@bubblelab/bubble-core 0.1.10 → 0.1.11

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 (298) hide show
  1. package/dist/bubble-bundle.d.ts +759 -350
  2. package/dist/bubble-factory.d.ts.map +1 -1
  3. package/dist/bubble-factory.js +125 -35
  4. package/dist/bubble-factory.js.map +1 -1
  5. package/dist/bubble-flow/bubble-flow-class.d.ts +5 -0
  6. package/dist/bubble-flow/bubble-flow-class.d.ts.map +1 -1
  7. package/dist/bubble-flow/bubble-flow-class.js +20 -0
  8. package/dist/bubble-flow/bubble-flow-class.js.map +1 -1
  9. package/dist/bubble-flow/sample/simplified-data-analysis.flow.d.ts.map +1 -1
  10. package/dist/bubble-flow/sample/simplified-data-analysis.flow.js +6 -3
  11. package/dist/bubble-flow/sample/simplified-data-analysis.flow.js.map +1 -1
  12. package/dist/bubbles/service-bubble/agi-inc.d.ts +1121 -0
  13. package/dist/bubbles/service-bubble/agi-inc.d.ts.map +1 -0
  14. package/dist/bubbles/service-bubble/agi-inc.js +730 -0
  15. package/dist/bubbles/service-bubble/agi-inc.js.map +1 -0
  16. package/dist/bubbles/service-bubble/ai-agent.d.ts +277 -65
  17. package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -1
  18. package/dist/bubbles/service-bubble/ai-agent.js +533 -399
  19. package/dist/bubbles/service-bubble/ai-agent.js.map +1 -1
  20. package/dist/bubbles/service-bubble/airtable.d.ts +1753 -0
  21. package/dist/bubbles/service-bubble/airtable.d.ts.map +1 -0
  22. package/dist/bubbles/service-bubble/airtable.js +1173 -0
  23. package/dist/bubbles/service-bubble/airtable.js.map +1 -0
  24. package/dist/bubbles/service-bubble/apify/actors/google-maps-scraper.d.ts +240 -0
  25. package/dist/bubbles/service-bubble/apify/actors/google-maps-scraper.d.ts.map +1 -0
  26. package/dist/bubbles/service-bubble/apify/actors/google-maps-scraper.js +119 -0
  27. package/dist/bubbles/service-bubble/apify/actors/google-maps-scraper.js.map +1 -0
  28. package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts +4 -4
  29. package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts +14 -14
  30. package/dist/bubbles/service-bubble/apify/actors/linkedin-jobs-scraper.d.ts +137 -0
  31. package/dist/bubbles/service-bubble/apify/actors/linkedin-jobs-scraper.d.ts.map +1 -0
  32. package/dist/bubbles/service-bubble/apify/actors/linkedin-jobs-scraper.js +81 -0
  33. package/dist/bubbles/service-bubble/apify/actors/linkedin-jobs-scraper.js.map +1 -0
  34. package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts +6 -6
  35. package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts +32 -32
  36. package/dist/bubbles/service-bubble/apify/actors/tiktok-scraper.d.ts +488 -0
  37. package/dist/bubbles/service-bubble/apify/actors/tiktok-scraper.d.ts.map +1 -0
  38. package/dist/bubbles/service-bubble/apify/actors/tiktok-scraper.js +463 -0
  39. package/dist/bubbles/service-bubble/apify/actors/tiktok-scraper.js.map +1 -0
  40. package/dist/bubbles/service-bubble/apify/actors/twitter-scraper.d.ts +262 -0
  41. package/dist/bubbles/service-bubble/apify/actors/twitter-scraper.d.ts.map +1 -0
  42. package/dist/bubbles/service-bubble/apify/actors/twitter-scraper.js +291 -0
  43. package/dist/bubbles/service-bubble/apify/actors/twitter-scraper.js.map +1 -0
  44. package/dist/bubbles/service-bubble/apify/actors/youtube-scraper.d.ts +12 -12
  45. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts +1301 -170
  46. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts.map +1 -1
  47. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js +32 -0
  48. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js.map +1 -1
  49. package/dist/bubbles/service-bubble/apify/apify.d.ts +162 -17
  50. package/dist/bubbles/service-bubble/apify/apify.d.ts.map +1 -1
  51. package/dist/bubbles/service-bubble/apify/apify.js +205 -32
  52. package/dist/bubbles/service-bubble/apify/apify.js.map +1 -1
  53. package/dist/bubbles/service-bubble/eleven-labs.d.ts +421 -0
  54. package/dist/bubbles/service-bubble/eleven-labs.d.ts.map +1 -0
  55. package/dist/bubbles/service-bubble/eleven-labs.js +479 -0
  56. package/dist/bubbles/service-bubble/eleven-labs.js.map +1 -0
  57. package/dist/bubbles/service-bubble/firecrawl.d.ts +37748 -0
  58. package/dist/bubbles/service-bubble/firecrawl.d.ts.map +1 -0
  59. package/dist/bubbles/service-bubble/firecrawl.js +1489 -0
  60. package/dist/bubbles/service-bubble/firecrawl.js.map +1 -0
  61. package/dist/bubbles/service-bubble/followupboss.d.ts +6822 -0
  62. package/dist/bubbles/service-bubble/followupboss.d.ts.map +1 -0
  63. package/dist/bubbles/service-bubble/followupboss.js +1394 -0
  64. package/dist/bubbles/service-bubble/followupboss.js.map +1 -0
  65. package/dist/bubbles/service-bubble/github.d.ts +2399 -0
  66. package/dist/bubbles/service-bubble/github.d.ts.map +1 -0
  67. package/dist/bubbles/service-bubble/github.js +1052 -0
  68. package/dist/bubbles/service-bubble/github.js.map +1 -0
  69. package/dist/bubbles/service-bubble/gmail.d.ts +180 -180
  70. package/dist/bubbles/service-bubble/google-calendar.d.ts +60 -60
  71. package/dist/bubbles/service-bubble/google-drive.d.ts +37 -36
  72. package/dist/bubbles/service-bubble/google-drive.d.ts.map +1 -1
  73. package/dist/bubbles/service-bubble/google-drive.js +35 -3
  74. package/dist/bubbles/service-bubble/google-drive.js.map +1 -1
  75. package/dist/bubbles/service-bubble/google-sheets/google-sheets.d.ts +943 -0
  76. package/dist/bubbles/service-bubble/google-sheets/google-sheets.d.ts.map +1 -0
  77. package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.d.ts +31 -0
  78. package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.d.ts.map +1 -0
  79. package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.js +184 -0
  80. package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.js.map +1 -0
  81. package/dist/bubbles/service-bubble/google-sheets/google-sheets.js +401 -0
  82. package/dist/bubbles/service-bubble/google-sheets/google-sheets.js.map +1 -0
  83. package/dist/bubbles/service-bubble/google-sheets/google-sheets.schema.d.ts +1024 -0
  84. package/dist/bubbles/service-bubble/google-sheets/google-sheets.schema.d.ts.map +1 -0
  85. package/dist/bubbles/service-bubble/{google-sheets.js → google-sheets/google-sheets.schema.js} +45 -409
  86. package/dist/bubbles/service-bubble/google-sheets/google-sheets.schema.js.map +1 -0
  87. package/dist/bubbles/service-bubble/google-sheets/google-sheets.utils.d.ts +38 -0
  88. package/dist/bubbles/service-bubble/google-sheets/google-sheets.utils.d.ts.map +1 -0
  89. package/dist/bubbles/service-bubble/google-sheets/google-sheets.utils.js +183 -0
  90. package/dist/bubbles/service-bubble/google-sheets/google-sheets.utils.js.map +1 -0
  91. package/dist/bubbles/service-bubble/google-sheets/index.d.ts +4 -0
  92. package/dist/bubbles/service-bubble/google-sheets/index.d.ts.map +1 -0
  93. package/dist/bubbles/service-bubble/google-sheets/index.js +4 -0
  94. package/dist/bubbles/service-bubble/google-sheets/index.js.map +1 -0
  95. package/dist/bubbles/service-bubble/hello-world.d.ts +4 -4
  96. package/dist/bubbles/service-bubble/http.d.ts +4 -4
  97. package/dist/bubbles/service-bubble/http.d.ts.map +1 -1
  98. package/dist/bubbles/service-bubble/http.js +7 -1
  99. package/dist/bubbles/service-bubble/http.js.map +1 -1
  100. package/dist/bubbles/service-bubble/insforge-db.d.ts +140 -0
  101. package/dist/bubbles/service-bubble/insforge-db.d.ts.map +1 -0
  102. package/dist/bubbles/service-bubble/insforge-db.js +260 -0
  103. package/dist/bubbles/service-bubble/insforge-db.js.map +1 -0
  104. package/dist/bubbles/service-bubble/notion/index.d.ts +3 -0
  105. package/dist/bubbles/service-bubble/notion/index.d.ts.map +1 -0
  106. package/dist/bubbles/service-bubble/notion/index.js +3 -0
  107. package/dist/bubbles/service-bubble/notion/index.js.map +1 -0
  108. package/dist/bubbles/service-bubble/notion/notion.d.ts +35405 -0
  109. package/dist/bubbles/service-bubble/notion/notion.d.ts.map +1 -0
  110. package/dist/bubbles/service-bubble/notion/notion.js +1492 -0
  111. package/dist/bubbles/service-bubble/notion/notion.js.map +1 -0
  112. package/dist/bubbles/service-bubble/notion/property-schemas.d.ts +1148 -0
  113. package/dist/bubbles/service-bubble/notion/property-schemas.d.ts.map +1 -0
  114. package/dist/bubbles/service-bubble/notion/property-schemas.js +341 -0
  115. package/dist/bubbles/service-bubble/notion/property-schemas.js.map +1 -0
  116. package/dist/bubbles/service-bubble/postgresql.d.ts +12 -12
  117. package/dist/bubbles/service-bubble/resend.d.ts +34 -13
  118. package/dist/bubbles/service-bubble/resend.d.ts.map +1 -1
  119. package/dist/bubbles/service-bubble/resend.js +133 -2
  120. package/dist/bubbles/service-bubble/resend.js.map +1 -1
  121. package/dist/bubbles/service-bubble/slack.d.ts +241 -241
  122. package/dist/bubbles/service-bubble/slack.d.ts.map +1 -1
  123. package/dist/bubbles/service-bubble/slack.js +2 -2
  124. package/dist/bubbles/service-bubble/slack.js.map +1 -1
  125. package/dist/bubbles/service-bubble/storage.d.ts +25 -21
  126. package/dist/bubbles/service-bubble/storage.d.ts.map +1 -1
  127. package/dist/bubbles/service-bubble/storage.js +43 -2
  128. package/dist/bubbles/service-bubble/storage.js.map +1 -1
  129. package/dist/bubbles/service-bubble/telegram.d.ts +7742 -0
  130. package/dist/bubbles/service-bubble/telegram.d.ts.map +1 -0
  131. package/dist/bubbles/service-bubble/telegram.js +1132 -0
  132. package/dist/bubbles/service-bubble/telegram.js.map +1 -0
  133. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +76 -20
  134. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts.map +1 -1
  135. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js +12 -0
  136. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js.map +1 -1
  137. package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +14 -14
  138. package/dist/bubbles/tool-bubble/code-edit-tool.d.ts +188 -0
  139. package/dist/bubbles/tool-bubble/code-edit-tool.d.ts.map +1 -0
  140. package/dist/bubbles/tool-bubble/code-edit-tool.js +321 -0
  141. package/dist/bubbles/tool-bubble/code-edit-tool.js.map +1 -0
  142. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts +8 -4
  143. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts.map +1 -1
  144. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js +115 -10
  145. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js.map +1 -1
  146. package/dist/bubbles/tool-bubble/google-maps-tool.d.ts +455 -0
  147. package/dist/bubbles/tool-bubble/google-maps-tool.d.ts.map +1 -0
  148. package/dist/bubbles/tool-bubble/google-maps-tool.js +205 -0
  149. package/dist/bubbles/tool-bubble/google-maps-tool.js.map +1 -0
  150. package/dist/bubbles/tool-bubble/instagram-tool.d.ts +36 -36
  151. package/dist/bubbles/tool-bubble/instagram-tool.d.ts.map +1 -1
  152. package/dist/bubbles/tool-bubble/instagram-tool.js +2 -2
  153. package/dist/bubbles/tool-bubble/instagram-tool.js.map +1 -1
  154. package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +824 -447
  155. package/dist/bubbles/tool-bubble/linkedin-tool.d.ts.map +1 -1
  156. package/dist/bubbles/tool-bubble/linkedin-tool.js +232 -12
  157. package/dist/bubbles/tool-bubble/linkedin-tool.js.map +1 -1
  158. package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts +4 -4
  159. package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +66 -66
  160. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +17 -16
  161. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts.map +1 -1
  162. package/dist/bubbles/tool-bubble/research-agent-tool.js +26 -16
  163. package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -1
  164. package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +8 -8
  165. package/dist/bubbles/tool-bubble/tiktok-tool.d.ts +485 -0
  166. package/dist/bubbles/tool-bubble/tiktok-tool.d.ts.map +1 -0
  167. package/dist/bubbles/tool-bubble/tiktok-tool.js +226 -0
  168. package/dist/bubbles/tool-bubble/tiktok-tool.js.map +1 -0
  169. package/dist/bubbles/tool-bubble/tool-template.d.ts +8 -8
  170. package/dist/bubbles/tool-bubble/twitter-tool.d.ts +947 -0
  171. package/dist/bubbles/tool-bubble/twitter-tool.d.ts.map +1 -0
  172. package/dist/bubbles/tool-bubble/twitter-tool.js +494 -0
  173. package/dist/bubbles/tool-bubble/twitter-tool.js.map +1 -0
  174. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +22 -16
  175. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts.map +1 -1
  176. package/dist/bubbles/tool-bubble/web-crawl-tool.js +58 -59
  177. package/dist/bubbles/tool-bubble/web-crawl-tool.js.map +1 -1
  178. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +8 -8
  179. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts.map +1 -1
  180. package/dist/bubbles/tool-bubble/web-extract-tool.js +17 -17
  181. package/dist/bubbles/tool-bubble/web-extract-tool.js.map +1 -1
  182. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +15 -107
  183. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts.map +1 -1
  184. package/dist/bubbles/tool-bubble/web-scrape-tool.js +51 -72
  185. package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -1
  186. package/dist/bubbles/tool-bubble/web-search-tool.d.ts +20 -9
  187. package/dist/bubbles/tool-bubble/web-search-tool.d.ts.map +1 -1
  188. package/dist/bubbles/tool-bubble/web-search-tool.js +45 -35
  189. package/dist/bubbles/tool-bubble/web-search-tool.js.map +1 -1
  190. package/dist/bubbles/tool-bubble/youtube-tool.d.ts +25 -25
  191. package/dist/bubbles/tool-bubble/youtube-tool.d.ts.map +1 -1
  192. package/dist/bubbles/tool-bubble/youtube-tool.js +5 -5
  193. package/dist/bubbles/tool-bubble/youtube-tool.js.map +1 -1
  194. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts +4 -4
  195. package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +30 -30
  196. package/dist/bubbles/workflow-bubble/generate-document.workflow.js +1 -1
  197. package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts +22 -22
  198. package/dist/bubbles/workflow-bubble/parse-document.workflow.js +1 -1
  199. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +54 -54
  200. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts.map +1 -1
  201. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js +4 -4
  202. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js.map +1 -1
  203. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +36 -36
  204. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js +1 -1
  205. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +14 -14
  206. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts.map +1 -1
  207. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js +6 -6
  208. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js.map +1 -1
  209. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +26 -26
  210. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts.map +1 -1
  211. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js +24 -4
  212. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js.map +1 -1
  213. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts +19 -19
  214. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts.map +1 -1
  215. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js +8 -8
  216. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js.map +1 -1
  217. package/dist/bubbles.json +220 -72
  218. package/dist/index.d.ts +23 -4
  219. package/dist/index.d.ts.map +1 -1
  220. package/dist/index.js +16 -3
  221. package/dist/index.js.map +1 -1
  222. package/dist/logging/BubbleLogger.d.ts +45 -16
  223. package/dist/logging/BubbleLogger.d.ts.map +1 -1
  224. package/dist/logging/BubbleLogger.js +178 -77
  225. package/dist/logging/BubbleLogger.js.map +1 -1
  226. package/dist/logging/StreamingBubbleLogger.d.ts +13 -1
  227. package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -1
  228. package/dist/logging/StreamingBubbleLogger.js +51 -8
  229. package/dist/logging/StreamingBubbleLogger.js.map +1 -1
  230. package/dist/logging/WebhookStreamLogger.d.ts +66 -0
  231. package/dist/logging/WebhookStreamLogger.d.ts.map +1 -0
  232. package/dist/logging/WebhookStreamLogger.js +291 -0
  233. package/dist/logging/WebhookStreamLogger.js.map +1 -0
  234. package/dist/types/available-tools.d.ts +1 -1
  235. package/dist/types/available-tools.d.ts.map +1 -1
  236. package/dist/types/available-tools.js +1 -0
  237. package/dist/types/available-tools.js.map +1 -1
  238. package/dist/types/base-bubble-class.d.ts +6 -4
  239. package/dist/types/base-bubble-class.d.ts.map +1 -1
  240. package/dist/types/base-bubble-class.js +35 -20
  241. package/dist/types/base-bubble-class.js.map +1 -1
  242. package/dist/types/bubble.d.ts +2 -0
  243. package/dist/types/bubble.d.ts.map +1 -1
  244. package/dist/types/service-bubble-class.d.ts +1 -1
  245. package/dist/types/service-bubble-class.d.ts.map +1 -1
  246. package/dist/types/service-bubble-class.js +2 -2
  247. package/dist/types/service-bubble-class.js.map +1 -1
  248. package/dist/types/tool-bubble-class.d.ts +1 -1
  249. package/dist/types/tool-bubble-class.d.ts.map +1 -1
  250. package/dist/types/tool-bubble-class.js +2 -2
  251. package/dist/types/tool-bubble-class.js.map +1 -1
  252. package/dist/types/workflow-bubble-class.d.ts +1 -1
  253. package/dist/types/workflow-bubble-class.d.ts.map +1 -1
  254. package/dist/types/workflow-bubble-class.js +2 -2
  255. package/dist/types/workflow-bubble-class.js.map +1 -1
  256. package/dist/utils/agent-formatter.d.ts +14 -2
  257. package/dist/utils/agent-formatter.d.ts.map +1 -1
  258. package/dist/utils/agent-formatter.js +174 -26
  259. package/dist/utils/agent-formatter.js.map +1 -1
  260. package/dist/utils/bubbleflow-validation.d.ts +7 -0
  261. package/dist/utils/bubbleflow-validation.d.ts.map +1 -1
  262. package/dist/utils/bubbleflow-validation.js +171 -6
  263. package/dist/utils/bubbleflow-validation.js.map +1 -1
  264. package/dist/utils/json-parsing.d.ts.map +1 -1
  265. package/dist/utils/json-parsing.js +146 -0
  266. package/dist/utils/json-parsing.js.map +1 -1
  267. package/dist/utils/safe-gemini-chat.d.ts +31 -0
  268. package/dist/utils/safe-gemini-chat.d.ts.map +1 -0
  269. package/dist/utils/safe-gemini-chat.js +93 -0
  270. package/dist/utils/safe-gemini-chat.js.map +1 -0
  271. package/dist/utils/schema-comparison.d.ts +92 -0
  272. package/dist/utils/schema-comparison.d.ts.map +1 -0
  273. package/dist/utils/schema-comparison.js +716 -0
  274. package/dist/utils/schema-comparison.js.map +1 -0
  275. package/dist/utils/zod-schema.d.ts +24 -0
  276. package/dist/utils/zod-schema.d.ts.map +1 -0
  277. package/dist/utils/zod-schema.js +56 -0
  278. package/dist/utils/zod-schema.js.map +1 -0
  279. package/package.json +5 -4
  280. package/dist/bubbles/service-bubble/google-sheets.d.ts +0 -1811
  281. package/dist/bubbles/service-bubble/google-sheets.d.ts.map +0 -1
  282. package/dist/bubbles/service-bubble/google-sheets.js.map +0 -1
  283. package/dist/bubbles/service-bubble/x-twitter.d.ts +0 -814
  284. package/dist/bubbles/service-bubble/x-twitter.d.ts.map +0 -1
  285. package/dist/bubbles/service-bubble/x-twitter.js +0 -445
  286. package/dist/bubbles/service-bubble/x-twitter.js.map +0 -1
  287. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts +0 -125
  288. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts.map +0 -1
  289. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js +0 -808
  290. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js.map +0 -1
  291. package/dist/test-gm.d.ts +0 -10
  292. package/dist/test-gm.d.ts.map +0 -1
  293. package/dist/test-gm.js +0 -95
  294. package/dist/test-gm.js.map +0 -1
  295. package/dist/utils/param-helper.d.ts +0 -2
  296. package/dist/utils/param-helper.d.ts.map +0 -1
  297. package/dist/utils/param-helper.js +0 -5
  298. package/dist/utils/param-helper.js.map +0 -1
package/dist/bubbles.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "generatedAt": "2025-11-02T09:38:25.586Z",
4
- "totalCount": 36,
3
+ "generatedAt": "2025-12-29T14:51:21.270Z",
4
+ "totalCount": 47,
5
5
  "bubbles": [
6
6
  {
7
7
  "name": "hello-world",
@@ -20,9 +20,9 @@
20
20
  "type": "service",
21
21
  "shortDescription": "AI agent with LangGraph for tool-enabled conversations, multimodal support, and JSON mode",
22
22
  "useCase": "- Add tools to enhance the AI agent's capabilities (web-search-tool, web-scrape-tool)",
23
- "inputSchema": "{\n message: string // The message or question to send to the AI agent,\n images: DiscriminatedUnion[] // Array of base64 encoded images to include with the message (for multimodal AI models). Example: [{type: \"base64\", data: \"base64...\", mimeType: \"image/png\", description: \"A beautiful image of a cat\"}] or [{type: \"url\", url: \"https://example.com/image.png\", description: \"A beautiful image of a cat\"}],\n systemPrompt: string // System prompt that defines the AI agents behavior and personality,\n name: string | undefined // A friendly name for the AI agent,\n model: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" // AI model to use (format: provider/model-name)., temperature: number // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: number | undefined // Maximum number of tokens to generate in response, keep at default of 40000 unless the response is expected to be certain length, jsonMode: boolean // When true, strips markdown formatting and returns clean JSON response } // AI model configuration including provider, temperature, and tokens. For model unless otherwise specified, use google/gemini-2.5-flash as default. Use google/gemini-2.5-flash-image-preview to edit and generate images.,\n tools: { name: \"web-search-tool\" | \"web-scrape-tool\" | \"web-crawl-tool\" | \"web-extract-tool\" | \"research-agent-tool\" | \"reddit-scrape-tool\" | \"instagram-tool\" | \"list-bubbles-tool\" | \"get-bubble-details-tool\" | \"bubbleflow-validation-tool\" | \"chart-js-tool\" | \"sql-query-tool\" // Name of the tool type or tool bubble to enable for the AI agent, credentials: Record<string, string> | undefined // Credential types to use for the tool bubble (injected at runtime), config: Record<string, unknown> | undefined // Configuration for the tool or tool bubble }[] // Array of pre-registered tools the AI agent can use. Can be tool types (web-search-tool, web-scrape-tool, web-crawl-tool, web-extract-tool, instagram-tool). If using image models, set the tools to [],\n customTools: { name: string // Unique name for your custom tool (e.g., \"calculate-tax\"), description: string // Description of what the tool does - helps the AI know when to use it, schema: Record<string, unknown> // Zod schema object defining the tool parameters. Example: { amount: z.number().describe(\"Amount to calculate tax on\"), rate: z.number().describe(\"Tax rate\") }, func: unknown // Async function that executes the tool logic. Receives params matching the schema and returns a result. }[] | undefined // Array of custom runtime-defined tools with their own schemas and functions. Use this to add domain-specific tools without pre-registration. Example: [{ name: \"calculate-tax\", description: \"Calculates sales tax\", schema: { amount: z.number() }, func: async (input) => {...} }],\n maxIterations: number // Maximum number of iterations for the agent workflow, 2 iterations per turn of conversation,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime),\n streaming: boolean // Enable real-time streaming of tokens, tool calls, and iteration progress\n}",
24
- "outputSchema": "{\n response: string // The AI agents final response to the user message. For text responses, returns plain text or JSON string. For image generation models (like gemini-2.5-flash-image-preview), returns base64-encoded image data with data URI format (data:image/png;base64,...),\n toolCalls: { tool: string // Name of the tool that was called, input: unknown // Input parameters passed to the tool, output: unknown // Output returned by the tool }[] // Array of tool calls made during the conversation,\n iterations: number // Number of back-and-forth iterations in the agent workflow,\n error: string // Error message of the run, undefined if successful,\n success: boolean // Whether the agent execution completed successfully\n}",
25
- "usageExample": "// Example usage of ai-agent bubble\nconst aiAgent = new AiAgentBubble({\n message: \"example string\", // The message or question to send to the AI agent,\n images: [{ type: \"base64\" // default, data: \"example string\", mimeType: \"image/png\" // default, description: \"example string\" }] // example for array, // Array of base64 encoded images to include with the message (for multimodal AI models). Example: [{type: \"base64\", data: \"base64...\", mimeType: \"image/png\", description: \"A beautiful image of a cat\"}] or [{type: \"url\", url: \"https://example.com/image.png\", description: \"A beautiful image of a cat\"}],\n systemPrompt: \"You are a helpful AI assistant\" // default, // System prompt that defines the AI agents behavior and personality,\n name: \"AI Agent\" // default, // A friendly name for the AI agent,\n model: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\" // AI model to use (format: provider/model-name)., temperature: 1 // default // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: 12800 // default // Maximum number of tokens to generate in response, keep at default of 40000 unless the response is expected to be certain length, jsonMode: false // default // When true, strips markdown formatting and returns clean JSON response } // structure, // AI model configuration including provider, temperature, and tokens. For model unless otherwise specified, use google/gemini-2.5-flash as default. Use google/gemini-2.5-flash-image-preview to edit and generate images.,\n tools: [{\"name\":\"web-search-tool\",\"config\":{\"maxResults\":5}}] // default, // Array of pre-registered tools the AI agent can use. Can be tool types (web-search-tool, web-scrape-tool, web-crawl-tool, web-extract-tool, instagram-tool). If using image models, set the tools to [],\n customTools: [{ name: \"example string\" // Unique name for your custom tool (e.g., \"calculate-tax\"), description: \"example string\" // Description of what the tool does - helps the AI know when to use it, schema: {} // record/object with string keys // Zod schema object defining the tool parameters. Example: { amount: z.number().describe(\"Amount to calculate tax on\"), rate: z.number().describe(\"Tax rate\") } }] // example for array, // Array of custom runtime-defined tools with their own schemas and functions. Use this to add domain-specific tools without pre-registration. Example: [{ name: \"calculate-tax\", description: \"Calculates sales tax\", schema: { amount: z.number() }, func: async (input) => {...} }],\n maxIterations: 10 // default, // Maximum number of iterations for the agent workflow, 2 iterations per turn of conversation,\n streaming: false // default, // Enable real-time streaming of tokens, tool calls, and iteration progress,\n});\n\nconst result = await aiAgent.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// response: string // The AI agents final response to the user message. For text responses, returns plain text or JSON string. For image generation models (like gemini-2.5-flash-image-preview), returns base64-encoded image data with data URI format (data:image/png;base64,...),\n// toolCalls: { tool: string // Name of the tool that was called, input: unknown // Input parameters passed to the tool, output: unknown // Output returned by the tool }[] // Array of tool calls made during the conversation,\n// iterations: number // Number of back-and-forth iterations in the agent workflow,\n// error: string // Error message of the run, undefined if successful,\n// success: boolean // Whether the agent execution completed successfully\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
23
+ "inputSchema": "{\n message: string // The message or question to send to the AI agent,\n images: { type: \"base64\", data: string // Base64 encoded image data (without data:image/... prefix), mimeType: string // MIME type of the image (e.g., image/png, image/jpeg), description: string | undefined // Optional description or context for the image } | { type: \"url\", url: string // URL to the image (http/https), description: string | undefined // Optional description or context for the image }[] // Array of base64 encoded images to include with the message (for multimodal AI models). Example: [{type: \"base64\", data: \"base64...\", mimeType: \"image/png\", description: \"A beautiful image of a cat\"}] or [{type: \"url\", url: \"https://example.com/image.png\", description: \"A beautiful image of a cat\"}],\n conversationHistory: { role: \"user\" | \"assistant\" | \"tool\" // The role of the message sender, content: string // The message content, toolCallId: string | undefined // Tool call ID for tool messages, name: string | undefined // Tool name for tool messages }[] | undefined // Previous conversation messages for multi-turn conversations. When provided, messages are sent as separate turns to enable KV cache optimization. Format: [{role: \"user\", content: \"...\"}, {role: \"assistant\", content: \"...\"}, ...],\n systemPrompt: string // System prompt that defines the AI agents behavior and personality,\n name: string | undefined // A friendly name for the AI agent,\n model: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use (format: provider/model-name)., temperature: number // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: number | undefined // Maximum number of tokens to generate in response, keep at default of 40000 unless the response is expected to be certain length, reasoningEffort: \"low\" | \"medium\" | \"high\" | undefined // Reasoning effort for model. If not specified, uses primary model reasoningEffort., maxRetries: number // Maximum number of retries for API calls (default: 3). Useful for handling transient errors like 503 Service Unavailable., provider: string[] | undefined // Providers for ai agent (open router only)., jsonMode: boolean // When true, returns clean JSON response, you must provide the exact JSON schema in the system prompt, backupModel: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\" // Backup AI model to use if the primary model fails (format: provider/model-name)., temperature: number | undefined // Temperature for backup model. If not specified, uses primary model temperature., maxTokens: number | undefined // Max tokens for backup model. If not specified, uses primary model maxTokens., reasoningEffort: \"low\" | \"medium\" | \"high\" | undefined // Reasoning effort for backup model. If not specified, uses primary model reasoningEffort., maxRetries: number | undefined // Max retries for backup model. If not specified, uses primary model maxRetries. } | undefined // Backup model configuration to use if the primary model fails. } // AI model configuration including provider, temperature, and tokens, retries, and json mode. Always include this.,\n tools: { name: \"web-search-tool\" | \"web-scrape-tool\" | \"web-crawl-tool\" | \"web-extract-tool\" | \"research-agent-tool\" | \"reddit-scrape-tool\" | \"instagram-tool\" | \"list-bubbles-tool\" | \"get-bubble-details-tool\" | \"bubbleflow-validation-tool\" | \"code-edit-tool\" | \"chart-js-tool\" | \"sql-query-tool\" // Name of the tool type or tool bubble to enable for the AI agent, config: Record<string, unknown> | undefined // Configuration for the tool or tool bubble }[] // Array of pre-registered tools the AI agent can use. Can be tool types (web-search-tool, web-scrape-tool, web-crawl-tool, web-extract-tool, instagram-tool). If using image models, set the tools to [],\n customTools: { name: string // Unique name for your custom tool (e.g., \"calculate-tax\"), description: string // Description of what the tool does - helps the AI know when to use it, schema: unknown // Zod schema object defining the tool parameters. Can be either a plain object (e.g., { amount: z.number() }) or a Zod object directly (e.g., z.object({ amount: z.number() }))., func: unknown // Async function that executes the tool logic. Receives params matching the schema and returns a result. }[] | undefined // Array of custom runtime-defined tools with their own schemas and functions. Use this to add domain-specific tools without pre-registration. Example: [{ name: \"calculate-tax\", description: \"Calculates sales tax\", schema: { amount: z.number() }, func: async (input) => {...} }],\n maxIterations: number // Maximum number of iterations for the agent workflow, 5 iterations per turn of conversation,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime),\n streaming: boolean // Enable real-time streaming of tokens, tool calls, and iteration progress,\n expectedOutputSchema: unknown | undefined // Zod schema or JSON schema string that defines the expected structure of the AI response. When provided, automatically enables JSON mode and instructs the AI to output in the exact format. Example: z.object({ summary: z.string(), items: z.array(z.object({ name: z.string(), score: z.number() })) })\n}",
24
+ "outputSchema": "{\n response: string // The AI agents final response to the user message. For text responses, returns plain text. If JSON mode is enabled, returns a JSON string. For image generation models (like gemini-2.5-flash-image-preview), returns base64-encoded image data with data URI format (data:image/png;base64,...),\n toolCalls: { tool: string // Name of the tool that was called, input: unknown // Input parameters passed to the tool, output: unknown // Output returned by the tool }[] // Array of tool calls made during the conversation,\n iterations: number // Number of back-and-forth iterations in the agent workflow,\n error: string // Error message of the run, undefined if successful,\n success: boolean // Whether the agent execution completed successfully\n}",
25
+ "usageExample": "// Example usage of ai-agent bubble\nconst aiAgent = new AIAgentBubble({\n message: \"example string\", // The message or question to send to the AI agent,\n images: [{ type: \"base64\" // default, data: \"example string\", mimeType: \"image/png\" // default, description: \"example string\" }] // example for array, // Array of base64 encoded images to include with the message (for multimodal AI models). Example: [{type: \"base64\", data: \"base64...\", mimeType: \"image/png\", description: \"A beautiful image of a cat\"}] or [{type: \"url\", url: \"https://example.com/image.png\", description: \"A beautiful image of a cat\"}],\n conversationHistory: [{ role: \"user\" // options: \"user\", \"assistant\", \"tool\" // The role of the message sender, content: \"example string\" // The message content, toolCallId: \"example string\" // Tool call ID for tool messages, name: \"example string\" // Tool name for tool messages }], // Previous conversation messages for multi-turn conversations. When provided, messages are sent as separate turns to enable KV cache optimization. Format: [{role: \"user\", content: \"...\"}, {role: \"assistant\", content: \"...\"}, ...],\n systemPrompt: \"You are a helpful AI assistant\" // default, // System prompt that defines the AI agents behavior and personality,\n name: \"AI Agent\" // default, // A friendly name for the AI agent,\n model: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use (format: provider/model-name)., temperature: 1 // default // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: 12800 // default // Maximum number of tokens to generate in response, keep at default of 40000 unless the response is expected to be certain length, reasoningEffort: \"low\" // options: \"low\", \"medium\", \"high\" // Reasoning effort for model. If not specified, uses primary model reasoningEffort., maxRetries: 3 // default // Maximum number of retries for API calls (default: 3). Useful for handling transient errors like 503 Service Unavailable., provider: [\"example string\"] // Providers for ai agent (open router only)., jsonMode: false // default // When true, returns clean JSON response, you must provide the exact JSON schema in the system prompt, backupModel: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\" // Backup AI model to use if the primary model fails (format: provider/model-name)., temperature: 42 // Temperature for backup model. If not specified, uses primary model temperature., maxTokens: 42 // Max tokens for backup model. If not specified, uses primary model maxTokens., reasoningEffort: \"low\" // options: \"low\", \"medium\", \"high\" // Reasoning effort for backup model. If not specified, uses primary model reasoningEffort., maxRetries: 42 // Max retries for backup model. If not specified, uses primary model maxRetries. } // structure // Backup model configuration to use if the primary model fails. } // structure, // AI model configuration including provider, temperature, and tokens, retries, and json mode. Always include this.,\n tools: [{ name: \"web-search-tool\" // options: \"web-search-tool\", \"web-scrape-tool\", \"web-crawl-tool\", \"web-extract-tool\", \"research-agent-tool\", \"reddit-scrape-tool\", \"instagram-tool\", \"list-bubbles-tool\", \"get-bubble-details-tool\", \"bubbleflow-validation-tool\", \"code-edit-tool\", \"chart-js-tool\", \"sql-query-tool\" // Name of the tool type or tool bubble to enable for the AI agent, config: {} // Configuration for the tool or tool bubble }] // example for array, // Array of pre-registered tools the AI agent can use. Can be tool types (web-search-tool, web-scrape-tool, web-crawl-tool, web-extract-tool, instagram-tool). If using image models, set the tools to [],\n customTools: [{ name: \"example string\" // Unique name for your custom tool (e.g., \"calculate-tax\"), description: \"example string\" // Description of what the tool does - helps the AI know when to use it, schema: {} // Zod schema object defining the tool parameters. Can be either a plain object (e.g., { amount: z.number() }) or a Zod object directly (e.g., z.object({ amount: z.number() })). }] // example for array, // Array of custom runtime-defined tools with their own schemas and functions. Use this to add domain-specific tools without pre-registration. Example: [{ name: \"calculate-tax\", description: \"Calculates sales tax\", schema: { amount: z.number() }, func: async (input) => {...} }],\n maxIterations: 40 // default, // Maximum number of iterations for the agent workflow, 5 iterations per turn of conversation,\n streaming: false // default, // Enable real-time streaming of tokens, tool calls, and iteration progress,\n expectedOutputSchema: \"example string\", // Zod schema or JSON schema string that defines the expected structure of the AI response. When provided, automatically enables JSON mode and instructs the AI to output in the exact format. Example: z.object({ summary: z.string(), items: z.array(z.object({ name: z.string(), score: z.number() })) }),\n});\n\nconst result = await aiAgent.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// response: string // The AI agents final response to the user message. For text responses, returns plain text. If JSON mode is enabled, returns a JSON string. For image generation models (like gemini-2.5-flash-image-preview), returns base64-encoded image data with data URI format (data:image/png;base64,...),\n// toolCalls: { tool: string // Name of the tool that was called, input: unknown // Input parameters passed to the tool, output: unknown // Output returned by the tool }[] // Array of tool calls made during the conversation,\n// iterations: number // Number of back-and-forth iterations in the agent workflow,\n// error: string // Error message of the run, undefined if successful,\n// success: boolean // Whether the agent execution completed successfully\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
26
26
  "requiredCredentials": [
27
27
  "OPENAI_CRED",
28
28
  "GOOGLE_GEMINI_CRED",
@@ -39,7 +39,7 @@
39
39
  "useCase": "- Data retrieval with SELECT queries",
40
40
  "inputSchema": "{\n ignoreSSL: boolean // Ignore SSL certificate errors when connecting to the database,\n query: unknown // SQL query to execute against the PostgreSQL database (use parameterized queries with $1, $2, etc.),\n allowedOperations: \"SELECT\" | \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"WITH\" | \"EXPLAIN\" | \"ANALYZE\" | \"SHOW\" | \"DESCRIBE\" | \"DESC\" | \"CREATE\"[] // List of allowed SQL operations for security (defaults to read-only operations),\n parameters: unknown[] | undefined // Parameters for parameterized queries (e.g., [value1, value2] for $1, $2),\n timeout: number // Query timeout in milliseconds (default: 30 seconds, max recommended: 300000),\n maxRows: number // Maximum number of rows to return to prevent large result sets (default: 1000),\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
41
41
  "outputSchema": "{\n rows: Record<string, unknown>[] // Array of result rows, each row is an object with column names as keys,\n rowCount: number | null // Number of rows affected by the query (null for SELECT queries),\n command: string // SQL command that was executed (SELECT, INSERT, UPDATE, DELETE),\n fields: { name: string // Column name, dataTypeID: number // PostgreSQL data type identifier }[] | undefined // Metadata about the columns returned by the query,\n executionTime: number // Query execution time in milliseconds,\n success: boolean // Whether the query executed successfully,\n error: string // Error message if query execution failed (empty string if successful),\n cleanedJSONString: string // Clean JSON string representation of the row data, suitable for AI prompts and integrations\n}",
42
- "usageExample": "// Example usage of postgresql bubble\nconst postgresql = new PostgresqlBubble({\n ignoreSSL: true // default, // Ignore SSL certificate errors when connecting to the database,\n allowedOperations: [\"SELECT\",\"WITH\",\"EXPLAIN\",\"ANALYZE\",\"SHOW\",\"DESCRIBE\",\"DESC\"] // default, // List of allowed SQL operations for security (defaults to read-only operations),\n parameters: [] // default, // Parameters for parameterized queries (e.g., [value1, value2] for $1, $2),\n timeout: 30000 // default, // Query timeout in milliseconds (default: 30 seconds, max recommended: 300000),\n maxRows: 1000 // default, // Maximum number of rows to return to prevent large result sets (default: 1000),\n});\n\nconst result = await postgresql.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// rows: Record<string, unknown>[] // Array of result rows, each row is an object with column names as keys,\n// rowCount: number | null // Number of rows affected by the query (null for SELECT queries),\n// command: string // SQL command that was executed (SELECT, INSERT, UPDATE, DELETE),\n// fields: { name: string // Column name, dataTypeID: number // PostgreSQL data type identifier }[] | undefined // Metadata about the columns returned by the query,\n// executionTime: number // Query execution time in milliseconds,\n// success: boolean // Whether the query executed successfully,\n// error: string // Error message if query execution failed (empty string if successful),\n// cleanedJSONString: string // Clean JSON string representation of the row data, suitable for AI prompts and integrations\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
42
+ "usageExample": "// Example usage of postgresql bubble\nconst postgresql = new PostgreSQLBubble({\n ignoreSSL: true // default, // Ignore SSL certificate errors when connecting to the database,\n allowedOperations: [\"SELECT\",\"WITH\",\"EXPLAIN\",\"ANALYZE\",\"SHOW\",\"DESCRIBE\",\"DESC\"] // default, // List of allowed SQL operations for security (defaults to read-only operations),\n parameters: [] // default, // Parameters for parameterized queries (e.g., [value1, value2] for $1, $2),\n timeout: 30000 // default, // Query timeout in milliseconds (default: 30 seconds, max recommended: 300000),\n maxRows: 1000 // default, // Maximum number of rows to return to prevent large result sets (default: 1000),\n});\n\nconst result = await postgresql.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// rows: Record<string, unknown>[] // Array of result rows, each row is an object with column names as keys,\n// rowCount: number | null // Number of rows affected by the query (null for SELECT queries),\n// command: string // SQL command that was executed (SELECT, INSERT, UPDATE, DELETE),\n// fields: { name: string // Column name, dataTypeID: number // PostgreSQL data type identifier }[] | undefined // Metadata about the columns returned by the query,\n// executionTime: number // Query execution time in milliseconds,\n// success: boolean // Whether the query executed successfully,\n// error: string // Error message if query execution failed (empty string if successful),\n// cleanedJSONString: string // Clean JSON string representation of the row data, suitable for AI prompts and integrations\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
43
43
  "requiredCredentials": [
44
44
  "DATABASE_CRED"
45
45
  ]
@@ -57,6 +57,19 @@
57
57
  "SLACK_CRED"
58
58
  ]
59
59
  },
60
+ {
61
+ "name": "telegram",
62
+ "alias": "telegram",
63
+ "type": "service",
64
+ "shortDescription": "Telegram Bot API integration for messaging and bot management",
65
+ "useCase": "- Send text messages, photos, and documents to chats",
66
+ "inputSchema": "Complex schema - see usage example for structure",
67
+ "outputSchema": "Complex schema - see usage example for structure",
68
+ "usageExample": "// Send Message example\nconst telegram_send_message = new TelegramBubble({\n operation: \"send_message\", // Send a text message to a Telegram chat\n chat_id: \"example string\", // Unique identifier for the target chat or username (e.g., @channelusername)\n text: \"example string\", // Text of the message to be sent\n parse_mode: \"HTML\" // options: \"HTML\", \"Markdown\", \"MarkdownV2\", // Text formatting mode (HTML, Markdown, or MarkdownV2)\n entities: [], // List of special entities in the message text\n disable_web_page_preview: true, // Disable link previews for links in this message\n disable_notification: true, // Sends the message silently\n protect_content: true, // Protects the content from forwarding and saving\n reply_to_message_id: 42, // If the message is a reply, ID of the original message\n allow_sending_without_reply: true, // Allow sending message even if the replied message is not found\n reply_markup: { inline_keyboard: [[{ text: \"example string\" // Button text, url: \"example string\" // HTTP or tg:// URL to open, callback_data: \"example string\" // Callback data (max 64 bytes), web_app: {} // Web App information, login_url: {} // Login URL information, switch_inline_query: \"example string\" // Switch to inline query, switch_inline_query_current_chat: \"example string\" // Switch to inline query in current chat, callback_game: {} // Callback game, pay: true // Pay button }]] // Array of button rows }, // Inline keyboard or reply keyboard markup\n});\n\nconst result = await telegram_send_message.action();\n// outputSchema for result.data when operation === 'send_message':\n// {\n// operation: \"send_message\" // Send a text message to a Telegram chat,\n// ok: boolean // Whether the Telegram API call was successful,\n// message: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // Sent message object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Send Photo example\nconst telegram_send_photo = new TelegramBubble({\n operation: \"send_photo\", // Send a photo to a Telegram chat\n chat_id: \"example string\", // Unique identifier for the target chat or username\n photo: \"example string\", // Photo to send (file_id, HTTP URL, or file path)\n caption: \"example string\", // Photo caption\n parse_mode: \"HTML\" // options: \"HTML\", \"Markdown\", \"MarkdownV2\", // Text formatting mode (HTML, Markdown, or MarkdownV2)\n caption_entities: [], // List of special entities in the caption\n has_spoiler: true, // Mark photo as spoiler\n disable_notification: true, // Sends the message silently\n protect_content: true, // Protects the content from forwarding and saving\n reply_to_message_id: 42, // If the message is a reply, ID of the original message\n allow_sending_without_reply: true, // Allow sending message even if the replied message is not found\n reply_markup: { inline_keyboard: [[{ text: \"example string\" // Button text, url: \"example string\" // HTTP or tg:// URL to open, callback_data: \"example string\" // Callback data (max 64 bytes), web_app: {} // Web App information, login_url: {} // Login URL information, switch_inline_query: \"example string\" // Switch to inline query, switch_inline_query_current_chat: \"example string\" // Switch to inline query in current chat, callback_game: {} // Callback game, pay: true // Pay button }]] // Array of button rows }, // Inline keyboard or reply keyboard markup\n});\n\nconst result = await telegram_send_photo.action();\n// outputSchema for result.data when operation === 'send_photo':\n// {\n// operation: \"send_photo\" // Send a photo to a Telegram chat,\n// ok: boolean // Whether the Telegram API call was successful,\n// message: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // Sent message object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Send Document example\nconst telegram_send_document = new TelegramBubble({\n operation: \"send_document\", // Send a document to a Telegram chat\n chat_id: \"example string\", // Unique identifier for the target chat or username\n document: \"example string\", // File to send (file_id, HTTP URL, or file path)\n thumbnail: \"example string\", // Thumbnail of the file\n caption: \"example string\", // Document caption\n parse_mode: \"HTML\" // options: \"HTML\", \"Markdown\", \"MarkdownV2\", // Text formatting mode (HTML, Markdown, or MarkdownV2)\n caption_entities: [], // List of special entities in the caption\n disable_content_type_detection: true, // Disable automatic file type detection\n disable_notification: true, // Sends the message silently\n protect_content: true, // Protects the content from forwarding and saving\n reply_to_message_id: 42, // If the message is a reply, ID of the original message\n allow_sending_without_reply: true, // Allow sending message even if the replied message is not found\n reply_markup: { inline_keyboard: [[{ text: \"example string\" // Button text, url: \"example string\" // HTTP or tg:// URL to open, callback_data: \"example string\" // Callback data (max 64 bytes), web_app: {} // Web App information, login_url: {} // Login URL information, switch_inline_query: \"example string\" // Switch to inline query, switch_inline_query_current_chat: \"example string\" // Switch to inline query in current chat, callback_game: {} // Callback game, pay: true // Pay button }]] // Array of button rows }, // Inline keyboard or reply keyboard markup\n});\n\nconst result = await telegram_send_document.action();\n// outputSchema for result.data when operation === 'send_document':\n// {\n// operation: \"send_document\" // Send a document to a Telegram chat,\n// ok: boolean // Whether the Telegram API call was successful,\n// message: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // Sent message object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Edit Message example\nconst telegram_edit_message = new TelegramBubble({\n operation: \"edit_message\", // Edit a previously sent message\n chat_id: \"example string\", // Unique identifier for the target chat or username\n message_id: 42, // Identifier of the message to edit\n inline_message_id: \"example string\", // Identifier of the inline message to edit\n text: \"example string\", // New text of the message\n parse_mode: \"HTML\" // options: \"HTML\", \"Markdown\", \"MarkdownV2\", // Text formatting mode (HTML, Markdown, or MarkdownV2)\n entities: [], // List of special entities in the message text\n disable_web_page_preview: true, // Disable link previews for links in this message\n reply_markup: { inline_keyboard: [[{ text: \"example string\" // Button text, url: \"example string\" // HTTP or tg:// URL to open, callback_data: \"example string\" // Callback data (max 64 bytes), web_app: {} // Web App information, login_url: {} // Login URL information, switch_inline_query: \"example string\" // Switch to inline query, switch_inline_query_current_chat: \"example string\" // Switch to inline query in current chat, callback_game: {} // Callback game, pay: true // Pay button }]] // Array of button rows },\n});\n\nconst result = await telegram_edit_message.action();\n// outputSchema for result.data when operation === 'edit_message':\n// {\n// operation: \"edit_message\" // Edit a previously sent message,\n// ok: boolean // Whether the Telegram API call was successful,\n// message: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // Edited message object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Delete Message example\nconst telegram_delete_message = new TelegramBubble({\n operation: \"delete_message\", // Delete a message\n chat_id: \"example string\", // Unique identifier for the target chat or username\n message_id: 42, // Identifier of the message to delete\n});\n\nconst result = await telegram_delete_message.action();\n// outputSchema for result.data when operation === 'delete_message':\n// {\n// operation: \"delete_message\" // Delete a message,\n// ok: boolean // Whether the Telegram API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Me example\nconst telegram_get_me = new TelegramBubble({\n operation: \"get_me\", // Get bot information\n});\n\nconst result = await telegram_get_me.action();\n// outputSchema for result.data when operation === 'get_me':\n// {\n// operation: \"get_me\" // Get bot information,\n// ok: boolean // Whether the Telegram API call was successful,\n// user: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Bot user object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Chat example\nconst telegram_get_chat = new TelegramBubble({\n operation: \"get_chat\", // Get information about a chat\n chat_id: \"example string\", // Unique identifier for the target chat or username\n});\n\nconst result = await telegram_get_chat.action();\n// outputSchema for result.data when operation === 'get_chat':\n// {\n// operation: \"get_chat\" // Get information about a chat,\n// ok: boolean // Whether the Telegram API call was successful,\n// chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats), description: string | undefined // Chat description, invite_link: string | undefined // Chat invite link } | undefined // Chat object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Updates example\nconst telegram_get_updates = new TelegramBubble({\n operation: \"get_updates\", // Receive incoming updates using long polling\n offset: 42, // Identifier of the first update to be returned\n limit: 100 // default, // Limits the number of updates to be retrieved (1-100)\n timeout: 42, // Timeout in seconds for long polling\n allowed_updates: [\"example string\"], // List of update types to receive\n});\n\nconst result = await telegram_get_updates.action();\n// outputSchema for result.data when operation === 'get_updates':\n// {\n// operation: \"get_updates\" // Receive incoming updates using long polling,\n// ok: boolean // Whether the Telegram API call was successful,\n// updates: { update_id: number // Update identifier, message: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // New incoming message, edited_message: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // Edited message, channel_post: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // New channel post, edited_channel_post: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // Edited channel post, callback_query: { id: string // Callback query identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } // User who sent the callback, message: { message_id: number // Unique message identifier, from: { id: number // User identifier, is_bot: boolean // True if user is a bot, first_name: string // User first name, last_name: string | undefined // User last name, username: string | undefined // User username, language_code: string | undefined // User language code } | undefined // Sender information, date: number // Date the message was sent (Unix time), chat: { id: number // Chat identifier, type: \"private\" | \"group\" | \"supergroup\" | \"channel\" // Chat type, title: string | undefined // Chat title, username: string | undefined // Chat username, first_name: string | undefined // First name (for private chats), last_name: string | undefined // Last name (for private chats) } // Chat information, text: string | undefined // Message text, photo: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, width: number // Photo width, height: number // Photo height, file_size: number | undefined // File size in bytes }[] | undefined // Message photo, document: { file_id: string // File identifier, file_unique_id: string // Unique file identifier, file_name: string | undefined // Original filename, mime_type: string | undefined // MIME type, file_size: number | undefined // File size in bytes } | undefined // Message document } | undefined // Message with the callback button, inline_message_id: string | undefined // Inline message identifier, chat_instance: string // Global identifier for the chat, data: string | undefined // Callback data, game_short_name: string | undefined // Game short name } | undefined // New incoming callback query }[] | undefined // Array of Update objects,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Send Chat Action example\nconst telegram_send_chat_action = new TelegramBubble({\n operation: \"send_chat_action\", // Tell the user that something is happening on the bot's side (typing, uploading photo, etc.)\n chat_id: \"example string\", // Unique identifier for the target chat or username\n action: \"typing\" // options: \"typing\", \"upload_photo\", \"record_video\", \"upload_video\", \"record_voice\", \"upload_voice\", \"upload_document\", \"find_location\", \"record_video_note\", \"upload_video_note\", \"choose_sticker\", // Type of action to broadcast\n message_thread_id: 42, // Unique identifier for the target message thread (for forum topics)\n});\n\nconst result = await telegram_send_chat_action.action();\n// outputSchema for result.data when operation === 'send_chat_action':\n// {\n// operation: \"send_chat_action\" // Tell the user that something is happening on the bot's side,\n// ok: boolean // Whether the Telegram API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Set Message Reaction example\nconst telegram_set_message_reaction = new TelegramBubble({\n operation: \"set_message_reaction\", // Add a reaction to a message\n chat_id: \"example string\", // Unique identifier for the target chat or username\n message_id: 42, // Identifier of the message to react to\n reaction: [{ type: \"emoji\", emoji: \"example string\" // Emoji reaction (e.g., \"👍\", \"❤️\") }], // Array of reactions to set (empty array to remove reactions)\n is_big: true, // Pass True to set the reaction with a bigger animation\n});\n\nconst result = await telegram_set_message_reaction.action();\n// outputSchema for result.data when operation === 'set_message_reaction':\n// {\n// operation: \"set_message_reaction\" // Add a reaction to a message,\n// ok: boolean // Whether the Telegram API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Set Webhook example\nconst telegram_set_webhook = new TelegramBubble({\n operation: \"set_webhook\", // Specify a URL to receive incoming updates via webhook\n url: \"example string\", // HTTPS URL to send updates to. Use an empty string to remove webhook integration\n ip_address: \"example string\", // The fixed IP address which will be used to send webhook requests instead of the IP address resolved through DNS\n max_connections: 42, // Maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery (1-100). Defaults to 40\n allowed_updates: [\"example string\"], // A list of update types you want your bot to receive (e.g., [\"message\", \"callback_query\"])\n drop_pending_updates: true, // Pass True to drop all pending updates\n secret_token: \"example string\", // A secret token to be sent in the X-Telegram-Bot-Api-Secret-Token header (1-256 characters, A-Z, a-z, 0-9, _, -)\n});\n\nconst result = await telegram_set_webhook.action();\n// outputSchema for result.data when operation === 'set_webhook':\n// {\n// operation: \"set_webhook\" // Specify a URL to receive incoming updates via webhook,\n// ok: boolean // Whether the Telegram API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Delete Webhook example\nconst telegram_delete_webhook = new TelegramBubble({\n operation: \"delete_webhook\", // Remove webhook integration to switch back to getUpdates\n drop_pending_updates: true, // Pass True to drop all pending updates\n});\n\nconst result = await telegram_delete_webhook.action();\n// outputSchema for result.data when operation === 'delete_webhook':\n// {\n// operation: \"delete_webhook\" // Remove webhook integration to switch back to getUpdates,\n// ok: boolean // Whether the Telegram API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Webhook Info example\nconst telegram_get_webhook_info = new TelegramBubble({\n operation: \"get_webhook_info\", // Get current webhook status and information\n});\n\nconst result = await telegram_get_webhook_info.action();\n// outputSchema for result.data when operation === 'get_webhook_info':\n// {\n// operation: \"get_webhook_info\" // Get current webhook status and information,\n// ok: boolean // Whether the Telegram API call was successful,\n// webhook_info: { url: string // Webhook URL, may be empty if webhook is not set up, has_custom_certificate: boolean // True, if a custom certificate was provided for webhook certificate checks, pending_update_count: number // Number of updates awaiting delivery, ip_address: string | undefined // Currently used webhook IP address, last_error_date: number | undefined // Unix time for the most recent error that happened when trying to deliver an update via webhook, last_error_message: string | undefined // Error message in human-readable format for the most recent error that happened when trying to deliver an update via webhook, last_synchronization_error_date: number | undefined // Unix time of the most recent error that happened when trying to synchronize available updates with Telegram datacenters, max_connections: number | undefined // The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery, allowed_updates: string[] | undefined // A list of update types the bot is subscribed to. Defaults to all update types except chat_member } | undefined // Webhook information object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`telegram failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
69
+ "requiredCredentials": [
70
+ "TELEGRAM_BOT_TOKEN"
71
+ ]
72
+ },
60
73
  {
61
74
  "name": "resend",
62
75
  "alias": "resend",
@@ -65,7 +78,7 @@
65
78
  "useCase": "- Send transactional emails with HTML and text content",
66
79
  "inputSchema": "Complex schema - see usage example for structure",
67
80
  "outputSchema": "Complex schema - see usage example for structure",
68
- "usageExample": "// Send Email example\nconst resend_send_email = new ResendBubble({\n operation: \"send_email\", // Send an email via Resend\n from: \"Bubble Lab Team <welcome@hello.bubblelab.ai>\" // default, // Sender email address, should not be changed from <welcome@hello.bubblelab.ai> if resend account has not been setup with domain verification\n subject: \"example string\", // Email subject line\n text: \"example string\", // Plain text email content\n html: \"example string\", // HTML email content\n scheduled_at: \"example string\", // Schedule email to be sent later (ISO 8601 format or natural language like \"in 1 hour\")\n attachments: [{ filename: \"example string\" // Name of the attached file, content_type: \"example string\" // MIME type of the file, path: \"example string\" // Path where the attachment file is hosted }], // Array of email attachments (max 40MB total per email)\n tags: [{ name: \"example string\" // Tag name (ASCII letters, numbers, underscores, dashes only, max 256 chars), value: \"example string\" // Tag value (ASCII letters, numbers, underscores, dashes only, max 256 chars) }], // Array of email tags for tracking and analytics\n headers: { \"example_key\": \"example string\" } // record/object with string keys, // Custom email headers (e.g., X-Custom-Header)\n});\n\nconst result = await resend_send_email.action();\n// outputSchema for result.data when operation === 'send_email':\n// {\n// operation: \"send_email\" // Send an email via Resend,\n// success: boolean // Whether the email was sent successfully,\n// email_id: string | undefined // Resend email ID if successful,\n// error: string // Error message if email sending failed\n// }\n\n\n// Get Email Status example\nconst resend_get_email_status = new ResendBubble({\n operation: \"get_email_status\", // Get the status of a sent email\n email_id: \"example string\", // Resend email ID to check status for\n});\n\nconst result = await resend_get_email_status.action();\n// outputSchema for result.data when operation === 'get_email_status':\n// {\n// operation: \"get_email_status\" // Get the status of a sent email,\n// success: boolean // Whether the status request was successful,\n// status: string | undefined // Current status of the email,\n// created_at: string | undefined // Timestamp when the email was created,\n// last_event: string | undefined // Last event that occurred with the email,\n// error: string // Error message if status request failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`resend failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
81
+ "usageExample": "// Send Email example\nconst resend_send_email = new ResendBubble({\n operation: \"send_email\", // Send an email via Resend\n from: \"Bubble Lab Team <welcome@hello.bubblelab.ai>\" // default, // Sender email address, should not be changed from <welcome@hello.bubblelab.ai> if resend account has not been setup with domain verification\n to: [\"example string\"], // Recipient email address(es). For multiple addresses, send as an array of strings. Max 50.\n cc: [\"example string\"], // CC email address(es). For multiple addresses, send as an array of strings.\n bcc: [\"example string\"], // BCC email address(es). For multiple addresses, send as an array of strings.\n subject: \"example string\", // Email subject line\n text: \"example string\", // Plain text email content\n html: \"example string\", // HTML email content\n reply_to: [\"example string\"], // Reply-to email address(es). For multiple addresses, send as an array of strings.\n scheduled_at: \"example string\", // Schedule email to be sent later (ISO 8601 format or natural language like \"in 1 hour\")\n attachments: [{ filename: \"example string\" // Name of the attached file, content: \"example string\" // File content as string or Buffer, content_type: \"example string\" // MIME type of the file, path: \"example string\" // Path where the attachment file is hosted }], // Array of email attachments (max 40MB total per email)\n tags: [{ name: \"example string\" // Tag name (ASCII letters, numbers, underscores, dashes only, max 256 chars), value: \"example string\" // Tag value (ASCII letters, numbers, underscores, dashes only, max 256 chars) }], // Array of email tags for tracking and analytics\n headers: { \"example_key\": \"example string\" }, // Custom email headers (e.g., X-Custom-Header)\n});\n\nconst result = await resend_send_email.action();\n// outputSchema for result.data when operation === 'send_email':\n// {\n// operation: \"send_email\" // Send an email via Resend,\n// success: boolean // Whether the email was sent successfully,\n// email_id: string | undefined // Resend email ID if successful,\n// error: string // Error message if email sending failed\n// }\n\n\n// Get Email Status example\nconst resend_get_email_status = new ResendBubble({\n operation: \"get_email_status\", // Get the status of a sent email\n email_id: \"example string\", // Resend email ID to check status for\n});\n\nconst result = await resend_get_email_status.action();\n// outputSchema for result.data when operation === 'get_email_status':\n// {\n// operation: \"get_email_status\" // Get the status of a sent email,\n// success: boolean // Whether the status request was successful,\n// status: string | undefined // Current status of the email,\n// created_at: string | undefined // Timestamp when the email was created,\n// last_event: string | undefined // Last event that occurred with the email,\n// error: string // Error message if status request failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`resend failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
69
82
  "requiredCredentials": [
70
83
  "RESEND_CRED"
71
84
  ]
@@ -78,7 +91,7 @@
78
91
  "useCase": "- Calling external REST APIs",
79
92
  "inputSchema": "{\n url: string // The URL to make the HTTP request to,\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\" | \"HEAD\" | \"OPTIONS\" // HTTP method to use (default: GET),\n headers: Record<string, string> | undefined // HTTP headers to include in the request,\n body: unknown | undefined // Request body (string or JSON object),\n timeout: number // Request timeout in milliseconds (default: 30000, max: 120000),\n followRedirects: boolean // Whether to follow HTTP redirects (default: true),\n credentials: Record<string, string> | undefined // Optional credentials for authentication (injected at runtime)\n}",
80
93
  "outputSchema": "{\n status: number // HTTP status code,\n statusText: string // HTTP status text,\n headers: Record<string, string> // Response headers,\n body: string // Response body as string,\n json: unknown | undefined // Parsed JSON response (if applicable),\n success: boolean // Whether the request was successful (HTTP 2xx status codes),\n error: string // Error message if request failed,\n responseTime: number // Response time in milliseconds,\n size: number // Response size in bytes\n}",
81
- "usageExample": "// Example usage of http bubble\nconst http = new HttpBubble({\n url: \"example string\", // The URL to make the HTTP request to,\n method: \"GET\" // options: \"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\", // HTTP method to use (default: GET),\n headers: { \"example_key\": \"example string\" } // record/object with string keys, // HTTP headers to include in the request,\n timeout: 30000 // default, // Request timeout in milliseconds (default: 30000, max: 120000),\n followRedirects: true // default, // Whether to follow HTTP redirects (default: true),\n});\n\nconst result = await http.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// status: number // HTTP status code,\n// statusText: string // HTTP status text,\n// headers: Record<string, string> // Response headers,\n// body: string // Response body as string,\n// json: unknown | undefined // Parsed JSON response (if applicable),\n// success: boolean // Whether the request was successful (HTTP 2xx status codes),\n// error: string // Error message if request failed,\n// responseTime: number // Response time in milliseconds,\n// size: number // Response size in bytes\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
94
+ "usageExample": "// Example usage of http bubble\nconst http = new HttpBubble({\n url: \"example string\", // The URL to make the HTTP request to,\n method: \"GET\" // options: \"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\", // HTTP method to use (default: GET),\n headers: { \"example_key\": \"example string\" }, // HTTP headers to include in the request,\n body: \"example string\", // Request body (string or JSON object),\n timeout: 30000 // default, // Request timeout in milliseconds (default: 30000, max: 120000),\n followRedirects: true // default, // Whether to follow HTTP redirects (default: true),\n});\n\nconst result = await http.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// status: number // HTTP status code,\n// statusText: string // HTTP status text,\n// headers: Record<string, string> // Response headers,\n// body: string // Response body as string,\n// json: unknown | undefined // Parsed JSON response (if applicable),\n// success: boolean // Whether the request was successful (HTTP 2xx status codes),\n// error: string // Error message if request failed,\n// responseTime: number // Response time in milliseconds,\n// size: number // Response size in bytes\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
82
95
  "requiredCredentials": []
83
96
  },
84
97
  {
@@ -104,7 +117,7 @@
104
117
  "useCase": "- Upload files and documents to Google Drive",
105
118
  "inputSchema": "Complex schema - see usage example for structure",
106
119
  "outputSchema": "Complex schema - see usage example for structure",
107
- "usageExample": "// Upload File example\nconst googleDrive_upload_file = new GoogleDriveBubble({\n operation: \"upload_file\", // Upload a file to Google Drive\n name: \"example string\", // Name for the uploaded file\n content: \"example string\", // File content as base64 encoded string or plain text\n mimeType: \"example string\", // MIME type of the file (auto-detected if not provided)\n parent_folder_id: \"example string\", // ID of the parent folder (uploads to root if not provided)\n convert_to_google_docs: false // default, // Convert uploaded file to Google Docs format if possible\n});\n\nconst result = await googleDrive_upload_file.action();\n// outputSchema for result.data when operation === 'upload_file':\n// {\n// operation: \"upload_file\" // Upload a file to Google Drive,\n// success: boolean // Whether the file was uploaded successfully,\n// file: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners } | undefined // Uploaded file metadata,\n// error: string // Error message if operation failed\n// }\n\n\n// Download File example\nconst googleDrive_download_file = new GoogleDriveBubble({\n operation: \"download_file\", // Download a file from Google Drive\n file_id: \"example string\", // Google Drive file ID to download\n export_format: \"example string\", // Export format for Google Workspace files (e.g., \"application/pdf\", \"text/plain\")\n});\n\nconst result = await googleDrive_download_file.action();\n// outputSchema for result.data when operation === 'download_file':\n// {\n// operation: \"download_file\" // Download a file from Google Drive,\n// success: boolean // Whether the file was downloaded successfully,\n// content: string | undefined // File content as base64 encoded string,\n// filename: string | undefined // Original filename,\n// mimeType: string | undefined // MIME type of the downloaded file,\n// error: string // Error message if operation failed\n// }\n\n\n// List Files example\nconst googleDrive_list_files = new GoogleDriveBubble({\n operation: \"list_files\", // List files and folders in Google Drive\n folder_id: \"example string\", // ID of folder to list files from (lists from root if not provided)\n query: \"example string\", // Search query to filter files (e.g., \"name contains 'report'\"\n max_results: 100 // default, // Maximum number of files to return\n include_folders: true // default, // Include folders in the results\n order_by: \"modifiedTime desc\" // default, // Order results by field (e.g., \"name\", \"modifiedTime desc\")\n});\n\nconst result = await googleDrive_list_files.action();\n// outputSchema for result.data when operation === 'list_files':\n// {\n// operation: \"list_files\" // List files and folders in Google Drive,\n// success: boolean // Whether the file list was retrieved successfully,\n// files: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners }[] | undefined // List of files and folders,\n// total_count: number | undefined // Total number of files found,\n// next_page_token: string | undefined // Token for fetching next page of results,\n// error: string // Error message if operation failed\n// }\n\n\n// Create Folder example\nconst googleDrive_create_folder = new GoogleDriveBubble({\n operation: \"create_folder\", // Create a new folder in Google Drive\n name: \"example string\", // Name of the folder to create\n parent_folder_id: \"example string\", // ID of the parent folder (creates in root if not provided)\n});\n\nconst result = await googleDrive_create_folder.action();\n// outputSchema for result.data when operation === 'create_folder':\n// {\n// operation: \"create_folder\" // Create a new folder in Google Drive,\n// success: boolean // Whether the folder was created successfully,\n// folder: { id: string // Unique folder identifier, name: string // Name of the folder, webViewLink: string | undefined // Link to view the folder in Google Drive, parents: string[] | undefined // Parent folder IDs } | undefined // Created folder metadata,\n// error: string // Error message if operation failed\n// }\n\n\n// Delete File example\nconst googleDrive_delete_file = new GoogleDriveBubble({\n operation: \"delete_file\", // Delete a file or folder from Google Drive\n file_id: \"example string\", // Google Drive file or folder ID to delete\n permanent: false // default, // Permanently delete (true) or move to trash (false)\n});\n\nconst result = await googleDrive_delete_file.action();\n// outputSchema for result.data when operation === 'delete_file':\n// {\n// operation: \"delete_file\" // Delete a file or folder from Google Drive,\n// success: boolean // Whether the file was deleted successfully,\n// deleted_file_id: string | undefined // ID of the deleted file,\n// error: string // Error message if operation failed\n// }\n\n\n// Get File Info example\nconst googleDrive_get_file_info = new GoogleDriveBubble({\n operation: \"get_file_info\", // Get detailed information about a file or folder\n file_id: \"example string\", // Google Drive file or folder ID to get info for\n include_permissions: false // default, // Include file permissions in the response\n});\n\nconst result = await googleDrive_get_file_info.action();\n// outputSchema for result.data when operation === 'get_file_info':\n// {\n// operation: \"get_file_info\" // Get detailed information about a file or folder,\n// success: boolean // Whether the file information was retrieved successfully,\n// file: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners } | undefined // File metadata and information,\n// permissions: { id: string, type: string, role: string, emailAddress: string | undefined // Permission holder email address, displayName: string | undefined // Permission holder display name }[] | undefined // File permissions (if requested),\n// error: string // Error message if operation failed\n// }\n\n\n// Share File example\nconst googleDrive_share_file = new GoogleDriveBubble({\n operation: \"share_file\", // Share a file or folder with specific users or make it public\n file_id: \"example string\", // Google Drive file or folder ID to share\n email_address: \"example string\", // Email address to share with (for specific user sharing)\n role: \"reader\" // options: \"reader\", \"writer\", \"commenter\", \"owner\", // Permission role to grant\n type: \"user\" // options: \"user\", \"group\", \"domain\", \"anyone\", // Type of permission to create\n send_notification: true // default, // Send notification email to the user\n});\n\nconst result = await googleDrive_share_file.action();\n// outputSchema for result.data when operation === 'share_file':\n// {\n// operation: \"share_file\" // Share a file or folder with specific users or make it public,\n// success: boolean // Whether the file was shared successfully,\n// permission_id: string | undefined // ID of the created permission,\n// share_link: string | undefined // Shareable link to the file,\n// error: string // Error message if operation failed\n// }\n\n\n// Move File example\nconst googleDrive_move_file = new GoogleDriveBubble({\n operation: \"move_file\", // Move a file or folder to a different location in Google Drive\n file_id: \"example string\", // Google Drive file or folder ID to move\n new_parent_folder_id: \"example string\", // ID of the new parent folder (moves to root if not provided)\n remove_parent_folder_id: \"example string\", // ID of the parent folder to remove (removes from all parents if not provided)\n});\n\nconst result = await googleDrive_move_file.action();\n// outputSchema for result.data when operation === 'move_file':\n// {\n// operation: \"move_file\" // Move a file or folder to a different location in Google Drive,\n// success: boolean // Whether the file was moved successfully,\n// file: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners } | undefined // Updated file metadata after move,\n// error: string // Error message if operation failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`google-drive failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
120
+ "usageExample": "// Upload File example\nconst googleDrive_upload_file = new GoogleDriveBubble({\n operation: \"upload_file\", // Upload a file to Google Drive\n name: \"example string\", // Name for the uploaded file\n content: \"example string\", // File content as base64 encoded string or plain text\n mimeType: \"example string\", // MIME type of the file (auto-detected if not provided)\n parent_folder_id: \"example string\", // ID of the parent folder (uploads to root if not provided)\n convert_to_google_docs: false // default, // Convert uploaded file to Google Docs format if possible\n});\n\nconst result = await googleDrive_upload_file.action();\n// outputSchema for result.data when operation === 'upload_file':\n// {\n// operation: \"upload_file\" // Upload a file to Google Drive,\n// success: boolean // Whether the file was uploaded successfully,\n// file: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners } | undefined // Uploaded file metadata,\n// error: string // Error message if operation failed\n// }\n\n\n// Download File example\nconst googleDrive_download_file = new GoogleDriveBubble({\n operation: \"download_file\", // Download a file from Google Drive\n file_id: \"example string\", // Google Drive file ID to download\n export_format: \"example string\", // Export format for Google Workspace files (e.g., \"application/pdf\", \"text/plain\")\n});\n\nconst result = await googleDrive_download_file.action();\n// outputSchema for result.data when operation === 'download_file':\n// {\n// operation: \"download_file\" // Download a file from Google Drive,\n// success: boolean // Whether the file was downloaded successfully,\n// content: string | undefined // File content as plain text (for text-based files) or base64 encoded string (for binary files),\n// filename: string | undefined // Original filename,\n// mimeType: string | undefined // MIME type of the downloaded file,\n// error: string // Error message if operation failed\n// }\n\n\n// List Files example\nconst googleDrive_list_files = new GoogleDriveBubble({\n operation: \"list_files\", // List files and folders in Google Drive\n folder_id: \"example string\", // ID of folder to list files from (lists from root if not provided)\n query: \"example string\", // Search query to filter files (e.g., \"name contains 'report'\"\n max_results: 100 // default, // Maximum number of files to return\n include_folders: true // default, // Include folders in the results\n order_by: \"modifiedTime desc\" // default, // Order results by field (e.g., \"name\", \"modifiedTime desc\")\n});\n\nconst result = await googleDrive_list_files.action();\n// outputSchema for result.data when operation === 'list_files':\n// {\n// operation: \"list_files\" // List files and folders in Google Drive,\n// success: boolean // Whether the file list was retrieved successfully,\n// files: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners }[] | undefined // List of files and folders,\n// total_count: number | undefined // Total number of files found,\n// next_page_token: string | undefined // Token for fetching next page of results,\n// error: string // Error message if operation failed\n// }\n\n\n// Create Folder example\nconst googleDrive_create_folder = new GoogleDriveBubble({\n operation: \"create_folder\", // Create a new folder in Google Drive\n name: \"example string\", // Name of the folder to create\n parent_folder_id: \"example string\", // ID of the parent folder (creates in root if not provided)\n});\n\nconst result = await googleDrive_create_folder.action();\n// outputSchema for result.data when operation === 'create_folder':\n// {\n// operation: \"create_folder\" // Create a new folder in Google Drive,\n// success: boolean // Whether the folder was created successfully,\n// folder: { id: string // Unique folder identifier, name: string // Name of the folder, webViewLink: string | undefined // Link to view the folder in Google Drive, parents: string[] | undefined // Parent folder IDs } | undefined // Created folder metadata,\n// error: string // Error message if operation failed\n// }\n\n\n// Delete File example\nconst googleDrive_delete_file = new GoogleDriveBubble({\n operation: \"delete_file\", // Delete a file or folder from Google Drive\n file_id: \"example string\", // Google Drive file or folder ID to delete\n permanent: false // default, // Permanently delete (true) or move to trash (false)\n});\n\nconst result = await googleDrive_delete_file.action();\n// outputSchema for result.data when operation === 'delete_file':\n// {\n// operation: \"delete_file\" // Delete a file or folder from Google Drive,\n// success: boolean // Whether the file was deleted successfully,\n// deleted_file_id: string | undefined // ID of the deleted file,\n// error: string // Error message if operation failed\n// }\n\n\n// Get File Info example\nconst googleDrive_get_file_info = new GoogleDriveBubble({\n operation: \"get_file_info\", // Get detailed information about a file or folder\n file_id: \"example string\", // Google Drive file or folder ID to get info for\n include_permissions: false // default, // Include file permissions in the response\n});\n\nconst result = await googleDrive_get_file_info.action();\n// outputSchema for result.data when operation === 'get_file_info':\n// {\n// operation: \"get_file_info\" // Get detailed information about a file or folder,\n// success: boolean // Whether the file information was retrieved successfully,\n// file: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners } | undefined // File metadata and information,\n// permissions: { id: string, type: string, role: string, emailAddress: string | undefined // Permission holder email address, displayName: string | undefined // Permission holder display name }[] | undefined // File permissions (if requested),\n// error: string // Error message if operation failed\n// }\n\n\n// Share File example\nconst googleDrive_share_file = new GoogleDriveBubble({\n operation: \"share_file\", // Share a file or folder with specific users or make it public\n file_id: \"example string\", // Google Drive file or folder ID to share\n email_address: \"example string\", // Email address to share with (for specific user sharing)\n role: \"reader\" // options: \"reader\", \"writer\", \"commenter\", \"owner\", // Permission role to grant\n type: \"user\" // options: \"user\", \"group\", \"domain\", \"anyone\", // Type of permission to create\n send_notification: true // default, // Send notification email to the user\n});\n\nconst result = await googleDrive_share_file.action();\n// outputSchema for result.data when operation === 'share_file':\n// {\n// operation: \"share_file\" // Share a file or folder with specific users or make it public,\n// success: boolean // Whether the file was shared successfully,\n// permission_id: string | undefined // ID of the created permission,\n// share_link: string | undefined // Shareable link to the file,\n// error: string // Error message if operation failed\n// }\n\n\n// Move File example\nconst googleDrive_move_file = new GoogleDriveBubble({\n operation: \"move_file\", // Move a file or folder to a different location in Google Drive\n file_id: \"example string\", // Google Drive file or folder ID to move\n new_parent_folder_id: \"example string\", // ID of the new parent folder (moves to root if not provided)\n remove_parent_folder_id: \"example string\", // ID of the parent folder to remove (removes from all parents if not provided)\n});\n\nconst result = await googleDrive_move_file.action();\n// outputSchema for result.data when operation === 'move_file':\n// {\n// operation: \"move_file\" // Move a file or folder to a different location in Google Drive,\n// success: boolean // Whether the file was moved successfully,\n// file: { id: string // Unique file identifier, name: string // Name of the file, mimeType: string // MIME type of the file, size: string | undefined // Size of the file in bytes, createdTime: string | undefined // Creation time in RFC 3339 format, modifiedTime: string | undefined // Last modified time in RFC 3339 format, webViewLink: string | undefined // Link to view the file in Google Drive, webContentLink: string | undefined // Link to download the file, parents: string[] | undefined // Parent folder IDs, shared: boolean | undefined // Whether the file is shared, owners: { displayName: string | undefined // Owner display name, emailAddress: string | undefined // Owner email address }[] | undefined // File owners } | undefined // Updated file metadata after move,\n// error: string // Error message if operation failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`google-drive failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
108
121
  "requiredCredentials": [
109
122
  "GOOGLE_DRIVE_CRED"
110
123
  ]
@@ -130,7 +143,7 @@
130
143
  "useCase": "- Read and write spreadsheet data with flexible ranges",
131
144
  "inputSchema": "Complex schema - see usage example for structure",
132
145
  "outputSchema": "Complex schema - see usage example for structure",
133
- "usageExample": "// Read Values example\nconst googleSheets_read_values = new GoogleSheetsBubble({\n operation: \"read_values\", // Read values from a range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n range: \"example string\", // A1 notation range (e.g., \"Sheet1!A1:B10\")\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_render_option: \"FORMATTED_VALUE\" // options: \"FORMATTED_VALUE\", \"UNFORMATTED_VALUE\", \"FORMULA\", // How values should be represented in the output\n date_time_render_option: \"SERIAL_NUMBER\" // options: \"SERIAL_NUMBER\", \"FORMATTED_STRING\", // How date/time values should be rendered\n});\n\nconst result = await googleSheets_read_values.action();\n// outputSchema for result.data when operation === 'read_values':\n// {\n// operation: \"read_values\" // Read values from a range,\n// success: boolean // Whether the operation was successful,\n// range: string | undefined // The range that was read,\n// values: unknown[][] | undefined // The values that were read,\n// major_dimension: string | undefined // Major dimension of the returned values,\n// error: string // Error message if operation failed\n// }\n\n\n// Write Values example\nconst googleSheets_write_values = new GoogleSheetsBubble({\n operation: \"write_values\", // Write values to a range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n range: \"example string\", // A1 notation range (e.g., \"Sheet1!A1:B10\")\n values: [[]], // Data to write as array of arrays\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n include_values_in_response: false // default, // Include updated values in response\n});\n\nconst result = await googleSheets_write_values.action();\n// outputSchema for result.data when operation === 'write_values':\n// {\n// operation: \"write_values\" // Write values to a range,\n// success: boolean // Whether the operation was successful,\n// updated_range: string | undefined // The range that was updated,\n// updated_rows: number | undefined // Number of rows updated,\n// updated_columns: number | undefined // Number of columns updated,\n// updated_cells: number | undefined // Number of cells updated,\n// updated_data: { range: string // The A1 notation range, majorDimension: \"ROWS\" | \"COLUMNS\" | undefined // Major dimension of the values, values: unknown[][] // The data values as array of arrays } | undefined // Updated data if requested,\n// error: string // Error message if operation failed\n// }\n\n\n// Update Values example\nconst googleSheets_update_values = new GoogleSheetsBubble({\n operation: \"update_values\", // Update values in a specific range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n range: \"example string\", // A1 notation range (e.g., \"Sheet1!A1:B10\")\n values: [[]], // Data to update as array of arrays\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n include_values_in_response: false // default, // Include updated values in response\n});\n\nconst result = await googleSheets_update_values.action();\n// outputSchema for result.data when operation === 'update_values':\n// {\n// operation: \"update_values\" // Update values in a specific range,\n// success: boolean // Whether the operation was successful,\n// updated_range: string | undefined // The range that was updated,\n// updated_rows: number | undefined // Number of rows updated,\n// updated_columns: number | undefined // Number of columns updated,\n// updated_cells: number | undefined // Number of cells updated,\n// updated_data: { range: string // The A1 notation range, majorDimension: \"ROWS\" | \"COLUMNS\" | undefined // Major dimension of the values, values: unknown[][] // The data values as array of arrays } | undefined // Updated data if requested,\n// error: string // Error message if operation failed\n// }\n\n\n// Append Values example\nconst googleSheets_append_values = new GoogleSheetsBubble({\n operation: \"append_values\", // Append values to the end of a table\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n range: \"example string\", // A1 notation range to search for table (e.g., \"Sheet1!A:A\")\n values: [[]], // Data to append as array of arrays\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n insert_data_option: \"OVERWRITE\" // options: \"OVERWRITE\", \"INSERT_ROWS\", // How data should be inserted\n include_values_in_response: false // default, // Include appended values in response\n});\n\nconst result = await googleSheets_append_values.action();\n// outputSchema for result.data when operation === 'append_values':\n// {\n// operation: \"append_values\" // Append values to the end of a table,\n// success: boolean // Whether the operation was successful,\n// table_range: string | undefined // The table range values were appended to,\n// updated_range: string | undefined // The range that was updated,\n// updated_rows: number | undefined // Number of rows updated,\n// updated_columns: number | undefined // Number of columns updated,\n// updated_cells: number | undefined // Number of cells updated,\n// error: string // Error message if operation failed\n// }\n\n\n// Clear Values example\nconst googleSheets_clear_values = new GoogleSheetsBubble({\n operation: \"clear_values\", // Clear values from a range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n range: \"example string\", // A1 notation range (e.g., \"Sheet1!A1:B10\")\n});\n\nconst result = await googleSheets_clear_values.action();\n// outputSchema for result.data when operation === 'clear_values':\n// {\n// operation: \"clear_values\" // Clear values from a range,\n// success: boolean // Whether the operation was successful,\n// cleared_range: string | undefined // The range that was cleared,\n// error: string // Error message if operation failed\n// }\n\n\n// Batch Read Values example\nconst googleSheets_batch_read_values = new GoogleSheetsBubble({\n operation: \"batch_read_values\", // Read multiple ranges at once\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n ranges: [\"example string\"], // Array of A1 notation ranges\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_render_option: \"FORMATTED_VALUE\" // options: \"FORMATTED_VALUE\", \"UNFORMATTED_VALUE\", \"FORMULA\", // How values should be represented in the output\n date_time_render_option: \"SERIAL_NUMBER\" // options: \"SERIAL_NUMBER\", \"FORMATTED_STRING\", // How date/time values should be rendered\n});\n\nconst result = await googleSheets_batch_read_values.action();\n// outputSchema for result.data when operation === 'batch_read_values':\n// {\n// operation: \"batch_read_values\" // Read multiple ranges at once,\n// success: boolean // Whether the operation was successful,\n// value_ranges: { range: string // The A1 notation range, majorDimension: \"ROWS\" | \"COLUMNS\" | undefined // Major dimension of the values, values: unknown[][] // The data values as array of arrays }[] | undefined // Array of value ranges that were read,\n// error: string // Error message if operation failed\n// }\n\n\n// Batch Update Values example\nconst googleSheets_batch_update_values = new GoogleSheetsBubble({\n operation: \"batch_update_values\", // Update multiple ranges at once\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n value_ranges: [{ range: \"example string\" // A1 notation range, values: [[]] // Data values, major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\" }], // Array of value ranges to update\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n include_values_in_response: false // default, // Include updated values in response\n});\n\nconst result = await googleSheets_batch_update_values.action();\n// outputSchema for result.data when operation === 'batch_update_values':\n// {\n// operation: \"batch_update_values\" // Update multiple ranges at once,\n// success: boolean // Whether the operation was successful,\n// total_updated_rows: number | undefined // Total number of rows updated across all ranges,\n// total_updated_columns: number | undefined // Total number of columns updated across all ranges,\n// total_updated_cells: number | undefined // Total number of cells updated across all ranges,\n// total_updated_sheets: number | undefined // Total number of sheets updated,\n// responses: { updated_range: string | undefined // Range that was updated, updated_rows: number | undefined // Number of rows updated in this range, updated_columns: number | undefined // Number of columns updated in this range, updated_cells: number | undefined // Number of cells updated in this range }[] | undefined // Individual update responses,\n// error: string // Error message if operation failed\n// }\n\n\n// Get Spreadsheet Info example\nconst googleSheets_get_spreadsheet_info = new GoogleSheetsBubble({\n operation: \"get_spreadsheet_info\", // Get spreadsheet metadata and properties\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n include_grid_data: false // default, // Include grid data in response\n});\n\nconst result = await googleSheets_get_spreadsheet_info.action();\n// outputSchema for result.data when operation === 'get_spreadsheet_info':\n// {\n// operation: \"get_spreadsheet_info\" // Get spreadsheet metadata and properties,\n// success: boolean // Whether the operation was successful,\n// spreadsheet: { spreadsheetId: string // Unique spreadsheet identifier, properties: { title: string // Spreadsheet title, locale: string | undefined // Spreadsheet locale, autoRecalc: string | undefined // Auto recalc setting, timeZone: string | undefined // Time zone } | undefined // Spreadsheet properties, sheets: { properties: { sheetId: number // Sheet ID, title: string // Sheet title, index: number // Sheet index, sheetType: string | undefined // Sheet type, gridProperties: { rowCount: number | undefined // Number of rows in the sheet, columnCount: number | undefined // Number of columns in the sheet } | undefined // Grid properties of the sheet } // Sheet properties }[] | undefined // List of sheets in the spreadsheet, spreadsheetUrl: string | undefined // URL to the spreadsheet } | undefined // Spreadsheet information,\n// error: string // Error message if operation failed\n// }\n\n\n// Create Spreadsheet example\nconst googleSheets_create_spreadsheet = new GoogleSheetsBubble({\n operation: \"create_spreadsheet\", // Create a new spreadsheet\n title: \"example string\", // Title for the new spreadsheet\n sheet_titles: [\"Sheet1\"] // default, // Titles for the initial sheets\n});\n\nconst result = await googleSheets_create_spreadsheet.action();\n// outputSchema for result.data when operation === 'create_spreadsheet':\n// {\n// operation: \"create_spreadsheet\" // Create a new spreadsheet,\n// success: boolean // Whether the operation was successful,\n// spreadsheet: { spreadsheetId: string // Unique spreadsheet identifier, properties: { title: string // Spreadsheet title, locale: string | undefined // Spreadsheet locale, autoRecalc: string | undefined // Auto recalc setting, timeZone: string | undefined // Time zone } | undefined // Spreadsheet properties, sheets: { properties: { sheetId: number // Sheet ID, title: string // Sheet title, index: number // Sheet index, sheetType: string | undefined // Sheet type, gridProperties: { rowCount: number | undefined // Number of rows in the sheet, columnCount: number | undefined // Number of columns in the sheet } | undefined // Grid properties of the sheet } // Sheet properties }[] | undefined // List of sheets in the spreadsheet, spreadsheetUrl: string | undefined // URL to the spreadsheet } | undefined // Created spreadsheet information,\n// error: string // Error message if operation failed\n// }\n\n\n// Add Sheet example\nconst googleSheets_add_sheet = new GoogleSheetsBubble({\n operation: \"add_sheet\", // Add a new sheet to spreadsheet\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n sheet_title: \"example string\", // Title for the new sheet\n row_count: 1000 // default, // Number of rows in the new sheet\n column_count: 26 // default, // Number of columns in the new sheet\n});\n\nconst result = await googleSheets_add_sheet.action();\n// outputSchema for result.data when operation === 'add_sheet':\n// {\n// operation: \"add_sheet\" // Add a new sheet to spreadsheet,\n// success: boolean // Whether the operation was successful,\n// sheet_id: number | undefined // ID of the added sheet,\n// sheet_title: string | undefined // Title of the added sheet,\n// error: string // Error message if operation failed\n// }\n\n\n// Delete Sheet example\nconst googleSheets_delete_sheet = new GoogleSheetsBubble({\n operation: \"delete_sheet\", // Delete a sheet from spreadsheet\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n sheet_id: 42, // ID of the sheet to delete\n});\n\nconst result = await googleSheets_delete_sheet.action();\n// outputSchema for result.data when operation === 'delete_sheet':\n// {\n// operation: \"delete_sheet\" // Delete a sheet from spreadsheet,\n// success: boolean // Whether the operation was successful,\n// deleted_sheet_id: number | undefined // ID of the deleted sheet,\n// error: string // Error message if operation failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`google-sheets failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
146
+ "usageExample": "// Read Values example\nconst googleSheets_read_values = new GoogleSheetsBubble({\n operation: \"read_values\", // Read values from a range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_render_option: \"FORMATTED_VALUE\" // options: \"FORMATTED_VALUE\", \"UNFORMATTED_VALUE\", \"FORMULA\", // How values should be represented in the output\n date_time_render_option: \"SERIAL_NUMBER\" // options: \"SERIAL_NUMBER\", \"FORMATTED_STRING\", // How date/time values should be rendered\n});\n\nconst result = await googleSheets_read_values.action();\n// outputSchema for result.data when operation === 'read_values':\n// {\n// operation: \"read_values\" // Read values from a range,\n// success: boolean // Whether the operation was successful,\n// range: string | undefined // The range that was read,\n// values: unknown[][] | undefined // The values that were read,\n// major_dimension: string | undefined // Major dimension of the returned values,\n// error: string // Error message if operation failed\n// }\n\n\n// Write Values example\nconst googleSheets_write_values = new GoogleSheetsBubble({\n operation: \"write_values\", // Write values to a range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n include_values_in_response: false // default, // Include updated values in response\n});\n\nconst result = await googleSheets_write_values.action();\n// outputSchema for result.data when operation === 'write_values':\n// {\n// operation: \"write_values\" // Write values to a range,\n// success: boolean // Whether the operation was successful,\n// updated_range: string | undefined // The range that was updated,\n// updated_rows: number | undefined // Number of rows updated,\n// updated_columns: number | undefined // Number of columns updated,\n// updated_cells: number | undefined // Number of cells updated,\n// updated_data: { range: string // The A1 notation range, majorDimension: \"ROWS\" | \"COLUMNS\" | undefined // Major dimension of the values, values: unknown[][] // The data values as array of arrays } | undefined // Updated data if requested,\n// error: string // Error message if operation failed\n// }\n\n\n// Update Values example\nconst googleSheets_update_values = new GoogleSheetsBubble({\n operation: \"update_values\", // Update values in a specific range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n include_values_in_response: false // default, // Include updated values in response\n});\n\nconst result = await googleSheets_update_values.action();\n// outputSchema for result.data when operation === 'update_values':\n// {\n// operation: \"update_values\" // Update values in a specific range,\n// success: boolean // Whether the operation was successful,\n// updated_range: string | undefined // The range that was updated,\n// updated_rows: number | undefined // Number of rows updated,\n// updated_columns: number | undefined // Number of columns updated,\n// updated_cells: number | undefined // Number of cells updated,\n// updated_data: { range: string // The A1 notation range, majorDimension: \"ROWS\" | \"COLUMNS\" | undefined // Major dimension of the values, values: unknown[][] // The data values as array of arrays } | undefined // Updated data if requested,\n// error: string // Error message if operation failed\n// }\n\n\n// Append Values example\nconst googleSheets_append_values = new GoogleSheetsBubble({\n operation: \"append_values\", // Append values to the end of a table\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n insert_data_option: \"OVERWRITE\" // options: \"OVERWRITE\", \"INSERT_ROWS\", // How data should be inserted\n include_values_in_response: false // default, // Include appended values in response\n});\n\nconst result = await googleSheets_append_values.action();\n// outputSchema for result.data when operation === 'append_values':\n// {\n// operation: \"append_values\" // Append values to the end of a table,\n// success: boolean // Whether the operation was successful,\n// table_range: string | undefined // The table range values were appended to,\n// updated_range: string | undefined // The range that was updated,\n// updated_rows: number | undefined // Number of rows updated,\n// updated_columns: number | undefined // Number of columns updated,\n// updated_cells: number | undefined // Number of cells updated,\n// error: string // Error message if operation failed\n// }\n\n\n// Clear Values example\nconst googleSheets_clear_values = new GoogleSheetsBubble({\n operation: \"clear_values\", // Clear values from a range\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n});\n\nconst result = await googleSheets_clear_values.action();\n// outputSchema for result.data when operation === 'clear_values':\n// {\n// operation: \"clear_values\" // Clear values from a range,\n// success: boolean // Whether the operation was successful,\n// cleared_range: string | undefined // The range that was cleared,\n// error: string // Error message if operation failed\n// }\n\n\n// Batch Read Values example\nconst googleSheets_batch_read_values = new GoogleSheetsBubble({\n operation: \"batch_read_values\", // Read multiple ranges at once\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\", // Major dimension for the values\n value_render_option: \"FORMATTED_VALUE\" // options: \"FORMATTED_VALUE\", \"UNFORMATTED_VALUE\", \"FORMULA\", // How values should be represented in the output\n date_time_render_option: \"SERIAL_NUMBER\" // options: \"SERIAL_NUMBER\", \"FORMATTED_STRING\", // How date/time values should be rendered\n});\n\nconst result = await googleSheets_batch_read_values.action();\n// outputSchema for result.data when operation === 'batch_read_values':\n// {\n// operation: \"batch_read_values\" // Read multiple ranges at once,\n// success: boolean // Whether the operation was successful,\n// value_ranges: { range: string // The A1 notation range, majorDimension: \"ROWS\" | \"COLUMNS\" | undefined // Major dimension of the values, values: unknown[][] // The data values as array of arrays }[] | undefined // Array of value ranges that were read,\n// error: string // Error message if operation failed\n// }\n\n\n// Batch Update Values example\nconst googleSheets_batch_update_values = new GoogleSheetsBubble({\n operation: \"batch_update_values\", // Update multiple ranges at once\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n value_ranges: [{ major_dimension: \"ROWS\" // options: \"ROWS\", \"COLUMNS\" }], // Array of value ranges to update\n value_input_option: \"RAW\" // options: \"RAW\", \"USER_ENTERED\", // How input data should be interpreted\n include_values_in_response: false // default, // Include updated values in response\n});\n\nconst result = await googleSheets_batch_update_values.action();\n// outputSchema for result.data when operation === 'batch_update_values':\n// {\n// operation: \"batch_update_values\" // Update multiple ranges at once,\n// success: boolean // Whether the operation was successful,\n// total_updated_rows: number | undefined // Total number of rows updated across all ranges,\n// total_updated_columns: number | undefined // Total number of columns updated across all ranges,\n// total_updated_cells: number | undefined // Total number of cells updated across all ranges,\n// total_updated_sheets: number | undefined // Total number of sheets updated,\n// responses: { updated_range: string | undefined // Range that was updated, updated_rows: number | undefined // Number of rows updated in this range, updated_columns: number | undefined // Number of columns updated in this range, updated_cells: number | undefined // Number of cells updated in this range }[] | undefined // Individual update responses,\n// error: string // Error message if operation failed\n// }\n\n\n// Get Spreadsheet Info example\nconst googleSheets_get_spreadsheet_info = new GoogleSheetsBubble({\n operation: \"get_spreadsheet_info\", // Get spreadsheet metadata and properties\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n include_grid_data: false // default, // Include grid data in response\n});\n\nconst result = await googleSheets_get_spreadsheet_info.action();\n// outputSchema for result.data when operation === 'get_spreadsheet_info':\n// {\n// operation: \"get_spreadsheet_info\" // Get spreadsheet metadata and properties,\n// success: boolean // Whether the operation was successful,\n// spreadsheet: { spreadsheetId: string // Unique spreadsheet identifier, properties: { title: string // Spreadsheet title, locale: string | undefined // Spreadsheet locale, autoRecalc: string | undefined // Auto recalc setting, timeZone: string | undefined // Time zone } | undefined // Spreadsheet properties, sheets: { properties: { sheetId: number // Sheet ID, title: string // Sheet title, index: number // Sheet index, sheetType: string | undefined // Sheet type, gridProperties: { rowCount: number | undefined // Number of rows in the sheet, columnCount: number | undefined // Number of columns in the sheet } | undefined // Grid properties of the sheet } // Sheet properties }[] | undefined // List of sheets in the spreadsheet, spreadsheetUrl: string | undefined // URL to the spreadsheet } | undefined // Spreadsheet information,\n// error: string // Error message if operation failed\n// }\n\n\n// Create Spreadsheet example\nconst googleSheets_create_spreadsheet = new GoogleSheetsBubble({\n operation: \"create_spreadsheet\", // Create a new spreadsheet\n title: \"example string\", // Title for the new spreadsheet\n sheet_titles: [\"Sheet1\"] // default, // Titles for the initial sheets\n});\n\nconst result = await googleSheets_create_spreadsheet.action();\n// outputSchema for result.data when operation === 'create_spreadsheet':\n// {\n// operation: \"create_spreadsheet\" // Create a new spreadsheet,\n// success: boolean // Whether the operation was successful,\n// spreadsheet: { spreadsheetId: string // Unique spreadsheet identifier, properties: { title: string // Spreadsheet title, locale: string | undefined // Spreadsheet locale, autoRecalc: string | undefined // Auto recalc setting, timeZone: string | undefined // Time zone } | undefined // Spreadsheet properties, sheets: { properties: { sheetId: number // Sheet ID, title: string // Sheet title, index: number // Sheet index, sheetType: string | undefined // Sheet type, gridProperties: { rowCount: number | undefined // Number of rows in the sheet, columnCount: number | undefined // Number of columns in the sheet } | undefined // Grid properties of the sheet } // Sheet properties }[] | undefined // List of sheets in the spreadsheet, spreadsheetUrl: string | undefined // URL to the spreadsheet } | undefined // Created spreadsheet information,\n// error: string // Error message if operation failed\n// }\n\n\n// Add Sheet example\nconst googleSheets_add_sheet = new GoogleSheetsBubble({\n operation: \"add_sheet\", // Add a new sheet to spreadsheet\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n sheet_title: \"example string\", // Title for the new sheet\n row_count: 1000 // default, // Number of rows in the new sheet\n column_count: 26 // default, // Number of columns in the new sheet\n});\n\nconst result = await googleSheets_add_sheet.action();\n// outputSchema for result.data when operation === 'add_sheet':\n// {\n// operation: \"add_sheet\" // Add a new sheet to spreadsheet,\n// success: boolean // Whether the operation was successful,\n// sheet_id: number | undefined // ID of the added sheet,\n// sheet_title: string | undefined // Title of the added sheet,\n// error: string // Error message if operation failed\n// }\n\n\n// Delete Sheet example\nconst googleSheets_delete_sheet = new GoogleSheetsBubble({\n operation: \"delete_sheet\", // Delete a sheet from spreadsheet\n spreadsheet_id: \"example string\", // Google Sheets spreadsheet ID\n sheet_id: 42, // ID of the sheet to delete\n});\n\nconst result = await googleSheets_delete_sheet.action();\n// outputSchema for result.data when operation === 'delete_sheet':\n// {\n// operation: \"delete_sheet\" // Delete a sheet from spreadsheet,\n// success: boolean // Whether the operation was successful,\n// deleted_sheet_id: number | undefined // ID of the deleted sheet,\n// error: string // Error message if operation failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`google-sheets failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
134
147
  "requiredCredentials": [
135
148
  "GOOGLE_SHEETS_CRED"
136
149
  ]
@@ -152,27 +165,52 @@
152
165
  "name": "apify",
153
166
  "alias": "scrape",
154
167
  "type": "service",
155
- "shortDescription": "Run any Apify actor for web scraping and automation",
156
- "useCase": "- Social media scraping (Instagram, Reddit, LinkedIn, etc.)",
157
- "inputSchema": "{\n actorId: string // The Apify actor to run. Examples: \"apify/instagram-scraper\", \"apify/reddit-scraper\", etc.,\n input: Record<string, unknown> // Input parameters for the actor. Structure depends on the specific actor being used.,\n waitForFinish: boolean | undefined // Whether to wait for the actor run to complete before returning,\n timeout: number | undefined // Maximum time to wait for actor completion in milliseconds (default: 120000),\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
158
- "outputSchema": "{\n runId: string // Apify actor run ID,\n status: string // Actor run status (READY, RUNNING, SUCCEEDED, FAILED, etc.),\n datasetId: string | undefined // Dataset ID where results are stored,\n items: unknown[] | undefined // Array of scraped items (if waitForFinish is true). Structure depends on the actor.,\n itemsCount: number | undefined // Total number of items scraped,\n consoleUrl: string // URL to view the actor run in Apify console,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
159
- "usageExample": "// Example usage of apify bubble\nconst apify = new ApifyBubble({\n actorId: \"example string\", // The Apify actor to run. Examples: \"apify/instagram-scraper\", \"apify/reddit-scraper\", etc.,\n input: {} // record/object with string keys, // Input parameters for the actor. Structure depends on the specific actor being used.,\n waitForFinish: true // default, // Whether to wait for the actor run to complete before returning,\n timeout: 120000 // default, // Maximum time to wait for actor completion in milliseconds (default: 120000),\n});\n\nconst result = await apify.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// runId: string // Apify actor run ID,\n// status: string // Actor run status (READY, RUNNING, SUCCEEDED, FAILED, etc.),\n// datasetId: string | undefined // Dataset ID where results are stored,\n// items: unknown[] | undefined // Array of scraped items (if waitForFinish is true). Structure depends on the actor.,\n// itemsCount: number | undefined // Total number of items scraped,\n// consoleUrl: string // URL to view the actor run in Apify console,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
168
+ "shortDescription": "Discover and run specialized Apify actors for complex web scraping tasks not covered by standard tools",
169
+ "useCase": "- Discovering available actors and their schemas then",
170
+ "inputSchema": "{\n actorId: string | undefined // The Apify actor to run. Examples: \"apify/instagram-scraper\", \"apify/reddit-scraper\", etc. Required when running an actor, not needed for discovery mode.,\n search: string | undefined // Search query to discover available Apify actors. When provided, this triggers discovery mode to search for actors matching the query and return their schemas and information.,\n limit: number | undefined // Maximum number of actors to return in discovery mode (default: 20, max: 100),\n input: Record<string, unknown> // Input parameters for the actor. Structure depends on the specific actor being used. Not used in discovery mode.,\n waitForFinish: boolean | undefined // Whether to wait for the actor run to complete before returning,\n timeout: number | undefined // Maximum time to wait for actor completion in milliseconds (default: 120000),\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
171
+ "outputSchema": "{\n runId: string // Apify actor run ID,\n status: string // Actor run status (READY, RUNNING, SUCCEEDED, FAILED, etc.),\n datasetId: string | undefined // Dataset ID where results are stored,\n items: unknown[] | undefined // Array of scraped items (if waitForFinish is true). Structure depends on the actor. For discovery mode, contains actor information with schemas.,\n itemsCount: number | undefined // Total number of items scraped,\n consoleUrl: string // URL to view the actor run in Apify console,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed,\n discoveredActors: { id: string // Actor ID (e.g., \"apify/instagram-scraper\"), name: string // Full actor path (e.g., \"beauty/linkedin-jobs-scraper\"), description: string | null | undefined // Actor description, inputSchemaUrl: string // URL to the actor input schema page. Use the web scrape tool to scrape from this URL (e.g., https://apify.com/apify/google-search-scraper/input-schema) to get the input/output schema details., stars: number | null | undefined // Actor rating (if available), usage: { totalRuns: number | undefined, usersCount: number | undefined } | null | undefined // Basic usage stats, requiresRental: boolean | undefined // Whether this actor requires rental/private access (filtered out when true) }[] | undefined // Discovered actors with description and input schema URL (only present in discovery mode)\n}",
172
+ "usageExample": "// Example usage of apify bubble\nconst apify = new ApifyBubble({\n actorId: \"example string\", // The Apify actor to run. Examples: \"apify/instagram-scraper\", \"apify/reddit-scraper\", etc. Required when running an actor, not needed for discovery mode.,\n search: \"example string\", // Search query to discover available Apify actors. When provided, this triggers discovery mode to search for actors matching the query and return their schemas and information.,\n limit: 20 // default, // Maximum number of actors to return in discovery mode (default: 20, max: 100),\n input: {}, // Input parameters for the actor. Structure depends on the specific actor being used. Not used in discovery mode.,\n waitForFinish: true // default, // Whether to wait for the actor run to complete before returning,\n timeout: 300000 // default, // Maximum time to wait for actor completion in milliseconds (default: 120000),\n});\n\nconst result = await apify.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// runId: string // Apify actor run ID,\n// status: string // Actor run status (READY, RUNNING, SUCCEEDED, FAILED, etc.),\n// datasetId: string | undefined // Dataset ID where results are stored,\n// items: unknown[] | undefined // Array of scraped items (if waitForFinish is true). Structure depends on the actor. For discovery mode, contains actor information with schemas.,\n// itemsCount: number | undefined // Total number of items scraped,\n// consoleUrl: string // URL to view the actor run in Apify console,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed,\n// discoveredActors: { id: string // Actor ID (e.g., \"apify/instagram-scraper\"), name: string // Full actor path (e.g., \"beauty/linkedin-jobs-scraper\"), description: string | null | undefined // Actor description, inputSchemaUrl: string // URL to the actor input schema page. Use the web scrape tool to scrape from this URL (e.g., https://apify.com/apify/google-search-scraper/input-schema) to get the input/output schema details., stars: number | null | undefined // Actor rating (if available), usage: { totalRuns: number | undefined, usersCount: number | undefined } | null | undefined // Basic usage stats, requiresRental: boolean | undefined // Whether this actor requires rental/private access (filtered out when true) }[] | undefined // Discovered actors with description and input schema URL (only present in discovery mode)\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
160
173
  "requiredCredentials": [
161
174
  "APIFY_CRED"
162
175
  ]
163
176
  },
164
177
  {
165
- "name": "bubbleflow-generator",
166
- "alias": "generate-flow",
167
- "type": "workflow",
168
- "shortDescription": "Generate BubbleFlow code from natural language",
169
- "useCase": "General purpose bubble for various workflow needs",
170
- "inputSchema": "{\n prompt: string // Natural language description of the desired BubbleFlow,\n credentials: Record<string, string> | undefined // Credentials for AI agent operations\n}",
171
- "outputSchema": "{\n generatedCode: string // The generated BubbleFlow TypeScript code,\n isValid: boolean // Whether the generated code is valid,\n success: boolean,\n error: string,\n flowId: number | undefined,\n toolCalls: unknown[] // The tool calls made by the AI agent,\n summary: string // High-level instructions for using the validated flow,\n inputsSchema: string // JSON Schema (string) representing the inputs of the flow,\n bubblesUsed: string[] // List of bubble names used in the generated flow,\n tokenUsage: { inputTokens: number, outputTokens: number, totalTokens: number, modelName: string | undefined } | undefined,\n bubbleCount: number | undefined,\n codeLength: number | undefined\n}",
172
- "usageExample": "// Example usage of bubbleflow-generator bubble\nconst bubbleflowGenerator = new BubbleflowGeneratorBubble({\n prompt: \"example string\", // Natural language description of the desired BubbleFlow,\n});\n\nconst result = await bubbleflowGenerator.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// generatedCode: string // The generated BubbleFlow TypeScript code,\n// isValid: boolean // Whether the generated code is valid,\n// success: boolean,\n// error: string,\n// flowId: number | undefined,\n// toolCalls: unknown[] // The tool calls made by the AI agent,\n// summary: string // High-level instructions for using the validated flow,\n// inputsSchema: string // JSON Schema (string) representing the inputs of the flow,\n// bubblesUsed: string[] // List of bubble names used in the generated flow,\n// tokenUsage: { inputTokens: number, outputTokens: number, totalTokens: number, modelName: string | undefined } | undefined,\n// bubbleCount: number | undefined,\n// codeLength: number | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
178
+ "name": "github",
179
+ "alias": "gh",
180
+ "type": "service",
181
+ "shortDescription": "GitHub API integration for repository operations",
182
+ "useCase": "- Code review automation and PR management",
183
+ "inputSchema": "Complex schema - see usage example for structure",
184
+ "outputSchema": "Complex schema - see usage example for structure",
185
+ "usageExample": "// Get File example\nconst github_get_file = new GithubBubble({\n operation: \"get_file\", // Get the contents of a file from a GitHub repository\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n path: \"example string\", // Path to the file in the repository (e.g., src/index.ts)\n ref: \"example string\", // Git reference (branch, tag, or commit SHA). Defaults to the default branch\n});\n\nconst result = await github_get_file.action();\n// outputSchema for result.data when operation === 'get_file':\n// {\n// operation: \"get_file\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// name: string | undefined // File name,\n// path: string | undefined // Full path to the file in the repository,\n// sha: string | undefined // Git SHA hash of the file,\n// size: number | undefined // File size in bytes,\n// url: string | undefined // API URL for this file,\n// html_url: string | undefined // Web URL to view the file on GitHub,\n// git_url: string | undefined // Git URL for the file object,\n// download_url: string | null | undefined // Direct download URL for the file,\n// type: \"file\" | \"dir\" | \"symlink\" | \"submodule\" | undefined // Type of the content,\n// content: string | undefined | undefined // Base64 encoded content (for files),\n// encoding: string | undefined | undefined // Encoding type (usually base64)\n// }\n\n\n// Get Directory example\nconst github_get_directory = new GithubBubble({\n operation: \"get_directory\", // Get the contents of a directory from a GitHub repository\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n path: \"\" // default, // Path to the directory in the repository (empty string for root)\n ref: \"example string\", // Git reference (branch, tag, or commit SHA). Defaults to the default branch\n});\n\nconst result = await github_get_directory.action();\n// outputSchema for result.data when operation === 'get_directory':\n// {\n// operation: \"get_directory\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// contents: { name: string // File name, path: string // Full path to the file in the repository, sha: string // Git SHA hash of the file, size: number // File size in bytes, url: string // API URL for this file, html_url: string // Web URL to view the file on GitHub, git_url: string // Git URL for the file object, download_url: string | null // Direct download URL for the file, type: \"file\" | \"dir\" | \"symlink\" | \"submodule\" // Type of the content, content: string | undefined // Base64 encoded content (for files), encoding: string | undefined // Encoding type (usually base64) }[] | undefined // Array of directory contents\n// }\n\n\n// List Pull Requests example\nconst github_list_pull_requests = new GithubBubble({\n operation: \"list_pull_requests\", // List pull requests in a GitHub repository\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n state: \"open\" // options: \"open\", \"closed\", \"all\", // Filter by PR state\n sort: \"created\" // options: \"created\", \"updated\", \"popularity\", \"long-running\", // Sort order for results\n direction: \"asc\" // options: \"asc\", \"desc\", // Sort direction\n per_page: 30 // default, // Number of results per page (1-100)\n page: 1 // default, // Page number for pagination\n});\n\nconst result = await github_list_pull_requests.action();\n// outputSchema for result.data when operation === 'list_pull_requests':\n// {\n// operation: \"list_pull_requests\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// pull_requests: { id: number // Pull request ID, node_id: string // GraphQL node ID, number: number // Pull request number, state: \"open\" | \"closed\" // Pull request state, title: string // Pull request title, body: string | null // Pull request description, created_at: string // ISO datetime when PR was created, updated_at: string // ISO datetime when PR was last updated, closed_at: string | null // ISO datetime when PR was closed, merged_at: string | null // ISO datetime when PR was merged, user: { login: string // Author username, id: number // Author ID, avatar_url: string // Author avatar URL } // Pull request author, html_url: string // Web URL to view the PR, draft: boolean // Whether this is a draft PR, head: { ref: string // Source branch name, sha: string // Source commit SHA } // Source branch information, base: { ref: string // Target branch name, sha: string // Target commit SHA } // Target branch information, merged: boolean | undefined // Whether the PR has been merged (may not be present in list responses), mergeable: boolean | null | undefined // Whether the PR can be merged (may not be present in list responses), mergeable_state: string | undefined // Mergeable state (clean, unstable, dirty, etc.), comments: number | undefined // Number of comments, review_comments: number | undefined // Number of review comments, commits: number | undefined // Number of commits, additions: number | undefined // Lines added, deletions: number | undefined // Lines deleted, changed_files: number | undefined // Number of files changed }[] | undefined // Array of pull requests\n// }\n\n\n// Get Pull Request example\nconst github_get_pull_request = new GithubBubble({\n operation: \"get_pull_request\", // Get detailed information about a specific pull request\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n pull_number: 42, // Pull request number\n});\n\nconst result = await github_get_pull_request.action();\n// outputSchema for result.data when operation === 'get_pull_request':\n// {\n// operation: \"get_pull_request\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// id: number | undefined // Pull request ID,\n// node_id: string | undefined // GraphQL node ID,\n// number: number | undefined // Pull request number,\n// state: \"open\" | \"closed\" | undefined // Pull request state,\n// title: string | undefined // Pull request title,\n// body: string | null | undefined // Pull request description,\n// created_at: string | undefined // ISO datetime when PR was created,\n// updated_at: string | undefined // ISO datetime when PR was last updated,\n// closed_at: string | null | undefined // ISO datetime when PR was closed,\n// merged_at: string | null | undefined // ISO datetime when PR was merged,\n// user: { login: string // Author username, id: number // Author ID, avatar_url: string // Author avatar URL } | undefined // Pull request author,\n// html_url: string | undefined // Web URL to view the PR,\n// draft: boolean | undefined // Whether this is a draft PR,\n// head: { ref: string // Source branch name, sha: string // Source commit SHA } | undefined // Source branch information,\n// base: { ref: string // Target branch name, sha: string // Target commit SHA } | undefined // Target branch information,\n// merged: boolean | undefined | undefined // Whether the PR has been merged (may not be present in list responses),\n// mergeable: boolean | null | undefined | undefined // Whether the PR can be merged (may not be present in list responses),\n// mergeable_state: string | undefined | undefined // Mergeable state (clean, unstable, dirty, etc.),\n// comments: number | undefined | undefined // Number of comments,\n// review_comments: number | undefined | undefined // Number of review comments,\n// commits: number | undefined | undefined // Number of commits,\n// additions: number | undefined | undefined // Lines added,\n// deletions: number | undefined | undefined // Lines deleted,\n// changed_files: number | undefined | undefined // Number of files changed\n// }\n\n\n// Create Pr Comment example\nconst github_create_pr_comment = new GithubBubble({\n operation: \"create_pr_comment\", // Add a comment to a pull request\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n pull_number: 42, // Pull request number\n body: \"example string\", // Comment text content (supports GitHub Markdown)\n});\n\nconst result = await github_create_pr_comment.action();\n// outputSchema for result.data when operation === 'create_pr_comment':\n// {\n// operation: \"create_pr_comment\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// id: number | undefined // Comment ID,\n// node_id: string | undefined // GraphQL node ID,\n// body: string | undefined // Comment text content,\n// user: { login: string // Comment author username, id: number // Comment author ID } | undefined // Comment author information,\n// created_at: string | undefined // ISO datetime when comment was created,\n// updated_at: string | undefined // ISO datetime when comment was last updated,\n// html_url: string | undefined // Web URL to view the comment\n// }\n\n\n// List Repositories example\nconst github_list_repositories = new GithubBubble({\n operation: \"list_repositories\", // List repositories for the authenticated user\n visibility: \"all\" // options: \"all\", \"public\", \"private\", // Filter by repository visibility\n affiliation: \"owner\" // options: \"owner\", \"collaborator\", \"organization_member\", // Filter by user affiliation\n sort: \"created\" // options: \"created\", \"updated\", \"pushed\", \"full_name\", // Sort order for results\n direction: \"asc\" // options: \"asc\", \"desc\", // Sort direction\n per_page: 30 // default, // Number of results per page (1-100)\n page: 1 // default, // Page number for pagination\n});\n\nconst result = await github_list_repositories.action();\n// outputSchema for result.data when operation === 'list_repositories':\n// {\n// operation: \"list_repositories\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// repositories: { id: number // Repository ID, node_id: string // GraphQL node ID, name: string // Repository name, full_name: string // Full repository name (owner/repo), private: boolean // Whether the repository is private, owner: { login: string // Owner username, id: number // Owner ID, avatar_url: string // Owner avatar URL, html_url: string // Owner profile URL } // Repository owner information, html_url: string // Repository web URL, description: string | null // Repository description, fork: boolean // Whether this is a fork, created_at: string // ISO datetime when repository was created, updated_at: string // ISO datetime when repository was last updated, pushed_at: string // ISO datetime of last push, size: number // Repository size in KB, stargazers_count: number // Number of stars, watchers_count: number // Number of watchers, language: string | null // Primary programming language, forks_count: number // Number of forks, open_issues_count: number // Number of open issues, default_branch: string // Default branch name, visibility: string | undefined // Repository visibility (public, private, internal) }[] | undefined // Array of repositories\n// }\n\n\n// Get Repository example\nconst github_get_repository = new GithubBubble({\n operation: \"get_repository\", // Get detailed information about a specific repository\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n});\n\nconst result = await github_get_repository.action();\n// outputSchema for result.data when operation === 'get_repository':\n// {\n// operation: \"get_repository\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// id: number | undefined // Repository ID,\n// node_id: string | undefined // GraphQL node ID,\n// name: string | undefined // Repository name,\n// full_name: string | undefined // Full repository name (owner/repo),\n// private: boolean | undefined // Whether the repository is private,\n// owner: { login: string // Owner username, id: number // Owner ID, avatar_url: string // Owner avatar URL, html_url: string // Owner profile URL } | undefined // Repository owner information,\n// html_url: string | undefined // Repository web URL,\n// description: string | null | undefined // Repository description,\n// fork: boolean | undefined // Whether this is a fork,\n// created_at: string | undefined // ISO datetime when repository was created,\n// updated_at: string | undefined // ISO datetime when repository was last updated,\n// pushed_at: string | undefined // ISO datetime of last push,\n// size: number | undefined // Repository size in KB,\n// stargazers_count: number | undefined // Number of stars,\n// watchers_count: number | undefined // Number of watchers,\n// language: string | null | undefined // Primary programming language,\n// forks_count: number | undefined // Number of forks,\n// open_issues_count: number | undefined // Number of open issues,\n// default_branch: string | undefined // Default branch name,\n// visibility: string | undefined | undefined // Repository visibility (public, private, internal)\n// }\n\n\n// Create Issue Comment example\nconst github_create_issue_comment = new GithubBubble({\n operation: \"create_issue_comment\", // Add a comment to an issue\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n issue_number: 42, // Issue number\n body: \"example string\", // Comment text content (supports GitHub Markdown)\n});\n\nconst result = await github_create_issue_comment.action();\n// outputSchema for result.data when operation === 'create_issue_comment':\n// {\n// operation: \"create_issue_comment\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// id: number | undefined // Comment ID,\n// node_id: string | undefined // GraphQL node ID,\n// body: string | undefined // Comment text content,\n// user: { login: string // Comment author username, id: number // Comment author ID } | undefined // Comment author information,\n// created_at: string | undefined // ISO datetime when comment was created,\n// updated_at: string | undefined // ISO datetime when comment was last updated,\n// html_url: string | undefined // Web URL to view the comment\n// }\n\n\n// List Issues example\nconst github_list_issues = new GithubBubble({\n operation: \"list_issues\", // List issues in a GitHub repository\n owner: \"example string\", // Repository owner (username or organization name)\n repo: \"example string\", // Repository name\n state: \"open\" // options: \"open\", \"closed\", \"all\", // Filter by issue state\n labels: \"example string\", // Filter by labels (comma-separated list)\n sort: \"created\" // options: \"created\", \"updated\", \"comments\", // Sort order for results\n direction: \"asc\" // options: \"asc\", \"desc\", // Sort direction\n per_page: 30 // default, // Number of results per page (1-100)\n page: 1 // default, // Page number for pagination\n});\n\nconst result = await github_list_issues.action();\n// outputSchema for result.data when operation === 'list_issues':\n// {\n// operation: \"list_issues\",\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// issues: { id: number // Issue ID, node_id: string // GraphQL node ID, number: number // Issue number, state: \"open\" | \"closed\" // Issue state, title: string // Issue title, body: string | null // Issue description, user: { login: string // Issue creator username, id: number // Issue creator ID } // Issue creator information, labels: { id: number // Label ID, name: string // Label name, color: string // Label color (hex), description: string | null // Label description }[] // Issue labels, created_at: string // ISO datetime when issue was created, updated_at: string // ISO datetime when issue was last updated, closed_at: string | null // ISO datetime when issue was closed, html_url: string // Web URL to view the issue, comments: number // Number of comments }[] | undefined // Array of issues\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`github failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
173
186
  "requiredCredentials": [
174
- "GOOGLE_GEMINI_CRED",
175
- "OPENROUTER_CRED"
187
+ "GITHUB_TOKEN"
188
+ ]
189
+ },
190
+ {
191
+ "name": "followupboss",
192
+ "alias": "fub",
193
+ "type": "service",
194
+ "shortDescription": "Follow Up Boss CRM integration",
195
+ "useCase": "- Manage contacts/people with full CRUD operations",
196
+ "inputSchema": "Complex schema - see usage example for structure",
197
+ "outputSchema": "Complex schema - see usage example for structure",
198
+ "usageExample": "// List People example\nconst followupboss_list_people = new FollowUpBossBubble({\n operation: \"list_people\", // List people/contacts\n limit: 25 // default, // Number of results to return\n offset: 0 // default, // Number of results to skip\n sort: \"example string\", // Sort field\n fields: \"example string\", // Comma-separated fields to return (use \"allFields\" for all)\n includeTrash: false // default, // Include people in Trash stage\n});\n\nconst result = await followupboss_list_people.action();\n// outputSchema for result.data when operation === 'list_people':\n// {\n// operation: \"list_people\",\n// success: boolean,\n// people: { id: number // Unique person identifier, firstName: string | undefined // First name, lastName: string | undefined // Last name, emails: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Email addresses, phones: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Phone numbers, stage: string | undefined // Current stage in pipeline, source: string | undefined // Lead source, assignedTo: number | undefined // Assigned user ID, tags: string[] | undefined // Tags applied to person, created: string | undefined // Creation timestamp, updated: string | undefined // Last update timestamp }[] | undefined,\n// _metadata: { total: number | undefined, limit: number | undefined, offset: number | undefined } | undefined,\n// error: string\n// }\n\n\n// Get Person example\nconst followupboss_get_person = new FollowUpBossBubble({\n operation: \"get_person\", // Get a specific person by ID\n person_id: 42, // Person ID to retrieve\n fields: \"example string\", // Comma-separated fields to return\n});\n\nconst result = await followupboss_get_person.action();\n// outputSchema for result.data when operation === 'get_person':\n// {\n// operation: \"get_person\",\n// success: boolean,\n// person: { id: number // Unique person identifier, firstName: string | undefined // First name, lastName: string | undefined // Last name, emails: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Email addresses, phones: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Phone numbers, stage: string | undefined // Current stage in pipeline, source: string | undefined // Lead source, assignedTo: number | undefined // Assigned user ID, tags: string[] | undefined // Tags applied to person, created: string | undefined // Creation timestamp, updated: string | undefined // Last update timestamp } | undefined // FUB person/contact object,\n// error: string\n// }\n\n\n// Create Person example\nconst followupboss_create_person = new FollowUpBossBubble({\n operation: \"create_person\", // Create a new person/contact\n firstName: \"example string\", // First name\n lastName: \"example string\", // Last name\n emails: [{ value: \"example string\", type: \"example string\", isPrimary: true }], // Email addresses\n phones: [{ value: \"example string\", type: \"example string\", isPrimary: true }], // Phone numbers\n stage: \"example string\", // Initial stage\n source: \"example string\", // Lead source\n assignedTo: 42, // Assigned user ID\n tags: [\"example string\"], // Tags to apply\n});\n\nconst result = await followupboss_create_person.action();\n// outputSchema for result.data when operation === 'create_person':\n// {\n// operation: \"create_person\",\n// success: boolean,\n// person: { id: number // Unique person identifier, firstName: string | undefined // First name, lastName: string | undefined // Last name, emails: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Email addresses, phones: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Phone numbers, stage: string | undefined // Current stage in pipeline, source: string | undefined // Lead source, assignedTo: number | undefined // Assigned user ID, tags: string[] | undefined // Tags applied to person, created: string | undefined // Creation timestamp, updated: string | undefined // Last update timestamp } | undefined // FUB person/contact object,\n// error: string\n// }\n\n\n// Update Person example\nconst followupboss_update_person = new FollowUpBossBubble({\n operation: \"update_person\", // Update an existing person\n person_id: 42, // Person ID to update\n firstName: \"example string\", // First name\n lastName: \"example string\", // Last name\n emails: [{ value: \"example string\", type: \"example string\", isPrimary: true }], // Email addresses\n phones: [{ value: \"example string\", type: \"example string\", isPrimary: true }], // Phone numbers\n stage: \"example string\", // Stage\n source: \"example string\", // Lead source\n assignedTo: 42, // Assigned user ID\n tags: [\"example string\"], // Tags\n});\n\nconst result = await followupboss_update_person.action();\n// outputSchema for result.data when operation === 'update_person':\n// {\n// operation: \"update_person\",\n// success: boolean,\n// person: { id: number // Unique person identifier, firstName: string | undefined // First name, lastName: string | undefined // Last name, emails: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Email addresses, phones: { value: string, type: string | undefined, isPrimary: boolean | undefined }[] | undefined // Phone numbers, stage: string | undefined // Current stage in pipeline, source: string | undefined // Lead source, assignedTo: number | undefined // Assigned user ID, tags: string[] | undefined // Tags applied to person, created: string | undefined // Creation timestamp, updated: string | undefined // Last update timestamp } | undefined // FUB person/contact object,\n// error: string\n// }\n\n\n// Delete Person example\nconst followupboss_delete_person = new FollowUpBossBubble({\n operation: \"delete_person\", // Delete a person\n person_id: 42, // Person ID to delete\n});\n\nconst result = await followupboss_delete_person.action();\n// outputSchema for result.data when operation === 'delete_person':\n// {\n// operation: \"delete_person\",\n// success: boolean,\n// deleted_id: number | undefined,\n// error: string\n// }\n\n\n// List Tasks example\nconst followupboss_list_tasks = new FollowUpBossBubble({\n operation: \"list_tasks\", // List tasks\n personId: 42, // Filter by person ID\n limit: 25 // default, // Number of results to return\n offset: 0 // default, // Number of results to skip\n});\n\nconst result = await followupboss_list_tasks.action();\n// outputSchema for result.data when operation === 'list_tasks':\n// {\n// operation: \"list_tasks\",\n// success: boolean,\n// tasks: { id: number // Unique task identifier, personId: number | undefined // Associated person ID, name: string // Task name/title, description: string | undefined // Task description, dueDate: string | undefined // Due date (YYYY-MM-DD), completed: boolean | undefined // Whether task is completed, assignedTo: number | undefined // Assigned user ID, created: string | undefined // Creation timestamp }[] | undefined,\n// _metadata: { total: number | undefined, limit: number | undefined, offset: number | undefined } | undefined,\n// error: string\n// }\n\n\n// Get Task example\nconst followupboss_get_task = new FollowUpBossBubble({\n operation: \"get_task\", // Get a specific task by ID\n task_id: 42, // Task ID to retrieve\n});\n\nconst result = await followupboss_get_task.action();\n// outputSchema for result.data when operation === 'get_task':\n// {\n// operation: \"get_task\",\n// success: boolean,\n// task: { id: number // Unique task identifier, personId: number | undefined // Associated person ID, name: string // Task name/title, description: string | undefined // Task description, dueDate: string | undefined // Due date (YYYY-MM-DD), completed: boolean | undefined // Whether task is completed, assignedTo: number | undefined // Assigned user ID, created: string | undefined // Creation timestamp } | undefined // FUB task object,\n// error: string\n// }\n\n\n// Create Task example\nconst followupboss_create_task = new FollowUpBossBubble({\n operation: \"create_task\", // Create a new task\n personId: 42, // Associated person ID\n name: \"example string\", // Task name/title\n description: \"example string\", // Task description\n dueDate: \"example string\", // Due date (YYYY-MM-DD)\n assignedTo: 42, // Assigned user ID\n});\n\nconst result = await followupboss_create_task.action();\n// outputSchema for result.data when operation === 'create_task':\n// {\n// operation: \"create_task\",\n// success: boolean,\n// task: { id: number // Unique task identifier, personId: number | undefined // Associated person ID, name: string // Task name/title, description: string | undefined // Task description, dueDate: string | undefined // Due date (YYYY-MM-DD), completed: boolean | undefined // Whether task is completed, assignedTo: number | undefined // Assigned user ID, created: string | undefined // Creation timestamp } | undefined // FUB task object,\n// error: string\n// }\n\n\n// Update Task example\nconst followupboss_update_task = new FollowUpBossBubble({\n operation: \"update_task\", // Update an existing task\n task_id: 42, // Task ID to update\n name: \"example string\", // Task name/title\n description: \"example string\", // Task description\n dueDate: \"example string\", // Due date (YYYY-MM-DD)\n completed: true, // Whether task is completed\n assignedTo: 42, // Assigned user ID\n});\n\nconst result = await followupboss_update_task.action();\n// outputSchema for result.data when operation === 'update_task':\n// {\n// operation: \"update_task\",\n// success: boolean,\n// task: { id: number // Unique task identifier, personId: number | undefined // Associated person ID, name: string // Task name/title, description: string | undefined // Task description, dueDate: string | undefined // Due date (YYYY-MM-DD), completed: boolean | undefined // Whether task is completed, assignedTo: number | undefined // Assigned user ID, created: string | undefined // Creation timestamp } | undefined // FUB task object,\n// error: string\n// }\n\n\n// Delete Task example\nconst followupboss_delete_task = new FollowUpBossBubble({\n operation: \"delete_task\", // Delete a task\n task_id: 42, // Task ID to delete\n});\n\nconst result = await followupboss_delete_task.action();\n// outputSchema for result.data when operation === 'delete_task':\n// {\n// operation: \"delete_task\",\n// success: boolean,\n// deleted_id: number | undefined,\n// error: string\n// }\n\n\n// List Notes example\nconst followupboss_list_notes = new FollowUpBossBubble({\n operation: \"list_notes\", // List notes\n personId: 42, // Filter by person ID\n limit: 25 // default, // Number of results to return\n offset: 0 // default, // Number of results to skip\n});\n\nconst result = await followupboss_list_notes.action();\n// outputSchema for result.data when operation === 'list_notes':\n// {\n// operation: \"list_notes\",\n// success: boolean,\n// notes: { id: number // Unique note identifier, personId: number // Associated person ID, subject: string | undefined // Note subject, body: string // Note content, created: string | undefined // Creation timestamp }[] | undefined,\n// _metadata: { total: number | undefined, limit: number | undefined, offset: number | undefined } | undefined,\n// error: string\n// }\n\n\n// Create Note example\nconst followupboss_create_note = new FollowUpBossBubble({\n operation: \"create_note\", // Create a new note\n personId: 42, // Associated person ID\n subject: \"example string\", // Note subject\n body: \"example string\", // Note content\n});\n\nconst result = await followupboss_create_note.action();\n// outputSchema for result.data when operation === 'create_note':\n// {\n// operation: \"create_note\",\n// success: boolean,\n// note: { id: number // Unique note identifier, personId: number // Associated person ID, subject: string | undefined // Note subject, body: string // Note content, created: string | undefined // Creation timestamp } | undefined // FUB note object,\n// error: string\n// }\n\n\n// Update Note example\nconst followupboss_update_note = new FollowUpBossBubble({\n operation: \"update_note\", // Update an existing note\n note_id: 42, // Note ID to update\n subject: \"example string\", // Note subject\n body: \"example string\", // Note content\n});\n\nconst result = await followupboss_update_note.action();\n// outputSchema for result.data when operation === 'update_note':\n// {\n// operation: \"update_note\",\n// success: boolean,\n// note: { id: number // Unique note identifier, personId: number // Associated person ID, subject: string | undefined // Note subject, body: string // Note content, created: string | undefined // Creation timestamp } | undefined // FUB note object,\n// error: string\n// }\n\n\n// Delete Note example\nconst followupboss_delete_note = new FollowUpBossBubble({\n operation: \"delete_note\", // Delete a note\n note_id: 42, // Note ID to delete\n});\n\nconst result = await followupboss_delete_note.action();\n// outputSchema for result.data when operation === 'delete_note':\n// {\n// operation: \"delete_note\",\n// success: boolean,\n// deleted_id: number | undefined,\n// error: string\n// }\n\n\n// List Deals example\nconst followupboss_list_deals = new FollowUpBossBubble({\n operation: \"list_deals\", // List deals\n personId: 42, // Filter by person ID\n limit: 25 // default, // Number of results to return\n offset: 0 // default, // Number of results to skip\n});\n\nconst result = await followupboss_list_deals.action();\n// outputSchema for result.data when operation === 'list_deals':\n// {\n// operation: \"list_deals\",\n// success: boolean,\n// deals: { id: number // Unique deal identifier, personId: number | undefined // Associated person ID, name: string | undefined // Deal name, price: number | undefined // Deal price/value, stage: string | undefined // Deal stage, closeDate: string | undefined // Expected close date, created: string | undefined // Creation timestamp }[] | undefined,\n// _metadata: { total: number | undefined, limit: number | undefined, offset: number | undefined } | undefined,\n// error: string\n// }\n\n\n// Get Deal example\nconst followupboss_get_deal = new FollowUpBossBubble({\n operation: \"get_deal\", // Get a specific deal by ID\n deal_id: 42, // Deal ID to retrieve\n});\n\nconst result = await followupboss_get_deal.action();\n// outputSchema for result.data when operation === 'get_deal':\n// {\n// operation: \"get_deal\",\n// success: boolean,\n// deal: { id: number // Unique deal identifier, personId: number | undefined // Associated person ID, name: string | undefined // Deal name, price: number | undefined // Deal price/value, stage: string | undefined // Deal stage, closeDate: string | undefined // Expected close date, created: string | undefined // Creation timestamp } | undefined // FUB deal object,\n// error: string\n// }\n\n\n// Create Deal example\nconst followupboss_create_deal = new FollowUpBossBubble({\n operation: \"create_deal\", // Create a new deal\n personId: 42, // Associated person ID\n name: \"example string\", // Deal name\n price: 42, // Deal price/value\n stage: \"example string\", // Deal stage\n closeDate: \"example string\", // Expected close date (YYYY-MM-DD)\n});\n\nconst result = await followupboss_create_deal.action();\n// outputSchema for result.data when operation === 'create_deal':\n// {\n// operation: \"create_deal\",\n// success: boolean,\n// deal: { id: number // Unique deal identifier, personId: number | undefined // Associated person ID, name: string | undefined // Deal name, price: number | undefined // Deal price/value, stage: string | undefined // Deal stage, closeDate: string | undefined // Expected close date, created: string | undefined // Creation timestamp } | undefined // FUB deal object,\n// error: string\n// }\n\n\n// Update Deal example\nconst followupboss_update_deal = new FollowUpBossBubble({\n operation: \"update_deal\", // Update an existing deal\n deal_id: 42, // Deal ID to update\n name: \"example string\", // Deal name\n price: 42, // Deal price/value\n stage: \"example string\", // Deal stage\n closeDate: \"example string\", // Expected close date (YYYY-MM-DD)\n});\n\nconst result = await followupboss_update_deal.action();\n// outputSchema for result.data when operation === 'update_deal':\n// {\n// operation: \"update_deal\",\n// success: boolean,\n// deal: { id: number // Unique deal identifier, personId: number | undefined // Associated person ID, name: string | undefined // Deal name, price: number | undefined // Deal price/value, stage: string | undefined // Deal stage, closeDate: string | undefined // Expected close date, created: string | undefined // Creation timestamp } | undefined // FUB deal object,\n// error: string\n// }\n\n\n// List Events example\nconst followupboss_list_events = new FollowUpBossBubble({\n operation: \"list_events\", // List/search events\n limit: 25 // default, // Number of results to return\n offset: 0 // default, // Number of results to skip\n personId: 42, // Filter by person ID\n});\n\nconst result = await followupboss_list_events.action();\n// outputSchema for result.data when operation === 'list_events':\n// {\n// operation: \"list_events\",\n// success: boolean,\n// events: { id: number | undefined // Event identifier, type: string // Event type (e.g., \"Showing Request\", \"Registration\"), source: string | undefined // Event source, message: string | undefined // Event message, person: { firstName: string | undefined, lastName: string | undefined, emails: { value: string }[] | undefined, phones: { value: string }[] | undefined, tags: string[] | undefined } | undefined // Person data for the event, created: string | undefined // Creation timestamp }[] | undefined,\n// _metadata: { total: number | undefined, limit: number | undefined, offset: number | undefined } | undefined,\n// error: string\n// }\n\n\n// Get Event example\nconst followupboss_get_event = new FollowUpBossBubble({\n operation: \"get_event\", // Get a specific event by ID\n event_id: 42, // Event ID to retrieve\n});\n\nconst result = await followupboss_get_event.action();\n// outputSchema for result.data when operation === 'get_event':\n// {\n// operation: \"get_event\",\n// success: boolean,\n// event: { id: number | undefined // Event identifier, type: string // Event type (e.g., \"Showing Request\", \"Registration\"), source: string | undefined // Event source, message: string | undefined // Event message, person: { firstName: string | undefined, lastName: string | undefined, emails: { value: string }[] | undefined, phones: { value: string }[] | undefined, tags: string[] | undefined } | undefined // Person data for the event, created: string | undefined // Creation timestamp } | undefined // FUB event object,\n// error: string\n// }\n\n\n// Create Event example\nconst followupboss_create_event = new FollowUpBossBubble({\n operation: \"create_event\", // Create an event (preferred for new leads)\n type: \"example string\", // Event type (e.g., \"Showing Request\", \"Registration\")\n source: \"example string\", // Event source\n message: \"example string\", // Event message\n person: { firstName: \"example string\", lastName: \"example string\", emails: [{ value: \"example string\" }], phones: [{ value: \"example string\" }], tags: [\"example string\"] }, // Person data for the event\n});\n\nconst result = await followupboss_create_event.action();\n// outputSchema for result.data when operation === 'create_event':\n// {\n// operation: \"create_event\",\n// success: boolean,\n// event: { id: number | undefined // Event identifier, type: string // Event type (e.g., \"Showing Request\", \"Registration\"), source: string | undefined // Event source, message: string | undefined // Event message, person: { firstName: string | undefined, lastName: string | undefined, emails: { value: string }[] | undefined, phones: { value: string }[] | undefined, tags: string[] | undefined } | undefined // Person data for the event, created: string | undefined // Creation timestamp } | undefined // FUB event object,\n// error: string\n// }\n\n\n// List Calls example\nconst followupboss_list_calls = new FollowUpBossBubble({\n operation: \"list_calls\", // List calls\n personId: 42, // Filter by person ID\n limit: 25 // default, // Number of results to return\n offset: 0 // default, // Number of results to skip\n});\n\nconst result = await followupboss_list_calls.action();\n// outputSchema for result.data when operation === 'list_calls':\n// {\n// operation: \"list_calls\",\n// success: boolean,\n// calls: { id: number // Unique call identifier, personId: number // Associated person ID, outcome: string | undefined // Call outcome, note: string | undefined // Call notes, duration: number | undefined // Call duration in seconds, created: string | undefined // Creation timestamp }[] | undefined,\n// _metadata: { total: number | undefined, limit: number | undefined, offset: number | undefined } | undefined,\n// error: string\n// }\n\n\n// Create Call example\nconst followupboss_create_call = new FollowUpBossBubble({\n operation: \"create_call\", // Log a call\n personId: 42, // Associated person ID\n outcome: \"example string\", // Call outcome\n note: \"example string\", // Call notes\n duration: 42, // Call duration in seconds\n});\n\nconst result = await followupboss_create_call.action();\n// outputSchema for result.data when operation === 'create_call':\n// {\n// operation: \"create_call\",\n// success: boolean,\n// call: { id: number // Unique call identifier, personId: number // Associated person ID, outcome: string | undefined // Call outcome, note: string | undefined // Call notes, duration: number | undefined // Call duration in seconds, created: string | undefined // Creation timestamp } | undefined // FUB call object,\n// error: string\n// }\n\n\n// List Appointments example\nconst followupboss_list_appointments = new FollowUpBossBubble({\n operation: \"list_appointments\", // List appointments\n personId: 42, // Filter by person ID\n limit: 25 // default, // Number of results to return\n offset: 0 // default, // Number of results to skip\n});\n\nconst result = await followupboss_list_appointments.action();\n// outputSchema for result.data when operation === 'list_appointments':\n// {\n// operation: \"list_appointments\",\n// success: boolean,\n// appointments: { id: number // Unique appointment identifier, personId: number | undefined // Associated person ID, title: string | undefined // Appointment title, startTime: string | undefined // Start time, endTime: string | undefined // End time, location: string | undefined // Location, created: string | undefined // Creation timestamp }[] | undefined,\n// _metadata: { total: number | undefined, limit: number | undefined, offset: number | undefined } | undefined,\n// error: string\n// }\n\n\n// Create Appointment example\nconst followupboss_create_appointment = new FollowUpBossBubble({\n operation: \"create_appointment\", // Create an appointment\n personId: 42, // Associated person ID\n title: \"example string\", // Appointment title\n startTime: \"example string\", // Start time (ISO 8601)\n endTime: \"example string\", // End time (ISO 8601)\n location: \"example string\", // Location\n});\n\nconst result = await followupboss_create_appointment.action();\n// outputSchema for result.data when operation === 'create_appointment':\n// {\n// operation: \"create_appointment\",\n// success: boolean,\n// appointment: { id: number // Unique appointment identifier, personId: number | undefined // Associated person ID, title: string | undefined // Appointment title, startTime: string | undefined // Start time, endTime: string | undefined // End time, location: string | undefined // Location, created: string | undefined // Creation timestamp } | undefined // FUB appointment object,\n// error: string\n// }\n\n\n// List Webhooks example\nconst followupboss_list_webhooks = new FollowUpBossBubble({\n operation: \"list_webhooks\", // List registered webhooks\n});\n\nconst result = await followupboss_list_webhooks.action();\n// outputSchema for result.data when operation === 'list_webhooks':\n// {\n// operation: \"list_webhooks\",\n// success: boolean,\n// webhooks: { id: number // Unique webhook identifier, event: string // Webhook event type, url: string // Callback URL, status: string | undefined // Webhook status (Active/Inactive) }[] | undefined,\n// error: string\n// }\n\n\n// Get Webhook example\nconst followupboss_get_webhook = new FollowUpBossBubble({\n operation: \"get_webhook\", // Get a specific webhook by ID\n webhook_id: 42, // Webhook ID to retrieve\n});\n\nconst result = await followupboss_get_webhook.action();\n// outputSchema for result.data when operation === 'get_webhook':\n// {\n// operation: \"get_webhook\",\n// success: boolean,\n// webhook: { id: number // Unique webhook identifier, event: string // Webhook event type, url: string // Callback URL, status: string | undefined // Webhook status (Active/Inactive) } | undefined // FUB webhook object,\n// error: string\n// }\n\n\n// Create Webhook example\nconst followupboss_create_webhook = new FollowUpBossBubble({\n operation: \"create_webhook\", // Register a new webhook\n event: \"peopleCreated\" // options: \"peopleCreated\", \"peopleUpdated\", \"peopleDeleted\", \"peopleTagsCreated\", \"peopleStageUpdated\", \"peopleRelationshipCreated\", \"peopleRelationshipUpdated\", \"peopleRelationshipDeleted\", \"notesCreated\", \"notesUpdated\", \"notesDeleted\", \"emailsCreated\", \"emailsUpdated\", \"emailsDeleted\", \"tasksCreated\", \"tasksUpdated\", \"tasksDeleted\", \"appointmentsCreated\", \"appointmentsUpdated\", \"appointmentsDeleted\", \"textMessagesCreated\", \"textMessagesUpdated\", \"textMessagesDeleted\", \"callsCreated\", \"callsUpdated\", \"callsDeleted\", \"dealsCreated\", \"dealsUpdated\", \"dealsDeleted\", \"eventsCreated\", \"stageCreated\", \"stageUpdated\", \"stageDeleted\", \"pipelineCreated\", \"pipelineUpdated\", \"pipelineDeleted\", \"pipelineStageCreated\", \"pipelineStageUpdated\", \"pipelineStageDeleted\", \"customFieldsCreated\", \"customFieldsUpdated\", \"customFieldsDeleted\", \"dealCustomFieldsCreated\", \"dealCustomFieldsUpdated\", \"dealCustomFieldsDeleted\", \"emEventsOpened\", \"emEventsClicked\", \"emEventsUnsubscribed\", \"reactionCreated\", \"reactionDeleted\", \"threadedReplyCreated\", \"threadedReplyUpdated\", \"threadedReplyDeleted\", // Webhook event type to subscribe to\n url: \"example string\", // HTTPS callback URL for webhook notifications\n});\n\nconst result = await followupboss_create_webhook.action();\n// outputSchema for result.data when operation === 'create_webhook':\n// {\n// operation: \"create_webhook\",\n// success: boolean,\n// webhook: { id: number // Unique webhook identifier, event: string // Webhook event type, url: string // Callback URL, status: string | undefined // Webhook status (Active/Inactive) } | undefined // FUB webhook object,\n// error: string\n// }\n\n\n// Update Webhook example\nconst followupboss_update_webhook = new FollowUpBossBubble({\n operation: \"update_webhook\", // Update an existing webhook\n webhook_id: 42, // Webhook ID to update\n event: \"peopleCreated\" // options: \"peopleCreated\", \"peopleUpdated\", \"peopleDeleted\", \"peopleTagsCreated\", \"peopleStageUpdated\", \"peopleRelationshipCreated\", \"peopleRelationshipUpdated\", \"peopleRelationshipDeleted\", \"notesCreated\", \"notesUpdated\", \"notesDeleted\", \"emailsCreated\", \"emailsUpdated\", \"emailsDeleted\", \"tasksCreated\", \"tasksUpdated\", \"tasksDeleted\", \"appointmentsCreated\", \"appointmentsUpdated\", \"appointmentsDeleted\", \"textMessagesCreated\", \"textMessagesUpdated\", \"textMessagesDeleted\", \"callsCreated\", \"callsUpdated\", \"callsDeleted\", \"dealsCreated\", \"dealsUpdated\", \"dealsDeleted\", \"eventsCreated\", \"stageCreated\", \"stageUpdated\", \"stageDeleted\", \"pipelineCreated\", \"pipelineUpdated\", \"pipelineDeleted\", \"pipelineStageCreated\", \"pipelineStageUpdated\", \"pipelineStageDeleted\", \"customFieldsCreated\", \"customFieldsUpdated\", \"customFieldsDeleted\", \"dealCustomFieldsCreated\", \"dealCustomFieldsUpdated\", \"dealCustomFieldsDeleted\", \"emEventsOpened\", \"emEventsClicked\", \"emEventsUnsubscribed\", \"reactionCreated\", \"reactionDeleted\", \"threadedReplyCreated\", \"threadedReplyUpdated\", \"threadedReplyDeleted\", // New webhook event type\n url: \"example string\", // New HTTPS callback URL\n});\n\nconst result = await followupboss_update_webhook.action();\n// outputSchema for result.data when operation === 'update_webhook':\n// {\n// operation: \"update_webhook\",\n// success: boolean,\n// webhook: { id: number // Unique webhook identifier, event: string // Webhook event type, url: string // Callback URL, status: string | undefined // Webhook status (Active/Inactive) } | undefined // FUB webhook object,\n// error: string\n// }\n\n\n// Delete Webhook example\nconst followupboss_delete_webhook = new FollowUpBossBubble({\n operation: \"delete_webhook\", // Delete a webhook\n webhook_id: 42, // Webhook ID to delete\n});\n\nconst result = await followupboss_delete_webhook.action();\n// outputSchema for result.data when operation === 'delete_webhook':\n// {\n// operation: \"delete_webhook\",\n// success: boolean,\n// deleted_id: number | undefined,\n// error: string\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`followupboss failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
199
+ "requiredCredentials": [
200
+ "FUB_CRED"
201
+ ]
202
+ },
203
+ {
204
+ "name": "notion",
205
+ "alias": "notion",
206
+ "type": "service",
207
+ "shortDescription": "Notion API integration for pages, databases, and blocks",
208
+ "useCase": "- Content management and automation",
209
+ "inputSchema": "Complex schema - see usage example for structure",
210
+ "outputSchema": "Complex schema - see usage example for structure",
211
+ "usageExample": "// Create Page example\nconst notion_create_page = new NotionBubble({\n operation: \"create_page\", // Create a new page in Notion\n parent: { type: \"page_id\", page_id: \"example string\" }, // Parent page, database, or workspace\n properties: {}, // Page properties (required if parent is a data source)\n children: [], // Array of block objects for page content\n icon: { type: \"emoji\", emoji: \"example string\" // Emoji character }, // Page icon (emoji or file)\n cover: { type: \"file\", file: { url: \"example string\" // Authenticated HTTP GET URL to the file, expiry_time: \"example string\" // ISO 8601 date time when the link expires } }, // Page cover image\n});\n\nconst result = await notion_create_page.action();\n// outputSchema for result.data when operation === 'create_page':\n// {\n// operation: \"create_page\" // Create page operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// page: { object: \"page\" // Object type, id: string // Page ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the page, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the page, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Page cover image, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Page icon, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } // Parent of the page, archived: boolean // Whether the page is archived, in_trash: boolean | undefined // Whether the page is in trash, properties: Record<string, unknown> // Page properties, url: string // Public URL of the page, public_url: string | null | undefined // Public shareable URL } | undefined // Created page object\n// }\n\n\n// Retrieve Page example\nconst notion_retrieve_page = new NotionBubble({\n operation: \"retrieve_page\", // Retrieve a page by its ID\n page_id: \"example string\", // UUID of the Notion page\n filter_properties: [\"example string\"], // Limit response to specific property IDs\n});\n\nconst result = await notion_retrieve_page.action();\n// outputSchema for result.data when operation === 'retrieve_page':\n// {\n// operation: \"retrieve_page\" // Retrieve page operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// page: { object: \"page\" // Object type, id: string // Page ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the page, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the page, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Page cover image, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Page icon, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } // Parent of the page, archived: boolean // Whether the page is archived, in_trash: boolean | undefined // Whether the page is in trash, properties: Record<string, unknown> // Page properties, url: string // Public URL of the page, public_url: string | null | undefined // Public shareable URL } | undefined // Retrieved page object\n// }\n\n\n// Update Page example\nconst notion_update_page = new NotionBubble({\n operation: \"update_page\", // Update an existing page\n page_id: \"example string\", // UUID of the Notion page\n properties: {}, // Page properties to update\n icon: { type: \"emoji\", emoji: \"example string\" }, // Page icon (emoji or file, null to remove)\n cover: { type: \"file\", file: { url: \"example string\" // Authenticated HTTP GET URL to the file, expiry_time: \"example string\" // ISO 8601 date time when the link expires } }, // Page cover image (null to remove)\n archived: true, // Set to true to archive the page\n in_trash: true, // Set to true to move page to trash\n is_locked: true, // Control if page can be edited in Notion UI\n});\n\nconst result = await notion_update_page.action();\n// outputSchema for result.data when operation === 'update_page':\n// {\n// operation: \"update_page\" // Update page operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// page: { object: \"page\" // Object type, id: string // Page ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the page, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the page, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Page cover image, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Page icon, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } // Parent of the page, archived: boolean // Whether the page is archived, in_trash: boolean | undefined // Whether the page is in trash, properties: Record<string, unknown> // Page properties, url: string // Public URL of the page, public_url: string | null | undefined // Public shareable URL } | undefined // Updated page object\n// }\n\n\n// Retrieve Database example\nconst notion_retrieve_database = new NotionBubble({\n operation: \"retrieve_database\", // Retrieve a database by its ID\n database_id: \"example string\", // UUID of the Notion database\n});\n\nconst result = await notion_retrieve_database.action();\n// outputSchema for result.data when operation === 'retrieve_database':\n// {\n// operation: \"retrieve_database\" // Retrieve database operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// database: { object: \"database\" // Object type, id: string // Database ID, To find a database ID, navigate to the database URL in your Notion workspace. The ID is the string of characters in the URL that is between the slash following the workspace name (if applicable) and the question mark. The ID is a 32 characters alphanumeric string., created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, title: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] // Database title, description: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] | undefined // Database description, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Database icon, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Database cover, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } // Parent of the database, is_inline: boolean | undefined // Whether displayed inline, in_trash: boolean | undefined // Whether in trash, is_locked: boolean | undefined // Whether locked from editing, data_sources: { id: string // Data source ID, name: string // Data source name, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined }[] // Array of data sources in this database, url: string | undefined // URL of the database, public_url: string | null | undefined } | undefined // Retrieved database object\n// }\n\n\n// Query Data Source example\nconst notion_query_data_source = new NotionBubble({\n operation: \"query_data_source\", // Query a data source to retrieve pages\n data_source_id: \"example string\", // UUID of the Notion data source\n filter: {}, // Filter object for querying\n sorts: [], // Array of sort objects\n start_cursor: \"example string\", // Cursor for pagination\n page_size: 100 // default, // Number of results per page (1-100)\n filter_properties: [\"example string\"], // Limit response to specific property IDs\n result_type: \"page\" // options: \"page\", \"data_source\", // Filter results to page or data_source\n});\n\nconst result = await notion_query_data_source.action();\n// outputSchema for result.data when operation === 'query_data_source':\n// {\n// operation: \"query_data_source\" // Query data source operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// results: { object: \"page\" | \"data_source\" // Object type (page or data_source), id: string // Object ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, url: string | undefined // URL of the object, properties: Record<string, unknown> | undefined // Object properties, title: { plain_text: string | undefined }[] | undefined // Title (for data sources), parent: Record<string, unknown> | undefined // Parent of the object, archived: boolean | undefined // Whether the object is archived, in_trash: boolean | undefined // Whether the object is in trash }[] | undefined // Array of pages or data sources from query,\n// next_cursor: string | null | undefined // Cursor for pagination,\n// has_more: boolean | undefined // Whether more results exist\n// }\n\n\n// Create Data Source example\nconst notion_create_data_source = new NotionBubble({\n operation: \"create_data_source\", // Create a new data source in an existing database\n parent: { type: \"database_id\" // Parent type, database_id: \"example string\" // ID of the parent database }, // Parent database for the new data source\n properties: {}, // Property schema for the data source (hash map where keys are property names)\n title: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Title of the data source\n icon: { type: \"emoji\", emoji: \"example string\" // Emoji character }, // Data source icon\n});\n\nconst result = await notion_create_data_source.action();\n// outputSchema for result.data when operation === 'create_data_source':\n// {\n// operation: \"create_data_source\" // Create data source operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// dataSource: { object: \"data_source\" // Object type, id: string // Data source ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the data source, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the data source, properties: Record<string, unknown> // Data source properties, parent: { type: \"database_id\", database_id: string } // Parent database, database_parent: Record<string, unknown> | undefined // Database parent information, archived: boolean // Whether the data source is archived, in_trash: boolean | undefined // Whether data source is in trash, is_inline: boolean | undefined // Whether displayed inline, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Data source icon, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Data source cover, title: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] // Data source title (can be empty array), description: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] | undefined // Data source description, url: string | undefined // URL of the data source, public_url: string | null | undefined // Public shareable URL of the data source } | undefined // Created data source object\n// }\n\n\n// Update Data Source example\nconst notion_update_data_source = new NotionBubble({\n operation: \"update_data_source\", // Update a data source\n data_source_id: \"example string\", // UUID of the Notion data source\n properties: {}, // Property schema updates\n title: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Updated title\n description: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Updated description\n icon: { type: \"emoji\", emoji: \"example string\" // Emoji character }, // Updated icon (null to remove)\n in_trash: true, // Set to true to move to trash\n parent: { type: \"database_id\", database_id: \"example string\" // ID of the destination database }, // New parent database to move data source\n});\n\nconst result = await notion_update_data_source.action();\n// outputSchema for result.data when operation === 'update_data_source':\n// {\n// operation: \"update_data_source\" // Update data source operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// dataSource: { object: \"data_source\" // Object type, id: string // Data source ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the data source, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the data source, properties: Record<string, unknown> // Data source properties, parent: { type: \"database_id\", database_id: string } // Parent database, database_parent: Record<string, unknown> | undefined // Database parent information, archived: boolean // Whether the data source is archived, in_trash: boolean | undefined // Whether data source is in trash, is_inline: boolean | undefined // Whether displayed inline, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Data source icon, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Data source cover, title: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] // Data source title (can be empty array), description: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] | undefined // Data source description, url: string | undefined // URL of the data source, public_url: string | null | undefined // Public shareable URL of the data source } | undefined // Updated data source object\n// }\n\n\n// Create Database example\nconst notion_create_database = new NotionBubble({\n operation: \"create_database\", // Create a new database\n initial_data_source: { properties: {} // Property schema for the data source (hash map where keys are property names) }, // Initial data source configuration\n title: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Title of the database\n description: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Description of the database\n icon: { type: \"emoji\", emoji: \"example string\" }, // Database icon\n cover: { type: \"file\", file: { url: \"example string\" // Authenticated HTTP GET URL to the file, expiry_time: \"example string\" // ISO 8601 date time when the link expires } }, // Database cover image\n});\n\nconst result = await notion_create_database.action();\n// outputSchema for result.data when operation === 'create_database':\n// {\n// operation: \"create_database\" // Create database operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// database: { object: \"database\" // Object type, id: string // Database ID, To find a database ID, navigate to the database URL in your Notion workspace. The ID is the string of characters in the URL that is between the slash following the workspace name (if applicable) and the question mark. The ID is a 32 characters alphanumeric string., created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, title: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] // Database title, description: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] | undefined // Database description, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Database icon, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Database cover, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } // Parent of the database, is_inline: boolean | undefined // Whether displayed inline, in_trash: boolean | undefined // Whether in trash, is_locked: boolean | undefined // Whether locked from editing, data_sources: { id: string // Data source ID, name: string // Data source name, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined }[] // Array of data sources in this database, url: string | undefined // URL of the database, public_url: string | null | undefined } | undefined // Created database object\n// }\n\n\n// Update Database example\nconst notion_update_database = new NotionBubble({\n operation: \"update_database\", // Update a database\n database_id: \"example string\", // UUID of the Notion database\n title: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Updated title\n description: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Updated description\n icon: { type: \"emoji\", emoji: \"example string\" }, // Updated icon (null to remove)\n cover: { type: \"file\", file: { url: \"example string\" // Authenticated HTTP GET URL to the file, expiry_time: \"example string\" // ISO 8601 date time when the link expires } }, // Updated cover (null to remove)\n parent: { type: \"page_id\", page_id: \"example string\" }, // New parent to move database\n is_inline: true, // Whether database should be displayed inline\n in_trash: true, // Set to true to move to trash\n is_locked: true, // Set to true to lock from editing\n});\n\nconst result = await notion_update_database.action();\n// outputSchema for result.data when operation === 'update_database':\n// {\n// operation: \"update_database\" // Update database operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// database: { object: \"database\" // Object type, id: string // Database ID, To find a database ID, navigate to the database URL in your Notion workspace. The ID is the string of characters in the URL that is between the slash following the workspace name (if applicable) and the question mark. The ID is a 32 characters alphanumeric string., created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, title: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] // Database title, description: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] | undefined // Database description, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined // Database icon, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined // Database cover, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } // Parent of the database, is_inline: boolean | undefined // Whether displayed inline, in_trash: boolean | undefined // Whether in trash, is_locked: boolean | undefined // Whether locked from editing, data_sources: { id: string // Data source ID, name: string // Data source name, icon: { type: \"emoji\" // Emoji icon, emoji: string // Emoji character } | { type: \"external\" // External icon, external: { url: string // URL of the external icon } } | { type: \"file\" // File icon, file: { url: string // URL of the file icon, expiry_time: string // Expiry time of the URL } } | null | undefined, cover: { type: \"file\" // Notion-hosted file type, file: { url: string // Authenticated HTTP GET URL to the file, expiry_time: string // ISO 8601 date time when the link expires } // File object for Notion-hosted files } | { type: \"file_upload\" // File uploaded via API type, file_upload: { id: string // ID of a File Upload object } // File upload object } | { type: \"external\" // External file type, external: { url: string // Link to externally hosted content } // External file object } | null | undefined }[] // Array of data sources in this database, url: string | undefined // URL of the database, public_url: string | null | undefined } | undefined // Updated database object\n// }\n\n\n// Append Block Children example\nconst notion_append_block_children = new NotionBubble({\n operation: \"append_block_children\", // Append children blocks to a parent block or page\n block_id: \"example string\", // UUID of the parent block or page\n children: [], // Array of block objects to append (max 100)\n after: \"example string\", // ID of block to append after\n});\n\nconst result = await notion_append_block_children.action();\n// outputSchema for result.data when operation === 'append_block_children':\n// {\n// operation: \"append_block_children\" // Append block children operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// blocks: { object: \"block\" // Object type, id: string // Block ID, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } | undefined // Parent of the block, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the block, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the block, has_children: boolean // Whether the block has children, archived: boolean // Whether the block is archived, in_trash: boolean | undefined // Whether block is in trash, type: string // Type of block (e.g., paragraph, heading_2, etc.) }[] | undefined // Array of appended block objects,\n// next_cursor: string | null | undefined // Cursor for pagination,\n// has_more: boolean | undefined // Whether more results exist\n// }\n\n\n// Retrieve Block Children example\nconst notion_retrieve_block_children = new NotionBubble({\n operation: \"retrieve_block_children\", // Retrieve children blocks of a parent block\n block_id: \"example string\", // UUID of the parent block\n start_cursor: \"example string\", // Cursor for pagination\n page_size: 100 // default, // Number of items per response (max 100)\n});\n\nconst result = await notion_retrieve_block_children.action();\n// outputSchema for result.data when operation === 'retrieve_block_children':\n// {\n// operation: \"retrieve_block_children\" // Retrieve block children operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// blocks: { object: \"block\" // Object type, id: string // Block ID, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } | undefined // Parent of the block, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the block, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the block, has_children: boolean // Whether the block has children, archived: boolean // Whether the block is archived, in_trash: boolean | undefined // Whether block is in trash, type: string // Type of block (e.g., paragraph, heading_2, etc.) }[] | undefined // Array of block children,\n// next_cursor: string | null | undefined // Cursor for pagination,\n// has_more: boolean | undefined // Whether more results exist\n// }\n\n\n// Retrieve Block example\nconst notion_retrieve_block = new NotionBubble({\n operation: \"retrieve_block\", // Retrieve a block by its ID\n block_id: \"example string\", // UUID of the Notion block\n});\n\nconst result = await notion_retrieve_block.action();\n// outputSchema for result.data when operation === 'retrieve_block':\n// {\n// operation: \"retrieve_block\" // Retrieve block operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// block: { object: \"block\" // Object type, id: string // Block ID, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } | undefined // Parent of the block, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the block, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the block, has_children: boolean // Whether the block has children, archived: boolean // Whether the block is archived, in_trash: boolean | undefined // Whether block is in trash, type: string // Type of block (e.g., paragraph, heading_2, etc.) } | undefined // Retrieved block object\n// }\n\n\n// Update Block example\nconst notion_update_block = new NotionBubble({\n operation: \"update_block\", // Update a block\n block_id: \"example string\", // UUID of the Notion block\n archived: true, // Set to true to archive the block\n});\n\nconst result = await notion_update_block.action();\n// outputSchema for result.data when operation === 'update_block':\n// {\n// operation: \"update_block\" // Update block operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// block: { object: \"block\" // Object type, id: string // Block ID, parent: { type: \"page_id\" // Parent is a page, page_id: string // ID of the parent page } | { type: \"database_id\" // Parent is a database, database_id: string // ID of the parent database } | { type: \"data_source_id\" // Parent is a data source, data_source_id: string // ID of the parent data source, database_id: string | undefined // ID of the database } | { type: \"block_id\" // Parent is a block, block_id: string // ID of the parent block } | { type: \"workspace\" // Parent is the workspace, workspace: true // Workspace parent } | undefined // Parent of the block, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the block, last_edited_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who last edited the block, has_children: boolean // Whether the block has children, archived: boolean // Whether the block is archived, in_trash: boolean | undefined // Whether block is in trash, type: string // Type of block (e.g., paragraph, heading_2, etc.) } | undefined // Updated block object\n// }\n\n\n// Create Comment example\nconst notion_create_comment = new NotionBubble({\n operation: \"create_comment\", // Create a comment on a page or block\n parent: { page_id: \"example string\" // ID of parent page, block_id: \"example string\" // ID of parent block }, // Parent page or block ID (one of page_id or block_id is required)\n rich_text: [{ type: \"text\" // options: \"text\", \"mention\", \"equation\" // Type of rich text, text: { content: \"example string\" // The actual text content, link: { url: \"example string\" // URL for the link } // Optional link object } // Text object (when type is \"text\"), annotations: { bold: false // default // Whether text is bolded, italic: false // default // Whether text is italicized, strikethrough: false // default // Whether text is struck through, underline: false // default // Whether text is underlined, code: false // default // Whether text is code style, color: \"default\" // options: \"default\", \"gray\", \"brown\", \"orange\", \"yellow\", \"green\", \"blue\", \"purple\", \"pink\", \"red\" // Color of the text } // Styling information for the rich text, plain_text: \"example string\" // Plain text without annotations, href: \"example string\" // URL of any link }], // Array of rich text objects for comment content\n attachments: [{ file_upload_id: \"example string\" // File Upload ID, type: \"file_upload\" }], // Array of file attachments (max 3)\n display_name: { type: \"integration\" // options: \"integration\", \"user\", \"custom\" // Type of display name, custom: { name: \"example string\" // Custom name for the comment } // Custom name object (required if type is custom) }, // Custom display name for the comment\n});\n\nconst result = await notion_create_comment.action();\n// outputSchema for result.data when operation === 'create_comment':\n// {\n// operation: \"create_comment\" // Create comment operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// comment: { object: \"comment\" // Object type, id: string // Comment ID, parent: { type: \"page_id\" | \"block_id\", page_id: string | undefined, block_id: string | undefined } // Parent page or block, discussion_id: string // Discussion thread ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the comment, rich_text: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] // Comment content } | undefined // Created comment object\n// }\n\n\n// Retrieve Comment example\nconst notion_retrieve_comment = new NotionBubble({\n operation: \"retrieve_comment\", // Retrieve a comment by its ID\n comment_id: \"example string\", // UUID of the Notion comment\n});\n\nconst result = await notion_retrieve_comment.action();\n// outputSchema for result.data when operation === 'retrieve_comment':\n// {\n// operation: \"retrieve_comment\" // Retrieve comment operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// comment: { object: \"comment\" // Object type, id: string // Comment ID, parent: { type: \"page_id\" | \"block_id\", page_id: string | undefined, block_id: string | undefined } // Parent page or block, discussion_id: string // Discussion thread ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, created_by: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details } // User who created the comment, rich_text: { type: \"text\" | \"mention\" | \"equation\" // Type of rich text, text: { content: string // The actual text content, link: { url: string // URL for the link } | null | undefined // Optional link object } | undefined // Text object (when type is \"text\"), annotations: { bold: boolean // Whether text is bolded, italic: boolean // Whether text is italicized, strikethrough: boolean // Whether text is struck through, underline: boolean // Whether text is underlined, code: boolean // Whether text is code style, color: \"default\" | \"gray\" | \"brown\" | \"orange\" | \"yellow\" | \"green\" | \"blue\" | \"purple\" | \"pink\" | \"red\" // Color of the text } | undefined // Styling information for the rich text, plain_text: string | undefined // Plain text without annotations, href: string | null | undefined // URL of any link }[] // Comment content } | undefined // Retrieved comment object\n// }\n\n\n// List Users example\nconst notion_list_users = new NotionBubble({\n operation: \"list_users\", // List all users in the workspace\n start_cursor: \"example string\", // Cursor for pagination\n page_size: 100 // default, // Number of items per page (max 100)\n});\n\nconst result = await notion_list_users.action();\n// outputSchema for result.data when operation === 'list_users':\n// {\n// operation: \"list_users\" // List users operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// users: { object: \"user\" // Object type, id: string // User ID, type: \"person\" | \"bot\" | undefined // User type, name: string | undefined // User name, avatar_url: string | null | undefined // Avatar URL, person: { email: string | undefined // Email address } | undefined // Person details, bot: { owner: { type: \"workspace\" | \"user\" // Owner type, workspace: boolean | undefined } | undefined, workspace_name: string | undefined // Workspace name } | undefined // Bot details }[] | undefined // Array of users in the workspace,\n// next_cursor: string | null | undefined // Cursor for pagination,\n// has_more: boolean | undefined // Whether more results exist\n// }\n\n\n// Search example\nconst notion_search = new NotionBubble({\n operation: \"search\", // Search all pages and data sources shared with the integration\n query: \"example string\", // Text to compare against page and data source titles. If not provided, returns all pages and data sources shared with the integration\n sort: { direction: \"ascending\" // options: \"ascending\", \"descending\" // Sort direction, timestamp: \"last_edited_time\" // Timestamp field to sort by (only \"last_edited_time\" is supported) }, // Sort criteria. If not provided, most recently edited results are returned first\n filter: { value: \"page\" // options: \"page\", \"data_source\" // Filter results to only pages or only data sources, property: \"object\" // Property to filter on (only \"object\" is supported) }, // Filter to limit results to either pages or data sources\n start_cursor: \"example string\", // Cursor for pagination (from previous response)\n page_size: 100 // default, // Number of items per page (max 100)\n});\n\nconst result = await notion_search.action();\n// outputSchema for result.data when operation === 'search':\n// {\n// operation: \"search\" // Search operation result,\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// results: { object: \"page\" | \"data_source\" // Object type (page or data_source), id: string // Object ID, created_time: string // ISO 8601 datetime, last_edited_time: string // ISO 8601 datetime, url: string | undefined // URL of the object, properties: Record<string, unknown> | undefined // Object properties, title: { plain_text: string | undefined }[] | undefined // Title (for data sources), parent: Record<string, unknown> | undefined // Parent of the object, archived: boolean | undefined // Whether the object is archived, in_trash: boolean | undefined // Whether the object is in trash }[] | undefined // Array of pages and/or data sources matching the search query,\n// next_cursor: string | null | undefined // Cursor for pagination,\n// has_more: boolean | undefined // Whether more results exist\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`notion failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
212
+ "requiredCredentials": [
213
+ "NOTION_OAUTH_TOKEN"
176
214
  ]
177
215
  },
178
216
  {
@@ -183,7 +221,7 @@
183
221
  "useCase": "General purpose bubble for various workflow needs",
184
222
  "inputSchema": "{\n dataSourceType: \"postgresql\" // Data source type to analyze,\n ignoreSSLErrors: boolean // Ignore SSL certificate errors,\n includeMetadata: boolean // Include enum values and column constraints,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime),\n injectedMetadata: { tables: Record<string, Record<string, string>> | undefined, tableNotes: Record<string, string> | undefined, rules: string[] | undefined } | undefined // Additional database context injected from user credentials metadata\n}",
185
223
  "outputSchema": "{\n success: boolean,\n error: string,\n databaseSchema: { rawData: Record<string, unknown>[] | undefined, cleanedJSON: string | undefined, tableCount: number | undefined, tableNames: string[] | undefined } | undefined,\n analysisSummary: { dataSourceType: string, connectionSuccessful: boolean, analysisTimestamp: unknown } | undefined\n}",
186
- "usageExample": "// Example usage of database-analyzer bubble\nconst databaseAnalyzer = new DatabaseAnalyzerBubble({\n dataSourceType: \"postgresql\", // Data source type to analyze,\n ignoreSSLErrors: false // default, // Ignore SSL certificate errors,\n includeMetadata: true // default, // Include enum values and column constraints,\n injectedMetadata: { tables: { \"example_key\": { \"example_key\": \"example string\" } // record/object with string keys } // record/object with string keys, tableNotes: { \"example_key\": \"example string\" } // record/object with string keys, rules: [\"example string\"] }, // Additional database context injected from user credentials metadata,\n});\n\nconst result = await databaseAnalyzer.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// success: boolean,\n// error: string,\n// databaseSchema: { rawData: Record<string, unknown>[] | undefined, cleanedJSON: string | undefined, tableCount: number | undefined, tableNames: string[] | undefined } | undefined,\n// analysisSummary: { dataSourceType: string, connectionSuccessful: boolean, analysisTimestamp: unknown } | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
224
+ "usageExample": "// Example usage of database-analyzer bubble\nconst databaseAnalyzer = new DatabaseAnalyzerWorkflowBubble({\n dataSourceType: \"postgresql\", // Data source type to analyze,\n ignoreSSLErrors: false // default, // Ignore SSL certificate errors,\n includeMetadata: true // default, // Include enum values and column constraints,\n injectedMetadata: { tables: { \"example_key\": { \"example_key\": \"example string\" } }, tableNotes: { \"example_key\": \"example string\" }, rules: [\"example string\"] }, // Additional database context injected from user credentials metadata,\n});\n\nconst result = await databaseAnalyzer.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// success: boolean,\n// error: string,\n// databaseSchema: { rawData: Record<string, unknown>[] | undefined, cleanedJSON: string | undefined, tableCount: number | undefined, tableNames: string[] | undefined } | undefined,\n// analysisSummary: { dataSourceType: string, connectionSuccessful: boolean, analysisTimestamp: unknown } | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
187
225
  "requiredCredentials": [
188
226
  "DATABASE_CRED"
189
227
  ]
@@ -194,9 +232,9 @@
194
232
  "type": "workflow",
195
233
  "shortDescription": "Data analyst-powered Slack notifications that tell compelling stories",
196
234
  "useCase": "General purpose bubble for various workflow needs",
197
- "inputSchema": "{\n contentToFormat: string // Raw content or data to format for Slack,\n originalUserQuery: string | undefined // Original user question or context,\n targetChannel: string // Slack channel name (without #) or channel ID,\n messageTitle: string | undefined // Custom title for the Slack message,\n messageStyle: \"professional\" | \"casual\" | \"technical\" | \"concise\" | \"detailed\" // Style and tone for message formatting,\n includeFormatting: boolean // Include emojis and rich Slack formatting,\n maxMessageLength: number // Maximum message length for Slack,\n aiModel: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\", temperature: number, maxTokens: number } | undefined // AI model settings for content formatting,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
235
+ "inputSchema": "{\n contentToFormat: string // Raw content or data to format for Slack,\n originalUserQuery: string | undefined // Original user question or context,\n targetChannel: string // Slack channel name (without #) or channel ID,\n messageTitle: string | undefined // Custom title for the Slack message,\n messageStyle: \"professional\" | \"casual\" | \"technical\" | \"concise\" | \"detailed\" // Style and tone for message formatting,\n includeFormatting: boolean // Include emojis and rich Slack formatting,\n maxMessageLength: number // Maximum message length for Slack,\n aiModel: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\", temperature: number, maxTokens: number } | undefined // AI model settings for content formatting,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
198
236
  "outputSchema": "{\n success: boolean,\n error: string,\n messageInfo: { messageTimestamp: string | undefined, channelId: string | undefined, channelName: string | undefined, formattedMessage: string | undefined, messageLength: number | undefined } | undefined,\n formattingInfo: { modelUsed: string | undefined, wasTruncated: boolean, originalLength: number | undefined } | undefined\n}",
199
- "usageExample": "// Example usage of slack-notifier bubble\nconst slackNotifier = new SlackNotifierBubble({\n contentToFormat: \"example string\", // Raw content or data to format for Slack,\n originalUserQuery: \"example string\", // Original user question or context,\n targetChannel: \"example string\", // Slack channel name (without #) or channel ID,\n messageTitle: \"example string\", // Custom title for the Slack message,\n messageStyle: \"professional\" // options: \"professional\", \"casual\", \"technical\", \"concise\", \"detailed\", // Style and tone for message formatting,\n includeFormatting: true // default, // Include emojis and rich Slack formatting,\n maxMessageLength: 3000 // default, // Maximum message length for Slack,\n aiModel: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", temperature: 0.3 // default, maxTokens: 50000 // default }, // AI model settings for content formatting,\n});\n\nconst result = await slackNotifier.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// success: boolean,\n// error: string,\n// messageInfo: { messageTimestamp: string | undefined, channelId: string | undefined, channelName: string | undefined, formattedMessage: string | undefined, messageLength: number | undefined } | undefined,\n// formattingInfo: { modelUsed: string | undefined, wasTruncated: boolean, originalLength: number | undefined } | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
237
+ "usageExample": "// Example usage of slack-notifier bubble\nconst slackNotifier = new SlackNotifierWorkflowBubble({\n contentToFormat: \"example string\", // Raw content or data to format for Slack,\n originalUserQuery: \"example string\", // Original user question or context,\n targetChannel: \"example string\", // Slack channel name (without #) or channel ID,\n messageTitle: \"example string\", // Custom title for the Slack message,\n messageStyle: \"professional\" // options: \"professional\", \"casual\", \"technical\", \"concise\", \"detailed\", // Style and tone for message formatting,\n includeFormatting: true // default, // Include emojis and rich Slack formatting,\n maxMessageLength: 3000 // default, // Maximum message length for Slack,\n aiModel: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\", temperature: 0.3 // default, maxTokens: 50000 // default }, // AI model settings for content formatting,\n});\n\nconst result = await slackNotifier.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// success: boolean,\n// error: string,\n// messageInfo: { messageTimestamp: string | undefined, channelId: string | undefined, channelName: string | undefined, formattedMessage: string | undefined, messageLength: number | undefined } | undefined,\n// formattingInfo: { modelUsed: string | undefined, wasTruncated: boolean, originalLength: number | undefined } | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
200
238
  "requiredCredentials": [
201
239
  "SLACK_CRED",
202
240
  "OPENAI_CRED",
@@ -210,9 +248,9 @@
210
248
  "type": "workflow",
211
249
  "shortDescription": "AI-powered Slack bot that answers data questions by querying databases",
212
250
  "useCase": "General purpose bubble for various workflow needs",
213
- "inputSchema": "{\n slackChannel: string // Slack channel ID where the bot will respond,\n slackThreadTs: string | undefined // Thread timestamp if replying to a thread,\n userQuestion: string // The user question from Slack,\n userName: string | undefined // Name of the user asking the question,\n name: string // Name of the AI assistant (e.g., \"DataBot\", \"Analytics Assistant\"),\n dataSourceType: \"postgresql\" | \"mysql\" | \"sqlite\" | \"mariadb\" | \"mssql\" // Type of database to analyze,\n databaseUrl: string | undefined // Database connection URL (if not using credentials),\n ignoreSSLErrors: boolean // Ignore SSL certificate errors for database connection,\n aiModel: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" // AI model to use for query generation,\n temperature: number // Temperature for AI responses (lower = more focused),\n verbosity: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Response verbosity level (1=concise, 5=comprehensive),\n technicality: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Technical complexity level (1=plain English, 5=expert),\n includeQuery: boolean // Include the SQL query in the response,\n includeExplanation: boolean // Include query explanation in the response,\n injectedMetadata: { tables: Record<string, Record<string, string>> | undefined, tableNotes: Record<string, string> | undefined, rules: string[] | undefined } | undefined // Additional database context injected from user credentials metadata,\n additionalContext: string | undefined // Additional context about how to answer the question,\n maxQueries: number // Maximum number of queries to run,\n credentials: Record<string, string> | undefined // Credentials for various services\n}",
251
+ "inputSchema": "{\n slackChannel: string // Slack channel ID where the bot will respond,\n slackThreadTs: string | undefined // Thread timestamp if replying to a thread,\n userQuestion: string // The user question from Slack,\n userName: string | undefined // Name of the user asking the question,\n name: string // Name of the AI assistant (e.g., \"DataBot\", \"Analytics Assistant\"),\n dataSourceType: \"postgresql\" | \"mysql\" | \"sqlite\" | \"mariadb\" | \"mssql\" // Type of database to analyze,\n databaseUrl: string | undefined // Database connection URL (if not using credentials),\n ignoreSSLErrors: boolean // Ignore SSL certificate errors for database connection,\n aiModel: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use for query generation,\n temperature: number // Temperature for AI responses (lower = more focused),\n verbosity: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Response verbosity level (1=concise, 5=comprehensive),\n technicality: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Technical complexity level (1=plain English, 5=expert),\n includeQuery: boolean // Include the SQL query in the response,\n includeExplanation: boolean // Include query explanation in the response,\n injectedMetadata: { tables: Record<string, Record<string, string>> | undefined, tableNotes: Record<string, string> | undefined, rules: string[] | undefined } | undefined // Additional database context injected from user credentials metadata,\n additionalContext: string | undefined // Additional context about how to answer the question,\n maxQueries: number // Maximum number of queries to run,\n credentials: Record<string, string> | undefined // Credentials for various services\n}",
214
252
  "outputSchema": "{\n success: boolean // Whether the workflow completed successfully,\n error: string // Error message if workflow failed,\n query: string | undefined // Generated SQL query,\n queryExplanation: string | undefined // Explanation of the query,\n queryResults: Record<string, unknown>[] | undefined // Results from the database query,\n formattedResponse: string | undefined // Formatted response for Slack,\n slackBlocks: unknown[] | undefined // Slack block kit formatted message,\n slackMessageTs: string | undefined // Timestamp of sent Slack message,\n isDataQuestion: boolean | undefined // Whether the question was data-related,\n metadata: { executionTime: number // Total execution time in milliseconds, rowCount: number | undefined // Number of rows returned, wordCount: number | undefined // Word count of response } | undefined\n}",
215
- "usageExample": "// Example usage of slack-data-assistant bubble\nconst slackDataAssistant = new SlackDataAssistantBubble({\n slackChannel: \"example string\", // Slack channel ID where the bot will respond,\n slackThreadTs: \"example string\", // Thread timestamp if replying to a thread,\n userQuestion: \"example string\", // The user question from Slack,\n userName: \"example string\", // Name of the user asking the question,\n name: \"Data Assistant\" // default, // Name of the AI assistant (e.g., \"DataBot\", \"Analytics Assistant\"),\n dataSourceType: \"postgresql\" // options: \"postgresql\", \"mysql\", \"sqlite\", \"mariadb\", \"mssql\", // Type of database to analyze,\n databaseUrl: \"example string\", // Database connection URL (if not using credentials),\n ignoreSSLErrors: false // default, // Ignore SSL certificate errors for database connection,\n aiModel: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", // AI model to use for query generation,\n temperature: 0.3 // default, // Temperature for AI responses (lower = more focused),\n verbosity: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Response verbosity level (1=concise, 5=comprehensive),\n technicality: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Technical complexity level (1=plain English, 5=expert),\n includeQuery: true // default, // Include the SQL query in the response,\n includeExplanation: true // default, // Include query explanation in the response,\n injectedMetadata: { tables: { \"example_key\": { \"example_key\": \"example string\" } // record/object with string keys } // record/object with string keys, tableNotes: { \"example_key\": \"example string\" } // record/object with string keys, rules: [\"example string\"] }, // Additional database context injected from user credentials metadata,\n additionalContext: \"example string\", // Additional context about how to answer the question,\n maxQueries: 20 // default, // Maximum number of queries to run,\n});\n\nconst result = await slackDataAssistant.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed,\n// query: string | undefined // Generated SQL query,\n// queryExplanation: string | undefined // Explanation of the query,\n// queryResults: Record<string, unknown>[] | undefined // Results from the database query,\n// formattedResponse: string | undefined // Formatted response for Slack,\n// slackBlocks: unknown[] | undefined // Slack block kit formatted message,\n// slackMessageTs: string | undefined // Timestamp of sent Slack message,\n// isDataQuestion: boolean | undefined // Whether the question was data-related,\n// metadata: { executionTime: number // Total execution time in milliseconds, rowCount: number | undefined // Number of rows returned, wordCount: number | undefined // Word count of response } | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
253
+ "usageExample": "// Example usage of slack-data-assistant bubble\nconst slackDataAssistant = new SlackDataAssistantWorkflow({\n slackChannel: \"example string\", // Slack channel ID where the bot will respond,\n slackThreadTs: \"example string\", // Thread timestamp if replying to a thread,\n userQuestion: \"example string\", // The user question from Slack,\n userName: \"example string\", // Name of the user asking the question,\n name: \"Data Assistant\" // default, // Name of the AI assistant (e.g., \"DataBot\", \"Analytics Assistant\"),\n dataSourceType: \"postgresql\" // options: \"postgresql\", \"mysql\", \"sqlite\", \"mariadb\", \"mssql\", // Type of database to analyze,\n databaseUrl: \"example string\", // Database connection URL (if not using credentials),\n ignoreSSLErrors: false // default, // Ignore SSL certificate errors for database connection,\n aiModel: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\", // AI model to use for query generation,\n temperature: 0.3 // default, // Temperature for AI responses (lower = more focused),\n verbosity: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Response verbosity level (1=concise, 5=comprehensive),\n technicality: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Technical complexity level (1=plain English, 5=expert),\n includeQuery: true // default, // Include the SQL query in the response,\n includeExplanation: true // default, // Include query explanation in the response,\n injectedMetadata: { tables: { \"example_key\": { \"example_key\": \"example string\" } }, tableNotes: { \"example_key\": \"example string\" }, rules: [\"example string\"] }, // Additional database context injected from user credentials metadata,\n additionalContext: \"example string\", // Additional context about how to answer the question,\n maxQueries: 20 // default, // Maximum number of queries to run,\n});\n\nconst result = await slackDataAssistant.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed,\n// query: string | undefined // Generated SQL query,\n// queryExplanation: string | undefined // Explanation of the query,\n// queryResults: Record<string, unknown>[] | undefined // Results from the database query,\n// formattedResponse: string | undefined // Formatted response for Slack,\n// slackBlocks: unknown[] | undefined // Slack block kit formatted message,\n// slackMessageTs: string | undefined // Timestamp of sent Slack message,\n// isDataQuestion: boolean | undefined // Whether the question was data-related,\n// metadata: { executionTime: number // Total execution time in milliseconds, rowCount: number | undefined // Number of rows returned, wordCount: number | undefined // Word count of response } | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
216
254
  "requiredCredentials": [
217
255
  "DATABASE_CRED",
218
256
  "SLACK_CRED",
@@ -227,9 +265,9 @@
227
265
  "type": "service",
228
266
  "shortDescription": "AI agent for creating well-formatted Slack messages with adjustable verbosity and technicality",
229
267
  "useCase": "General purpose bubble for various workflow needs",
230
- "inputSchema": "{\n message: string // The message or question to send to the AI agent,\n verbosity: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Response verbosity level (1-5): 1=concise bullet points, 5=comprehensive explanations,\n technicality: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Technical complexity level (1-5): 1=plain English, 5=expert terminology,\n includeBlockKit: boolean // Include Slack Block Kit JSON for rich formatting,\n includeQuery: boolean // Include the query that was executed in the response,\n includeExplanation: boolean // Include explanation of what the query does and why it was chosen,\n model: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" // AI model to use (format: provider/model-name), temperature: number // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: number | undefined // Maximum number of tokens to generate in response } // AI model configuration including provider, temperature, and tokens,\n tools: { name: string // Name of the tool bubble to enable for the AI agent, credentials: Record<string, string> | undefined // Credential types to use for the tool bubble (injected at runtime), config: Record<string, unknown> | undefined // Configuration for the tool bubble }[] // Array of tool bubbles the AI agent can use,\n maxIterations: number // Maximum number of iterations for the agent workflow,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime),\n additionalContext: string | undefined // Additional context about how to answer the question\n}",
268
+ "inputSchema": "{\n message: string // The message or question to send to the AI agent,\n verbosity: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Response verbosity level (1-5): 1=concise bullet points, 5=comprehensive explanations,\n technicality: \"1\" | \"2\" | \"3\" | \"4\" | \"5\" // Technical complexity level (1-5): 1=plain English, 5=expert terminology,\n includeBlockKit: boolean // Include Slack Block Kit JSON for rich formatting,\n includeQuery: boolean // Include the query that was executed in the response,\n includeExplanation: boolean // Include explanation of what the query does and why it was chosen,\n model: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use (format: provider/model-name), temperature: number // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: number | undefined // Maximum number of tokens to generate in response } // AI model configuration including provider, temperature, and tokens,\n tools: { name: string // Name of the tool bubble to enable for the AI agent, config: Record<string, unknown> | undefined // Configuration for the tool bubble }[] // Array of tool bubbles the AI agent can use,\n maxIterations: number // Maximum number of iterations for the agent workflow,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime),\n additionalContext: string | undefined // Additional context about how to answer the question\n}",
231
269
  "outputSchema": "{\n response: string // The AI agents formatted response in Slack markdown,\n blocks: { type: \"section\" | \"header\" | \"divider\" | \"context\" | \"actions\" | \"input\" | \"file\" | \"image\", text: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined } | undefined, block_id: string | undefined, accessory: unknown | undefined, fields: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined }[] | undefined, element: unknown | undefined, label: unknown | undefined, hint: unknown | undefined, optional: boolean | undefined, alt_text: string | undefined, image_url: string | undefined, title: { type: \"plain_text\", text: string, emoji: boolean | undefined } | undefined, elements: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined }[] | undefined }[] | undefined // Slack Block Kit formatted blocks for rich message display,\n metadata: { verbosityLevel: string // Applied verbosity level, technicalityLevel: string // Applied technicality level, wordCount: number // Total word count of response, blockCount: number | undefined // Number of Slack blocks generated } // Metadata about the formatting,\n toolCalls: { tool: string // Name of the tool that was called, input: unknown // Input parameters passed to the tool, output: unknown // Output returned by the tool }[] | undefined // Array of tool calls made during the conversation,\n iterations: number // Number of back-and-forth iterations in the agent workflow,\n error: string // Error message of the run, undefined if successful,\n success: boolean // Whether the agent execution completed successfully\n}",
232
- "usageExample": "// Example usage of slack-formatter-agent bubble\nconst slackFormatterAgent = new SlackFormatterAgentBubble({\n message: \"example string\", // The message or question to send to the AI agent,\n verbosity: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Response verbosity level (1-5): 1=concise bullet points, 5=comprehensive explanations,\n technicality: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Technical complexity level (1-5): 1=plain English, 5=expert terminology,\n includeBlockKit: true // default, // Include Slack Block Kit JSON for rich formatting,\n includeQuery: false // default, // Include the query that was executed in the response,\n includeExplanation: false // default, // Include explanation of what the query does and why it was chosen,\n model: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\" // AI model to use (format: provider/model-name), temperature: 0.7 // default // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: 10000 // default // Maximum number of tokens to generate in response } // structure, // AI model configuration including provider, temperature, and tokens,\n tools: [{ name: \"example string\" // Name of the tool bubble to enable for the AI agent, credentials: { \"example_key\": \"example string\" } // record/object with string keys // structure // Credential types to use for the tool bubble (injected at runtime), config: {} // record/object with string keys // Configuration for the tool bubble }] // example for array, // Array of tool bubbles the AI agent can use,\n maxIterations: 10 // default, // Maximum number of iterations for the agent workflow,\n additionalContext: \"example string\", // Additional context about how to answer the question,\n});\n\nconst result = await slackFormatterAgent.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// response: string // The AI agents formatted response in Slack markdown,\n// blocks: { type: \"section\" | \"header\" | \"divider\" | \"context\" | \"actions\" | \"input\" | \"file\" | \"image\", text: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined } | undefined, block_id: string | undefined, accessory: unknown | undefined, fields: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined }[] | undefined, element: unknown | undefined, label: unknown | undefined, hint: unknown | undefined, optional: boolean | undefined, alt_text: string | undefined, image_url: string | undefined, title: { type: \"plain_text\", text: string, emoji: boolean | undefined } | undefined, elements: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined }[] | undefined }[] | undefined // Slack Block Kit formatted blocks for rich message display,\n// metadata: { verbosityLevel: string // Applied verbosity level, technicalityLevel: string // Applied technicality level, wordCount: number // Total word count of response, blockCount: number | undefined // Number of Slack blocks generated } // Metadata about the formatting,\n// toolCalls: { tool: string // Name of the tool that was called, input: unknown // Input parameters passed to the tool, output: unknown // Output returned by the tool }[] | undefined // Array of tool calls made during the conversation,\n// iterations: number // Number of back-and-forth iterations in the agent workflow,\n// error: string // Error message of the run, undefined if successful,\n// success: boolean // Whether the agent execution completed successfully\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
270
+ "usageExample": "// Example usage of slack-formatter-agent bubble\nconst slackFormatterAgent = new SlackFormatterAgentBubble({\n message: \"example string\", // The message or question to send to the AI agent,\n verbosity: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Response verbosity level (1-5): 1=concise bullet points, 5=comprehensive explanations,\n technicality: \"1\" // options: \"1\", \"2\", \"3\", \"4\", \"5\", // Technical complexity level (1-5): 1=plain English, 5=expert terminology,\n includeBlockKit: true // default, // Include Slack Block Kit JSON for rich formatting,\n includeQuery: false // default, // Include the query that was executed in the response,\n includeExplanation: false // default, // Include explanation of what the query does and why it was chosen,\n model: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use (format: provider/model-name), temperature: 0.7 // default // Temperature for response randomness (0 = deterministic, 2 = very random), maxTokens: 10000 // default // Maximum number of tokens to generate in response } // structure, // AI model configuration including provider, temperature, and tokens,\n tools: [{ name: \"example string\" // Name of the tool bubble to enable for the AI agent, config: {} // Configuration for the tool bubble }] // example for array, // Array of tool bubbles the AI agent can use,\n maxIterations: 10 // default, // Maximum number of iterations for the agent workflow,\n additionalContext: \"example string\", // Additional context about how to answer the question,\n});\n\nconst result = await slackFormatterAgent.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// response: string // The AI agents formatted response in Slack markdown,\n// blocks: { type: \"section\" | \"header\" | \"divider\" | \"context\" | \"actions\" | \"input\" | \"file\" | \"image\", text: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined } | undefined, block_id: string | undefined, accessory: unknown | undefined, fields: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined }[] | undefined, element: unknown | undefined, label: unknown | undefined, hint: unknown | undefined, optional: boolean | undefined, alt_text: string | undefined, image_url: string | undefined, title: { type: \"plain_text\", text: string, emoji: boolean | undefined } | undefined, elements: { type: \"plain_text\" | \"mrkdwn\", text: string, emoji: boolean | undefined, verbatim: boolean | undefined }[] | undefined }[] | undefined // Slack Block Kit formatted blocks for rich message display,\n// metadata: { verbosityLevel: string // Applied verbosity level, technicalityLevel: string // Applied technicality level, wordCount: number // Total word count of response, blockCount: number | undefined // Number of Slack blocks generated } // Metadata about the formatting,\n// toolCalls: { tool: string // Name of the tool that was called, input: unknown // Input parameters passed to the tool, output: unknown // Output returned by the tool }[] | undefined // Array of tool calls made during the conversation,\n// iterations: number // Number of back-and-forth iterations in the agent workflow,\n// error: string // Error message of the run, undefined if successful,\n// success: boolean // Whether the agent execution completed successfully\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
233
271
  "requiredCredentials": [
234
272
  "OPENAI_CRED",
235
273
  "GOOGLE_GEMINI_CRED",
@@ -244,8 +282,13 @@
244
282
  "useCase": "General purpose bubble for various workflow needs",
245
283
  "inputSchema": "Complex schema - see usage example for structure",
246
284
  "outputSchema": "Complex schema - see usage example for structure",
247
- "usageExample": "// Discover example\nconst pdfFormOperations_discover = new PdfFormOperationsBubble({\n operation: \"discover\",\n pdfData: \"example string\", // Base64 encoded PDF data\n targetPage: 42, // Extract fields from specific page only (default: all pages)\n});\n\nconst result = await pdfFormOperations_discover.action();\n// outputSchema for result.data when operation === 'discover':\n// {\n// operation: \"discover\",\n// fields: { id: number, page: number, name: string, type: string, field_type: string, current_value: string, choices: string[], rect: unknown, x: number, y: number, width: number, height: number, field_flags: number, label: string, potential_labels: string[] }[],\n// totalFields: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Fill example\nconst pdfFormOperations_fill = new PdfFormOperationsBubble({\n operation: \"fill\",\n pdfData: \"example string\", // Base64 encoded PDF data\n fieldValues: { \"example_key\": \"example string\" } // record/object with string keys, // Field name to value mapping\n});\n\nconst result = await pdfFormOperations_fill.action();\n// outputSchema for result.data when operation === 'fill':\n// {\n// operation: \"fill\",\n// filledPdfData: string // Base64 encoded filled PDF data,\n// filledFields: number,\n// verification: Record<string, { value: string, type: string, page: number }>,\n// success: boolean,\n// error: string\n// }\n\n\n// Analyze-checkboxes example\nconst pdfFormOperations_analyze_checkboxes = new PdfFormOperationsBubble({\n operation: \"analyze-checkboxes\",\n pdfData: \"example string\", // Base64 encoded PDF data\n});\n\nconst result = await pdfFormOperations_analyze_checkboxes.action();\n// outputSchema for result.data when operation === 'analyze-checkboxes':\n// {\n// operation: \"analyze-checkboxes\",\n// checkboxes: Record<string, { page: number, current_value: string, possible_values: string[], field_flags: number }>,\n// totalCheckboxes: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Validate example\nconst pdfFormOperations_validate = new PdfFormOperationsBubble({\n operation: \"validate\",\n pdfData: \"example string\", // Base64 encoded PDF data\n});\n\nconst result = await pdfFormOperations_validate.action();\n// outputSchema for result.data when operation === 'validate':\n// {\n// operation: \"validate\",\n// fields: Record<string, { value: string, type: string, page: number }>,\n// totalFields: number,\n// filledFields: number,\n// emptyFields: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Convert-to-images example\nconst pdfFormOperations_convert_to_images = new PdfFormOperationsBubble({\n operation: \"convert-to-images\",\n pdfData: \"example string\", // Base64 encoded PDF data\n format: \"png\" // options: \"png\", \"jpeg\", // Output image format\n quality: 0.8 // default, // JPEG quality (0.1-1.0, only for JPEG format)\n dpi: 150 // default, // Output DPI (dots per inch)\n pages: [42], // Specific page numbers to convert (1-indexed). If not provided, converts all pages\n});\n\nconst result = await pdfFormOperations_convert_to_images.action();\n// outputSchema for result.data when operation === 'convert-to-images':\n// {\n// operation: \"convert-to-images\",\n// images: { pageNumber: number, imageData: string // Base64 encoded image data, format: string, width: number, height: number }[],\n// totalPages: number,\n// convertedPages: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Convert-to-markdown example\nconst pdfFormOperations_convert_to_markdown = new PdfFormOperationsBubble({\n operation: \"convert-to-markdown\",\n pdfData: \"example string\", // Base64 encoded PDF data\n pages: [42], // Specific page numbers to convert (1-indexed). If not provided, converts all pages\n includeFormFields: true // default, // Whether to include form field information in the markdown\n});\n\nconst result = await pdfFormOperations_convert_to_markdown.action();\n// outputSchema for result.data when operation === 'convert-to-markdown':\n// {\n// operation: \"convert-to-markdown\",\n// markdown: string // Markdown representation of the PDF content,\n// pages: { pageNumber: number, markdown: string // Markdown content for this page, formFields: { id: number, name: string, type: string, value: string, x: number, y: number }[] | undefined }[],\n// totalPages: number,\n// convertedPages: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`pdf-form-operations failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
248
- "requiredCredentials": []
285
+ "usageExample": "// Discover example\nconst pdfFormOperations_discover = new PDFFormOperationsWorkflow({\n operation: \"discover\",\n pdfData: \"example string\", // Base64 encoded PDF data\n targetPage: 42, // Extract fields from specific page only (default: all pages)\n});\n\nconst result = await pdfFormOperations_discover.action();\n// outputSchema for result.data when operation === 'discover':\n// {\n// operation: \"discover\",\n// fields: { id: number, page: number, name: string, type: string, field_type: string, current_value: string, choices: string[], rect: unknown, x: number, y: number, width: number, height: number, field_flags: number, label: string, potential_labels: string[] }[],\n// totalFields: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Fill example\nconst pdfFormOperations_fill = new PDFFormOperationsWorkflow({\n operation: \"fill\",\n pdfData: \"example string\", // Base64 encoded PDF data\n fieldValues: { \"example_key\": \"example string\" }, // Field name to value mapping\n});\n\nconst result = await pdfFormOperations_fill.action();\n// outputSchema for result.data when operation === 'fill':\n// {\n// operation: \"fill\",\n// filledPdfData: string // Base64 encoded filled PDF data,\n// filledFields: number,\n// verification: Record<string, { value: string, type: string, page: number }>,\n// success: boolean,\n// error: string\n// }\n\n\n// Analyze-checkboxes example\nconst pdfFormOperations_analyze_checkboxes = new PDFFormOperationsWorkflow({\n operation: \"analyze-checkboxes\",\n pdfData: \"example string\", // Base64 encoded PDF data\n});\n\nconst result = await pdfFormOperations_analyze_checkboxes.action();\n// outputSchema for result.data when operation === 'analyze-checkboxes':\n// {\n// operation: \"analyze-checkboxes\",\n// checkboxes: Record<string, { page: number, current_value: string, possible_values: string[], field_flags: number }>,\n// totalCheckboxes: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Validate example\nconst pdfFormOperations_validate = new PDFFormOperationsWorkflow({\n operation: \"validate\",\n pdfData: \"example string\", // Base64 encoded PDF data\n});\n\nconst result = await pdfFormOperations_validate.action();\n// outputSchema for result.data when operation === 'validate':\n// {\n// operation: \"validate\",\n// fields: Record<string, { value: string, type: string, page: number }>,\n// totalFields: number,\n// filledFields: number,\n// emptyFields: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Convert-to-images example\nconst pdfFormOperations_convert_to_images = new PDFFormOperationsWorkflow({\n operation: \"convert-to-images\",\n pdfData: \"example string\", // Base64 encoded PDF data\n format: \"png\" // options: \"png\", \"jpeg\", // Output image format\n quality: 0.8 // default, // JPEG quality (0.1-1.0, only for JPEG format)\n dpi: 150 // default, // Output DPI (dots per inch)\n pages: [42], // Specific page numbers to convert (1-indexed). If not provided, converts all pages\n});\n\nconst result = await pdfFormOperations_convert_to_images.action();\n// outputSchema for result.data when operation === 'convert-to-images':\n// {\n// operation: \"convert-to-images\",\n// images: { pageNumber: number, imageData: string // Base64 encoded image data, format: string, width: number, height: number }[],\n// totalPages: number,\n// convertedPages: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Convert-to-markdown example\nconst pdfFormOperations_convert_to_markdown = new PDFFormOperationsWorkflow({\n operation: \"convert-to-markdown\",\n pdfData: \"example string\", // Base64 encoded PDF data\n pages: [42], // Specific page numbers to convert (1-indexed). If not provided, converts all pages\n includeFormFields: true // default, // Whether to include form field information in the markdown\n});\n\nconst result = await pdfFormOperations_convert_to_markdown.action();\n// outputSchema for result.data when operation === 'convert-to-markdown':\n// {\n// operation: \"convert-to-markdown\",\n// markdown: string // Markdown representation of the PDF content,\n// pages: { pageNumber: number, markdown: string // Markdown content for this page, formFields: { id: number, name: string, type: string, value: string, x: number, y: number }[] | undefined }[],\n// totalPages: number,\n// convertedPages: number,\n// success: boolean,\n// error: string\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`pdf-form-operations failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
286
+ "requiredCredentials": [
287
+ "GOOGLE_GEMINI_CRED",
288
+ "OPENAI_CRED",
289
+ "ANTHROPIC_CRED",
290
+ "OPENROUTER_CRED"
291
+ ]
249
292
  },
250
293
  {
251
294
  "name": "pdf-ocr-workflow",
@@ -255,7 +298,7 @@
255
298
  "useCase": "- **Identify**: Form schema generation, document structure analysis",
256
299
  "inputSchema": "Complex schema - see usage example for structure",
257
300
  "outputSchema": "Complex schema - see usage example for structure",
258
- "usageExample": "// Identify example\nconst pdfOcrWorkflow_identify = new PdfOcrWorkflowBubble({\n mode: \"identify\", // Identify form fields and generate descriptive names\n pdfData: \"example string\", // Base64 encoded PDF data\n discoveryOptions: { targetPage: 42 // Extract fields from specific page only (default: all pages) } // structure, // Options for PDF field discovery\n imageOptions: { format: \"png\" // options: \"png\", \"jpeg\" // Output image format, quality: 0.8 // default // JPEG quality (0.1-1.0, only for JPEG format), dpi: 150 // default // Output DPI (dots per inch), pages: [42] // Specific page numbers to convert (1-indexed). If not provided, converts all pages } // structure, // Options for PDF to images conversion\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\" // AI model to use for field identification, temperature: 0.3 // default // Temperature for AI responses (lower = more consistent), maxTokens: 50000 // default // Maximum tokens for AI response, jsonMode: true // default // Enable JSON mode to ensure clean JSON output } // structure, // AI agent configuration options\n});\n\nconst result = await pdfOcrWorkflow_identify.action();\n// outputSchema for result.data when operation === 'identify':\n// {\n// mode: \"identify\" // Result from identify mode,\n// extractedFields: { id: number // Field ID from discovery or auto-generated, fieldName: string // Descriptive name generated based on PDF content, confidence: number // AI confidence in the field identification (0.0-1.0) }[] // Array of identified fields with descriptive names,\n// discoveryData: { totalFields: number, fieldsWithCoordinates: number, pages: number[] } // Summary of field discovery results,\n// imageData: { totalPages: number, convertedPages: number, format: string, dpi: number } // Summary of image conversion results,\n// aiAnalysis: { model: string, iterations: number, processingTime: number | undefined } // AI analysis metadata,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n\n// Autofill example\nconst pdfOcrWorkflow_autofill = new PdfOcrWorkflowBubble({\n mode: \"autofill\", // Identify form fields and autofill with client information\n pdfData: \"example string\", // Base64 encoded PDF data\n clientInformation: \"example string\", // Free text containing client information to use for autofilling form fields\n discoveryOptions: { targetPage: 42 // Extract fields from specific page only (default: all pages) } // structure, // Options for PDF field discovery\n imageOptions: { format: \"png\" // options: \"png\", \"jpeg\" // Output image format, quality: 0.8 // default // JPEG quality (0.1-1.0, only for JPEG format), dpi: 150 // default // Output DPI (dots per inch), pages: [42] // Specific page numbers to convert (1-indexed). If not provided, converts all pages } // structure, // Options for PDF to images conversion\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\" // AI model to use for field identification and autofill, temperature: 0.3 // default // Temperature for AI responses (lower = more consistent), maxTokens: 50000 // default // Maximum tokens for AI response, jsonMode: true // default // Enable JSON mode to ensure clean JSON output } // structure, // AI agent configuration options\n});\n\nconst result = await pdfOcrWorkflow_autofill.action();\n// outputSchema for result.data when operation === 'autofill':\n// {\n// mode: \"autofill\" // Result from autofill mode,\n// extractedFields: { id: number // Field ID from discovery or auto-generated, originalFieldName: string | undefined // Original field name from discovery for precise matching, fieldName: string // Descriptive name generated based on PDF content, value: string // Value to fill in the field based on client information, confidence: number // AI confidence in the field identification and value assignment (0.0-1.0) }[] // Array of identified fields with values for autofill,\n// filledPdfData: string // Base64 encoded filled PDF data,\n// discoveryData: { totalFields: number, fieldsWithCoordinates: number, pages: number[] } // Summary of field discovery results,\n// imageData: { totalPages: number, convertedPages: number, format: string, dpi: number } // Summary of image conversion results,\n// aiAnalysis: { model: string, iterations: number, processingTime: number | undefined } // AI analysis metadata,\n// fillResults: { filledFields: number, successfullyFilled: number } // Summary of PDF filling results,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`pdf-ocr-workflow failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
301
+ "usageExample": "// Identify example\nconst pdfOcrWorkflow_identify = new PDFOcrWorkflow({\n mode: \"identify\", // Identify form fields and generate descriptive names\n pdfData: \"example string\", // Base64 encoded PDF data\n discoveryOptions: { targetPage: 42 // Extract fields from specific page only (default: all pages) } // structure, // Options for PDF field discovery\n imageOptions: { format: \"png\" // options: \"png\", \"jpeg\" // Output image format, quality: 0.8 // default // JPEG quality (0.1-1.0, only for JPEG format), dpi: 150 // default // Output DPI (dots per inch), pages: [42] // Specific page numbers to convert (1-indexed). If not provided, converts all pages } // structure, // Options for PDF to images conversion\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use for field identification, temperature: 0.3 // default // Temperature for AI responses (lower = more consistent), maxTokens: 50000 // default // Maximum tokens for AI response, jsonMode: true // default // Enable JSON mode to ensure clean JSON output } // structure, // AI agent configuration options\n});\n\nconst result = await pdfOcrWorkflow_identify.action();\n// outputSchema for result.data when operation === 'identify':\n// {\n// mode: \"identify\" // Result from identify mode,\n// extractedFields: { id: number // Field ID from discovery or auto-generated, fieldName: string // Descriptive name generated based on PDF content, confidence: number // AI confidence in the field identification (0.0-1.0) }[] // Array of identified fields with descriptive names,\n// discoveryData: { totalFields: number, fieldsWithCoordinates: number, pages: number[] } // Summary of field discovery results,\n// imageData: { totalPages: number, convertedPages: number, format: string, dpi: number } // Summary of image conversion results,\n// aiAnalysis: { model: string, iterations: number, processingTime: number | undefined } // AI analysis metadata,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n\n// Autofill example\nconst pdfOcrWorkflow_autofill = new PDFOcrWorkflow({\n mode: \"autofill\", // Identify form fields and autofill with client information\n pdfData: \"example string\", // Base64 encoded PDF data\n clientInformation: \"example string\", // Free text containing client information to use for autofilling form fields\n discoveryOptions: { targetPage: 42 // Extract fields from specific page only (default: all pages) } // structure, // Options for PDF field discovery\n imageOptions: { format: \"png\" // options: \"png\", \"jpeg\" // Output image format, quality: 0.8 // default // JPEG quality (0.1-1.0, only for JPEG format), dpi: 150 // default // Output DPI (dots per inch), pages: [42] // Specific page numbers to convert (1-indexed). If not provided, converts all pages } // structure, // Options for PDF to images conversion\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use for field identification and autofill, temperature: 0.3 // default // Temperature for AI responses (lower = more consistent), maxTokens: 50000 // default // Maximum tokens for AI response, jsonMode: true // default // Enable JSON mode to ensure clean JSON output } // structure, // AI agent configuration options\n});\n\nconst result = await pdfOcrWorkflow_autofill.action();\n// outputSchema for result.data when operation === 'autofill':\n// {\n// mode: \"autofill\" // Result from autofill mode,\n// extractedFields: { id: number // Field ID from discovery or auto-generated, originalFieldName: string | undefined // Original field name from discovery for precise matching, fieldName: string // Descriptive name generated based on PDF content, value: string // Value to fill in the field based on client information, confidence: number // AI confidence in the field identification and value assignment (0.0-1.0) }[] // Array of identified fields with values for autofill,\n// filledPdfData: string // Base64 encoded filled PDF data,\n// discoveryData: { totalFields: number, fieldsWithCoordinates: number, pages: number[] } // Summary of field discovery results,\n// imageData: { totalPages: number, convertedPages: number, format: string, dpi: number } // Summary of image conversion results,\n// aiAnalysis: { model: string, iterations: number, processingTime: number | undefined } // AI analysis metadata,\n// fillResults: { filledFields: number, successfullyFilled: number } // Summary of PDF filling results,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`pdf-ocr-workflow failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
259
302
  "requiredCredentials": [
260
303
  "GOOGLE_GEMINI_CRED",
261
304
  "OPENAI_CRED",
@@ -269,9 +312,9 @@
269
312
  "type": "workflow",
270
313
  "shortDescription": "Generate Document workflow: convert markdown to structured formats using AI",
271
314
  "useCase": "General purpose bubble for various workflow needs",
272
- "inputSchema": "{\n documents: { content: string, index: number, metadata: { originalFilename: string | undefined, pageCount: number | undefined, uploadedImages: { pageNumber: number, fileName: string, fileUrl: string | undefined }[] | undefined } | undefined }[] // Array of document objects with content, index, and metadata,\n outputDescription: string // Description of what the user wants to extract (e.g., \"expense tracking with vendor, amount, date, category\"),\n outputFormat: \"html\" | \"csv\" | \"json\" // Output format for the structured data,\n aiOptions: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" // AI model to use for document analysis, temperature: number // Temperature for AI responses (lower = more consistent), maxTokens: number // Maximum tokens for AI response, jsonMode: boolean // Enable JSON mode to ensure clean JSON output } // AI agent configuration options,\n credentials: Record<string, string> | undefined // Credentials for AI model access (GOOGLE_GEMINI_CRED, OPENAI_CRED, etc.)\n}",
315
+ "inputSchema": "{\n documents: { content: string, index: number, metadata: { originalFilename: string | undefined, pageCount: number | undefined, uploadedImages: { pageNumber: number, fileName: string, fileUrl: string | undefined }[] | undefined } | undefined }[] // Array of document objects with content, index, and metadata,\n outputDescription: string // Description of what the user wants to extract (e.g., \"expense tracking with vendor, amount, date, category\"),\n outputFormat: \"html\" | \"csv\" | \"json\" // Output format for the structured data,\n aiOptions: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use for document analysis, temperature: number // Temperature for AI responses (lower = more consistent), maxTokens: number // Maximum tokens for AI response, jsonMode: boolean // Enable JSON mode to ensure clean JSON output } // AI agent configuration options,\n credentials: Record<string, string> | undefined // Credentials for AI model access (GOOGLE_GEMINI_CRED, OPENAI_CRED, etc.)\n}",
273
316
  "outputSchema": "{\n columns: { name: string // Column name, type: \"string\" | \"number\" | \"integer\" | \"float\" | \"date\" | \"boolean\" // Data type of the column, description: string // Description of what this column contains }[] // Column definitions for the structured data,\n rows: Record<string, unknown>[] // Array of data rows extracted from documents,\n metadata: { totalDocuments: number // Number of documents processed, totalRows: number // Number of data rows extracted, totalColumns: number // Number of columns in the result, processingTime: number // Processing time in milliseconds, extractedFrom: string[] // Summary of document sources } // Metadata about the extraction process,\n generatedFiles: { html: string | undefined // Generated HTML table, csv: string | undefined // Generated CSV data, json: string | undefined // Generated JSON data } // Generated files in requested formats,\n aiAnalysis: { model: string // AI model used, iterations: number // Number of AI iterations, processingTime: number | undefined // AI processing time } // AI analysis metadata,\n success: boolean // Whether the workflow completed successfully,\n error: string // Error message if workflow failed\n}",
274
- "usageExample": "// Example usage of generate-document-workflow bubble\nconst generateDocumentWorkflow = new GenerateDocumentWorkflowBubble({\n documents: [{ content: \"example string\", index: 42, metadata: { originalFilename: \"example string\", pageCount: 42, uploadedImages: [{ pageNumber: 42, fileName: \"example string\", fileUrl: \"example string\" }] } }], // Array of document objects with content, index, and metadata,\n outputDescription: \"example string\", // Description of what the user wants to extract (e.g., \"expense tracking with vendor, amount, date, category\"),\n outputFormat: \"html\" // options: \"html\", \"csv\", \"json\", // Output format for the structured data,\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\" // AI model to use for document analysis, temperature: 0.1 // default // Temperature for AI responses (lower = more consistent), maxTokens: 50000 // default // Maximum tokens for AI response, jsonMode: true // default // Enable JSON mode to ensure clean JSON output } // structure, // AI agent configuration options,\n});\n\nconst result = await generateDocumentWorkflow.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// columns: { name: string // Column name, type: \"string\" | \"number\" | \"integer\" | \"float\" | \"date\" | \"boolean\" // Data type of the column, description: string // Description of what this column contains }[] // Column definitions for the structured data,\n// rows: Record<string, unknown>[] // Array of data rows extracted from documents,\n// metadata: { totalDocuments: number // Number of documents processed, totalRows: number // Number of data rows extracted, totalColumns: number // Number of columns in the result, processingTime: number // Processing time in milliseconds, extractedFrom: string[] // Summary of document sources } // Metadata about the extraction process,\n// generatedFiles: { html: string | undefined // Generated HTML table, csv: string | undefined // Generated CSV data, json: string | undefined // Generated JSON data } // Generated files in requested formats,\n// aiAnalysis: { model: string // AI model used, iterations: number // Number of AI iterations, processingTime: number | undefined // AI processing time } // AI analysis metadata,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
317
+ "usageExample": "// Example usage of generate-document-workflow bubble\nconst generateDocumentWorkflow = new GenerateDocumentWorkflow({\n documents: [{ content: \"example string\", index: 42, metadata: { originalFilename: \"example string\", pageCount: 42, uploadedImages: [{ pageNumber: 42, fileName: \"example string\", fileUrl: \"example string\" }] } }], // Array of document objects with content, index, and metadata,\n outputDescription: \"example string\", // Description of what the user wants to extract (e.g., \"expense tracking with vendor, amount, date, category\"),\n outputFormat: \"html\" // options: \"html\", \"csv\", \"json\", // Output format for the structured data,\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use for document analysis, temperature: 0.1 // default // Temperature for AI responses (lower = more consistent), maxTokens: 50000 // default // Maximum tokens for AI response, jsonMode: true // default // Enable JSON mode to ensure clean JSON output } // structure, // AI agent configuration options,\n});\n\nconst result = await generateDocumentWorkflow.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// columns: { name: string // Column name, type: \"string\" | \"number\" | \"integer\" | \"float\" | \"date\" | \"boolean\" // Data type of the column, description: string // Description of what this column contains }[] // Column definitions for the structured data,\n// rows: Record<string, unknown>[] // Array of data rows extracted from documents,\n// metadata: { totalDocuments: number // Number of documents processed, totalRows: number // Number of data rows extracted, totalColumns: number // Number of columns in the result, processingTime: number // Processing time in milliseconds, extractedFrom: string[] // Summary of document sources } // Metadata about the extraction process,\n// generatedFiles: { html: string | undefined // Generated HTML table, csv: string | undefined // Generated CSV data, json: string | undefined // Generated JSON data } // Generated files in requested formats,\n// aiAnalysis: { model: string // AI model used, iterations: number // Number of AI iterations, processingTime: number | undefined // AI processing time } // AI analysis metadata,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
275
318
  "requiredCredentials": [
276
319
  "GOOGLE_GEMINI_CRED",
277
320
  "OPENAI_CRED",
@@ -285,9 +328,9 @@
285
328
  "type": "workflow",
286
329
  "shortDescription": "Parse Document workflow: convert PDFs/images to markdown using AI vision",
287
330
  "useCase": "General purpose bubble for various workflow needs",
288
- "inputSchema": "{\n documentData: string // Base64 encoded document data (PDF or image) OR R2 file URL starting with https://,\n documentType: \"pdf\" | \"image\" // Type of document being processed,\n isFileUrl: boolean | undefined // Set to true if documentData is an R2 file URL instead of base64,\n conversionOptions: { preserveStructure: boolean // Maintain original document structure and hierarchy, includeVisualDescriptions: boolean // Include detailed descriptions of charts, images, and diagrams, extractNumericalData: boolean // Extract specific numerical values from charts and tables, combinePages: boolean // Deprecated: Pages are always kept separate with clear headers } // Options for document conversion and parsing,\n imageOptions: { format: \"png\" | \"jpeg\" // Output image format for PDF conversion, quality: number // Image quality (0.1-1.0, higher = better quality), dpi: number // Output DPI for PDF conversion (higher = better quality), pages: number[] | undefined // Specific page numbers to process (1-indexed) } // Options for PDF to images conversion,\n aiOptions: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" // AI model to use for document analysis and conversion, temperature: number // Temperature for AI responses (balanced for accuracy vs recitation), maxTokens: number // Maximum tokens for AI response, jsonMode: boolean // Use JSON mode for structured output } // AI agent configuration options,\n storageOptions: { uploadImages: boolean // Whether to upload converted page images to S3, bucketName: string | undefined // S3 bucket name for image uploads, pageImageUrls: { pageNumber: number, uploadUrl: string, fileName: string }[] | undefined // Pre-generated upload URLs for page images, userId: string | undefined // User ID for secure file isolation } | undefined // Storage options for uploading page images,\n credentials: Record<string, string> | undefined // Credentials for AI model access (GOOGLE_GEMINI_CRED, OPENAI_CRED, etc.)\n}",
331
+ "inputSchema": "{\n documentData: string // Base64 encoded document data (PDF or image) OR R2 file URL starting with https://,\n documentType: \"pdf\" | \"image\" // Type of document being processed,\n isFileUrl: boolean | undefined // Set to true if documentData is an R2 file URL instead of base64,\n conversionOptions: { preserveStructure: boolean // Maintain original document structure and hierarchy, includeVisualDescriptions: boolean // Include detailed descriptions of charts, images, and diagrams, extractNumericalData: boolean // Extract specific numerical values from charts and tables, combinePages: boolean // Deprecated: Pages are always kept separate with clear headers } // Options for document conversion and parsing,\n imageOptions: { format: \"png\" | \"jpeg\" // Output image format for PDF conversion, quality: number // Image quality (0.1-1.0, higher = better quality), dpi: number // Output DPI for PDF conversion (higher = better quality), pages: number[] | undefined // Specific page numbers to process (1-indexed) } // Options for PDF to images conversion,\n aiOptions: { model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use for document analysis and conversion, temperature: number // Temperature for AI responses (balanced for accuracy vs recitation), maxTokens: number // Maximum tokens for AI response, jsonMode: boolean // Use JSON mode for structured output } // AI agent configuration options,\n storageOptions: { uploadImages: boolean // Whether to upload converted page images to S3, bucketName: string | undefined // S3 bucket name for image uploads, pageImageUrls: { pageNumber: number, uploadUrl: string, fileName: string }[] | undefined // Pre-generated upload URLs for page images, userId: string | undefined // User ID for secure file isolation } | undefined // Storage options for uploading page images,\n credentials: Record<string, string> | undefined // Credentials for AI model access (GOOGLE_GEMINI_CRED, OPENAI_CRED, etc.)\n}",
289
332
  "outputSchema": "{\n markdown: string // Generated markdown content from the document,\n pages: { pageNumber: number // Page number (1-indexed), markdown: string // Markdown content for this page, hasCharts: boolean // Whether this page contains charts or graphs, hasTables: boolean // Whether this page contains tables, hasImages: boolean // Whether this page contains images }[] // Per-page analysis results,\n metadata: { totalPages: number // Total number of pages processed, processedPages: number // Number of pages successfully processed, hasVisualElements: boolean // Whether document contains charts, tables, or images, processingTime: number // Total processing time in milliseconds, imageFormat: string // Image format used for conversion, imageDpi: number // DPI used for image conversion } // Metadata about the parsing process,\n conversionSummary: { totalCharacters: number // Total characters in generated markdown, tablesExtracted: number // Number of tables converted to markdown, chartsDescribed: number // Number of charts and graphs described, imagesDescribed: number // Number of images described } // Summary of conversion results,\n aiAnalysis: { model: string // AI model used for analysis, iterations: number // Number of AI iterations, processingTime: number // AI processing time in milliseconds } // AI analysis metadata,\n uploadedImages: { pageNumber: number, fileName: string, fileUrl: string | undefined, uploaded: boolean }[] | undefined // Information about uploaded page images,\n success: boolean // Whether the workflow completed successfully,\n error: string // Error message if workflow failed\n}",
290
- "usageExample": "// Example usage of parse-document-workflow bubble\nconst parseDocumentWorkflow = new ParseDocumentWorkflowBubble({\n documentData: \"example string\", // Base64 encoded document data (PDF or image) OR R2 file URL starting with https://,\n documentType: \"pdf\" // options: \"pdf\", \"image\", // Type of document being processed,\n isFileUrl: false // default, // Set to true if documentData is an R2 file URL instead of base64,\n conversionOptions: { preserveStructure: true // default // Maintain original document structure and hierarchy, includeVisualDescriptions: true // default // Include detailed descriptions of charts, images, and diagrams, extractNumericalData: true // default // Extract specific numerical values from charts and tables, combinePages: false // default // Deprecated: Pages are always kept separate with clear headers } // structure, // Options for document conversion and parsing,\n imageOptions: { format: \"png\" // options: \"png\", \"jpeg\" // Output image format for PDF conversion, quality: 0.9 // default // Image quality (0.1-1.0, higher = better quality), dpi: 200 // default // Output DPI for PDF conversion (higher = better quality), pages: [42] // Specific page numbers to process (1-indexed) } // structure, // Options for PDF to images conversion,\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\" // AI model to use for document analysis and conversion, temperature: 0.4 // default // Temperature for AI responses (balanced for accuracy vs recitation), maxTokens: 2000 // default // Maximum tokens for AI response, jsonMode: false // default // Use JSON mode for structured output } // structure, // AI agent configuration options,\n storageOptions: { uploadImages: false // default // Whether to upload converted page images to S3, bucketName: \"example string\" // S3 bucket name for image uploads, pageImageUrls: [{ pageNumber: 42, uploadUrl: \"example string\", fileName: \"example string\" }] // Pre-generated upload URLs for page images, userId: \"example string\" // User ID for secure file isolation }, // Storage options for uploading page images,\n});\n\nconst result = await parseDocumentWorkflow.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// markdown: string // Generated markdown content from the document,\n// pages: { pageNumber: number // Page number (1-indexed), markdown: string // Markdown content for this page, hasCharts: boolean // Whether this page contains charts or graphs, hasTables: boolean // Whether this page contains tables, hasImages: boolean // Whether this page contains images }[] // Per-page analysis results,\n// metadata: { totalPages: number // Total number of pages processed, processedPages: number // Number of pages successfully processed, hasVisualElements: boolean // Whether document contains charts, tables, or images, processingTime: number // Total processing time in milliseconds, imageFormat: string // Image format used for conversion, imageDpi: number // DPI used for image conversion } // Metadata about the parsing process,\n// conversionSummary: { totalCharacters: number // Total characters in generated markdown, tablesExtracted: number // Number of tables converted to markdown, chartsDescribed: number // Number of charts and graphs described, imagesDescribed: number // Number of images described } // Summary of conversion results,\n// aiAnalysis: { model: string // AI model used for analysis, iterations: number // Number of AI iterations, processingTime: number // AI processing time in milliseconds } // AI analysis metadata,\n// uploadedImages: { pageNumber: number, fileName: string, fileUrl: string | undefined, uploaded: boolean }[] | undefined // Information about uploaded page images,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
333
+ "usageExample": "// Example usage of parse-document-workflow bubble\nconst parseDocumentWorkflow = new ParseDocumentWorkflow({\n documentData: \"example string\", // Base64 encoded document data (PDF or image) OR R2 file URL starting with https://,\n documentType: \"pdf\" // options: \"pdf\", \"image\", // Type of document being processed,\n isFileUrl: false // default, // Set to true if documentData is an R2 file URL instead of base64,\n conversionOptions: { preserveStructure: true // default // Maintain original document structure and hierarchy, includeVisualDescriptions: true // default // Include detailed descriptions of charts, images, and diagrams, extractNumericalData: true // default // Extract specific numerical values from charts and tables, combinePages: false // default // Deprecated: Pages are always kept separate with clear headers } // structure, // Options for document conversion and parsing,\n imageOptions: { format: \"png\" // options: \"png\", \"jpeg\" // Output image format for PDF conversion, quality: 0.9 // default // Image quality (0.1-1.0, higher = better quality), dpi: 200 // default // Output DPI for PDF conversion (higher = better quality), pages: [42] // Specific page numbers to process (1-indexed) } // structure, // Options for PDF to images conversion,\n aiOptions: { model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\" // AI model to use for document analysis and conversion, temperature: 0.4 // default // Temperature for AI responses (balanced for accuracy vs recitation), maxTokens: 2000 // default // Maximum tokens for AI response, jsonMode: false // default // Use JSON mode for structured output } // structure, // AI agent configuration options,\n storageOptions: { uploadImages: false // default // Whether to upload converted page images to S3, bucketName: \"example string\" // S3 bucket name for image uploads, pageImageUrls: [{ pageNumber: 42, uploadUrl: \"example string\", fileName: \"example string\" }] // Pre-generated upload URLs for page images, userId: \"example string\" // User ID for secure file isolation }, // Storage options for uploading page images,\n});\n\nconst result = await parseDocumentWorkflow.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// markdown: string // Generated markdown content from the document,\n// pages: { pageNumber: number // Page number (1-indexed), markdown: string // Markdown content for this page, hasCharts: boolean // Whether this page contains charts or graphs, hasTables: boolean // Whether this page contains tables, hasImages: boolean // Whether this page contains images }[] // Per-page analysis results,\n// metadata: { totalPages: number // Total number of pages processed, processedPages: number // Number of pages successfully processed, hasVisualElements: boolean // Whether document contains charts, tables, or images, processingTime: number // Total processing time in milliseconds, imageFormat: string // Image format used for conversion, imageDpi: number // DPI used for image conversion } // Metadata about the parsing process,\n// conversionSummary: { totalCharacters: number // Total characters in generated markdown, tablesExtracted: number // Number of tables converted to markdown, chartsDescribed: number // Number of charts and graphs described, imagesDescribed: number // Number of images described } // Summary of conversion results,\n// aiAnalysis: { model: string // AI model used for analysis, iterations: number // Number of AI iterations, processingTime: number // AI processing time in milliseconds } // AI analysis metadata,\n// uploadedImages: { pageNumber: number, fileName: string, fileUrl: string | undefined, uploaded: boolean }[] | undefined // Information about uploaded page images,\n// success: boolean // Whether the workflow completed successfully,\n// error: string // Error message if workflow failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
291
334
  "requiredCredentials": [
292
335
  "GOOGLE_GEMINI_CRED",
293
336
  "OPENAI_CRED",
@@ -306,7 +349,7 @@
306
349
  "useCase": "- AI agent understanding of specific bubble capabilities",
307
350
  "inputSchema": "{\n bubbleName: string // The name of the bubble to get details about,\n includeInputSchema: boolean | undefined // Include input parameter schema in the response,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
308
351
  "outputSchema": "{\n name: string // Name of the bubble,\n alias: string | undefined // Short alias for the bubble,\n inputSchema: string | undefined // String representation of the input parameter schema types,\n outputSchema: string // String representation of the output schema types,\n usageExample: string // Code example showing how to use the bubble,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
309
- "usageExample": "// Example usage of get-bubble-details-tool bubble\nconst getBubbleDetailsTool = new GetBubbleDetailsToolBubble({\n bubbleName: \"example string\", // The name of the bubble to get details about,\n includeInputSchema: false // default, // Include input parameter schema in the response,\n});\n\nconst result = await getBubbleDetailsTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// name: string // Name of the bubble,\n// alias: string | undefined // Short alias for the bubble,\n// inputSchema: string | undefined // String representation of the input parameter schema types,\n// outputSchema: string // String representation of the output schema types,\n// usageExample: string // Code example showing how to use the bubble,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
352
+ "usageExample": "// Example usage of get-bubble-details-tool bubble\nconst getBubbleDetailsTool = new GetBubbleDetailsTool({\n bubbleName: \"example string\", // The name of the bubble to get details about,\n includeInputSchema: false // default, // Include input parameter schema in the response,\n});\n\nconst result = await getBubbleDetailsTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// name: string // Name of the bubble,\n// alias: string | undefined // Short alias for the bubble,\n// inputSchema: string | undefined // String representation of the input parameter schema types,\n// outputSchema: string // String representation of the output schema types,\n// usageExample: string // Code example showing how to use the bubble,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
310
353
  "requiredCredentials": []
311
354
  },
312
355
  {
@@ -317,7 +360,7 @@
317
360
  "useCase": "- AI agent discovery of available capabilities",
318
361
  "inputSchema": "Complex schema - see usage example for structure",
319
362
  "outputSchema": "{\n bubbles: { name: string // Name of the bubble, alias: string | undefined // Short alias for the bubble, shortDescription: string // Brief description of the bubble functionality, useCase: string // Primary use cases for the bubble, type: string // Type of bubble (service, workflow, tool) }[] // Array of bubble information objects,\n totalCount: number // Total number of bubbles in the registry,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
320
- "usageExample": "// Example usage of list-bubbles-tool bubble\nconst listBubblesTool = new ListBubblesToolBubble({\n // Add required parameters here\n});\n\nconst result = await listBubblesTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// bubbles: { name: string // Name of the bubble, alias: string | undefined // Short alias for the bubble, shortDescription: string // Brief description of the bubble functionality, useCase: string // Primary use cases for the bubble, type: string // Type of bubble (service, workflow, tool) }[] // Array of bubble information objects,\n// totalCount: number // Total number of bubbles in the registry,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
363
+ "usageExample": "// Example usage of list-bubbles-tool bubble\nconst listBubblesTool = new ListBubblesTool({\n // Add required parameters here\n});\n\nconst result = await listBubblesTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// bubbles: { name: string // Name of the bubble, alias: string | undefined // Short alias for the bubble, shortDescription: string // Brief description of the bubble functionality, useCase: string // Primary use cases for the bubble, type: string // Type of bubble (service, workflow, tool) }[] // Array of bubble information objects,\n// totalCount: number // Total number of bubbles in the registry,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
321
364
  "requiredCredentials": []
322
365
  },
323
366
  {
@@ -328,7 +371,7 @@
328
371
  "useCase": "- AI agents performing iterative database exploration",
329
372
  "inputSchema": "{\n query: string // SQL query to execute (SELECT, WITH, EXPLAIN, ANALYZE, SHOW, DESCRIBE only),\n reasoning: string // Explain why you're running this specific query and what you hope to learn from it,\n credentials: Record<string, string> | undefined // Database credentials (injected at runtime),\n config: Record<string, unknown> | undefined // Configuration for the tool bubble\n}",
330
373
  "outputSchema": "{\n rows: Record<string, unknown>[] | undefined // Array of query result rows as objects,\n rowCount: number // Number of rows returned by the query,\n executionTime: number // Query execution time in milliseconds,\n fields: { name: string // Name of the column, dataTypeID: number | undefined // PostgreSQL data type ID for the column }[] | undefined // Array of column metadata from the query result,\n success: boolean // Whether the query execution was successful,\n error: string // Error message if query execution failed\n}",
331
- "usageExample": "// Example usage of sql-query-tool bubble\nconst sqlQueryTool = new SqlQueryToolBubble({\n query: \"example string\", // SQL query to execute (SELECT, WITH, EXPLAIN, ANALYZE, SHOW, DESCRIBE only),\n reasoning: \"example string\", // Explain why you're running this specific query and what you hope to learn from it,\n config: {} // record/object with string keys, // Configuration for the tool bubble,\n});\n\nconst result = await sqlQueryTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// rows: Record<string, unknown>[] | undefined // Array of query result rows as objects,\n// rowCount: number // Number of rows returned by the query,\n// executionTime: number // Query execution time in milliseconds,\n// fields: { name: string // Name of the column, dataTypeID: number | undefined // PostgreSQL data type ID for the column }[] | undefined // Array of column metadata from the query result,\n// success: boolean // Whether the query execution was successful,\n// error: string // Error message if query execution failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
374
+ "usageExample": "// Example usage of sql-query-tool bubble\nconst sqlQueryTool = new SQLQueryTool({\n query: \"example string\", // SQL query to execute (SELECT, WITH, EXPLAIN, ANALYZE, SHOW, DESCRIBE only),\n reasoning: \"example string\", // Explain why you're running this specific query and what you hope to learn from it,\n config: {}, // Configuration for the tool bubble,\n});\n\nconst result = await sqlQueryTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// rows: Record<string, unknown>[] | undefined // Array of query result rows as objects,\n// rowCount: number // Number of rows returned by the query,\n// executionTime: number // Query execution time in milliseconds,\n// fields: { name: string // Name of the column, dataTypeID: number | undefined // PostgreSQL data type ID for the column }[] | undefined // Array of column metadata from the query result,\n// success: boolean // Whether the query execution was successful,\n// error: string // Error message if query execution failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
332
375
  "requiredCredentials": [
333
376
  "DATABASE_CRED"
334
377
  ]
@@ -341,7 +384,7 @@
341
384
  "useCase": "- Converting SQL query results into visual charts",
342
385
  "inputSchema": "{\n data: Record<string, unknown>[] // Array of data objects (typically from SQL query results),\n chartType: \"line\" | \"bar\" | \"pie\" | \"doughnut\" | \"radar\" | \"scatter\" | \"bubble\" | \"polarArea\" // Type of chart to generate,\n xColumn: string | undefined // Column name to use for X-axis (auto-detected if not provided),\n yColumn: string | undefined // Column name to use for Y-axis (auto-detected if not provided),\n groupByColumn: string | undefined // Column to group data by for multiple series,\n options: { title: string | undefined // Chart title, xAxisLabel: string | undefined // X-axis label, yAxisLabel: string | undefined // Y-axis label, colorScheme: \"default\" | \"viridis\" | \"plasma\" | \"inferno\" | \"magma\" | \"blues\" | \"greens\" | \"reds\" | \"oranges\" | \"categorical\" // Color scheme for the chart, responsive: boolean // Make chart responsive, maintainAspectRatio: boolean // Maintain aspect ratio, showLegend: boolean // Show chart legend, showTooltips: boolean // Show tooltips on hover } | undefined // Chart customization options,\n advancedConfig: Record<string, unknown> | undefined // Advanced Chart.js configuration object (overrides simple options),\n reasoning: string // Explain why this chart type and configuration was chosen,\n generateFile: boolean // Generate an actual chart image file (PNG format),\n filePath: string | undefined // Custom file path for generated chart (defaults to temp directory),\n fileName: string | undefined // Custom file name for generated chart (defaults to auto-generated name),\n width: number | undefined // Chart width in pixels (default: 800),\n height: number | undefined // Chart height in pixels (default: 600),\n credentials: Record<string, string> | undefined // Credentials (HIDDEN from AI - injected at runtime),\n config: Record<string, unknown> | undefined // Configuration for the tool bubble (HIDDEN from AI - injected at runtime)\n}",
343
386
  "outputSchema": "{\n chartConfig: Record<string, unknown> // Complete Chart.js configuration object,\n chartType: string // Chart type that was generated,\n datasetCount: number // Number of datasets in the chart,\n dataPointCount: number // Total number of data points,\n suggestedSize: { width: number, height: number } // Suggested canvas size for the chart,\n metadata: { xColumn: string | undefined, yColumn: string | undefined, groupByColumn: string | undefined, colorScheme: string, generatedAt: string } // Metadata about chart generation,\n filePath: string | undefined // Path to generated chart file (if generateFile was true),\n fileExists: boolean | undefined // Whether the generated file exists on disk,\n fileSize: number | undefined // Size of generated file in bytes,\n success: boolean,\n error: string\n}",
344
- "usageExample": "// Example usage of chart-js-tool bubble\nconst chartJsTool = new ChartJsToolBubble({\n data: [{} // record/object with string keys], // Array of data objects (typically from SQL query results),\n chartType: \"line\" // options: \"line\", \"bar\", \"pie\", \"doughnut\", \"radar\", \"scatter\", \"bubble\", \"polarArea\", // Type of chart to generate,\n xColumn: \"example string\", // Column name to use for X-axis (auto-detected if not provided),\n yColumn: \"example string\", // Column name to use for Y-axis (auto-detected if not provided),\n groupByColumn: \"example string\", // Column to group data by for multiple series,\n options: { title: \"example string\" // Chart title, xAxisLabel: \"example string\" // X-axis label, yAxisLabel: \"example string\" // Y-axis label, colorScheme: \"default\" // options: \"default\", \"viridis\", \"plasma\", \"inferno\", \"magma\", \"blues\", \"greens\", \"reds\", \"oranges\", \"categorical\" // Color scheme for the chart, responsive: true // default // Make chart responsive, maintainAspectRatio: true // default // Maintain aspect ratio, showLegend: true // default // Show chart legend, showTooltips: true // default // Show tooltips on hover }, // Chart customization options,\n advancedConfig: {} // record/object with string keys, // Advanced Chart.js configuration object (overrides simple options),\n reasoning: \"example string\", // Explain why this chart type and configuration was chosen,\n generateFile: false // default, // Generate an actual chart image file (PNG format),\n filePath: \"example string\", // Custom file path for generated chart (defaults to temp directory),\n fileName: \"example string\", // Custom file name for generated chart (defaults to auto-generated name),\n width: 800 // default, // Chart width in pixels (default: 800),\n height: 600 // default, // Chart height in pixels (default: 600),\n config: {} // record/object with string keys, // Configuration for the tool bubble (HIDDEN from AI - injected at runtime),\n});\n\nconst result = await chartJsTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// chartConfig: Record<string, unknown> // Complete Chart.js configuration object,\n// chartType: string // Chart type that was generated,\n// datasetCount: number // Number of datasets in the chart,\n// dataPointCount: number // Total number of data points,\n// suggestedSize: { width: number, height: number } // Suggested canvas size for the chart,\n// metadata: { xColumn: string | undefined, yColumn: string | undefined, groupByColumn: string | undefined, colorScheme: string, generatedAt: string } // Metadata about chart generation,\n// filePath: string | undefined // Path to generated chart file (if generateFile was true),\n// fileExists: boolean | undefined // Whether the generated file exists on disk,\n// fileSize: number | undefined // Size of generated file in bytes,\n// success: boolean,\n// error: string\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
387
+ "usageExample": "// Example usage of chart-js-tool bubble\nconst chartJsTool = new ChartJSTool({\n data: [{}], // Array of data objects (typically from SQL query results),\n chartType: \"line\" // options: \"line\", \"bar\", \"pie\", \"doughnut\", \"radar\", \"scatter\", \"bubble\", \"polarArea\", // Type of chart to generate,\n xColumn: \"example string\", // Column name to use for X-axis (auto-detected if not provided),\n yColumn: \"example string\", // Column name to use for Y-axis (auto-detected if not provided),\n groupByColumn: \"example string\", // Column to group data by for multiple series,\n options: { title: \"example string\" // Chart title, xAxisLabel: \"example string\" // X-axis label, yAxisLabel: \"example string\" // Y-axis label, colorScheme: \"default\" // options: \"default\", \"viridis\", \"plasma\", \"inferno\", \"magma\", \"blues\", \"greens\", \"reds\", \"oranges\", \"categorical\" // Color scheme for the chart, responsive: true // default // Make chart responsive, maintainAspectRatio: true // default // Maintain aspect ratio, showLegend: true // default // Show chart legend, showTooltips: true // default // Show tooltips on hover }, // Chart customization options,\n advancedConfig: {}, // Advanced Chart.js configuration object (overrides simple options),\n reasoning: \"example string\", // Explain why this chart type and configuration was chosen,\n generateFile: false // default, // Generate an actual chart image file (PNG format),\n filePath: \"example string\", // Custom file path for generated chart (defaults to temp directory),\n fileName: \"example string\", // Custom file name for generated chart (defaults to auto-generated name),\n width: 800 // default, // Chart width in pixels (default: 800),\n height: 600 // default, // Chart height in pixels (default: 600),\n config: {}, // Configuration for the tool bubble (HIDDEN from AI - injected at runtime),\n});\n\nconst result = await chartJsTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// chartConfig: Record<string, unknown> // Complete Chart.js configuration object,\n// chartType: string // Chart type that was generated,\n// datasetCount: number // Number of datasets in the chart,\n// dataPointCount: number // Total number of data points,\n// suggestedSize: { width: number, height: number } // Suggested canvas size for the chart,\n// metadata: { xColumn: string | undefined, yColumn: string | undefined, groupByColumn: string | undefined, colorScheme: string, generatedAt: string } // Metadata about chart generation,\n// filePath: string | undefined // Path to generated chart file (if generateFile was true),\n// fileExists: boolean | undefined // Whether the generated file exists on disk,\n// fileSize: number | undefined // Size of generated file in bytes,\n// success: boolean,\n// error: string\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
345
388
  "requiredCredentials": []
346
389
  },
347
390
  {
@@ -351,19 +394,32 @@
351
394
  "shortDescription": "Validates BubbleFlow TypeScript code for syntax and structure",
352
395
  "useCase": "- When an AI agent needs to validate user-provided BubbleFlow code",
353
396
  "inputSchema": "{\n code: string // TypeScript code to validate,\n options: { includeDetails: boolean // Include detailed bubble analysis, strictMode: boolean // Enable strict TypeScript validation } | undefined // Validation configuration options,\n credentials: Record<string, string> | undefined // Credentials (HIDDEN from AI - injected at runtime),\n config: Record<string, unknown> | undefined // Configuration for the validation tool (HIDDEN from AI - injected at runtime)\n}",
354
- "outputSchema": "{\n valid: boolean // Whether the code is valid,\n errors: string[] | undefined // List of validation errors if any,\n bubbleCount: number | undefined // Number of bubbles found in the code,\n bubbles: { variableName: string // Variable name assigned to the bubble, bubbleName: string // Type of bubble (e.g., postgresql, slack), className: string // Bubble class name (e.g., PostgreSQLBubble), hasAwait: boolean // Whether the bubble call is awaited, hasActionCall: boolean // Whether .action() is called, parameterCount: number // Number of parameters passed to the bubble }[] | undefined // Details about each bubble found,\n metadata: { validatedAt: string // Timestamp when validation was performed, codeLength: number // Length of the code in characters, strictMode: boolean // Whether strict mode was used },\n success: boolean // Whether the validation operation was successful,\n error: string // Error message if validation failed\n}",
355
- "usageExample": "// Example usage of bubbleflow-validation-tool bubble\nconst bubbleflowValidationTool = new BubbleflowValidationToolBubble({\n code: \"example string\", // TypeScript code to validate,\n options: { includeDetails: true // default // Include detailed bubble analysis, strictMode: true // default // Enable strict TypeScript validation }, // Validation configuration options,\n config: {} // record/object with string keys, // Configuration for the validation tool (HIDDEN from AI - injected at runtime),\n});\n\nconst result = await bubbleflowValidationTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// valid: boolean // Whether the code is valid,\n// errors: string[] | undefined // List of validation errors if any,\n// bubbleCount: number | undefined // Number of bubbles found in the code,\n// bubbles: { variableName: string // Variable name assigned to the bubble, bubbleName: string // Type of bubble (e.g., postgresql, slack), className: string // Bubble class name (e.g., PostgreSQLBubble), hasAwait: boolean // Whether the bubble call is awaited, hasActionCall: boolean // Whether .action() is called, parameterCount: number // Number of parameters passed to the bubble }[] | undefined // Details about each bubble found,\n// metadata: { validatedAt: string // Timestamp when validation was performed, codeLength: number // Length of the code in characters, strictMode: boolean // Whether strict mode was used },\n// success: boolean // Whether the validation operation was successful,\n// error: string // Error message if validation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
397
+ "outputSchema": "{\n valid: boolean // Whether the code is valid,\n errors: string[] | undefined // List of validation errors if any,\n bubbleCount: number | undefined // Number of bubbles found in the code,\n bubbles: { variableName: string // Variable name assigned to the bubble, bubbleName: string // Type of bubble (e.g., postgresql, slack), className: string // Bubble class name (e.g., PostgreSQLBubble), hasAwait: boolean // Whether the bubble call is awaited, hasActionCall: boolean // Whether .action() is called, parameterCount: number // Number of parameters passed to the bubble }[] | undefined,\n variableTypes: { name: string // Variable name, type: string // Variable type, line: number // Line number, column: number // Column number }[] | undefined // Details about each bubble found,\n metadata: { validatedAt: string // Timestamp when validation was performed, codeLength: number // Length of the code in characters, strictMode: boolean // Whether strict mode was used },\n success: boolean // Whether the validation operation was successful,\n error: string // Error message if validation failed\n}",
398
+ "usageExample": "// Example usage of bubbleflow-validation-tool bubble\nconst bubbleflowValidationTool = new BubbleFlowValidationTool({\n code: \"example string\", // TypeScript code to validate,\n options: { includeDetails: true // default // Include detailed bubble analysis, strictMode: true // default // Enable strict TypeScript validation }, // Validation configuration options,\n config: {}, // Configuration for the validation tool (HIDDEN from AI - injected at runtime),\n});\n\nconst result = await bubbleflowValidationTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// valid: boolean // Whether the code is valid,\n// errors: string[] | undefined // List of validation errors if any,\n// bubbleCount: number | undefined // Number of bubbles found in the code,\n// bubbles: { variableName: string // Variable name assigned to the bubble, bubbleName: string // Type of bubble (e.g., postgresql, slack), className: string // Bubble class name (e.g., PostgreSQLBubble), hasAwait: boolean // Whether the bubble call is awaited, hasActionCall: boolean // Whether .action() is called, parameterCount: number // Number of parameters passed to the bubble }[] | undefined,\n// variableTypes: { name: string // Variable name, type: string // Variable type, line: number // Line number, column: number // Column number }[] | undefined // Details about each bubble found,\n// metadata: { validatedAt: string // Timestamp when validation was performed, codeLength: number // Length of the code in characters, strictMode: boolean // Whether strict mode was used },\n// success: boolean // Whether the validation operation was successful,\n// error: string // Error message if validation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
356
399
  "requiredCredentials": []
357
400
  },
401
+ {
402
+ "name": "code-edit-tool",
403
+ "alias": "code-edit",
404
+ "type": "tool",
405
+ "shortDescription": "Applies code edits to BubbleFlow files using Morph Fast Apply",
406
+ "useCase": "- When an AI agent needs to make edits to BubbleFlow code",
407
+ "inputSchema": "{\n initialCode: string // The original code to be edited,\n instructions: string // A single sentence instruction in first person describing what changes are being made (e.g., \"I am adding error handling to the user auth and removing the old auth functions\"). Used to help disambiguate uncertainty in the edit.,\n codeEdit: string // The code changes to apply. Specify ONLY the precise lines of code that you wish to edit. Use \"// ... existing code ...\" to represent unchanged sections. DO NOT omit spans of pre-existing code without using the marker, as this may cause inadvertent deletion.,\n morphModel: string | undefined // Morph model to use for applying edits via OpenRouter,\n credentials: Record<string, string> | undefined // Credentials (HIDDEN from AI - injected at runtime),\n config: Record<string, unknown> | undefined // Configuration for the edit tool (HIDDEN from AI - injected at runtime)\n}",
408
+ "outputSchema": "{\n mergedCode: string // The final code after applying edits,\n applied: boolean // Whether the edit was successfully applied,\n diff: string | undefined // Unified diff showing the changes made (if available),\n metadata: { editedAt: string // Timestamp when edit was performed, originalLength: number // Length of original code in characters, finalLength: number // Length of final code in characters, morphModel: string // Morph model used for the edit },\n success: boolean // Whether the edit operation was successful,\n error: string // Error message if edit failed\n}",
409
+ "usageExample": "// Example usage of code-edit-tool bubble\nconst codeEditTool = new EditBubbleFlowTool({\n initialCode: \"example string\", // The original code to be edited,\n instructions: \"example string\", // A single sentence instruction in first person describing what changes are being made (e.g., \"I am adding error handling to the user auth and removing the old auth functions\"). Used to help disambiguate uncertainty in the edit.,\n codeEdit: \"example string\", // The code changes to apply. Specify ONLY the precise lines of code that you wish to edit. Use \"// ... existing code ...\" to represent unchanged sections. DO NOT omit spans of pre-existing code without using the marker, as this may cause inadvertent deletion.,\n morphModel: \"morph/morph-v3-large\" // default, // Morph model to use for applying edits via OpenRouter,\n config: {}, // Configuration for the edit tool (HIDDEN from AI - injected at runtime),\n});\n\nconst result = await codeEditTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// mergedCode: string // The final code after applying edits,\n// applied: boolean // Whether the edit was successfully applied,\n// diff: string | undefined // Unified diff showing the changes made (if available),\n// metadata: { editedAt: string // Timestamp when edit was performed, originalLength: number // Length of original code in characters, finalLength: number // Length of final code in characters, morphModel: string // Morph model used for the edit },\n// success: boolean // Whether the edit operation was successful,\n// error: string // Error message if edit failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
410
+ "requiredCredentials": [
411
+ "OPENROUTER_CRED"
412
+ ]
413
+ },
358
414
  {
359
415
  "name": "web-search-tool",
360
416
  "alias": "websearch",
361
417
  "type": "tool",
362
418
  "shortDescription": "Performs web searches using Firecrawl to find current information from the web",
363
419
  "useCase": "- Finding current events and news",
364
- "inputSchema": "{\n query: string // The search query to execute,\n limit: number // Maximum number of search results to return,\n location: string | undefined // Location parameter for search results (e.g., \"us\", \"uk\"),\n credentials: Record<string, string> | undefined // Required credentials including FIRECRAWL_API_KEY\n}",
365
- "outputSchema": "{\n results: { title: string // Title of the search result, url: string // URL of the search result, content: string // Content snippet from the search result }[] // Array of search results with title, URL, and content,\n query: string // The original search query,\n totalResults: number // Number of results returned,\n searchEngine: string // Search engine used (Firecrawl),\n success: boolean // Whether the search was successful,\n error: string // Error message if search failed\n}",
366
- "usageExample": "// Example usage of web-search-tool bubble\nconst webSearchTool = new WebSearchToolBubble({\n query: \"example string\", // The search query to execute,\n limit: 3 // default, // Maximum number of search results to return,\n location: \"example string\", // Location parameter for search results (e.g., \"us\", \"uk\"),\n});\n\nconst result = await webSearchTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// results: { title: string // Title of the search result, url: string // URL of the search result, content: string // Content snippet from the search result }[] // Array of search results with title, URL, and content,\n// query: string // The original search query,\n// totalResults: number // Number of results returned,\n// searchEngine: string // Search engine used (Firecrawl),\n// success: boolean // Whether the search was successful,\n// error: string // Error message if search failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
420
+ "inputSchema": "{\n query: string // The search query to execute,\n limit: number // Maximum number of search results to return,\n categories: \"research\" | \"pdf\" | \"github\"[] // Categories to find most relevant search results (research, pdf, github),\n location: string | undefined // Location parameter for search results (e.g., \"us\", \"uk\"),\n credentials: Record<string, string> | undefined // Required credentials including FIRECRAWL_API_KEY\n}",
421
+ "outputSchema": "{\n results: { title: string // Title of the search result, url: string // URL of the search result, content: string // Content snippet from the search result }[] // Array of search results with title, URL, and content,\n query: string // The original search query,\n totalResults: number // Number of results returned,\n searchEngine: string // Search engine used (Firecrawl),\n creditsUsed: number // Number of credits used,\n success: boolean // Whether the search was successful,\n error: string // Error message if search failed\n}",
422
+ "usageExample": "// Example usage of web-search-tool bubble\nconst webSearchTool = new WebSearchTool({\n query: \"example string\", // The search query to execute,\n limit: 10 // default, // Maximum number of search results to return,\n categories: [\"research\" // options: \"research\", \"pdf\", \"github\"] // example for array, // Categories to find most relevant search results (research, pdf, github),\n location: \"example string\", // Location parameter for search results (e.g., \"us\", \"uk\"),\n});\n\nconst result = await webSearchTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// results: { title: string // Title of the search result, url: string // URL of the search result, content: string // Content snippet from the search result }[] // Array of search results with title, URL, and content,\n// query: string // The original search query,\n// totalResults: number // Number of results returned,\n// searchEngine: string // Search engine used (Firecrawl),\n// creditsUsed: number // Number of credits used,\n// success: boolean // Whether the search was successful,\n// error: string // Error message if search failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
367
423
  "requiredCredentials": [
368
424
  "FIRECRAWL_API_KEY"
369
425
  ]
@@ -372,11 +428,11 @@
372
428
  "name": "web-scrape-tool",
373
429
  "alias": "scrape",
374
430
  "type": "tool",
375
- "shortDescription": "Scrapes content from a single web page using Firecrawl, good to use after web-search-tool to get the full content of a page",
431
+ "shortDescription": "Scrapes content from a single web page. Useful after web-search-tool to get the full content of a page. Also useful if you need to understand a site's structure or content.",
376
432
  "useCase": "General purpose bubble for various workflow needs",
377
- "inputSchema": "{\n url: string // The URL to scrape content from,\n format: \"markdown\" // Content format to extract (default: markdown),\n onlyMainContent: boolean // Extract only main content, filtering out navigation/footers,\n actions: { type: \"wait\" | \"click\" | \"write\" | \"press\" | \"scroll\" | \"executeJavascript\" // Action type to perform, milliseconds: number | undefined // Time to wait in milliseconds (for wait), selector: string | undefined // CSS selector to interact with (wait/click/write/scroll), text: string | undefined // Text to write (for write), key: string | undefined // Key to press (e.g., \"Enter\") (for press), direction: \"up\" | \"down\" | undefined // Scroll direction (for scroll), script: string | undefined // JavaScript code (for executeJavascript) }[] | undefined // Optional browser actions for authentication/navigation (e.g., login flows),\n headers: Record<string, string> | undefined // Optional HTTP headers (e.g., for session cookies),\n waitFor: number // Time to wait for dynamic content in milliseconds (default: 3000),\n credentials: Record<string, string> | undefined // Required credentials including FIRECRAWL_API_KEY\n}",
378
- "outputSchema": "{\n content: string // Scraped content in requested format,\n title: string // Page title if available,\n url: string // The original URL that was scraped,\n format: string // Format of the returned content,\n success: boolean // Whether the scraping was successful,\n error: string // Error message if scraping failed,\n metadata: { statusCode: number | undefined, loadTime: number | undefined } | undefined // Additional metadata about the scrape\n}",
379
- "usageExample": "// Example usage of web-scrape-tool bubble\nconst webScrapeTool = new WebScrapeToolBubble({\n url: \"example string\", // The URL to scrape content from,\n format: \"markdown\", // Content format to extract (default: markdown),\n onlyMainContent: true // default, // Extract only main content, filtering out navigation/footers,\n actions: [{ type: \"wait\" // options: \"wait\", \"click\", \"write\", \"press\", \"scroll\", \"executeJavascript\" // Action type to perform, milliseconds: 42 // Time to wait in milliseconds (for wait), selector: \"example string\" // CSS selector to interact with (wait/click/write/scroll), text: \"example string\" // Text to write (for write), key: \"example string\" // Key to press (e.g., \"Enter\") (for press), direction: \"up\" // options: \"up\", \"down\" // Scroll direction (for scroll), script: \"example string\" // JavaScript code (for executeJavascript) }], // Optional browser actions for authentication/navigation (e.g., login flows),\n headers: { \"example_key\": \"example string\" } // record/object with string keys, // Optional HTTP headers (e.g., for session cookies),\n waitFor: 3000 // default, // Time to wait for dynamic content in milliseconds (default: 3000),\n});\n\nconst result = await webScrapeTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// content: string // Scraped content in requested format,\n// title: string // Page title if available,\n// url: string // The original URL that was scraped,\n// format: string // Format of the returned content,\n// success: boolean // Whether the scraping was successful,\n// error: string // Error message if scraping failed,\n// metadata: { statusCode: number | undefined, loadTime: number | undefined } | undefined // Additional metadata about the scrape\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
433
+ "inputSchema": "{\n url: string // The URL to scrape content from,\n format: \"markdown\" // Content format to extract (default: markdown),\n onlyMainContent: boolean // Extract only main content, filtering out navigation/footers,\n credentials: Record<string, string> | undefined // Required credentials including FIRECRAWL_API_KEY\n}",
434
+ "outputSchema": "{\n content: string // Scraped content in requested format,\n title: string // Page title if available,\n url: string // The original URL that was scraped,\n format: string // Format of the returned content,\n success: boolean // Whether the scraping was successful,\n error: string // Error message if scraping failed,\n creditsUsed: number // Number of credits used,\n metadata: { statusCode: number | undefined, loadTime: number | undefined } | undefined // Additional metadata about the scrape\n}",
435
+ "usageExample": "// Example usage of web-scrape-tool bubble\nconst webScrapeTool = new WebScrapeTool({\n url: \"example string\", // The URL to scrape content from,\n format: \"markdown\", // Content format to extract (default: markdown),\n onlyMainContent: true // default, // Extract only main content, filtering out navigation/footers,\n});\n\nconst result = await webScrapeTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// content: string // Scraped content in requested format,\n// title: string // Page title if available,\n// url: string // The original URL that was scraped,\n// format: string // Format of the returned content,\n// success: boolean // Whether the scraping was successful,\n// error: string // Error message if scraping failed,\n// creditsUsed: number // Number of credits used,\n// metadata: { statusCode: number | undefined, loadTime: number | undefined } | undefined // Additional metadata about the scrape\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
380
436
  "requiredCredentials": [
381
437
  "FIRECRAWL_API_KEY"
382
438
  ]
@@ -389,7 +445,7 @@
389
445
  "useCase": "General purpose bubble for various workflow needs",
390
446
  "inputSchema": "{\n url: string // The URL to extract structured data from,\n prompt: string // Detailed prompt describing what data to extract from the web page,\n schema: string // JSON schema string defining the structure of the data to extract,\n timeout: number | undefined // Timeout in milliseconds for the extraction (default: 30000),\n credentials: Record<string, string> | undefined // Required credentials including FIRECRAWL_API_KEY\n}",
391
447
  "outputSchema": "{\n url: string // The original URL that was processed,\n success: boolean // Whether the extraction was successful,\n error: string // Error message if extraction failed,\n extractedData: unknown // The extracted structured data matching the provided schema,\n metadata: { extractionTime: number | undefined, pageTitle: string | undefined, statusCode: number | undefined } | undefined // Additional metadata about the extraction\n}",
392
- "usageExample": "// Example usage of web-extract-tool bubble\nconst webExtractTool = new WebExtractToolBubble({\n url: \"example string\", // The URL to extract structured data from,\n prompt: \"example string\", // Detailed prompt describing what data to extract from the web page,\n schema: \"example string\", // JSON schema string defining the structure of the data to extract,\n timeout: 30000 // default, // Timeout in milliseconds for the extraction (default: 30000),\n});\n\nconst result = await webExtractTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// url: string // The original URL that was processed,\n// success: boolean // Whether the extraction was successful,\n// error: string // Error message if extraction failed,\n// extractedData: unknown // The extracted structured data matching the provided schema,\n// metadata: { extractionTime: number | undefined, pageTitle: string | undefined, statusCode: number | undefined } | undefined // Additional metadata about the extraction\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
448
+ "usageExample": "// Example usage of web-extract-tool bubble\nconst webExtractTool = new WebExtractTool({\n url: \"example string\", // The URL to extract structured data from,\n prompt: \"example string\", // Detailed prompt describing what data to extract from the web page,\n schema: \"example string\", // JSON schema string defining the structure of the data to extract,\n timeout: 30000 // default, // Timeout in milliseconds for the extraction (default: 30000),\n});\n\nconst result = await webExtractTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// url: string // The original URL that was processed,\n// success: boolean // Whether the extraction was successful,\n// error: string // Error message if extraction failed,\n// extractedData: unknown // The extracted structured data matching the provided schema,\n// metadata: { extractionTime: number | undefined, pageTitle: string | undefined, statusCode: number | undefined } | undefined // Additional metadata about the extraction\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
393
449
  "requiredCredentials": [
394
450
  "FIRECRAWL_API_KEY"
395
451
  ]
@@ -400,9 +456,9 @@
400
456
  "type": "tool",
401
457
  "shortDescription": "AI-powered research agent that searches and scrapes the internet to gather structured information",
402
458
  "useCase": "- Market research with structured competitor analysis",
403
- "inputSchema": "{\n task: string // The research task that requires searching the internet and gathering information,\n expectedResultSchema: string // JSON schema string that defines the expected structure of the research result. Out,\n model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | undefined // Model to use for the research agent (default: google/gemini-2.5-pro),\n maxTokens: number | undefined // Maximum number of tokens for the research agent (default: 40000),\n maxIterations: number // Maximum number of iterations for the research agent (default: 100),\n credentials: Record<string, string> | undefined // Required credentials\n}",
459
+ "inputSchema": "{\n task: string // The research task that requires searching the internet and gathering information,\n expectedResultSchema: unknown // Zod schema or JSON schema string that defines the expected structure of the research result. Example: z.object({ trends: z.array(z.string()).describe(\"An array of trends\"), summary: z.string().describe(\"A summary of the trends\") }) or JSON.stringify({ type: \"object\", properties: { trends: { type: \"array\", items: { type: \"string\" } }, summary: { type: \"string\" } } }),\n model: \"openai/gpt-5\" | \"openai/gpt-5-mini\" | \"openai/gpt-5.1\" | \"openai/gpt-5.2\" | \"google/gemini-2.5-pro\" | \"google/gemini-2.5-flash\" | \"google/gemini-2.5-flash-lite\" | \"google/gemini-2.5-flash-image-preview\" | \"google/gemini-3-pro-preview\" | \"google/gemini-3-pro-image-preview\" | \"google/gemini-3-flash-preview\" | \"anthropic/claude-sonnet-4-5\" | \"anthropic/claude-opus-4-5\" | \"anthropic/claude-haiku-4-5\" | \"openrouter/x-ai/grok-code-fast-1\" | \"openrouter/z-ai/glm-4.6\" | \"openrouter/anthropic/claude-sonnet-4.5\" | \"openrouter/google/gemini-3-pro-preview\" | \"openrouter/morph/morph-v3-large\" | \"openrouter/x-ai/grok-4.1-fast\" | \"openrouter/openai/gpt-oss-120b\" | \"openrouter/deepseek/deepseek-chat-v3.1\" // Model to use for the research agent (default: google/gemini-3-pro-preview),\n maxTokens: number | undefined // Maximum number of tokens for the research agent (default: 40000),\n maxIterations: number // Maximum number of iterations for the research agent (default: 100),\n credentials: Record<string, string> | undefined // Required credentials\n}",
404
460
  "outputSchema": "{\n result: unknown // The research result matching the expected JSON schema structure, parsed to object,\n summary: string // 1-2 sentence summary of what research was conducted and completed,\n sourcesUsed: string[] // Array of URLs and sources that were searched and scraped during research,\n iterationsUsed: number // Number of AI agent iterations used to complete the research,\n success: boolean // Whether the research task was completed successfully,\n error: string // Error message if research failed\n}",
405
- "usageExample": "// Example usage of research-agent-tool bubble\nconst researchAgentTool = new ResearchAgentToolBubble({\n task: \"example string\", // The research task that requires searching the internet and gathering information,\n expectedResultSchema: \"example string\", // JSON schema string that defines the expected structure of the research result. Out,\n model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", // Model to use for the research agent (default: google/gemini-2.5-pro),\n maxTokens: 40000 // default, // Maximum number of tokens for the research agent (default: 40000),\n maxIterations: 100 // default, // Maximum number of iterations for the research agent (default: 100),\n});\n\nconst result = await researchAgentTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// result: unknown // The research result matching the expected JSON schema structure, parsed to object,\n// summary: string // 1-2 sentence summary of what research was conducted and completed,\n// sourcesUsed: string[] // Array of URLs and sources that were searched and scraped during research,\n// iterationsUsed: number // Number of AI agent iterations used to complete the research,\n// success: boolean // Whether the research task was completed successfully,\n// error: string // Error message if research failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
461
+ "usageExample": "// Example usage of research-agent-tool bubble\nconst researchAgentTool = new ResearchAgentTool({\n task: \"example string\", // The research task that requires searching the internet and gathering information,\n expectedResultSchema: \"example string\", // Zod schema or JSON schema string that defines the expected structure of the research result. Example: z.object({ trends: z.array(z.string()).describe(\"An array of trends\"), summary: z.string().describe(\"A summary of the trends\") }) or JSON.stringify({ type: \"object\", properties: { trends: { type: \"array\", items: { type: \"string\" } }, summary: { type: \"string\" } } }),\n model: \"openai/gpt-5\" // options: \"openai/gpt-5\", \"openai/gpt-5-mini\", \"openai/gpt-5.1\", \"openai/gpt-5.2\", \"google/gemini-2.5-pro\", \"google/gemini-2.5-flash\", \"google/gemini-2.5-flash-lite\", \"google/gemini-2.5-flash-image-preview\", \"google/gemini-3-pro-preview\", \"google/gemini-3-pro-image-preview\", \"google/gemini-3-flash-preview\", \"anthropic/claude-sonnet-4-5\", \"anthropic/claude-opus-4-5\", \"anthropic/claude-haiku-4-5\", \"openrouter/x-ai/grok-code-fast-1\", \"openrouter/z-ai/glm-4.6\", \"openrouter/anthropic/claude-sonnet-4.5\", \"openrouter/google/gemini-3-pro-preview\", \"openrouter/morph/morph-v3-large\", \"openrouter/x-ai/grok-4.1-fast\", \"openrouter/openai/gpt-oss-120b\", \"openrouter/deepseek/deepseek-chat-v3.1\", // Model to use for the research agent (default: google/gemini-3-pro-preview),\n maxTokens: 40000 // default, // Maximum number of tokens for the research agent (default: 40000),\n maxIterations: 400 // default, // Maximum number of iterations for the research agent (default: 100),\n});\n\nconst result = await researchAgentTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// result: unknown // The research result matching the expected JSON schema structure, parsed to object,\n// summary: string // 1-2 sentence summary of what research was conducted and completed,\n// sourcesUsed: string[] // Array of URLs and sources that were searched and scraped during research,\n// iterationsUsed: number // Number of AI agent iterations used to complete the research,\n// success: boolean // Whether the research task was completed successfully,\n// error: string // Error message if research failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
406
462
  "requiredCredentials": [
407
463
  "FIRECRAWL_API_KEY",
408
464
  "GOOGLE_GEMINI_CRED"
@@ -416,7 +472,7 @@
416
472
  "useCase": "General purpose bubble for various workflow needs",
417
473
  "inputSchema": "{\n subreddit: unknown // Name of the subreddit to scrape (with or without r/ prefix),\n limit: number // Maximum number of posts to fetch (1-1000, default: 25),\n sort: \"hot\" | \"new\" | \"top\" | \"rising\" // Sorting method for posts (default: hot),\n timeFilter: \"hour\" | \"day\" | \"week\" | \"month\" | \"year\" | \"all\" | undefined // Time filter for \"top\" sort (only applies when sort=top),\n filterToday: boolean // Filter results to only include posts from today,\n includeStickied: boolean // Include stickied/pinned posts in results,\n minScore: number | undefined // Minimum upvote score required for posts,\n credentials: Record<string, string> | undefined // Optional credentials for enhanced features\n}",
418
474
  "outputSchema": "{\n posts: { title: string // Post title, url: string // Post URL (external link or Reddit permalink), author: string // Username of the post author, score: number // Post upvote score, numComments: number // Number of comments on the post, createdUtc: number // Post creation timestamp (Unix UTC), postUrl: string // Reddit url to the post, selftext: string // Post content text (for text posts/self posts). Empty for link posts which don't have text content., subreddit: string // Subreddit name, postHint: string | null | undefined // Post type hint (image, video, link, etc.), isSelf: boolean // Whether this is a text post (true) or link post (false), thumbnail: string | undefined // Thumbnail image URL if available, domain: string | undefined // Domain of external link, flair: string | undefined // Post flair text }[] // Array of scraped Reddit posts,\n metadata: { subreddit: string // Subreddit that was scraped, requestedLimit: number // Number of posts requested, actualCount: number // Actual number of posts returned, filteredCount: number // Number of posts after filtering, sort: string // Sorting method used, timeFilter: string | undefined // Time filter used (if any), scrapedAt: string // ISO timestamp when scraping occurred, apiEndpoint: string // Reddit API endpoint used } // Metadata about the scraping operation,\n success: boolean // Whether the scraping was successful,\n error: string // Error message if scraping failed\n}",
419
- "usageExample": "// Example usage of reddit-scrape-tool bubble\nconst redditScrapeTool = new RedditScrapeToolBubble({\n limit: 100 // default, // Maximum number of posts to fetch (1-1000, default: 25),\n sort: \"hot\" // options: \"hot\", \"new\", \"top\", \"rising\", // Sorting method for posts (default: hot),\n timeFilter: \"hour\" // options: \"hour\", \"day\", \"week\", \"month\", \"year\", \"all\", // Time filter for \"top\" sort (only applies when sort=top),\n filterToday: false // default, // Filter results to only include posts from today,\n includeStickied: false // default, // Include stickied/pinned posts in results,\n minScore: 42, // Minimum upvote score required for posts,\n});\n\nconst result = await redditScrapeTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// posts: { title: string // Post title, url: string // Post URL (external link or Reddit permalink), author: string // Username of the post author, score: number // Post upvote score, numComments: number // Number of comments on the post, createdUtc: number // Post creation timestamp (Unix UTC), postUrl: string // Reddit url to the post, selftext: string // Post content text (for text posts/self posts). Empty for link posts which don't have text content., subreddit: string // Subreddit name, postHint: string | null | undefined // Post type hint (image, video, link, etc.), isSelf: boolean // Whether this is a text post (true) or link post (false), thumbnail: string | undefined // Thumbnail image URL if available, domain: string | undefined // Domain of external link, flair: string | undefined // Post flair text }[] // Array of scraped Reddit posts,\n// metadata: { subreddit: string // Subreddit that was scraped, requestedLimit: number // Number of posts requested, actualCount: number // Actual number of posts returned, filteredCount: number // Number of posts after filtering, sort: string // Sorting method used, timeFilter: string | undefined // Time filter used (if any), scrapedAt: string // ISO timestamp when scraping occurred, apiEndpoint: string // Reddit API endpoint used } // Metadata about the scraping operation,\n// success: boolean // Whether the scraping was successful,\n// error: string // Error message if scraping failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
475
+ "usageExample": "// Example usage of reddit-scrape-tool bubble\nconst redditScrapeTool = new RedditScrapeTool({\n limit: 100 // default, // Maximum number of posts to fetch (1-1000, default: 25),\n sort: \"hot\" // options: \"hot\", \"new\", \"top\", \"rising\", // Sorting method for posts (default: hot),\n timeFilter: \"hour\" // options: \"hour\", \"day\", \"week\", \"month\", \"year\", \"all\", // Time filter for \"top\" sort (only applies when sort=top),\n filterToday: false // default, // Filter results to only include posts from today,\n includeStickied: false // default, // Include stickied/pinned posts in results,\n minScore: 42, // Minimum upvote score required for posts,\n});\n\nconst result = await redditScrapeTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// posts: { title: string // Post title, url: string // Post URL (external link or Reddit permalink), author: string // Username of the post author, score: number // Post upvote score, numComments: number // Number of comments on the post, createdUtc: number // Post creation timestamp (Unix UTC), postUrl: string // Reddit url to the post, selftext: string // Post content text (for text posts/self posts). Empty for link posts which don't have text content., subreddit: string // Subreddit name, postHint: string | null | undefined // Post type hint (image, video, link, etc.), isSelf: boolean // Whether this is a text post (true) or link post (false), thumbnail: string | undefined // Thumbnail image URL if available, domain: string | undefined // Domain of external link, flair: string | undefined // Post flair text }[] // Array of scraped Reddit posts,\n// metadata: { subreddit: string // Subreddit that was scraped, requestedLimit: number // Number of posts requested, actualCount: number // Actual number of posts returned, filteredCount: number // Number of posts after filtering, sort: string // Sorting method used, timeFilter: string | undefined // Time filter used (if any), scrapedAt: string // ISO timestamp when scraping occurred, apiEndpoint: string // Reddit API endpoint used } // Metadata about the scraping operation,\n// success: boolean // Whether the scraping was successful,\n// error: string // Error message if scraping failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
420
476
  "requiredCredentials": []
421
477
  },
422
478
  {
@@ -427,7 +483,7 @@
427
483
  "useCase": "**",
428
484
  "inputSchema": "{\n operation: \"scrapeProfile\" | \"scrapeHashtag\" // Operation to perform: scrapeProfile for user profiles, scrapeHashtag for hashtag posts,\n profiles: string[] | undefined // Instagram usernames or profile URLs to scrape (for scrapeProfile operation). Examples: [\"@username\", \"https://www.instagram.com/username/\"],\n hashtags: string[] | undefined // Hashtags to scrape (for scrapeHashtag operation). Examples: [\"ai\", \"tech\"] or [\"https://www.instagram.com/explore/tags/ai\"],\n limit: number | undefined // Maximum number of posts to fetch (default: 20 for profiles, 50 for hashtags),\n credentials: Record<string, string> | undefined // Required credentials (auto-injected)\n}",
429
485
  "outputSchema": "{\n operation: \"scrapeProfile\" | \"scrapeHashtag\" // Operation that was performed,\n posts: { url: string | null // Post URL, caption: string | null // Post caption text, likesCount: number | null // Number of likes, commentsCount: number | null // Number of comments, ownerUsername: string | null // Post owner username, timestamp: string | null // Post timestamp (ISO format), type: \"image\" | \"video\" | \"carousel\" | null // Post media type, displayUrl: string | null // Main display image URL, hashtags: string[] | null // Hashtags in the post }[] // Array of Instagram posts scraped,\n profiles: { username: string // Instagram username, fullName: string | null // Full name, bio: string | null // Profile bio, followersCount: number | null // Number of followers, followingCount: number | null // Number of following, postsCount: number | null // Total posts, isVerified: boolean | null // Verification status, profilePicUrl: string | null // Profile picture URL }[] | undefined // Profile information for each scraped profile (only for scrapeProfile operation),\n scrapedHashtags: string[] | undefined // List of hashtags that were scraped (only for scrapeHashtag operation),\n scrapedProfiles: string[] | undefined // List of profile usernames that were scraped (only for scrapeProfile operation),\n totalPosts: number // Total number of posts scraped,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
430
- "usageExample": "// Example usage of instagram-tool bubble\nconst instagramTool = new InstagramToolBubble({\n operation: \"scrapeProfile\" // options: \"scrapeProfile\", \"scrapeHashtag\", // Operation to perform: scrapeProfile for user profiles, scrapeHashtag for hashtag posts,\n profiles: [\"example string\"], // Instagram usernames or profile URLs to scrape (for scrapeProfile operation). Examples: [\"@username\", \"https://www.instagram.com/username/\"],\n hashtags: [\"example string\"], // Hashtags to scrape (for scrapeHashtag operation). Examples: [\"ai\", \"tech\"] or [\"https://www.instagram.com/explore/tags/ai\"],\n limit: 20 // default, // Maximum number of posts to fetch (default: 20 for profiles, 50 for hashtags),\n});\n\nconst result = await instagramTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"scrapeProfile\" | \"scrapeHashtag\" // Operation that was performed,\n// posts: { url: string | null // Post URL, caption: string | null // Post caption text, likesCount: number | null // Number of likes, commentsCount: number | null // Number of comments, ownerUsername: string | null // Post owner username, timestamp: string | null // Post timestamp (ISO format), type: \"image\" | \"video\" | \"carousel\" | null // Post media type, displayUrl: string | null // Main display image URL, hashtags: string[] | null // Hashtags in the post }[] // Array of Instagram posts scraped,\n// profiles: { username: string // Instagram username, fullName: string | null // Full name, bio: string | null // Profile bio, followersCount: number | null // Number of followers, followingCount: number | null // Number of following, postsCount: number | null // Total posts, isVerified: boolean | null // Verification status, profilePicUrl: string | null // Profile picture URL }[] | undefined // Profile information for each scraped profile (only for scrapeProfile operation),\n// scrapedHashtags: string[] | undefined // List of hashtags that were scraped (only for scrapeHashtag operation),\n// scrapedProfiles: string[] | undefined // List of profile usernames that were scraped (only for scrapeProfile operation),\n// totalPosts: number // Total number of posts scraped,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
486
+ "usageExample": "// Example usage of instagram-tool bubble\nconst instagramTool = new InstagramTool({\n operation: \"scrapeProfile\" // options: \"scrapeProfile\", \"scrapeHashtag\", // Operation to perform: scrapeProfile for user profiles, scrapeHashtag for hashtag posts,\n profiles: [\"example string\"], // Instagram usernames or profile URLs to scrape (for scrapeProfile operation). Examples: [\"@username\", \"https://www.instagram.com/username/\"],\n hashtags: [\"example string\"], // Hashtags to scrape (for scrapeHashtag operation). Examples: [\"ai\", \"tech\"] or [\"https://www.instagram.com/explore/tags/ai\"],\n limit: 20 // default, // Maximum number of posts to fetch (default: 20 for profiles, 50 for hashtags),\n});\n\nconst result = await instagramTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"scrapeProfile\" | \"scrapeHashtag\" // Operation that was performed,\n// posts: { url: string | null // Post URL, caption: string | null // Post caption text, likesCount: number | null // Number of likes, commentsCount: number | null // Number of comments, ownerUsername: string | null // Post owner username, timestamp: string | null // Post timestamp (ISO format), type: \"image\" | \"video\" | \"carousel\" | null // Post media type, displayUrl: string | null // Main display image URL, hashtags: string[] | null // Hashtags in the post }[] // Array of Instagram posts scraped,\n// profiles: { username: string // Instagram username, fullName: string | null // Full name, bio: string | null // Profile bio, followersCount: number | null // Number of followers, followingCount: number | null // Number of following, postsCount: number | null // Total posts, isVerified: boolean | null // Verification status, profilePicUrl: string | null // Profile picture URL }[] | undefined // Profile information for each scraped profile (only for scrapeProfile operation),\n// scrapedHashtags: string[] | undefined // List of hashtags that were scraped (only for scrapeHashtag operation),\n// scrapedProfiles: string[] | undefined // List of profile usernames that were scraped (only for scrapeProfile operation),\n// totalPosts: number // Total number of posts scraped,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
431
487
  "requiredCredentials": [
432
488
  "APIFY_CRED"
433
489
  ]
@@ -438,9 +494,48 @@
438
494
  "type": "tool",
439
495
  "shortDescription": "Scrape LinkedIn posts by profile or search by keyword. Get engagement metrics, media, and complete metadata.",
440
496
  "useCase": "**",
441
- "inputSchema": "{\n operation: \"scrapePosts\" | \"searchPosts\" // Operation to perform: scrapePosts for user profiles, searchPosts for keyword search,\n username: string | undefined // LinkedIn username (for scrapePosts operation). Examples: \"satyanadella\", \"billgates\",\n keyword: string | undefined // Keyword or phrase to search for (for searchPosts operation). Examples: \"AI\", \"hiring\", \"n8n\",\n sortBy: \"relevance\" | \"date_posted\" | undefined // Sort results by relevance or date posted (for searchPosts operation, default: relevance),\n dateFilter: \"\" | \"past-24h\" | \"past-week\" | \"past-month\" | undefined // Filter posts by date range (for searchPosts operation, default: no filter),\n limit: number | undefined // Maximum number of posts to fetch (default: 50 for search, 100 for profiles),\n pageNumber: number | undefined // Page number for pagination (default: 1),\n credentials: Record<string, string> | undefined // Required credentials (auto-injected)\n}",
442
- "outputSchema": "{\n operation: \"scrapePosts\" | \"searchPosts\" // Operation that was performed,\n posts: { urn: string | null // Post URN, fullUrn: string | null // Full URN with prefix, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null // When post was created, text: string | null // Post text content, url: string | null // Post URL, postType: string | null // Post type (regular, quote, etc), author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null // Post author information, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null // Post engagement statistics, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null // Post media content, article: { url: string | null, title: string | null, subtitle: string | null, thumbnail: string | null } | null // Shared article information, document: { title: string | null, pageCount: number | null, url: string | null, thumbnail: string | null } | null // Shared document information, resharedPost: { urn: string | null, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null, text: string | null, url: string | null, postType: string | null, author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null } | null // Original post that was reshared }[] // Array of LinkedIn posts,\n username: string | undefined // LinkedIn username that was scraped (only for scrapePosts operation),\n paginationToken: string | null | undefined // Token for fetching next page of results (only for scrapePosts operation),\n keyword: string | undefined // Search keyword that was used (only for searchPosts operation),\n totalResults: number | null | undefined // Total results available (only for searchPosts operation),\n hasNextPage: boolean | null | undefined // Whether there are more results (only for searchPosts operation),\n totalPosts: number // Total number of posts found,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
443
- "usageExample": "// Example usage of linkedin-tool bubble\nconst linkedinTool = new LinkedinToolBubble({\n operation: \"scrapePosts\" // options: \"scrapePosts\", \"searchPosts\", // Operation to perform: scrapePosts for user profiles, searchPosts for keyword search,\n username: \"example string\", // LinkedIn username (for scrapePosts operation). Examples: \"satyanadella\", \"billgates\",\n keyword: \"example string\", // Keyword or phrase to search for (for searchPosts operation). Examples: \"AI\", \"hiring\", \"n8n\",\n sortBy: \"relevance\" // options: \"relevance\", \"date_posted\", // Sort results by relevance or date posted (for searchPosts operation, default: relevance),\n dateFilter: \"\" // options: \"\", \"past-24h\", \"past-week\", \"past-month\", // Filter posts by date range (for searchPosts operation, default: no filter),\n limit: 50 // default, // Maximum number of posts to fetch (default: 50 for search, 100 for profiles),\n pageNumber: 1 // default, // Page number for pagination (default: 1),\n});\n\nconst result = await linkedinTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"scrapePosts\" | \"searchPosts\" // Operation that was performed,\n// posts: { urn: string | null // Post URN, fullUrn: string | null // Full URN with prefix, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null // When post was created, text: string | null // Post text content, url: string | null // Post URL, postType: string | null // Post type (regular, quote, etc), author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null // Post author information, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null // Post engagement statistics, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null // Post media content, article: { url: string | null, title: string | null, subtitle: string | null, thumbnail: string | null } | null // Shared article information, document: { title: string | null, pageCount: number | null, url: string | null, thumbnail: string | null } | null // Shared document information, resharedPost: { urn: string | null, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null, text: string | null, url: string | null, postType: string | null, author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null } | null // Original post that was reshared }[] // Array of LinkedIn posts,\n// username: string | undefined // LinkedIn username that was scraped (only for scrapePosts operation),\n// paginationToken: string | null | undefined // Token for fetching next page of results (only for scrapePosts operation),\n// keyword: string | undefined // Search keyword that was used (only for searchPosts operation),\n// totalResults: number | null | undefined // Total results available (only for searchPosts operation),\n// hasNextPage: boolean | null | undefined // Whether there are more results (only for searchPosts operation),\n// totalPosts: number // Total number of posts found,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
497
+ "inputSchema": "{\n operation: \"scrapePosts\" | \"searchPosts\" | \"scrapeJobs\" // Operation to perform: scrapePosts (profiles), searchPosts (keywords), or scrapeJobs,\n username: string | undefined // LinkedIn username (for scrapePosts operation). Examples: \"satyanadella\", \"billgates\",\n keyword: string | undefined // Keyword or phrase to search for (for searchPosts/scrapeJobs). Examples: \"AI\", \"hiring\", \"Software Engineer\",\n location: string | undefined // Location for job search (e.g. \"San Francisco\", \"Remote\") (scrapeJobs only),\n jobType: \"full-time\" | \"part-time\" | \"contract\" | \"temporary\" | \"internship\"[] | undefined // Filter by job type (scrapeJobs only),\n workplaceType: \"on-site\" | \"remote\" | \"hybrid\"[] | undefined // Filter by workplace type (scrapeJobs only),\n experienceLevel: \"internship\" | \"entry-level\" | \"associate\" | \"mid-senior\" | \"director\" | \"executive\"[] | undefined // Filter by experience level (scrapeJobs only),\n sortBy: \"relevance\" | \"date_posted\" | undefined // Sort results by relevance or date posted (for searchPosts operation, default: relevance),\n dateFilter: \"\" | \"past-24h\" | \"past-week\" | \"past-month\" | undefined // Filter posts/jobs by date range (searchPosts/scrapeJobs). Options: past-24h, past-week, past-month,\n limit: number | undefined // Maximum number of items to fetch (default: 50),\n pageNumber: number | undefined // Page number for pagination (default: 1),\n credentials: Record<string, string> | undefined // Required credentials (auto-injected)\n}",
498
+ "outputSchema": "{\n operation: \"scrapePosts\" | \"searchPosts\" | \"scrapeJobs\" // Operation that was performed,\n jobs: { id: string | null // Job ID, title: string | null // Job title, company: { name: string | null, url: string | null, logo: string | null } | null // Company info, location: string | null // Job location, description: string | null // Job description, employmentType: string | null // Employment type, seniorityLevel: string | null // Seniority level, postedAt: string | null // Posted date, url: string | null // Job URL, applyUrl: string | null // Apply URL, salary: { from: number | null, to: number | null, currency: string | null, period: string | null } | null // Salary info, skills: string[] | null // Required skills }[] | undefined // Array of LinkedIn jobs,\n posts: { urn: string | null // Post URN, fullUrn: string | null // Full URN with prefix, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null // When post was created, text: string | null // Post text content, url: string | null // Post URL, postType: string | null // Post type (regular, quote, etc), author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null // Post author information, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null // Post engagement statistics, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null // Post media content, article: { url: string | null, title: string | null, subtitle: string | null, thumbnail: string | null } | null // Shared article information, document: { title: string | null, pageCount: number | null, url: string | null, thumbnail: string | null } | null // Shared document information, resharedPost: { urn: string | null, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null, text: string | null, url: string | null, postType: string | null, author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null } | null // Original post that was reshared }[] // Array of LinkedIn posts,\n username: string | undefined // LinkedIn username that was scraped (only for scrapePosts operation),\n paginationToken: string | null | undefined // Token for fetching next page of results (only for scrapePosts operation),\n keyword: string | undefined // Search keyword that was used (only for searchPosts operation),\n totalResults: number | null | undefined // Total results available (only for searchPosts operation),\n hasNextPage: boolean | null | undefined // Whether there are more results (only for searchPosts operation),\n totalPosts: number // Total number of posts found,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
499
+ "usageExample": "// Example usage of linkedin-tool bubble\nconst linkedinTool = new LinkedInTool({\n operation: \"scrapePosts\" // options: \"scrapePosts\", \"searchPosts\", \"scrapeJobs\", // Operation to perform: scrapePosts (profiles), searchPosts (keywords), or scrapeJobs,\n username: \"example string\", // LinkedIn username (for scrapePosts operation). Examples: \"satyanadella\", \"billgates\",\n keyword: \"example string\", // Keyword or phrase to search for (for searchPosts/scrapeJobs). Examples: \"AI\", \"hiring\", \"Software Engineer\",\n location: \"example string\", // Location for job search (e.g. \"San Francisco\", \"Remote\") (scrapeJobs only),\n jobType: [\"full-time\" // options: \"full-time\", \"part-time\", \"contract\", \"temporary\", \"internship\"], // Filter by job type (scrapeJobs only),\n workplaceType: [\"on-site\" // options: \"on-site\", \"remote\", \"hybrid\"], // Filter by workplace type (scrapeJobs only),\n experienceLevel: [\"internship\" // options: \"internship\", \"entry-level\", \"associate\", \"mid-senior\", \"director\", \"executive\"], // Filter by experience level (scrapeJobs only),\n sortBy: \"relevance\" // options: \"relevance\", \"date_posted\", // Sort results by relevance or date posted (for searchPosts operation, default: relevance),\n dateFilter: \"\" // options: \"\", \"past-24h\", \"past-week\", \"past-month\", // Filter posts/jobs by date range (searchPosts/scrapeJobs). Options: past-24h, past-week, past-month,\n limit: 50 // default, // Maximum number of items to fetch (default: 50),\n pageNumber: 1 // default, // Page number for pagination (default: 1),\n});\n\nconst result = await linkedinTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"scrapePosts\" | \"searchPosts\" | \"scrapeJobs\" // Operation that was performed,\n// jobs: { id: string | null // Job ID, title: string | null // Job title, company: { name: string | null, url: string | null, logo: string | null } | null // Company info, location: string | null // Job location, description: string | null // Job description, employmentType: string | null // Employment type, seniorityLevel: string | null // Seniority level, postedAt: string | null // Posted date, url: string | null // Job URL, applyUrl: string | null // Apply URL, salary: { from: number | null, to: number | null, currency: string | null, period: string | null } | null // Salary info, skills: string[] | null // Required skills }[] | undefined // Array of LinkedIn jobs,\n// posts: { urn: string | null // Post URN, fullUrn: string | null // Full URN with prefix, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null // When post was created, text: string | null // Post text content, url: string | null // Post URL, postType: string | null // Post type (regular, quote, etc), author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null // Post author information, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null // Post engagement statistics, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null // Post media content, article: { url: string | null, title: string | null, subtitle: string | null, thumbnail: string | null } | null // Shared article information, document: { title: string | null, pageCount: number | null, url: string | null, thumbnail: string | null } | null // Shared document information, resharedPost: { urn: string | null, postedAt: { date: string | null // Post date (formatted string), relative: string | null // Relative time (e.g., \"2 days ago\"), timestamp: number | null // Unix timestamp in milliseconds } | null, text: string | null, url: string | null, postType: string | null, author: { firstName: string | null // Author first name, lastName: string | null // Author last name, headline: string | null // Author headline/title, username: string | null // Author username, profileUrl: string | null // Author profile URL, profilePicture: string | null // Author profile picture URL } | null, stats: { totalReactions: number | null // Total number of reactions, like: number | null // Number of likes, support: number | null // Number of support reactions, love: number | null // Number of love reactions, insight: number | null // Number of insight reactions, celebrate: number | null // Number of celebrate reactions, funny: number | null // Number of funny reactions, comments: number | null // Number of comments, reposts: number | null // Number of reposts } | null, media: { type: string | null // Media type (image, video, images), url: string | null // Media URL, thumbnail: string | null // Media thumbnail URL, images: { url: string | null, width: number | null, height: number | null }[] | null // Array of images for multi-image posts } | null } | null // Original post that was reshared }[] // Array of LinkedIn posts,\n// username: string | undefined // LinkedIn username that was scraped (only for scrapePosts operation),\n// paginationToken: string | null | undefined // Token for fetching next page of results (only for scrapePosts operation),\n// keyword: string | undefined // Search keyword that was used (only for searchPosts operation),\n// totalResults: number | null | undefined // Total results available (only for searchPosts operation),\n// hasNextPage: boolean | null | undefined // Whether there are more results (only for searchPosts operation),\n// totalPosts: number // Total number of posts found,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
500
+ "requiredCredentials": [
501
+ "APIFY_CRED"
502
+ ]
503
+ },
504
+ {
505
+ "name": "tiktok-tool",
506
+ "alias": "tiktok",
507
+ "type": "tool",
508
+ "shortDescription": "Scrape TikTok profiles, videos, and hashtags.",
509
+ "useCase": "General purpose bubble for various workflow needs",
510
+ "inputSchema": "{\n operation: \"scrapeProfile\" | \"scrapeHashtag\" | \"scrapeVideo\" // Operation to perform,\n profiles: string[] | undefined // TikTok profile URLs to scrape (for scrapeProfile),\n hashtags: string[] | undefined // Hashtags to scrape (for scrapeHashtag),\n videoUrls: string[] | undefined // Video URLs to scrape (for scrapeVideo),\n limit: number | undefined // Number of results in total to fetch,\n shouldDownloadVideos: boolean | undefined // Whether to download video files,\n credentials: Record<string, string> | undefined // Required credentials (auto-injected)\n}",
511
+ "outputSchema": "{\n operation: \"scrapeProfile\" | \"scrapeHashtag\" | \"scrapeVideo\" // Operation that was performed,\n videos: { id: string | null // Video ID, text: string | null // Video caption/description, createTime: number | null // Creation timestamp, createTimeISO: string | null // Creation time (ISO format), author: { id: string | null // Author user ID, uniqueId: string | null // Author username, nickname: string | null // Author display name, avatarThumb: string | null // Author avatar URL, signature: string | null // Author bio/signature, verified: boolean | null // Whether author is verified, followerCount: number | null // Number of followers, followingCount: number | null // Number of following, videoCount: number | null // Total number of videos, heartCount: number | null // Total likes received } | null // Video author information, stats: { diggCount: number | null // Number of likes, shareCount: number | null // Number of shares, commentCount: number | null // Number of comments, playCount: number | null // Number of plays/views, collectCount: number | null // Number of times collected } | null // Video engagement statistics, videoUrl: string | null // Video URL, webVideoUrl: string | null // Web video URL, covers: string[] | null // Array of cover image URLs, hashtags: { name: string | null }[] | null // Hashtags used in the video }[] // Array of scraped videos,\n totalVideos: number // Total number of videos scraped,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
512
+ "usageExample": "// Example usage of tiktok-tool bubble\nconst tiktokTool = new TikTokTool({\n operation: \"scrapeProfile\" // options: \"scrapeProfile\", \"scrapeHashtag\", \"scrapeVideo\", // Operation to perform,\n profiles: [\"example string\"], // TikTok profile URLs to scrape (for scrapeProfile),\n hashtags: [\"example string\"], // Hashtags to scrape (for scrapeHashtag),\n videoUrls: [\"example string\"], // Video URLs to scrape (for scrapeVideo),\n limit: 20 // default, // Number of results in total to fetch,\n shouldDownloadVideos: false // default, // Whether to download video files,\n});\n\nconst result = await tiktokTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"scrapeProfile\" | \"scrapeHashtag\" | \"scrapeVideo\" // Operation that was performed,\n// videos: { id: string | null // Video ID, text: string | null // Video caption/description, createTime: number | null // Creation timestamp, createTimeISO: string | null // Creation time (ISO format), author: { id: string | null // Author user ID, uniqueId: string | null // Author username, nickname: string | null // Author display name, avatarThumb: string | null // Author avatar URL, signature: string | null // Author bio/signature, verified: boolean | null // Whether author is verified, followerCount: number | null // Number of followers, followingCount: number | null // Number of following, videoCount: number | null // Total number of videos, heartCount: number | null // Total likes received } | null // Video author information, stats: { diggCount: number | null // Number of likes, shareCount: number | null // Number of shares, commentCount: number | null // Number of comments, playCount: number | null // Number of plays/views, collectCount: number | null // Number of times collected } | null // Video engagement statistics, videoUrl: string | null // Video URL, webVideoUrl: string | null // Web video URL, covers: string[] | null // Array of cover image URLs, hashtags: { name: string | null }[] | null // Hashtags used in the video }[] // Array of scraped videos,\n// totalVideos: number // Total number of videos scraped,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
513
+ "requiredCredentials": [
514
+ "APIFY_CRED"
515
+ ]
516
+ },
517
+ {
518
+ "name": "twitter-tool",
519
+ "alias": "twitter",
520
+ "type": "tool",
521
+ "shortDescription": "Scrape Twitter/X profiles, tweets, and search results with a simple, unified interface.",
522
+ "useCase": "**",
523
+ "inputSchema": "{\n operation: \"scrapeProfile\" | \"search\" | \"scrapeUrl\" // Operation to perform: scrapeProfile (get tweets from user handles), search (search tweets by query), scrapeUrl (scrape specific Twitter URLs),\n twitterHandles: string[] | undefined // [scrapeProfile] Twitter handles/usernames to scrape (without @). Example: [\"elonmusk\", \"OpenAI\"],\n searchTerms: string[] | undefined // [search] Search queries. Supports advanced search syntax: https://github.com/igorbrigadir/twitter-advanced-search. Example: [\"AI news\", \"#machinelearning\"],\n startUrls: string[] | undefined // [scrapeUrl] Direct Twitter URLs to scrape. Supports Tweet, Profile, Search, or List URLs. Example: [\"https://twitter.com/elonmusk/status/123456\"],\n maxItems: number | undefined // Maximum number of tweets to return (default: 20, max: 1000),\n sort: \"Top\" | \"Latest\" | undefined // [search only] Sort results by \"Top\" (most relevant) or \"Latest\" (most recent),\n tweetLanguage: string | undefined // Filter tweets by language using ISO 639-1 code (e.g., \"en\" for English, \"es\" for Spanish),\n credentials: Record<string, string> | undefined // Required credentials (auto-injected)\n}",
524
+ "outputSchema": "{\n operation: \"scrapeProfile\" | \"search\" | \"scrapeUrl\" // Operation that was performed,\n tweets: { id: string | null // Tweet ID, url: string | null // Tweet URL, text: string | null // Tweet text content, author: { id: string | null // User ID, name: string | null // User display name, userName: string | null // User handle (username), description: string | null // User bio, isVerified: boolean | null // Whether user is verified, isBlueVerified: boolean | null // Whether user has Twitter Blue, profilePicture: string | null // Profile picture URL, followers: number | null // Number of followers, following: number | null // Number of following, tweetsCount: number | null // Total number of tweets, url: string | null // Profile URL, createdAt: string | null // Account creation date } | null // Tweet author information, createdAt: string | null // Tweet creation date (ISO format), stats: { retweetCount: number | null, replyCount: number | null, likeCount: number | null, quoteCount: number | null, viewCount: number | null, bookmarkCount: number | null } | null // Tweet engagement statistics, lang: string | null // Tweet language code, media: { type: string | null, url: string | null, width: number | null, height: number | null, duration: number | null }[] | null // Media attachments, entities: { hashtags: string[] | null, urls: string[] | null, mentions: string[] | null } | null // Tweet entities, isRetweet: boolean | null, isQuote: boolean | null, isReply: boolean | null }[] // Array of scraped tweets,\n totalTweets: number // Total number of tweets scraped,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
525
+ "usageExample": "// Example usage of twitter-tool bubble\nconst twitterTool = new TwitterTool({\n operation: \"scrapeProfile\" // options: \"scrapeProfile\", \"search\", \"scrapeUrl\", // Operation to perform: scrapeProfile (get tweets from user handles), search (search tweets by query), scrapeUrl (scrape specific Twitter URLs),\n twitterHandles: [\"example string\"], // [scrapeProfile] Twitter handles/usernames to scrape (without @). Example: [\"elonmusk\", \"OpenAI\"],\n searchTerms: [\"example string\"], // [search] Search queries. Supports advanced search syntax: https://github.com/igorbrigadir/twitter-advanced-search. Example: [\"AI news\", \"#machinelearning\"],\n startUrls: [\"example string\"], // [scrapeUrl] Direct Twitter URLs to scrape. Supports Tweet, Profile, Search, or List URLs. Example: [\"https://twitter.com/elonmusk/status/123456\"],\n maxItems: 20 // default, // Maximum number of tweets to return (default: 20, max: 1000),\n sort: \"Top\" // options: \"Top\", \"Latest\", // [search only] Sort results by \"Top\" (most relevant) or \"Latest\" (most recent),\n tweetLanguage: \"example string\", // Filter tweets by language using ISO 639-1 code (e.g., \"en\" for English, \"es\" for Spanish),\n});\n\nconst result = await twitterTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"scrapeProfile\" | \"search\" | \"scrapeUrl\" // Operation that was performed,\n// tweets: { id: string | null // Tweet ID, url: string | null // Tweet URL, text: string | null // Tweet text content, author: { id: string | null // User ID, name: string | null // User display name, userName: string | null // User handle (username), description: string | null // User bio, isVerified: boolean | null // Whether user is verified, isBlueVerified: boolean | null // Whether user has Twitter Blue, profilePicture: string | null // Profile picture URL, followers: number | null // Number of followers, following: number | null // Number of following, tweetsCount: number | null // Total number of tweets, url: string | null // Profile URL, createdAt: string | null // Account creation date } | null // Tweet author information, createdAt: string | null // Tweet creation date (ISO format), stats: { retweetCount: number | null, replyCount: number | null, likeCount: number | null, quoteCount: number | null, viewCount: number | null, bookmarkCount: number | null } | null // Tweet engagement statistics, lang: string | null // Tweet language code, media: { type: string | null, url: string | null, width: number | null, height: number | null, duration: number | null }[] | null // Media attachments, entities: { hashtags: string[] | null, urls: string[] | null, mentions: string[] | null } | null // Tweet entities, isRetweet: boolean | null, isQuote: boolean | null, isReply: boolean | null }[] // Array of scraped tweets,\n// totalTweets: number // Total number of tweets scraped,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
526
+ "requiredCredentials": [
527
+ "APIFY_CRED"
528
+ ]
529
+ },
530
+ {
531
+ "name": "google-maps-tool",
532
+ "alias": "maps",
533
+ "type": "tool",
534
+ "shortDescription": "Scrape Google Maps business listings, reviews, and place data.",
535
+ "useCase": "General purpose bubble for various workflow needs",
536
+ "inputSchema": "{\n operation: \"search\" // Operation (only search supported),\n queries: string[] // Search queries (e.g. \"restaurants in NYC\"),\n location: string | undefined // Location to focus search (e.g. \"New York, USA\"),\n limit: number | undefined // Maximum number of places to scrape per query,\n language: string | undefined // Result language,\n credentials: Record<string, string> | undefined // Required credentials (auto-injected)\n}",
537
+ "outputSchema": "{\n operation: \"search\" // Operation performed,\n places: { title: string | null // Place name, placeId: string | null // Place ID, url: string | null // Place URL, address: string | null // Full address, category: string | null // Primary category, website: string | null // Website URL, phone: string | null // Phone number, rating: number | null // Average rating, reviewsCount: number | null // Total reviews, priceLevel: string | null // Price level, isAdvertisement: boolean | null // Is sponsored, location: { lat: number | null, lng: number | null } | null // Coordinates, openingHours: { day: string | null, hours: unknown }[] | null // Opening hours, reviews: { name: string | null // Reviewer name, rating: number | null // Rating (1-5), text: string | null // Review text, publishedAtDate: string | null // Publish date, likesCount: number | null // Number of likes, responseFromOwnerText: string | null // Owner response }[] | null // Recent reviews, imageUrls: string[] | null // Image URLs, additionalInfo: Record<string, string[]> | null // Additional attributes (accessibility, amenities, etc.) }[] // Found places,\n totalPlaces: number // Total places found,\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
538
+ "usageExample": "// Example usage of google-maps-tool bubble\nconst googleMapsTool = new GoogleMapsTool({\n operation: \"search\", // Operation (only search supported),\n queries: [\"example string\"], // Search queries (e.g. \"restaurants in NYC\"),\n location: \"example string\", // Location to focus search (e.g. \"New York, USA\"),\n limit: 20 // default, // Maximum number of places to scrape per query,\n language: \"en\" // default, // Result language,\n});\n\nconst result = await googleMapsTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"search\" // Operation performed,\n// places: { title: string | null // Place name, placeId: string | null // Place ID, url: string | null // Place URL, address: string | null // Full address, category: string | null // Primary category, website: string | null // Website URL, phone: string | null // Phone number, rating: number | null // Average rating, reviewsCount: number | null // Total reviews, priceLevel: string | null // Price level, isAdvertisement: boolean | null // Is sponsored, location: { lat: number | null, lng: number | null } | null // Coordinates, openingHours: { day: string | null, hours: unknown }[] | null // Opening hours, reviews: { name: string | null // Reviewer name, rating: number | null // Rating (1-5), text: string | null // Review text, publishedAtDate: string | null // Publish date, likesCount: number | null // Number of likes, responseFromOwnerText: string | null // Owner response }[] | null // Recent reviews, imageUrls: string[] | null // Image URLs, additionalInfo: Record<string, string[]> | null // Additional attributes (accessibility, amenities, etc.) }[] // Found places,\n// totalPlaces: number // Total places found,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
444
539
  "requiredCredentials": [
445
540
  "APIFY_CRED"
446
541
  ]
@@ -453,7 +548,7 @@
453
548
  "useCase": "General purpose bubble for various workflow needs",
454
549
  "inputSchema": "{\n operation: \"searchVideos\" | \"getTranscript\" | \"scrapeChannel\" // Operation: searchVideos for search/URLs, getTranscript for transcripts, scrapeChannel for channel videos. Not all videos will have transcript available.,\n searchQueries: string[] | undefined // Search queries for YouTube (for searchVideos). Examples: [\"AI tutorials\", \"react hooks\"],\n videoUrls: string[] | undefined // Direct YouTube URLs - videos, channels, playlists (for searchVideos or getTranscript),\n channelUrl: string | undefined // YouTube channel URL (for scrapeChannel operation),\n videoUrl: string | undefined // Single video URL for transcript extraction (for getTranscript),\n maxResults: number | undefined // Max videos to fetch (default: 20),\n includeShorts: boolean | undefined // Include YouTube Shorts in results,\n credentials: Record<string, string> | undefined // Required credentials (auto-injected)\n}",
455
550
  "outputSchema": "{\n operation: \"searchVideos\" | \"getTranscript\" | \"scrapeChannel\" // Operation performed,\n videos: { title: string | null // Video title, id: string | null // YouTube video ID, url: string | null // Video URL, viewCount: number | null // Number of views, likes: number | null // Number of likes, date: string | null // Upload date (ISO format), channelName: string | null // Channel name, channelUrl: string | null // Channel URL, subscribers: number | null // Number of channel subscribers, duration: string | null // Video duration (HH:MM:SS), description: string | null // Video description, comments: number | null // Number of comments, thumbnail: string | null // Thumbnail URL }[] | undefined // Array of YouTube videos,\n transcript: { start: string | null // Start time in seconds, duration: string | null // Duration in seconds, text: string | null // Transcript text }[] | undefined // Video transcript with timestamps,\n fullTranscriptText: string | undefined // Complete transcript as plain text,\n totalResults: number // Total number of results,\n success: boolean // Whether operation succeeded,\n error: string // Error message if failed\n}",
456
- "usageExample": "// Example usage of youtube-tool bubble\nconst youtubeTool = new YoutubeToolBubble({\n operation: \"searchVideos\" // options: \"searchVideos\", \"getTranscript\", \"scrapeChannel\", // Operation: searchVideos for search/URLs, getTranscript for transcripts, scrapeChannel for channel videos. Not all videos will have transcript available.,\n searchQueries: [\"example string\"], // Search queries for YouTube (for searchVideos). Examples: [\"AI tutorials\", \"react hooks\"],\n videoUrls: [\"example string\"], // Direct YouTube URLs - videos, channels, playlists (for searchVideos or getTranscript),\n channelUrl: \"example string\", // YouTube channel URL (for scrapeChannel operation),\n videoUrl: \"example string\", // Single video URL for transcript extraction (for getTranscript),\n maxResults: 20 // default, // Max videos to fetch (default: 20),\n includeShorts: false // default, // Include YouTube Shorts in results,\n});\n\nconst result = await youtubeTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"searchVideos\" | \"getTranscript\" | \"scrapeChannel\" // Operation performed,\n// videos: { title: string | null // Video title, id: string | null // YouTube video ID, url: string | null // Video URL, viewCount: number | null // Number of views, likes: number | null // Number of likes, date: string | null // Upload date (ISO format), channelName: string | null // Channel name, channelUrl: string | null // Channel URL, subscribers: number | null // Number of channel subscribers, duration: string | null // Video duration (HH:MM:SS), description: string | null // Video description, comments: number | null // Number of comments, thumbnail: string | null // Thumbnail URL }[] | undefined // Array of YouTube videos,\n// transcript: { start: string | null // Start time in seconds, duration: string | null // Duration in seconds, text: string | null // Transcript text }[] | undefined // Video transcript with timestamps,\n// fullTranscriptText: string | undefined // Complete transcript as plain text,\n// totalResults: number // Total number of results,\n// success: boolean // Whether operation succeeded,\n// error: string // Error message if failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
551
+ "usageExample": "// Example usage of youtube-tool bubble\nconst youtubeTool = new YouTubeTool({\n operation: \"searchVideos\" // options: \"searchVideos\", \"getTranscript\", \"scrapeChannel\", // Operation: searchVideos for search/URLs, getTranscript for transcripts, scrapeChannel for channel videos. Not all videos will have transcript available.,\n searchQueries: [\"example string\"], // Search queries for YouTube (for searchVideos). Examples: [\"AI tutorials\", \"react hooks\"],\n videoUrls: [\"example string\"], // Direct YouTube URLs - videos, channels, playlists (for searchVideos or getTranscript),\n channelUrl: \"example string\", // YouTube channel URL (for scrapeChannel operation),\n videoUrl: \"example string\", // Single video URL for transcript extraction (for getTranscript),\n maxResults: 20 // default, // Max videos to fetch (default: 20),\n includeShorts: false // default, // Include YouTube Shorts in results,\n});\n\nconst result = await youtubeTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// operation: \"searchVideos\" | \"getTranscript\" | \"scrapeChannel\" // Operation performed,\n// videos: { title: string | null // Video title, id: string | null // YouTube video ID, url: string | null // Video URL, viewCount: number | null // Number of views, likes: number | null // Number of likes, date: string | null // Upload date (ISO format), channelName: string | null // Channel name, channelUrl: string | null // Channel URL, subscribers: number | null // Number of channel subscribers, duration: string | null // Video duration (HH:MM:SS), description: string | null // Video description, comments: number | null // Number of comments, thumbnail: string | null // Thumbnail URL }[] | undefined // Array of YouTube videos,\n// transcript: { start: string | null // Start time in seconds, duration: string | null // Duration in seconds, text: string | null // Transcript text }[] | undefined // Video transcript with timestamps,\n// fullTranscriptText: string | undefined // Complete transcript as plain text,\n// totalResults: number // Total number of results,\n// success: boolean // Whether operation succeeded,\n// error: string // Error message if failed\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
457
552
  "requiredCredentials": [
458
553
  "APIFY_CRED"
459
554
  ]
@@ -465,24 +560,77 @@
465
560
  "shortDescription": "Multi-page web crawling tool for exploring entire websites and subdomains.",
466
561
  "useCase": "General purpose bubble for various workflow needs",
467
562
  "inputSchema": "{\n url: string // The root URL to crawl and extract content from,\n format: \"markdown\" // Output format for crawled content,\n onlyMainContent: boolean // Extract only main content, filtering out navigation/footers,\n maxPages: number | undefined // Maximum number of pages to crawl,\n crawlDepth: number | undefined // Maximum depth to crawl,\n includePaths: string[] | undefined // URL patterns to include in crawl (regex patterns), Example: [\"^/blog/.*$\", \"^/docs/.*$\"],\n excludePaths: string[] | undefined // URL patterns to exclude from crawl (regex patterns), [\"^/admin/.*$\", \"^/private/.*$\"],\n waitFor: number // Time to wait for dynamic content in milliseconds,\n credentials: Record<string, string> | undefined // Required credentials including FIRECRAWL_API_KEY\n}",
468
- "outputSchema": "{\n url: string // The original URL that was crawled,\n success: boolean // Whether the crawl operation was successful,\n error: string // Error message if crawl failed,\n pages: { url: string, title: string | undefined, content: string, depth: number | undefined }[] // Array of crawled pages with content,\n totalPages: number // Total number of pages crawled,\n metadata: { loadTime: number | undefined, crawlDepth: number | undefined, maxPagesReached: boolean | undefined } | undefined // Additional metadata about the crawl operation\n}",
469
- "usageExample": "// Example usage of web-crawl-tool bubble\nconst webCrawlTool = new WebCrawlToolBubble({\n url: \"example string\", // The root URL to crawl and extract content from,\n format: \"markdown\", // Output format for crawled content,\n onlyMainContent: true // default, // Extract only main content, filtering out navigation/footers,\n maxPages: 10 // default, // Maximum number of pages to crawl,\n crawlDepth: 2 // default, // Maximum depth to crawl,\n includePaths: [\"example string\"], // URL patterns to include in crawl (regex patterns), Example: [\"^/blog/.*$\", \"^/docs/.*$\"],\n excludePaths: [\"example string\"], // URL patterns to exclude from crawl (regex patterns), [\"^/admin/.*$\", \"^/private/.*$\"],\n waitFor: 3000 // default, // Time to wait for dynamic content in milliseconds,\n});\n\nconst result = await webCrawlTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// url: string // The original URL that was crawled,\n// success: boolean // Whether the crawl operation was successful,\n// error: string // Error message if crawl failed,\n// pages: { url: string, title: string | undefined, content: string, depth: number | undefined }[] // Array of crawled pages with content,\n// totalPages: number // Total number of pages crawled,\n// metadata: { loadTime: number | undefined, crawlDepth: number | undefined, maxPagesReached: boolean | undefined } | undefined // Additional metadata about the crawl operation\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
563
+ "outputSchema": "{\n url: string // The original URL that was crawled,\n success: boolean // Whether the crawl operation was successful,\n error: string // Error message if crawl failed,\n pages: { url: string, title: string | undefined, content: string, depth: number | undefined }[] // Array of crawled pages with content,\n totalPages: number // Total number of pages crawled,\n creditsUsed: number // Number of credits used,\n metadata: { loadTime: number | undefined, crawlDepth: number | undefined, maxPagesReached: boolean | undefined } | undefined // Additional metadata about the crawl operation\n}",
564
+ "usageExample": "// Example usage of web-crawl-tool bubble\nconst webCrawlTool = new WebCrawlTool({\n url: \"example string\", // The root URL to crawl and extract content from,\n format: \"markdown\", // Output format for crawled content,\n onlyMainContent: true // default, // Extract only main content, filtering out navigation/footers,\n maxPages: 10 // default, // Maximum number of pages to crawl,\n crawlDepth: 2 // default, // Maximum depth to crawl,\n includePaths: [\"example string\"], // URL patterns to include in crawl (regex patterns), Example: [\"^/blog/.*$\", \"^/docs/.*$\"],\n excludePaths: [\"example string\"], // URL patterns to exclude from crawl (regex patterns), [\"^/admin/.*$\", \"^/private/.*$\"],\n waitFor: 3000 // default, // Time to wait for dynamic content in milliseconds,\n});\n\nconst result = await webCrawlTool.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// url: string // The original URL that was crawled,\n// success: boolean // Whether the crawl operation was successful,\n// error: string // Error message if crawl failed,\n// pages: { url: string, title: string | undefined, content: string, depth: number | undefined }[] // Array of crawled pages with content,\n// totalPages: number // Total number of pages crawled,\n// creditsUsed: number // Number of credits used,\n// metadata: { loadTime: number | undefined, crawlDepth: number | undefined, maxPagesReached: boolean | undefined } | undefined // Additional metadata about the crawl operation\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
565
+ "requiredCredentials": [
566
+ "FIRECRAWL_API_KEY",
567
+ "GOOGLE_GEMINI_CRED"
568
+ ]
569
+ },
570
+ {
571
+ "name": "eleven-labs",
572
+ "alias": "elevenlabs",
573
+ "type": "service",
574
+ "shortDescription": "Eleven Labs integration for Conversational AI",
575
+ "useCase": "- Generate signed URLs for secure WebSocket connections to agents",
576
+ "inputSchema": "Complex schema - see usage example for structure",
577
+ "outputSchema": "Complex schema - see usage example for structure",
578
+ "usageExample": "// Get Signed Url example\nconst elevenLabs_get_signed_url = new ElevenLabsBubble({\n operation: \"get_signed_url\", // Get a signed URL for authenticated WebSocket connection\n agentId: \"example string\", // The ID of the agent to connect to\n});\n\nconst result = await elevenLabs_get_signed_url.action();\n// outputSchema for result.data when operation === 'get_signed_url':\n// {\n// operation: \"get_signed_url\",\n// signedUrl: string | undefined // The signed URL for WebSocket connection,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if the operation failed\n// }\n\n\n// Trigger Outbound Call example\nconst elevenLabs_trigger_outbound_call = new ElevenLabsBubble({\n operation: \"trigger_outbound_call\", // Trigger an outbound call to a phone number\n agentId: \"example string\", // The ID of the agent to use for the call\n toPhoneNumber: \"example string\", // The phone number to call (E.164 format)\n phoneNumberId: \"example string\", // The ID of the phone number to call from (optional)\n variables: { \"example_key\": \"example string\" }, // Dynamic variables to pass to the agent\n});\n\nconst result = await elevenLabs_trigger_outbound_call.action();\n// outputSchema for result.data when operation === 'trigger_outbound_call':\n// {\n// operation: \"trigger_outbound_call\",\n// callSid: string | undefined // The unique identifier for the call,\n// conversationId: string | undefined // The unique identifier for the conversation,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if the operation failed\n// }\n\n\n// Get Agent example\nconst elevenLabs_get_agent = new ElevenLabsBubble({\n operation: \"get_agent\", // Get details about an agent\n agentId: \"example string\", // The ID of the agent to retrieve\n});\n\nconst result = await elevenLabs_get_agent.action();\n// outputSchema for result.data when operation === 'get_agent':\n// {\n// operation: \"get_agent\",\n// agent: Record<string, unknown> | undefined // The agent details,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if the operation failed\n// }\n\n\n// Validate Webhook Signature example\nconst elevenLabs_validate_webhook_signature = new ElevenLabsBubble({\n operation: \"validate_webhook_signature\", // Validate a webhook signature from Eleven Labs\n signature: \"example string\", // The signature header from the webhook request\n timestamp: \"example string\", // The timestamp header from the webhook request\n body: \"example string\", // The raw body of the webhook request\n webhookSecret: \"example string\", // The webhook secret to validate against\n});\n\nconst result = await elevenLabs_validate_webhook_signature.action();\n// outputSchema for result.data when operation === 'validate_webhook_signature':\n// {\n// operation: \"validate_webhook_signature\",\n// isValid: boolean // Whether the signature is valid,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if the operation failed\n// }\n\n\n// Get Conversation example\nconst elevenLabs_get_conversation = new ElevenLabsBubble({\n operation: \"get_conversation\", // Get details of a specific conversation\n conversationId: \"example string\", // The ID of the conversation to retrieve\n});\n\nconst result = await elevenLabs_get_conversation.action();\n// outputSchema for result.data when operation === 'get_conversation':\n// {\n// operation: \"get_conversation\",\n// conversation: Record<string, unknown> | undefined // The conversation details,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if the operation failed\n// }\n\n\n// Get Conversations example\nconst elevenLabs_get_conversations = new ElevenLabsBubble({\n operation: \"get_conversations\", // Get a list of conversations\n agentId: \"example string\", // Filter conversations by agent ID\n pageSize: 42, // Number of conversations to return (default: 30)\n cursor: \"example string\", // Cursor for pagination\n});\n\nconst result = await elevenLabs_get_conversations.action();\n// outputSchema for result.data when operation === 'get_conversations':\n// {\n// operation: \"get_conversations\",\n// conversations: Record<string, unknown>[] | undefined // List of conversations,\n// hasMore: boolean | undefined // Whether there are more conversations to retrieve,\n// nextCursor: string | undefined // Cursor for the next page of results,\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if the operation failed\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`eleven-labs failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
579
+ "requiredCredentials": [
580
+ "ELEVENLABS_API_KEY"
581
+ ]
582
+ },
583
+ {
584
+ "name": "agi-inc",
585
+ "alias": "agi-inc",
586
+ "type": "service",
587
+ "shortDescription": "AGI Agent integration for browser automation and task execution",
588
+ "useCase": "- Internet research and data extraction",
589
+ "inputSchema": "Complex schema - see usage example for structure",
590
+ "outputSchema": "Complex schema - see usage example for structure",
591
+ "usageExample": "// Create Session example\nconst agiInc_create_session = new AGIIncBubble({\n operation: \"create_session\", // Create a new agent session with a browser environment\n agent_name: \"agi-0\" // options: \"agi-0\", \"agi-0-fast\", // Agent model to use\n webhook_url: \"example string\", // URL to receive webhook notifications for session events\n restore_from_session_id: \"example string\", // Restore session from a specific session snapshot\n restore_default_environment_from_user_id: \"example string\", // Restore from user default environment snapshot\n enable_memory_snapshot: true // default, // Enable memory snapshots for faster restoration\n});\n\nconst result = await agiInc_create_session.action();\n// outputSchema for result.data when operation === 'create_session':\n// {\n// operation: \"create_session\",\n// ok: boolean // Whether the API call was successful,\n// session_id: string | undefined // Created session ID,\n// vnc_url: string | undefined // URL to view the browser,\n// agent_name: string | undefined // Agent model being used,\n// status: \"initializing\" | \"ready\" | \"running\" | \"paused\" | \"completed\" | \"error\" | \"terminated\" | undefined // Session status,\n// created_at: string | undefined // Creation timestamp,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// List Sessions example\nconst agiInc_list_sessions = new AGIIncBubble({\n operation: \"list_sessions\", // Get all sessions for the authenticated user\n});\n\nconst result = await agiInc_list_sessions.action();\n// outputSchema for result.data when operation === 'list_sessions':\n// {\n// operation: \"list_sessions\",\n// ok: boolean // Whether the API call was successful,\n// sessions: { session_id: string // Unique session identifier, vnc_url: string | undefined // URL to view the browser, agent_name: string // Agent model being used, status: \"initializing\" | \"ready\" | \"running\" | \"paused\" | \"completed\" | \"error\" | \"terminated\" // Current session status, created_at: string // ISO 8601 creation timestamp }[] | undefined // Array of sessions,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Session example\nconst agiInc_get_session = new AGIIncBubble({\n operation: \"get_session\", // Get details for a specific session\n session_id: \"example string\", // The UUID of the session to retrieve\n});\n\nconst result = await agiInc_get_session.action();\n// outputSchema for result.data when operation === 'get_session':\n// {\n// operation: \"get_session\",\n// ok: boolean // Whether the API call was successful,\n// session: { session_id: string // Unique session identifier, vnc_url: string | undefined // URL to view the browser, agent_name: string // Agent model being used, status: \"initializing\" | \"ready\" | \"running\" | \"paused\" | \"completed\" | \"error\" | \"terminated\" // Current session status, created_at: string // ISO 8601 creation timestamp } | undefined // Session details,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Delete Session example\nconst agiInc_delete_session = new AGIIncBubble({\n operation: \"delete_session\", // Delete a specific session and cleanup resources\n session_id: \"example string\", // The UUID of the session to delete\n save_snapshot_mode: \"none\" // options: \"none\", \"memory\", \"filesystem\", // Snapshot mode when deleting\n save_as_default: false // default, // Set snapshot as user default environment\n});\n\nconst result = await agiInc_delete_session.action();\n// outputSchema for result.data when operation === 'delete_session':\n// {\n// operation: \"delete_session\",\n// ok: boolean // Whether the API call was successful,\n// deleted: boolean | undefined // Whether session was deleted,\n// message: string | undefined // Result message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Delete All Sessions example\nconst agiInc_delete_all_sessions = new AGIIncBubble({\n operation: \"delete_all_sessions\", // Delete all sessions for the authenticated user\n});\n\nconst result = await agiInc_delete_all_sessions.action();\n// outputSchema for result.data when operation === 'delete_all_sessions':\n// {\n// operation: \"delete_all_sessions\",\n// ok: boolean // Whether the API call was successful,\n// deleted: boolean | undefined // Whether sessions were deleted,\n// message: string | undefined // Result message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Send Message example\nconst agiInc_send_message = new AGIIncBubble({\n operation: \"send_message\", // Send a message to the agent to start a task or respond\n session_id: \"example string\", // The UUID of the session\n message: \"example string\", // The message text to send to the agent\n start_url: \"example string\", // Optional starting URL for the agent to navigate to\n});\n\nconst result = await agiInc_send_message.action();\n// outputSchema for result.data when operation === 'send_message':\n// {\n// operation: \"send_message\",\n// ok: boolean // Whether the API call was successful,\n// message: string | undefined // Confirmation message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Status example\nconst agiInc_get_status = new AGIIncBubble({\n operation: \"get_status\", // Get the current execution status of a session\n session_id: \"example string\", // The UUID of the session\n});\n\nconst result = await agiInc_get_status.action();\n// outputSchema for result.data when operation === 'get_status':\n// {\n// operation: \"get_status\",\n// ok: boolean // Whether the API call was successful,\n// status: \"running\" | \"waiting_for_input\" | \"finished\" | \"error\" | undefined // Current execution status,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Messages example\nconst agiInc_get_messages = new AGIIncBubble({\n operation: \"get_messages\", // Poll for messages and updates from the agent\n session_id: \"example string\", // The UUID of the session\n after_id: 0 // default, // Return only messages with ID greater than this value\n sanitize: true // default, // Filter out system messages and internal prompts\n});\n\nconst result = await agiInc_get_messages.action();\n// outputSchema for result.data when operation === 'get_messages':\n// {\n// operation: \"get_messages\",\n// ok: boolean // Whether the API call was successful,\n// messages: { id: number // Unique message ID, type: \"THOUGHT\" | \"QUESTION\" | \"USER\" | \"DONE\" | \"ERROR\" | \"LOG\" // Message type, content: unknown // Message content, timestamp: string // ISO 8601 timestamp, metadata: Record<string, unknown> | undefined // Additional metadata }[] | undefined // Array of messages,\n// status: \"running\" | \"waiting_for_input\" | \"finished\" | \"error\" | undefined // Current execution status,\n// has_agent: boolean | undefined // Whether agent is connected,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Pause Session example\nconst agiInc_pause_session = new AGIIncBubble({\n operation: \"pause_session\", // Temporarily pause task execution\n session_id: \"example string\", // The UUID of the session to pause\n});\n\nconst result = await agiInc_pause_session.action();\n// outputSchema for result.data when operation === 'pause_session':\n// {\n// operation: \"pause_session\",\n// ok: boolean // Whether the API call was successful,\n// message: string | undefined // Result message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Resume Session example\nconst agiInc_resume_session = new AGIIncBubble({\n operation: \"resume_session\", // Resume a paused task\n session_id: \"example string\", // The UUID of the session to resume\n});\n\nconst result = await agiInc_resume_session.action();\n// outputSchema for result.data when operation === 'resume_session':\n// {\n// operation: \"resume_session\",\n// ok: boolean // Whether the API call was successful,\n// message: string | undefined // Result message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Cancel Session example\nconst agiInc_cancel_session = new AGIIncBubble({\n operation: \"cancel_session\", // Cancel the current task execution\n session_id: \"example string\", // The UUID of the session to cancel\n});\n\nconst result = await agiInc_cancel_session.action();\n// outputSchema for result.data when operation === 'cancel_session':\n// {\n// operation: \"cancel_session\",\n// ok: boolean // Whether the API call was successful,\n// message: string | undefined // Result message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Navigate example\nconst agiInc_navigate = new AGIIncBubble({\n operation: \"navigate\", // Navigate the browser to a specific URL\n session_id: \"example string\", // The UUID of the session\n url: \"example string\", // Absolute URL to navigate to\n});\n\nconst result = await agiInc_navigate.action();\n// outputSchema for result.data when operation === 'navigate':\n// {\n// operation: \"navigate\",\n// ok: boolean // Whether the API call was successful,\n// current_url: string | undefined // Current URL after navigation,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Screenshot example\nconst agiInc_get_screenshot = new AGIIncBubble({\n operation: \"get_screenshot\", // Capture a screenshot of the current browser state\n session_id: \"example string\", // The UUID of the session\n});\n\nconst result = await agiInc_get_screenshot.action();\n// outputSchema for result.data when operation === 'get_screenshot':\n// {\n// operation: \"get_screenshot\",\n// ok: boolean // Whether the API call was successful,\n// screenshot: string | undefined // Base64-encoded JPEG image as data URL,\n// url: string | undefined // Current page URL,\n// title: string | undefined // Current page title,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`agi-inc failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
592
+ "requiredCredentials": [
593
+ "AGI_API_KEY"
594
+ ]
595
+ },
596
+ {
597
+ "name": "airtable",
598
+ "alias": "airtable",
599
+ "type": "service",
600
+ "shortDescription": "Airtable integration for managing records in bases and tables",
601
+ "useCase": "- List records with filtering, sorting, and pagination",
602
+ "inputSchema": "Complex schema - see usage example for structure",
603
+ "outputSchema": "Complex schema - see usage example for structure",
604
+ "usageExample": "// List Records example\nconst airtable_list_records = new AirtableBubble({\n operation: \"list_records\", // List records from an Airtable table with filtering and sorting\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n fields: [\"example string\"], // Array of field names to include in results (returns all fields if not specified)\n filterByFormula: \"example string\", // Airtable formula to filter records (e.g., \"{Status} = 'Done'\")\n maxRecords: 42, // Maximum number of records to return (1-100, returns all if not specified)\n pageSize: 100 // default, // Number of records per page for pagination (1-100)\n sort: [{ field: \"example string\" // Field name to sort by, direction: \"asc\" // options: \"asc\", \"desc\" // Sort direction (asc or desc) }], // Array of sort specifications to order records\n view: \"example string\", // View name or ID to use (includes view's filters and sorts)\n cellFormat: \"json\" // options: \"json\", \"string\", // Format for cell values: json (structured) or string (formatted)\n timeZone: \"example string\", // Time zone for date/time fields (e.g., \"America/Los_Angeles\")\n userLocale: \"example string\", // Locale for formatting (e.g., \"en-US\")\n offset: \"example string\", // Pagination offset from previous response\n});\n\nconst result = await airtable_list_records.action();\n// outputSchema for result.data when operation === 'list_records':\n// {\n// operation: \"list_records\" // List records from an Airtable table with filtering and sorting,\n// ok: boolean // Whether the Airtable API call was successful,\n// records: { id: string // Unique record identifier (starts with rec), createdTime: string // ISO 8601 datetime when record was created, fields: Record<string, unknown> // Record field values as key-value pairs }[] | undefined // Array of record objects,\n// offset: string | undefined // Pagination offset for retrieving next page of results,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Record example\nconst airtable_get_record = new AirtableBubble({\n operation: \"get_record\", // Retrieve a single record by its ID\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n recordId: \"example string\", // Record ID to retrieve (starts with rec)\n});\n\nconst result = await airtable_get_record.action();\n// outputSchema for result.data when operation === 'get_record':\n// {\n// operation: \"get_record\" // Retrieve a single record by its ID,\n// ok: boolean // Whether the Airtable API call was successful,\n// record: { id: string // Unique record identifier (starts with rec), createdTime: string // ISO 8601 datetime when record was created, fields: Record<string, unknown> // Record field values as key-value pairs } | undefined // Record object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Create Records example\nconst airtable_create_records = new AirtableBubble({\n operation: \"create_records\", // Create one or more new records in an Airtable table\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n records: [{ fields: { \"example_key\": [] } // Field values for the new record }], // Array of records to create (max 10 per request)\n typecast: false // default, // Automatically convert field values to the appropriate type\n});\n\nconst result = await airtable_create_records.action();\n// outputSchema for result.data when operation === 'create_records':\n// {\n// operation: \"create_records\" // Create one or more new records in an Airtable table,\n// ok: boolean // Whether the Airtable API call was successful,\n// records: { id: string // Unique record identifier (starts with rec), createdTime: string // ISO 8601 datetime when record was created, fields: Record<string, unknown> // Record field values as key-value pairs }[] | undefined // Array of created record objects,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Update Records example\nconst airtable_update_records = new AirtableBubble({\n operation: \"update_records\", // Update existing records in an Airtable table\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n records: [{ id: \"example string\" // Record ID to update (starts with rec), fields: { \"example_key\": [] } // Field values to update (only specified fields will be updated) }], // Array of records to update (max 10 per request)\n typecast: false // default, // Automatically convert field values to the appropriate type\n});\n\nconst result = await airtable_update_records.action();\n// outputSchema for result.data when operation === 'update_records':\n// {\n// operation: \"update_records\" // Update existing records in an Airtable table,\n// ok: boolean // Whether the Airtable API call was successful,\n// records: { id: string // Unique record identifier (starts with rec), createdTime: string // ISO 8601 datetime when record was created, fields: Record<string, unknown> // Record field values as key-value pairs }[] | undefined // Array of updated record objects,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Delete Records example\nconst airtable_delete_records = new AirtableBubble({\n operation: \"delete_records\", // Delete one or more records from an Airtable table\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n recordIds: [\"example string\"], // Array of record IDs to delete (max 10 per request)\n});\n\nconst result = await airtable_delete_records.action();\n// outputSchema for result.data when operation === 'delete_records':\n// {\n// operation: \"delete_records\" // Delete one or more records from an Airtable table,\n// ok: boolean // Whether the Airtable API call was successful,\n// records: { id: string // ID of deleted record, deleted: boolean // Whether the record was deleted }[] | undefined // Array of deletion confirmation objects,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// List Bases example\nconst airtable_list_bases = new AirtableBubble({\n operation: \"list_bases\", // List all bases accessible with the current API key\n});\n\nconst result = await airtable_list_bases.action();\n// outputSchema for result.data when operation === 'list_bases':\n// {\n// operation: \"list_bases\" // List all bases accessible with the current API key,\n// ok: boolean // Whether the Airtable API call was successful,\n// bases: { id: string // Base ID, name: string // Base name, permissionLevel: string // Permission level for this base }[] | undefined // Array of base objects,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Base Schema example\nconst airtable_get_base_schema = new AirtableBubble({\n operation: \"get_base_schema\", // Get the schema for a specific base including all tables and fields\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n});\n\nconst result = await airtable_get_base_schema.action();\n// outputSchema for result.data when operation === 'get_base_schema':\n// {\n// operation: \"get_base_schema\" // Get the schema for a specific base including all tables and fields,\n// ok: boolean // Whether the Airtable API call was successful,\n// tables: { id: string // Table ID, name: string // Table name, description: string | undefined // Table description, primaryFieldId: string // ID of the primary field, fields: { id: string // Field ID, name: string // Field name, type: string // Field type, description: string | undefined // Field description, options: Record<string, unknown> | undefined // Field options }[] // Array of field definitions, views: { id: string // View ID, name: string // View name, type: string // View type }[] | undefined // Array of view definitions }[] | undefined // Array of table schemas,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Create Table example\nconst airtable_create_table = new AirtableBubble({\n operation: \"create_table\", // Create a new table in an Airtable base\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n name: \"example string\", // Name for the new table\n description: \"example string\", // Optional description for the table\n fields: [{ name: \"example string\" // Field name, type: \"singleLineText\" // options: \"singleLineText\", \"multilineText\", \"richText\", \"email\", \"url\", \"phoneNumber\", \"number\", \"percent\", \"currency\", \"rating\", \"duration\", \"singleSelect\", \"multipleSelects\", \"singleCollaborator\", \"multipleCollaborators\", \"date\", \"dateTime\", \"checkbox\", \"multipleRecordLinks\", \"multipleAttachments\", \"barcode\", \"button\", \"formula\", \"createdTime\", \"lastModifiedTime\", \"createdBy\", \"lastModifiedBy\", \"autoNumber\", \"externalSyncSource\", \"count\", \"lookup\", \"rollup\" // Field type, description: \"example string\" // Field description, options: {} // Field options }], // Array of field definitions for the table\n});\n\nconst result = await airtable_create_table.action();\n// outputSchema for result.data when operation === 'create_table':\n// {\n// operation: \"create_table\" // Create a new table in an Airtable base,\n// ok: boolean // Whether the Airtable API call was successful,\n// table: { id: string // Table ID, name: string // Table name, description: string | undefined // Table description, primaryFieldId: string // ID of the primary field, fields: { id: string // Field ID, name: string // Field name, type: \"singleLineText\" | \"multilineText\" | \"richText\" | \"email\" | \"url\" | \"phoneNumber\" | \"number\" | \"percent\" | \"currency\" | \"rating\" | \"duration\" | \"singleSelect\" | \"multipleSelects\" | \"singleCollaborator\" | \"multipleCollaborators\" | \"date\" | \"dateTime\" | \"checkbox\" | \"multipleRecordLinks\" | \"multipleAttachments\" | \"barcode\" | \"button\" | \"formula\" | \"createdTime\" | \"lastModifiedTime\" | \"createdBy\" | \"lastModifiedBy\" | \"autoNumber\" | \"externalSyncSource\" | \"count\" | \"lookup\" | \"rollup\" // Field type }[] // Array of field definitions } | undefined // Created table object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Update Table example\nconst airtable_update_table = new AirtableBubble({\n operation: \"update_table\", // Update table properties like name and description\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n name: \"example string\", // New name for the table\n description: \"example string\", // New description for the table\n});\n\nconst result = await airtable_update_table.action();\n// outputSchema for result.data when operation === 'update_table':\n// {\n// operation: \"update_table\" // Update table properties like name and description,\n// ok: boolean // Whether the Airtable API call was successful,\n// table: { id: string // Table ID, name: string // Table name, description: string | undefined // Table description } | undefined // Updated table object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Create Field example\nconst airtable_create_field = new AirtableBubble({\n operation: \"create_field\", // Create a new field in an Airtable table\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n name: \"example string\", // Name for the new field\n type: \"singleLineText\" // options: \"singleLineText\", \"multilineText\", \"richText\", \"email\", \"url\", \"phoneNumber\", \"number\", \"percent\", \"currency\", \"rating\", \"duration\", \"singleSelect\", \"multipleSelects\", \"singleCollaborator\", \"multipleCollaborators\", \"date\", \"dateTime\", \"checkbox\", \"multipleRecordLinks\", \"multipleAttachments\", \"barcode\", \"button\", \"formula\", \"createdTime\", \"lastModifiedTime\", \"createdBy\", \"lastModifiedBy\", \"autoNumber\", \"externalSyncSource\", \"count\", \"lookup\", \"rollup\", // Field type\n description: \"example string\", // Field description\n options: {}, // Field-specific options\n});\n\nconst result = await airtable_create_field.action();\n// outputSchema for result.data when operation === 'create_field':\n// {\n// operation: \"create_field\" // Create a new field in an Airtable table,\n// ok: boolean // Whether the Airtable API call was successful,\n// field: { id: string // Field ID, name: string // Field name, type: string // Field type, description: string | undefined // Field description } | undefined // Created field object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Update Field example\nconst airtable_update_field = new AirtableBubble({\n operation: \"update_field\", // Update field properties like name, type, or description\n baseId: \"example string\", // Airtable base ID (e.g., appXXXXXXXXXXXXXX)\n tableIdOrName: \"example string\", // Table ID (e.g., tblXXXXXXXXXXXXXX) or table name\n fieldIdOrName: \"example string\", // Field ID (e.g., fldXXXXXXXXXXXXXX) or field name\n name: \"example string\", // New name for the field\n description: \"example string\", // New description for the field\n});\n\nconst result = await airtable_update_field.action();\n// outputSchema for result.data when operation === 'update_field':\n// {\n// operation: \"update_field\" // Update field properties like name, type, or description,\n// ok: boolean // Whether the Airtable API call was successful,\n// field: { id: string // Field ID, name: string // Field name, type: string // Field type, description: string | undefined // Field description } | undefined // Updated field object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`airtable failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
605
+ "requiredCredentials": [
606
+ "AIRTABLE_CRED"
607
+ ]
608
+ },
609
+ {
610
+ "name": "firecrawl",
611
+ "alias": "firecrawl",
612
+ "type": "service",
613
+ "shortDescription": "Firecrawl API integration for web crawl operations.",
614
+ "useCase": "- Add web knowledge to your RAG chatbots and AI assistants.",
615
+ "inputSchema": "Complex schema - see usage example for structure",
616
+ "outputSchema": "Complex schema - see usage example for structure",
617
+ "usageExample": "// Scrape example\nconst firecrawl_scrape = new FirecrawlBubble({\n maxRetries: 42, // Maximum number of retries for the scrape request\n backoffFactor: 42, // Backoff factor for retry delays\n formats: [\"markdown\"] // default, // Formats to scrape from the URL\n headers: { \"example_key\": \"example string\" }, // HTTP headers to include in the request\n includeTags: [\"example string\"], // HTML tags/classes/ids to include in the scrape\n excludeTags: [\"example string\"], // HTML tags/classes/ids to exclude from the scrape\n onlyMainContent: true // default, // Whether to extract only main content or full page content\n timeout: 30000 // default, // Max duration in milliseconds before aborting the request\n waitFor: 0 // default, // Milliseconds of extra wait time before scraping (use sparingly). This waiting time is in addition to Firecrawl’s smart wait feature.\n mobile: true, // Whether to emulate a mobile device\n parsers: [{ type: \"pdf\", maxPages: 42 // Maximum number of PDF pages to parse }], // Extract structured content from various document formats\n actions: [{ type: \"wait\", milliseconds: 42 // Time to wait in milliseconds (for wait), selector: \"example string\" // CSS selector to wait for (for wait) }], // Sequence of browser actions to perform before scraping\n location: { country: \"example string\" // Country code for proxy location, languages: [\"example string\"] // Preferred languages for proxy location }, // Location configuration for proxy location\n skipTlsVerification: true, // Whether to skip TLS certificate verification\n removeBase64Images: true, // Whether to remove base64-encoded images from the content\n fastMode: true, // Whether to enable fast mode for scraping\n useMock: \"example string\", // Use a mock response for testing purposes\n blockAds: true, // Whether to block ads during scraping\n proxy: \"example string\", // Type of proxy to use for scraping\n maxAge: 172800000 // default, // If a cached version of the page is newer than `maxAge` (in milliseconds), Firecrawl returns it instantly; otherwise it scrapes fresh and updates the cache. Set 0 to always fetch fresh.\n storeInCache: true, // Whether to store the scraped result in cache\n integration: \"example string\", // Integration identifier for the scrape request\n operation: \"scrape\", // Scrape a single URL\n url: \"example string\", // The URL to scrape content from\n});\n\nconst result = await firecrawl_scrape.action();\n// outputSchema for result.data when operation === 'scrape':\n// {\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// markdown: string | undefined // Document content in markdown format,\n// html: string | undefined // Document content in HTML format,\n// rawHtml: string | undefined // Document content in raw HTML format,\n// json: unknown | undefined // Document content in structured JSON format,\n// summary: string | undefined // Summary of the document content,\n// metadata: { title: string | undefined // Title of the document, description: string | undefined // Description of the document, url: string | undefined // URL of the document, language: unknown | undefined // Language of the document, keywords: unknown | undefined // Keywords associated with the document, robots: unknown | undefined // Robots meta tag content, ogTitle: string | undefined // Open Graph title, ogDescription: string | undefined // Open Graph description, ogUrl: string | undefined // Open Graph URL, ogImage: string | undefined // Open Graph image URL, ogAudio: string | undefined // Open Graph audio URL, ogDeterminer: string | undefined // Open Graph determiner, ogLocale: string | undefined // Open Graph locale, ogLocaleAlternate: string[] | undefined // Alternate Open Graph locales, ogSiteName: string | undefined // Open Graph site name, ogVideo: string | undefined // Open Graph video URL, favicon: string | undefined // Favicon URL, dcTermsCreated: string | undefined // Dublin Core terms created, dcDateCreated: string | undefined // Dublin Core date created, dcDate: string | undefined // Dublin Core date, dcTermsType: string | undefined // Dublin Core terms type, dcType: string | undefined // Dublin Core type, dcTermsAudience: string | undefined // Dublin Core terms audience, dcTermsSubject: string | undefined // Dublin Core terms subject, dcSubject: string | undefined // Dublin Core subject, dcDescription: string | undefined // Dublin Core description, dcTermsKeywords: string | undefined // Dublin Core terms keywords, modifiedTime: string | undefined // Last modified time, publishedTime: string | undefined // Published time, articleTag: string | undefined // Article tag, articleSection: string | undefined // Article section, sourceURL: string | undefined // Source URL, statusCode: number | undefined // HTTP status code, scrapeId: string | undefined // Scrape identifier, numPages: number | undefined // Number of pages scraped, contentType: string | undefined // Content type of the document, proxyUsed: \"basic\" | \"stealth\" | undefined // Type of proxy used, cacheState: \"hit\" | \"miss\" | undefined // Cache state, cachedAt: string | undefined // Cache timestamp, creditsUsed: number | undefined // Number of credits used, error: string | undefined // Error message if any } | undefined // Metadata associated with the document,\n// links: string[] | undefined // Array of links found in the document,\n// images: string[] | undefined // Array of image URLs found in the document,\n// screenshot: string | undefined // Base64-encoded screenshot of the document,\n// attributes: { selector: string // CSS selector for the element, attribute: string // Attribute name to extract, values: string[] // Extracted attribute values }[] | undefined // Array of extracted attributes from the document,\n// actions: Record<string, unknown> | undefined // Record of actions performed on the document,\n// warning: string | undefined // Warning message if any,\n// changeTracking: Record<string, unknown> | undefined // Change tracking information for the document,\n// branding: { colorScheme: \"light\" | \"dark\" | undefined // The detected color scheme (\"light\" or \"dark\"), logo: string | null | undefined // URL of the primary logo, fonts: { family: string // Font family name }[] | undefined // Array of font families used on the page, colors: { primary: string | undefined // Primary brand color, secondary: string | undefined // Secondary brand color, accent: string | undefined // Accent brand color, background: string | undefined // UI Background color, textPrimary: string | undefined // UI Primary text color, textSecondary: string | undefined // UI Secondary text color, link: string | undefined // Semantic Link color, success: string | undefined // Semantic Success color, warning: string | undefined // Semantic Warning color, error: string | undefined // Semantic Error color } | undefined // Object containing brand colors, typography: { fontFamilies: { primary: string | undefined // Primary font family, heading: string | undefined // Heading font family, code: string | undefined // Code font family } | undefined // Primary, heading, and code font families, fontStacks: { primary: string[] | undefined // Primary font stack array, heading: string[] | undefined // Heading font stack array, body: string[] | undefined // Body font stack array, paragraph: string[] | undefined // Paragraph font stack array } | undefined // Font stack arrays for primary, heading, body, and paragraph, fontSizes: { h1: string | undefined // H1 font size, h2: string | undefined // H2 font size, h3: string | undefined // H3 font size, body: string | undefined // Body font size, small: string | undefined // Small text font size } | undefined // Size definitions for headings and body text, lineHeights: { heading: number | undefined // Heading line height, body: number | undefined // Body text line height } | undefined // Line height values for different text types, fontWeights: { light: number | undefined // Light font weight, regular: number | undefined // Regular font weight, medium: number | undefined // Medium font weight, bold: number | undefined // Bold font weight } | undefined // Weight definitions (light, regular, medium, bold) } | undefined // Detailed typography information, spacing: { baseUnit: number | undefined // Base spacing unit in pixels, padding: Record<string, number> | undefined // Padding spacing values, margins: Record<string, number> | undefined // Margin spacing values, gridGutter: number | undefined // Grid gutter size in pixels, borderRadius: string | undefined // Default border radius } | undefined // Spacing and layout information, components: { buttonPrimary: { background: string | undefined // Button background color, textColor: string | undefined // Button text color, borderColor: string | undefined // Button border color, borderRadius: string | undefined // Button border radius } | undefined // Primary button styles, buttonSecondary: { background: string | undefined // Button background color, textColor: string | undefined // Button text color, borderColor: string | undefined // Button border color, borderRadius: string | undefined // Button border radius } | undefined // Secondary button styles, input: { borderColor: string | undefined // Input border color, focusBorderColor: string | undefined // Input focus border color, borderRadius: string | undefined // Input border radius } | undefined // Input field styles } | undefined // UI component styles, icons: { style: string | undefined // Icon style, primaryColor: string | undefined // Primary icon color } | undefined // Icon style information, images: { logo: string | null | undefined // Logo image URL, favicon: string | null | undefined // Favicon image URL, ogImage: string | null | undefined // Open Graph image URL } | undefined // Brand images (logo, favicon, og:image), animations: { transitionDuration: string | undefined // Transition duration for animations, easing: string | undefined // Easing function for animations } | undefined // Animation and transition settings, layout: { grid: { columns: number | undefined // Number of grid columns, maxWidth: string | undefined // Maximum grid width } | undefined // Grid layout configuration, headerHeight: string | undefined // Header height, footerHeight: string | undefined // Footer height } | undefined // Layout configuration (grid, header/footer heights), tone: { voice: string | undefined // Brand voice tone, emojiUsage: string | undefined // Emoji usage style } | undefined // Tone and voice characteristics, personality: { tone: \"professional\" | \"playful\" | \"modern\" | \"traditional\" | \"minimalist\" | \"bold\" // Brand tone, energy: \"low\" | \"medium\" | \"high\" // Brand energy level, targetAudience: string // Description of the target audience } | undefined // Brand personality traits (tone, energy, target audience) } | undefined // Branding profile associated with the document,\n// operation: \"scrape\" // Scrape a single URL\n// }\n\n\n// Search example\nconst firecrawl_search = new FirecrawlBubble({\n maxRetries: 42, // Maximum number of retries for the scrape request\n backoffFactor: 42, // Backoff factor for retry delays\n operation: \"search\", // Search the web and optionally scrape each result\n query: \"example string\", // The search query to execute\n sources: [{ type: \"web\" // options: \"web\", \"news\", \"images\" }], // Specialized result types to include in addition to regular web results\n categories: [{ type: \"github\" // options: \"github\", \"research\", \"pdf\" }], // Filter search results by specific categories\n limit: 42, // Maximum number of search results to return\n tbs: \"example string\", // Filter results by time (e.g., \"qdr:h\" for past hour, \"qdr:m\" for past month)\n location: \"example string\", // Geographical location to tailor search results\n ignoreInvalidURLs: true, // Whether to ignore invalid URLs in the search results\n timeout: 42, // Timeout in milliseconds for the search operation\n scrapeOptions: { formats: [\"markdown\"] // default // Formats to scrape from the URL, headers: { \"example_key\": \"example string\" } // HTTP headers to include in the request, includeTags: [\"example string\"] // HTML tags/classes/ids to include in the scrape, excludeTags: [\"example string\"] // HTML tags/classes/ids to exclude from the scrape, onlyMainContent: true // default // Whether to extract only main content or full page content, timeout: 30000 // default // Max duration in milliseconds before aborting the request, waitFor: 0 // default // Milliseconds of extra wait time before scraping (use sparingly). This waiting time is in addition to Firecrawl’s smart wait feature., mobile: true // Whether to emulate a mobile device, parsers: [{ type: \"pdf\", maxPages: 42 // Maximum number of PDF pages to parse }] // Extract structured content from various document formats, actions: [{ type: \"wait\", milliseconds: 42 // Time to wait in milliseconds (for wait), selector: \"example string\" // CSS selector to wait for (for wait) }] // Sequence of browser actions to perform before scraping, location: { country: \"example string\" // Country code for proxy location, languages: [\"example string\"] // Preferred languages for proxy location } // Location configuration for proxy location, skipTlsVerification: true // Whether to skip TLS certificate verification, removeBase64Images: true // Whether to remove base64-encoded images from the content, fastMode: true // Whether to enable fast mode for scraping, useMock: \"example string\" // Use a mock response for testing purposes, blockAds: true // Whether to block ads during scraping, proxy: \"example string\" // Type of proxy to use for scraping, maxAge: 172800000 // default // If a cached version of the page is newer than `maxAge` (in milliseconds), Firecrawl returns it instantly; otherwise it scrapes fresh and updates the cache. Set 0 to always fetch fresh., storeInCache: true // Whether to store the scraped result in cache, integration: \"example string\" // Integration identifier for the scrape request }, // Scrape options to apply to each search result\n integration: \"example string\", // Integration identifier for the search request\n});\n\nconst result = await firecrawl_search.action();\n// outputSchema for result.data when operation === 'search':\n// {\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// operation: \"search\" // Search the web and optionally scrape each result,\n// web: unknown[] | undefined // Web search results,\n// news: unknown[] | undefined // News search results,\n// images: unknown[] | undefined // Image search results,\n// other: unknown[] | undefined // Unknown mystery search results\n// }\n\n\n// Map example\nconst firecrawl_map = new FirecrawlBubble({\n maxRetries: 42, // Maximum number of retries for the scrape request\n backoffFactor: 42, // Backoff factor for retry delays\n operation: \"map\", // Map a site to discover URLs\n url: \"example string\", // The base URL of the site to map\n search: \"example string\", // Search for specific urls inside a website\n sitemap: \"only\" // options: \"only\", \"include\", \"skip\", // Sitemap handling strategy\n includeSubdomains: true, // Whether to include subdomains in the site map\n limit: 42, // Maximum number of URLs to discover\n timeout: 42, // Timeout in milliseconds for the mapping operation\n integration: \"example string\", // Integration identifier for the map request\n location: { country: \"example string\" // Country code for proxy location, languages: [\"example string\"] // Preferred languages for proxy location }, // Location configuration for proxy location\n});\n\nconst result = await firecrawl_map.action();\n// outputSchema for result.data when operation === 'map':\n// {\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// operation: \"map\" // Map a site to discover URLs,\n// links: { url: string // Discovered URL, title: string | undefined // Page title, description: string | undefined // Page description, category: string | undefined // URL category }[] // Discovered links\n// }\n\n\n// Crawl example\nconst firecrawl_crawl = new FirecrawlBubble({\n maxRetries: 42, // Maximum number of retries for the scrape request\n backoffFactor: 42, // Backoff factor for retry delays\n operation: \"crawl\", // Recursively search through a urls subdomains, and gather the content\n url: \"example string\", // The URL to crawl\n prompt: \"example string\", // Optional prompt to guide the crawl behavior\n excludePaths: [\"example string\"], // List of URL paths to exclude from the crawl\n includePaths: [\"example string\"], // List of URL paths to include in the crawl\n maxDiscoveryDepth: 42, // Maximum depth for link discovery during the crawl\n sitemap: \"skip\" // options: \"skip\", \"include\", // Sitemap handling strategy during the crawl\n ignoreQueryParameters: true, // Whether to ignore query parameters when crawling URLs\n limit: 42, // Maximum number of pages to crawl\n crawlEntireDomain: true, // Whether to crawl the entire domain including subdomains\n allowExternalLinks: true, // Whether to allow crawling external links\n allowSubdomains: true, // Whether to include subdomains in the crawl\n delay: 42, // Delay in milliseconds between requests during the crawl\n maxConcurrency: 42, // Maximum number of concurrent requests during the crawl\n webhook: { url: \"example string\" // Webhook URL to send crawl results to, headers: { \"example_key\": \"example string\" } // HTTP headers to include in the webhook request, metadata: { \"example_key\": \"example string\" } // Additional metadata to include in the webhook payload, events: [\"completed\" // options: \"completed\", \"failed\", \"page\", \"started\"] // Events that trigger the webhook }, // Webhook configuration for crawl events\n scrapeOptions: { formats: [\"markdown\"] // default // Formats to scrape from the URL, headers: { \"example_key\": \"example string\" } // HTTP headers to include in the request, includeTags: [\"example string\"] // HTML tags/classes/ids to include in the scrape, excludeTags: [\"example string\"] // HTML tags/classes/ids to exclude from the scrape, onlyMainContent: true // default // Whether to extract only main content or full page content, timeout: 30000 // default // Max duration in milliseconds before aborting the request, waitFor: 0 // default // Milliseconds of extra wait time before scraping (use sparingly). This waiting time is in addition to Firecrawl’s smart wait feature., mobile: true // Whether to emulate a mobile device, parsers: [{ type: \"pdf\", maxPages: 42 // Maximum number of PDF pages to parse }] // Extract structured content from various document formats, actions: [{ type: \"wait\", milliseconds: 42 // Time to wait in milliseconds (for wait), selector: \"example string\" // CSS selector to wait for (for wait) }] // Sequence of browser actions to perform before scraping, location: { country: \"example string\" // Country code for proxy location, languages: [\"example string\"] // Preferred languages for proxy location } // Location configuration for proxy location, skipTlsVerification: true // Whether to skip TLS certificate verification, removeBase64Images: true // Whether to remove base64-encoded images from the content, fastMode: true // Whether to enable fast mode for scraping, useMock: \"example string\" // Use a mock response for testing purposes, blockAds: true // Whether to block ads during scraping, proxy: \"example string\" // Type of proxy to use for scraping, maxAge: 172800000 // default // If a cached version of the page is newer than `maxAge` (in milliseconds), Firecrawl returns it instantly; otherwise it scrapes fresh and updates the cache. Set 0 to always fetch fresh., storeInCache: true // Whether to store the scraped result in cache, integration: \"example string\" // Integration identifier for the scrape request }, // Scrape options to apply to each crawled page\n zeroDataRetention: true, // Whether to retain zero data from the crawl\n integration: \"example string\", // Integration identifier for the crawl request\n pollInterval: 42, // Interval in milliseconds to poll for crawl status\n timeout: 42, // Timeout in milliseconds for the crawl operation\n});\n\nconst result = await firecrawl_crawl.action();\n// outputSchema for result.data when operation === 'crawl':\n// {\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// operation: \"crawl\" // Recursively search through a urls subdomains, and gather the content,\n// status: \"scraping\" | \"completed\" | \"failed\" | \"cancelled\" // Status of the crawl job,\n// total: number // Total number of pages to crawl,\n// completed: number // Number of pages crawled,\n// creditsUsed: number | undefined // Number of credits used,\n// expiresAt: string | undefined // Expiration time of the crawl job,\n// data: { markdown: string | undefined // Document content in markdown format, html: string | undefined // Document content in HTML format, rawHtml: string | undefined // Document content in raw HTML format, json: unknown | undefined // Document content in structured JSON format, summary: string | undefined // Summary of the document content, metadata: { title: string | undefined // Title of the document, description: string | undefined // Description of the document, url: string | undefined // URL of the document, language: unknown | undefined // Language of the document, keywords: unknown | undefined // Keywords associated with the document, robots: unknown | undefined // Robots meta tag content, ogTitle: string | undefined // Open Graph title, ogDescription: string | undefined // Open Graph description, ogUrl: string | undefined // Open Graph URL, ogImage: string | undefined // Open Graph image URL, ogAudio: string | undefined // Open Graph audio URL, ogDeterminer: string | undefined // Open Graph determiner, ogLocale: string | undefined // Open Graph locale, ogLocaleAlternate: string[] | undefined // Alternate Open Graph locales, ogSiteName: string | undefined // Open Graph site name, ogVideo: string | undefined // Open Graph video URL, favicon: string | undefined // Favicon URL, dcTermsCreated: string | undefined // Dublin Core terms created, dcDateCreated: string | undefined // Dublin Core date created, dcDate: string | undefined // Dublin Core date, dcTermsType: string | undefined // Dublin Core terms type, dcType: string | undefined // Dublin Core type, dcTermsAudience: string | undefined // Dublin Core terms audience, dcTermsSubject: string | undefined // Dublin Core terms subject, dcSubject: string | undefined // Dublin Core subject, dcDescription: string | undefined // Dublin Core description, dcTermsKeywords: string | undefined // Dublin Core terms keywords, modifiedTime: string | undefined // Last modified time, publishedTime: string | undefined // Published time, articleTag: string | undefined // Article tag, articleSection: string | undefined // Article section, sourceURL: string | undefined // Source URL, statusCode: number | undefined // HTTP status code, scrapeId: string | undefined // Scrape identifier, numPages: number | undefined // Number of pages scraped, contentType: string | undefined // Content type of the document, proxyUsed: \"basic\" | \"stealth\" | undefined // Type of proxy used, cacheState: \"hit\" | \"miss\" | undefined // Cache state, cachedAt: string | undefined // Cache timestamp, creditsUsed: number | undefined // Number of credits used, error: string | undefined // Error message if any } | undefined // Metadata associated with the document, links: string[] | undefined // Array of links found in the document, images: string[] | undefined // Array of image URLs found in the document, screenshot: string | undefined // Base64-encoded screenshot of the document, attributes: { selector: string // CSS selector for the element, attribute: string // Attribute name to extract, values: string[] // Extracted attribute values }[] | undefined // Array of extracted attributes from the document, actions: Record<string, unknown> | undefined // Record of actions performed on the document, warning: string | undefined // Warning message if any, changeTracking: Record<string, unknown> | undefined // Change tracking information for the document, branding: { colorScheme: \"light\" | \"dark\" | undefined // The detected color scheme (\"light\" or \"dark\"), logo: string | null | undefined // URL of the primary logo, fonts: { family: string // Font family name }[] | undefined // Array of font families used on the page, colors: { primary: string | undefined // Primary brand color, secondary: string | undefined // Secondary brand color, accent: string | undefined // Accent brand color, background: string | undefined // UI Background color, textPrimary: string | undefined // UI Primary text color, textSecondary: string | undefined // UI Secondary text color, link: string | undefined // Semantic Link color, success: string | undefined // Semantic Success color, warning: string | undefined // Semantic Warning color, error: string | undefined // Semantic Error color } | undefined // Object containing brand colors, typography: { fontFamilies: { primary: string | undefined // Primary font family, heading: string | undefined // Heading font family, code: string | undefined // Code font family } | undefined // Primary, heading, and code font families, fontStacks: { primary: string[] | undefined // Primary font stack array, heading: string[] | undefined // Heading font stack array, body: string[] | undefined // Body font stack array, paragraph: string[] | undefined // Paragraph font stack array } | undefined // Font stack arrays for primary, heading, body, and paragraph, fontSizes: { h1: string | undefined // H1 font size, h2: string | undefined // H2 font size, h3: string | undefined // H3 font size, body: string | undefined // Body font size, small: string | undefined // Small text font size } | undefined // Size definitions for headings and body text, lineHeights: { heading: number | undefined // Heading line height, body: number | undefined // Body text line height } | undefined // Line height values for different text types, fontWeights: { light: number | undefined // Light font weight, regular: number | undefined // Regular font weight, medium: number | undefined // Medium font weight, bold: number | undefined // Bold font weight } | undefined // Weight definitions (light, regular, medium, bold) } | undefined // Detailed typography information, spacing: { baseUnit: number | undefined // Base spacing unit in pixels, padding: Record<string, number> | undefined // Padding spacing values, margins: Record<string, number> | undefined // Margin spacing values, gridGutter: number | undefined // Grid gutter size in pixels, borderRadius: string | undefined // Default border radius } | undefined // Spacing and layout information, components: { buttonPrimary: { background: string | undefined // Button background color, textColor: string | undefined // Button text color, borderColor: string | undefined // Button border color, borderRadius: string | undefined // Button border radius } | undefined // Primary button styles, buttonSecondary: { background: string | undefined // Button background color, textColor: string | undefined // Button text color, borderColor: string | undefined // Button border color, borderRadius: string | undefined // Button border radius } | undefined // Secondary button styles, input: { borderColor: string | undefined // Input border color, focusBorderColor: string | undefined // Input focus border color, borderRadius: string | undefined // Input border radius } | undefined // Input field styles } | undefined // UI component styles, icons: { style: string | undefined // Icon style, primaryColor: string | undefined // Primary icon color } | undefined // Icon style information, images: { logo: string | null | undefined // Logo image URL, favicon: string | null | undefined // Favicon image URL, ogImage: string | null | undefined // Open Graph image URL } | undefined // Brand images (logo, favicon, og:image), animations: { transitionDuration: string | undefined // Transition duration for animations, easing: string | undefined // Easing function for animations } | undefined // Animation and transition settings, layout: { grid: { columns: number | undefined // Number of grid columns, maxWidth: string | undefined // Maximum grid width } | undefined // Grid layout configuration, headerHeight: string | undefined // Header height, footerHeight: string | undefined // Footer height } | undefined // Layout configuration (grid, header/footer heights), tone: { voice: string | undefined // Brand voice tone, emojiUsage: string | undefined // Emoji usage style } | undefined // Tone and voice characteristics, personality: { tone: \"professional\" | \"playful\" | \"modern\" | \"traditional\" | \"minimalist\" | \"bold\" // Brand tone, energy: \"low\" | \"medium\" | \"high\" // Brand energy level, targetAudience: string // Description of the target audience } | undefined // Brand personality traits (tone, energy, target audience) } | undefined // Branding profile associated with the document }[] // Crawled documents\n// }\n\n\n// Extract example\nconst firecrawl_extract = new FirecrawlBubble({\n maxRetries: 42, // Maximum number of retries for the scrape request\n backoffFactor: 42, // Backoff factor for retry delays\n operation: \"extract\", // Extract structured data from a URL\n urls: [\"example string\"], // Array of URLs to extract data from\n prompt: \"example string\", // Optional prompt to guide the extraction process\n schema: {}, // Optional schema to structure the extracted data\n systemPrompt: \"example string\", // Optional system prompt for the extraction AI agent\n allowExternalLinks: true, // Whether to allow extraction from external links found on the page\n enableWebSearch: true, // Whether to enable web search to supplement extraction\n showSources: true, // Whether to include source URLs in the extraction results\n scrapeOptions: { formats: [\"markdown\"] // default // Formats to scrape from the URL, headers: { \"example_key\": \"example string\" } // HTTP headers to include in the request, includeTags: [\"example string\"] // HTML tags/classes/ids to include in the scrape, excludeTags: [\"example string\"] // HTML tags/classes/ids to exclude from the scrape, onlyMainContent: true // default // Whether to extract only main content or full page content, timeout: 30000 // default // Max duration in milliseconds before aborting the request, waitFor: 0 // default // Milliseconds of extra wait time before scraping (use sparingly). This waiting time is in addition to Firecrawl’s smart wait feature., mobile: true // Whether to emulate a mobile device, parsers: [{ type: \"pdf\", maxPages: 42 // Maximum number of PDF pages to parse }] // Extract structured content from various document formats, actions: [{ type: \"wait\", milliseconds: 42 // Time to wait in milliseconds (for wait), selector: \"example string\" // CSS selector to wait for (for wait) }] // Sequence of browser actions to perform before scraping, location: { country: \"example string\" // Country code for proxy location, languages: [\"example string\"] // Preferred languages for proxy location } // Location configuration for proxy location, skipTlsVerification: true // Whether to skip TLS certificate verification, removeBase64Images: true // Whether to remove base64-encoded images from the content, fastMode: true // Whether to enable fast mode for scraping, useMock: \"example string\" // Use a mock response for testing purposes, blockAds: true // Whether to block ads during scraping, proxy: \"example string\" // Type of proxy to use for scraping, maxAge: 172800000 // default // If a cached version of the page is newer than `maxAge` (in milliseconds), Firecrawl returns it instantly; otherwise it scrapes fresh and updates the cache. Set 0 to always fetch fresh., storeInCache: true // Whether to store the scraped result in cache, integration: \"example string\" // Integration identifier for the scrape request }, // Optional scrape options to apply to the extraction process\n ignoreInvalidURLs: true, // Whether to ignore invalid URLs in the input list\n integration: \"example string\", // Integration identifier for the extraction process\n agent: { model: \"FIRE-1\" // AI model to use for extraction }, // Agent to use for the extraction process\n pollInterval: 42, // Interval in milliseconds to poll for extraction status\n timeout: 42, // Timeout in milliseconds for the extraction operation\n});\n\nconst result = await firecrawl_extract.action();\n// outputSchema for result.data when operation === 'extract':\n// {\n// success: boolean // Whether the operation succeeded,\n// error: string // Error message if operation failed,\n// operation: \"extract\" // Extract structured data from a URL,\n// id: string | undefined // Extraction job identifier,\n// status: \"processing\" | \"completed\" | \"failed\" | \"cancelled\" | undefined // Status of the extraction job,\n// data: unknown | undefined // Extracted structured data,\n// warning: string | undefined // Warning message if any,\n// sources: Record<string, unknown> | undefined // Extraction sources,\n// expiresAt: string | undefined // Expiration time of the extraction job\n// }\n\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`firecrawl failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
470
618
  "requiredCredentials": [
471
619
  "FIRECRAWL_API_KEY"
472
620
  ]
473
621
  },
474
622
  {
475
- "name": "bubbleflow-generator",
476
- "alias": "generate-flow",
477
- "type": "workflow",
478
- "shortDescription": "Generate BubbleFlow code from natural language",
623
+ "name": "insforge-db",
624
+ "alias": "insforge",
625
+ "type": "service",
626
+ "shortDescription": "InsForge is the backend built for AI-assisted development. Connect InsForge with any agent. Add authentication, database, storage, functions, and AI integrations to your app in seconds.",
479
627
  "useCase": "General purpose bubble for various workflow needs",
480
- "inputSchema": "{\n prompt: string // Natural language description of the desired BubbleFlow,\n credentials: Record<string, string> | undefined // Credentials for AI agent operations\n}",
481
- "outputSchema": "{\n generatedCode: string // The generated BubbleFlow TypeScript code,\n isValid: boolean // Whether the generated code is valid,\n success: boolean,\n error: string,\n flowId: number | undefined,\n toolCalls: unknown[] // The tool calls made by the AI agent,\n summary: string // High-level instructions for using the validated flow,\n inputsSchema: string // JSON Schema (string) representing the inputs of the flow,\n bubblesUsed: string[] // List of bubble names used in the generated flow,\n tokenUsage: { inputTokens: number, outputTokens: number, totalTokens: number, modelName: string | undefined } | undefined,\n bubbleCount: number | undefined,\n codeLength: number | undefined\n}",
482
- "usageExample": "// Example usage of bubbleflow-generator bubble\nconst bubbleflowGenerator = new BubbleflowGeneratorBubble({\n prompt: \"example string\", // Natural language description of the desired BubbleFlow,\n});\n\nconst result = await bubbleflowGenerator.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// generatedCode: string // The generated BubbleFlow TypeScript code,\n// isValid: boolean // Whether the generated code is valid,\n// success: boolean,\n// error: string,\n// flowId: number | undefined,\n// toolCalls: unknown[] // The tool calls made by the AI agent,\n// summary: string // High-level instructions for using the validated flow,\n// inputsSchema: string // JSON Schema (string) representing the inputs of the flow,\n// bubblesUsed: string[] // List of bubble names used in the generated flow,\n// tokenUsage: { inputTokens: number, outputTokens: number, totalTokens: number, modelName: string | undefined } | undefined,\n// bubbleCount: number | undefined,\n// codeLength: number | undefined\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
628
+ "inputSchema": "{\n query: string // SQL query to execute against the InsForge database,\n allowedOperations: \"SELECT\" | \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"CREATE\" | \"WITH\" | \"EXPLAIN\"[] // List of allowed SQL operations for security (defaults to read-only operations),\n parameters: unknown[] | undefined // Parameters for parameterized queries (e.g., [value1, value2] for $1, $2),\n timeout: number // Query timeout in milliseconds (default: 30 seconds),\n maxRows: number // Maximum number of rows to return (default: 1000),\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
629
+ "outputSchema": "{\n rows: Record<string, unknown>[] // Array of result rows,\n rowCount: number | null // Number of rows affected by the query,\n command: string // SQL command that was executed,\n executionTime: number // Query execution time in milliseconds,\n success: boolean // Whether the query executed successfully,\n error: string // Error message if query execution failed,\n cleanedJSONString: string // Clean JSON string representation of the row data\n}",
630
+ "usageExample": "// Example usage of insforge-db bubble\nconst insforgeDb = new InsForgeDbBubble({\n query: \"example string\", // SQL query to execute against the InsForge database,\n allowedOperations: [\"SELECT\",\"WITH\"] // default, // List of allowed SQL operations for security (defaults to read-only operations),\n parameters: [] // default, // Parameters for parameterized queries (e.g., [value1, value2] for $1, $2),\n timeout: 30000 // default, // Query timeout in milliseconds (default: 30 seconds),\n maxRows: 1000 // default, // Maximum number of rows to return (default: 1000),\n});\n\nconst result = await insforgeDb.action();\n\n// Always check success status before using data\nif (!result.success) {\n throw new Error(`${metadata.name} failed: ${result.error}`);\n}\n\n// outputSchema for result.data:\n// {\n// rows: Record<string, unknown>[] // Array of result rows,\n// rowCount: number | null // Number of rows affected by the query,\n// command: string // SQL command that was executed,\n// executionTime: number // Query execution time in milliseconds,\n// success: boolean // Whether the query executed successfully,\n// error: string // Error message if query execution failed,\n// cleanedJSONString: string // Clean JSON string representation of the row data\n// }\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
483
631
  "requiredCredentials": [
484
- "GOOGLE_GEMINI_CRED",
485
- "OPENROUTER_CRED"
632
+ "INSFORGE_BASE_URL",
633
+ "INSFORGE_API_KEY"
486
634
  ]
487
635
  }
488
636
  ]