@bubblelab/bubble-core 0.1.11 → 0.1.13

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 (143) hide show
  1. package/dist/bubble-bundle.d.ts +183 -117
  2. package/dist/bubble-factory.d.ts +2 -3
  3. package/dist/bubble-factory.d.ts.map +1 -1
  4. package/dist/bubble-factory.js +28 -96
  5. package/dist/bubble-factory.js.map +1 -1
  6. package/dist/bubbles/service-bubble/ai-agent.d.ts +14 -14
  7. package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -1
  8. package/dist/bubbles/service-bubble/ai-agent.js +3 -6
  9. package/dist/bubbles/service-bubble/ai-agent.js.map +1 -1
  10. package/dist/bubbles/service-bubble/apify/apify.d.ts +5 -5
  11. package/dist/bubbles/service-bubble/apify/apify.d.ts.map +1 -1
  12. package/dist/bubbles/service-bubble/apify/apify.js +20 -8
  13. package/dist/bubbles/service-bubble/apify/apify.js.map +1 -1
  14. package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts +542 -0
  15. package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts.map +1 -0
  16. package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.d.ts +37 -0
  17. package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.d.ts.map +1 -0
  18. package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.js +203 -0
  19. package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.js.map +1 -0
  20. package/dist/bubbles/service-bubble/browserbase/browserbase.js +593 -0
  21. package/dist/bubbles/service-bubble/browserbase/browserbase.js.map +1 -0
  22. package/dist/bubbles/service-bubble/browserbase/browserbase.schema.d.ts +518 -0
  23. package/dist/bubbles/service-bubble/browserbase/browserbase.schema.d.ts.map +1 -0
  24. package/dist/bubbles/service-bubble/browserbase/browserbase.schema.js +311 -0
  25. package/dist/bubbles/service-bubble/browserbase/browserbase.schema.js.map +1 -0
  26. package/dist/bubbles/service-bubble/browserbase/index.d.ts +3 -0
  27. package/dist/bubbles/service-bubble/browserbase/index.d.ts.map +1 -0
  28. package/dist/bubbles/service-bubble/browserbase/index.js +3 -0
  29. package/dist/bubbles/service-bubble/browserbase/index.js.map +1 -0
  30. package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts +1358 -0
  31. package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts.map +1 -0
  32. package/dist/bubbles/service-bubble/crustdata/crustdata.js +219 -0
  33. package/dist/bubbles/service-bubble/crustdata/crustdata.js.map +1 -0
  34. package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts +1604 -0
  35. package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts.map +1 -0
  36. package/dist/bubbles/service-bubble/crustdata/crustdata.schema.js +194 -0
  37. package/dist/bubbles/service-bubble/crustdata/crustdata.schema.js.map +1 -0
  38. package/dist/bubbles/service-bubble/crustdata/index.d.ts +3 -0
  39. package/dist/bubbles/service-bubble/crustdata/index.d.ts.map +1 -0
  40. package/dist/bubbles/service-bubble/crustdata/index.js +3 -0
  41. package/dist/bubbles/service-bubble/crustdata/index.js.map +1 -0
  42. package/dist/bubbles/service-bubble/firecrawl.d.ts +4 -4
  43. package/dist/bubbles/service-bubble/firecrawl.js +1 -1
  44. package/dist/bubbles/service-bubble/firecrawl.js.map +1 -1
  45. package/dist/bubbles/service-bubble/github.d.ts +0 -6
  46. package/dist/bubbles/service-bubble/github.d.ts.map +1 -1
  47. package/dist/bubbles/service-bubble/github.js +1 -7
  48. package/dist/bubbles/service-bubble/github.js.map +1 -1
  49. package/dist/bubbles/service-bubble/gmail.d.ts +84 -84
  50. package/dist/bubbles/service-bubble/google-drive.d.ts +32 -32
  51. package/dist/bubbles/service-bubble/http.d.ts +13 -1
  52. package/dist/bubbles/service-bubble/http.d.ts.map +1 -1
  53. package/dist/bubbles/service-bubble/http.integration.flow.d.ts +49 -0
  54. package/dist/bubbles/service-bubble/http.integration.flow.d.ts.map +1 -0
  55. package/dist/bubbles/service-bubble/http.integration.flow.js +425 -0
  56. package/dist/bubbles/service-bubble/http.integration.flow.js.map +1 -0
  57. package/dist/bubbles/service-bubble/http.js +40 -4
  58. package/dist/bubbles/service-bubble/http.js.map +1 -1
  59. package/dist/bubbles/service-bubble/resend.d.ts +4 -4
  60. package/dist/bubbles/service-bubble/slack.d.ts +978 -35
  61. package/dist/bubbles/service-bubble/slack.d.ts.map +1 -1
  62. package/dist/bubbles/service-bubble/slack.js +320 -26
  63. package/dist/bubbles/service-bubble/slack.js.map +1 -1
  64. package/dist/bubbles/service-bubble/storage.d.ts +1 -1
  65. package/dist/bubbles/service-bubble/storage.d.ts.map +1 -1
  66. package/dist/bubbles/service-bubble/storage.js +2 -2
  67. package/dist/bubbles/service-bubble/storage.js.map +1 -1
  68. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.d.ts +494 -0
  69. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.d.ts.map +1 -0
  70. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.d.ts +31 -0
  71. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.d.ts.map +1 -0
  72. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.js +100 -0
  73. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.js.map +1 -0
  74. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.js +1301 -0
  75. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.js.map +1 -0
  76. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.d.ts +473 -0
  77. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.d.ts.map +1 -0
  78. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.js +230 -0
  79. package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.js.map +1 -0
  80. package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.d.ts +3 -0
  81. package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.d.ts.map +1 -0
  82. package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.js +3 -0
  83. package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.js.map +1 -0
  84. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +8 -8
  85. package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts +740 -0
  86. package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts.map +1 -0
  87. package/dist/bubbles/tool-bubble/company-enrichment-tool.js +350 -0
  88. package/dist/bubbles/tool-bubble/company-enrichment-tool.js.map +1 -0
  89. package/dist/bubbles/tool-bubble/get-trigger-detail-tool.d.ts +146 -0
  90. package/dist/bubbles/tool-bubble/get-trigger-detail-tool.d.ts.map +1 -0
  91. package/dist/bubbles/tool-bubble/get-trigger-detail-tool.js +128 -0
  92. package/dist/bubbles/tool-bubble/get-trigger-detail-tool.js.map +1 -0
  93. package/dist/bubbles/tool-bubble/google-maps-tool.d.ts.map +1 -1
  94. package/dist/bubbles/tool-bubble/google-maps-tool.js +1 -0
  95. package/dist/bubbles/tool-bubble/google-maps-tool.js.map +1 -1
  96. package/dist/bubbles/tool-bubble/instagram-tool.d.ts.map +1 -1
  97. package/dist/bubbles/tool-bubble/instagram-tool.js +2 -0
  98. package/dist/bubbles/tool-bubble/instagram-tool.js.map +1 -1
  99. package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +6 -6
  100. package/dist/bubbles/tool-bubble/linkedin-tool.d.ts.map +1 -1
  101. package/dist/bubbles/tool-bubble/linkedin-tool.js +6 -4
  102. package/dist/bubbles/tool-bubble/linkedin-tool.js.map +1 -1
  103. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts.map +1 -1
  104. package/dist/bubbles/tool-bubble/research-agent-tool.js +6 -1
  105. package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -1
  106. package/dist/bubbles/tool-bubble/tiktok-tool.d.ts +8 -8
  107. package/dist/bubbles/tool-bubble/twitter-tool.d.ts +10 -10
  108. package/dist/bubbles/tool-bubble/twitter-tool.d.ts.map +1 -1
  109. package/dist/bubbles/tool-bubble/twitter-tool.js +3 -0
  110. package/dist/bubbles/tool-bubble/twitter-tool.js.map +1 -1
  111. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +6 -6
  112. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts.map +1 -1
  113. package/dist/bubbles/tool-bubble/web-scrape-tool.js +4 -1
  114. package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -1
  115. package/dist/bubbles/tool-bubble/youtube-tool.d.ts.map +1 -1
  116. package/dist/bubbles/tool-bubble/youtube-tool.js +3 -0
  117. package/dist/bubbles/tool-bubble/youtube-tool.js.map +1 -1
  118. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +24 -24
  119. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +8 -8
  120. package/dist/bubbles.json +64 -15
  121. package/dist/index.d.ts +3 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +3 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/logging/BubbleLogger.d.ts +10 -0
  126. package/dist/logging/BubbleLogger.d.ts.map +1 -1
  127. package/dist/logging/BubbleLogger.js +14 -0
  128. package/dist/logging/BubbleLogger.js.map +1 -1
  129. package/dist/logging/StreamingBubbleLogger.d.ts +8 -0
  130. package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -1
  131. package/dist/logging/StreamingBubbleLogger.js +29 -0
  132. package/dist/logging/StreamingBubbleLogger.js.map +1 -1
  133. package/dist/types/available-tools.d.ts +1 -1
  134. package/dist/types/available-tools.d.ts.map +1 -1
  135. package/dist/types/available-tools.js +7 -0
  136. package/dist/types/available-tools.js.map +1 -1
  137. package/dist/types/base-bubble-class.d.ts.map +1 -1
  138. package/dist/types/base-bubble-class.js +0 -8
  139. package/dist/types/base-bubble-class.js.map +1 -1
  140. package/dist/types/tool-bubble-class.d.ts.map +1 -1
  141. package/dist/types/tool-bubble-class.js +58 -8
  142. package/dist/types/tool-bubble-class.js.map +1 -1
  143. package/package.json +3 -2
package/dist/bubbles.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "generatedAt": "2025-12-29T14:51:21.270Z",
4
- "totalCount": 47,
3
+ "generatedAt": "2026-01-19T04:35:11.493Z",
4
+ "totalCount": 50,
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: { 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}",
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\" | \"get-trigger-detail-tool\" | \"bubbleflow-validation-tool\" | \"code-edit-tool\" | \"chart-js-tool\" | \"amazon-shopping-tool\" | \"linkedin-tool\" | \"tiktok-tool\" | \"twitter-tool\" | \"google-maps-tool\" | \"youtube-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
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);",
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: 64000 // 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\", \"get-trigger-detail-tool\", \"bubbleflow-validation-tool\", \"code-edit-tool\", \"chart-js-tool\", \"amazon-shopping-tool\", \"linkedin-tool\", \"tiktok-tool\", \"twitter-tool\", \"google-maps-tool\", \"youtube-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",
@@ -49,10 +49,10 @@
49
49
  "alias": "slack",
50
50
  "type": "service",
51
51
  "shortDescription": "Slack integration for messaging and workspace management",
52
- "useCase": "- Send messages to channels or direct messages",
52
+ "useCase": "General purpose bubble for various workflow needs",
53
53
  "inputSchema": "Complex schema - see usage example for structure",
54
54
  "outputSchema": "Complex schema - see usage example for structure",
55
- "usageExample": "// Send Message example\nconst slack_send_message = new SlackBubble({\n operation: \"send_message\", // Send a message to a Slack channel or DM\n channel: \"example string\", // Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM\n text: \"example string\", // Message text content\n username: \"example string\", // Override bot username for this message\n icon_emoji: \"example string\", // Override bot icon with emoji (e.g., :robot_face:)\n icon_url: \"example string\", // Override bot icon with custom image URL\n attachments: [{ color: \"example string\" // Color bar accent (hex color or good/warning/danger), pretext: \"example string\" // Text that appears before the main attachment content, author_name: \"example string\" // Author name displayed at the top, author_link: \"example string\" // URL to link the author name, author_icon: \"example string\" // Author icon image URL, title: \"example string\" // Attachment title text, title_link: \"example string\" // URL to link the title, text: \"example string\" // Main attachment text content, fields: [{ title: \"example string\" // Field title, value: \"example string\" // Field value, short: true // Whether field should be displayed side-by-side }] // Array of field objects for structured data, image_url: \"example string\" // URL of image to display, thumb_url: \"example string\" // URL of thumbnail image, footer: \"example string\" // Footer text, footer_icon: \"example string\" // Footer icon URL, ts: 42 // Timestamp for the attachment }], // Legacy message attachments\n blocks: [{ type: \"example string\" // Block element type (section, divider, button, etc.), text: { type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\" // Text formatting type, text: \"example string\" // The actual text content, emoji: true, verbatim: true } // Text object for the block element, elements: [{ type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\", \"image\" // Element type, text: \"example string\" // Text content, image_url: \"example string\" // Image URL for image elements, alt_text: \"example string\" // Alt text for image elements, emoji: true, verbatim: true }] // Elements array for context blocks }], // Block Kit structured message blocks\n thread_ts: \"example string\", // Timestamp of parent message to reply in thread\n reply_broadcast: false // default, // Broadcast thread reply to channel\n unfurl_links: true // default, // Enable automatic link unfurling\n unfurl_media: true // default, // Enable automatic media unfurling\n});\n\nconst result = await slack_send_message.action();\n// outputSchema for result.data when operation === 'send_message':\n// {\n// operation: \"send_message\" // Send a message to a Slack channel or DM,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: string | undefined // Channel ID where the message was sent,\n// ts: string | undefined // Timestamp of the sent message,\n// message: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message } | undefined // Details of the sent message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// List Channels example\nconst slack_list_channels = new SlackBubble({\n operation: \"list_channels\", // List all channels in the Slack workspace\n types: [\"public_channel\",\"private_channel\"] // default, // Types of channels to include in results\n exclude_archived: true // default, // Exclude archived channels from results\n limit: 50 // default, // Maximum number of channels to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n});\n\nconst result = await slack_list_channels.action();\n// outputSchema for result.data when operation === 'list_channels':\n// {\n// operation: \"list_channels\" // List all channels in the Slack workspace,\n// ok: boolean // Whether the Slack API call was successful,\n// channels: { id: string // Unique channel identifier, name: string // Channel name without # prefix, is_channel: boolean | undefined // True if this is a public channel, is_group: boolean | undefined // True if this is a private channel, is_im: boolean | undefined // True if this is a direct message, is_mpim: boolean | undefined // True if this is a multi-person direct message, is_private: boolean | undefined // True if this is a private channel, created: number // Unix timestamp when channel was created, is_archived: boolean // True if channel is archived, is_general: boolean | undefined // True if this is the #general channel, unlinked: number | undefined // Unix timestamp when channel was unlinked, name_normalized: string | undefined // Normalized channel name, is_shared: boolean | undefined // True if channel is shared with other workspaces, is_ext_shared: boolean | undefined // True if channel is shared externally, is_org_shared: boolean | undefined // True if channel is shared across organization, shared_team_ids: string[] | undefined // IDs of teams this channel is shared with, pending_shared: string[] | undefined // Pending shared connections, pending_connected_team_ids: string[] | undefined // Pending team connection IDs, is_pending_ext_shared: boolean | undefined // True if external sharing is pending, is_member: boolean | undefined // True if the bot is a member of this channel, is_open: boolean | undefined // True if the channel is open, topic: { value: string // Topic text, creator: string // User ID who set the topic, last_set: number // Unix timestamp when topic was last set } | undefined // Channel topic information, purpose: { value: string // Purpose text, creator: string // User ID who set the purpose, last_set: number // Unix timestamp when purpose was last set } | undefined // Channel purpose information, num_members: number | undefined // Number of members in the channel }[] | undefined // Array of channel objects,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Channel Info example\nconst slack_get_channel_info = new SlackBubble({\n operation: \"get_channel_info\", // Get detailed information about a specific channel\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general)\n include_locale: false // default, // Include locale information in the response\n});\n\nconst result = await slack_get_channel_info.action();\n// outputSchema for result.data when operation === 'get_channel_info':\n// {\n// operation: \"get_channel_info\" // Get detailed information about a specific channel,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: { id: string // Unique channel identifier, name: string // Channel name without # prefix, is_channel: boolean | undefined // True if this is a public channel, is_group: boolean | undefined // True if this is a private channel, is_im: boolean | undefined // True if this is a direct message, is_mpim: boolean | undefined // True if this is a multi-person direct message, is_private: boolean | undefined // True if this is a private channel, created: number // Unix timestamp when channel was created, is_archived: boolean // True if channel is archived, is_general: boolean | undefined // True if this is the #general channel, unlinked: number | undefined // Unix timestamp when channel was unlinked, name_normalized: string | undefined // Normalized channel name, is_shared: boolean | undefined // True if channel is shared with other workspaces, is_ext_shared: boolean | undefined // True if channel is shared externally, is_org_shared: boolean | undefined // True if channel is shared across organization, shared_team_ids: string[] | undefined // IDs of teams this channel is shared with, pending_shared: string[] | undefined // Pending shared connections, pending_connected_team_ids: string[] | undefined // Pending team connection IDs, is_pending_ext_shared: boolean | undefined // True if external sharing is pending, is_member: boolean | undefined // True if the bot is a member of this channel, is_open: boolean | undefined // True if the channel is open, topic: { value: string // Topic text, creator: string // User ID who set the topic, last_set: number // Unix timestamp when topic was last set } | undefined // Channel topic information, purpose: { value: string // Purpose text, creator: string // User ID who set the purpose, last_set: number // Unix timestamp when purpose was last set } | undefined // Channel purpose information, num_members: number | undefined // Number of members in the channel } | undefined // Channel information object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get User Info example\nconst slack_get_user_info = new SlackBubble({\n operation: \"get_user_info\", // Get detailed information about a specific user\n user: \"example string\", // User ID to get information about\n include_locale: false // default, // Include locale information in the response\n});\n\nconst result = await slack_get_user_info.action();\n// outputSchema for result.data when operation === 'get_user_info':\n// {\n// operation: \"get_user_info\" // Get detailed information about a specific user,\n// ok: boolean // Whether the Slack API call was successful,\n// user: { id: string // Unique user identifier, team_id: string | undefined // Team/workspace ID, name: string // Username (handle without @), deleted: boolean | undefined // True if user account is deleted, color: string | undefined // Color code for user in UI, real_name: string | undefined // Users real name, tz: string | undefined // Timezone identifier, tz_label: string | undefined // Human-readable timezone label, tz_offset: number | undefined // Timezone offset from UTC in seconds, profile: { title: string | undefined // Job title, phone: string | undefined // Phone number, skype: string | undefined // Skype username, real_name: string | undefined // Real name from profile, real_name_normalized: string | undefined // Normalized real name, display_name: string | undefined // Display name, display_name_normalized: string | undefined // Normalized display name, fields: Record<string, unknown> | undefined // Custom profile fields, status_text: string | undefined // Current status text, status_emoji: string | undefined // Current status emoji, status_expiration: number | undefined // Unix timestamp when status expires, avatar_hash: string | undefined // Hash for avatar image, image_original: string | undefined // URL of original avatar image, is_custom_image: boolean | undefined // True if using custom avatar, email: string | undefined // Email address, first_name: string | undefined // First name, last_name: string | undefined // Last name, image_24: string | undefined // 24x24 pixel avatar URL, image_32: string | undefined // 32x32 pixel avatar URL, image_48: string | undefined // 48x48 pixel avatar URL, image_72: string | undefined // 72x72 pixel avatar URL, image_192: string | undefined // 192x192 pixel avatar URL, image_512: string | undefined // 512x512 pixel avatar URL, image_1024: string | undefined // 1024x1024 pixel avatar URL } | undefined // User profile information, is_admin: boolean | undefined // True if user is workspace admin, is_owner: boolean | undefined // True if user is workspace owner, is_primary_owner: boolean | undefined // True if user is primary workspace owner, is_restricted: boolean | undefined // True if user is restricted (single-channel guest), is_ultra_restricted: boolean | undefined // True if user is ultra restricted (multi-channel guest), is_bot: boolean | undefined // True if this is a bot user, is_app_user: boolean | undefined // True if this is an app user, updated: number | undefined // Unix timestamp when user was last updated, has_2fa: boolean | undefined // True if user has two-factor authentication enabled } | undefined // User information object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// List Users example\nconst slack_list_users = new SlackBubble({\n operation: \"list_users\", // List all users in the Slack workspace\n limit: 50 // default, // Maximum number of users to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n include_locale: false // default, // Include locale information in the response\n});\n\nconst result = await slack_list_users.action();\n// outputSchema for result.data when operation === 'list_users':\n// {\n// operation: \"list_users\" // List all users in the Slack workspace,\n// ok: boolean // Whether the Slack API call was successful,\n// members: { id: string // Unique user identifier, team_id: string | undefined // Team/workspace ID, name: string // Username (handle without @), deleted: boolean | undefined // True if user account is deleted, color: string | undefined // Color code for user in UI, real_name: string | undefined // Users real name, tz: string | undefined // Timezone identifier, tz_label: string | undefined // Human-readable timezone label, tz_offset: number | undefined // Timezone offset from UTC in seconds, profile: { title: string | undefined // Job title, phone: string | undefined // Phone number, skype: string | undefined // Skype username, real_name: string | undefined // Real name from profile, real_name_normalized: string | undefined // Normalized real name, display_name: string | undefined // Display name, display_name_normalized: string | undefined // Normalized display name, fields: Record<string, unknown> | undefined // Custom profile fields, status_text: string | undefined // Current status text, status_emoji: string | undefined // Current status emoji, status_expiration: number | undefined // Unix timestamp when status expires, avatar_hash: string | undefined // Hash for avatar image, image_original: string | undefined // URL of original avatar image, is_custom_image: boolean | undefined // True if using custom avatar, email: string | undefined // Email address, first_name: string | undefined // First name, last_name: string | undefined // Last name, image_24: string | undefined // 24x24 pixel avatar URL, image_32: string | undefined // 32x32 pixel avatar URL, image_48: string | undefined // 48x48 pixel avatar URL, image_72: string | undefined // 72x72 pixel avatar URL, image_192: string | undefined // 192x192 pixel avatar URL, image_512: string | undefined // 512x512 pixel avatar URL, image_1024: string | undefined // 1024x1024 pixel avatar URL } | undefined // User profile information, is_admin: boolean | undefined // True if user is workspace admin, is_owner: boolean | undefined // True if user is workspace owner, is_primary_owner: boolean | undefined // True if user is primary workspace owner, is_restricted: boolean | undefined // True if user is restricted (single-channel guest), is_ultra_restricted: boolean | undefined // True if user is ultra restricted (multi-channel guest), is_bot: boolean | undefined // True if this is a bot user, is_app_user: boolean | undefined // True if this is an app user, updated: number | undefined // Unix timestamp when user was last updated, has_2fa: boolean | undefined // True if user has two-factor authentication enabled }[] | undefined // Array of user objects,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Conversation History example\nconst slack_get_conversation_history = new SlackBubble({\n operation: \"get_conversation_history\", // Retrieve message history from a channel or direct message\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general)\n latest: \"example string\", // End of time range of messages to include (timestamp)\n oldest: \"example string\", // Start of time range of messages to include (timestamp)\n inclusive: false // default, // Include messages with latest or oldest timestamps in results\n limit: 20 // default, // Maximum number of messages to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n});\n\nconst result = await slack_get_conversation_history.action();\n// outputSchema for result.data when operation === 'get_conversation_history':\n// {\n// operation: \"get_conversation_history\" // Retrieve message history from a channel or direct message,\n// ok: boolean // Whether the Slack API call was successful,\n// messages: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message }[] | undefined // Array of message objects,\n// has_more: boolean | undefined // Whether there are more messages to retrieve,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Thread Replies example\nconst slack_get_thread_replies = new SlackBubble({\n operation: \"get_thread_replies\", // Retrieve all replies to a thread in a channel\n channel: \"example string\", // Channel ID where the thread exists\n ts: \"example string\", // Timestamp of the parent message to get replies for\n latest: \"example string\", // End of time range of messages to include (timestamp)\n oldest: \"example string\", // Start of time range of messages to include (timestamp)\n inclusive: false // default, // Include messages with latest or oldest timestamps in results\n limit: 100 // default, // Maximum number of messages to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n});\n\nconst result = await slack_get_thread_replies.action();\n// outputSchema for result.data when operation === 'get_thread_replies':\n// {\n// operation: \"get_thread_replies\" // Retrieve all replies to a thread in a channel,\n// ok: boolean // Whether the Slack API call was successful,\n// messages: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message }[] | undefined // Array of message objects in the thread,\n// has_more: boolean | undefined // Whether there are more messages to retrieve,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Update Message example\nconst slack_update_message = new SlackBubble({\n operation: \"update_message\", // Update an existing message in a channel\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n ts: \"example string\", // Timestamp of the message to update\n text: \"example string\", // New text content for the message\n attachments: [{ color: \"example string\" // Color bar accent (hex color or good/warning/danger), pretext: \"example string\" // Text that appears before the main attachment content, author_name: \"example string\" // Author name displayed at the top, author_link: \"example string\" // URL to link the author name, author_icon: \"example string\" // Author icon image URL, title: \"example string\" // Attachment title text, title_link: \"example string\" // URL to link the title, text: \"example string\" // Main attachment text content, fields: [{ title: \"example string\" // Field title, value: \"example string\" // Field value, short: true // Whether field should be displayed side-by-side }] // Array of field objects for structured data, image_url: \"example string\" // URL of image to display, thumb_url: \"example string\" // URL of thumbnail image, footer: \"example string\" // Footer text, footer_icon: \"example string\" // Footer icon URL, ts: 42 // Timestamp for the attachment }], // New legacy message attachments\n blocks: [{ type: \"example string\" // Block element type (section, divider, button, etc.), text: { type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\" // Text formatting type, text: \"example string\" // The actual text content, emoji: true, verbatim: true } // Text object for the block element, elements: [{ type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\", \"image\" // Element type, text: \"example string\" // Text content, image_url: \"example string\" // Image URL for image elements, alt_text: \"example string\" // Alt text for image elements, emoji: true, verbatim: true }] // Elements array for context blocks }], // New Block Kit structured message blocks\n});\n\nconst result = await slack_update_message.action();\n// outputSchema for result.data when operation === 'update_message':\n// {\n// operation: \"update_message\" // Update an existing message in a channel,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: string | undefined // Channel ID where the message was updated,\n// ts: string | undefined // Timestamp of the updated message,\n// text: string | undefined // Updated text content of the message,\n// message: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message } | undefined // Details of the updated message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Delete Message example\nconst slack_delete_message = new SlackBubble({\n operation: \"delete_message\", // Delete a message from a channel\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n ts: \"example string\", // Timestamp of the message to delete\n});\n\nconst result = await slack_delete_message.action();\n// outputSchema for result.data when operation === 'delete_message':\n// {\n// operation: \"delete_message\" // Delete a message from a channel,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: string | undefined // Channel ID where the message was deleted,\n// ts: string | undefined // Timestamp of the deleted message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Add Reaction example\nconst slack_add_reaction = new SlackBubble({\n operation: \"add_reaction\", // Add an emoji reaction to a message\n name: \"example string\", // Emoji name without colons (e.g., thumbsup, heart)\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n timestamp: \"example string\", // Timestamp of the message to react to\n});\n\nconst result = await slack_add_reaction.action();\n// outputSchema for result.data when operation === 'add_reaction':\n// {\n// operation: \"add_reaction\" // Add an emoji reaction to a message,\n// ok: boolean // Whether the Slack API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Remove Reaction example\nconst slack_remove_reaction = new SlackBubble({\n operation: \"remove_reaction\", // Remove an emoji reaction from a message\n name: \"example string\", // Emoji name without colons (e.g., thumbsup, heart)\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n timestamp: \"example string\", // Timestamp of the message to remove reaction from\n});\n\nconst result = await slack_remove_reaction.action();\n// outputSchema for result.data when operation === 'remove_reaction':\n// {\n// operation: \"remove_reaction\" // Remove an emoji reaction from a message,\n// ok: boolean // Whether the Slack API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Upload File example\nconst slack_upload_file = new SlackBubble({\n operation: \"upload_file\", // Upload a file to a Slack channel\n channel: \"example string\", // Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM\n file_path: \"example string\", // Local file path to upload\n filename: \"example string\", // Override filename for the upload\n title: \"example string\", // Title for the file\n initial_comment: \"example string\", // Initial comment to post with the file\n thread_ts: \"example string\", // Timestamp of parent message to upload file in thread\n});\n\nconst result = await slack_upload_file.action();\n// outputSchema for result.data when operation === 'upload_file':\n// {\n// operation: \"upload_file\" // Upload a file to a Slack channel,\n// ok: boolean // Whether the Slack API call was successful,\n// file: { id: string // Unique file identifier, created: number // Unix timestamp when file was created, timestamp: number // Unix timestamp when file was uploaded, name: string // Original filename, title: string | undefined // File title, mimetype: string // MIME type of the file, filetype: string // File type extension, pretty_type: string // Human-readable file type, user: string // User ID who uploaded the file, editable: boolean // Whether the file is editable, size: number // File size in bytes, mode: string // File sharing mode, is_external: boolean // Whether file is from external source, external_type: string // External file type if applicable, is_public: boolean // Whether file is publicly accessible, public_url_shared: boolean // Whether public URL is shared, display_as_bot: boolean // Whether file is displayed as uploaded by bot, username: string // Username of uploader, url_private: string // Private URL to access file, url_private_download: string // Private download URL, permalink: string // Permanent link to file, permalink_public: string | undefined // Public permanent link, shares: { public: Record<string, { reply_users: string[] // User IDs who replied, reply_users_count: number // Number of unique users who replied, reply_count: number // Total number of replies, ts: string // Timestamp of the share, channel_name: string // Name of the channel, team_id: string // Team ID }[]> | undefined // Public channel shares, private: Record<string, { reply_users: string[] // User IDs who replied, reply_users_count: number // Number of unique users who replied, reply_count: number // Total number of replies, ts: string // Timestamp of the share, channel_name: string // Name of the channel, team_id: string // Team ID }[]> | undefined // Private channel shares } | undefined // Information about where file is shared, channels: string[] | undefined // Channel IDs where file is shared, groups: string[] | undefined // Private group IDs where file is shared, ims: string[] | undefined // Direct message IDs where file is shared, has_rich_preview: boolean | undefined // Whether file has rich preview } | undefined // File 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(`slack failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
55
+ "usageExample": "// Send Message example\nconst slack_send_message = new SlackBubble({\n operation: \"send_message\", // Send a message to a Slack channel or DM. Required scopes: chat:write (add chat:write.public for public channels bot has not joined, add im:write to send DMs to users)\n channel: \"example string\", // Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM (e.g., U1234567890 - requires im:write scope)\n text: \"example string\", // Message text content\n username: \"example string\", // Override bot username for this message\n icon_emoji: \"example string\", // Override bot icon with emoji (e.g., :robot_face:)\n icon_url: \"example string\", // Override bot icon with custom image URL\n attachments: [{ color: \"example string\" // Color bar accent (hex color or good/warning/danger), pretext: \"example string\" // Text that appears before the main attachment content, author_name: \"example string\" // Author name displayed at the top, author_link: \"example string\" // URL to link the author name, author_icon: \"example string\" // Author icon image URL, title: \"example string\" // Attachment title text, title_link: \"example string\" // URL to link the title, text: \"example string\" // Main attachment text content, fields: [{ title: \"example string\" // Field title, value: \"example string\" // Field value, short: true // Whether field should be displayed side-by-side }] // Array of field objects for structured data, image_url: \"example string\" // URL of image to display, thumb_url: \"example string\" // URL of thumbnail image, footer: \"example string\" // Footer text, footer_icon: \"example string\" // Footer icon URL, ts: 42 // Timestamp for the attachment }], // Legacy message attachments\n blocks: [{ type: \"example string\" // Block element type (section, divider, button, etc.), text: { type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\" // Text formatting type, text: \"example string\" // The actual text content, emoji: true, verbatim: true } // Text object for the block element, elements: [{ type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\", \"image\" // Element type, text: \"example string\" // Text content, image_url: \"example string\" // Image URL for image elements, alt_text: \"example string\" // Alt text for image elements, emoji: true, verbatim: true }] // Elements array for context blocks }], // Block Kit structured message blocks\n thread_ts: \"example string\", // Timestamp of parent message to reply in thread\n reply_broadcast: false // default, // Broadcast thread reply to channel\n unfurl_links: true // default, // Enable automatic link unfurling\n unfurl_media: true // default, // Enable automatic media unfurling\n});\n\nconst result = await slack_send_message.action();\n// outputSchema for result.data when operation === 'send_message':\n// {\n// operation: \"send_message\" // Send a message to a Slack channel or DM,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: string | undefined // Channel ID where the message was sent,\n// ts: string | undefined // Timestamp of the sent message,\n// message: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message } | undefined // Details of the sent message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// List Channels example\nconst slack_list_channels = new SlackBubble({\n operation: \"list_channels\", // List all channels in the Slack workspace. Required scopes: channels:read (public), groups:read (private), im:read (DMs), mpim:read (group DMs)\n types: [\"public_channel\",\"private_channel\"] // default, // Types of channels to include in results\n exclude_archived: true // default, // Exclude archived channels from results\n limit: 50 // default, // Maximum number of channels to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n});\n\nconst result = await slack_list_channels.action();\n// outputSchema for result.data when operation === 'list_channels':\n// {\n// operation: \"list_channels\" // List all channels in the Slack workspace,\n// ok: boolean // Whether the Slack API call was successful,\n// channels: { id: string // Unique channel identifier, name: string // Channel name without # prefix, is_channel: boolean | undefined // True if this is a public channel, is_group: boolean | undefined // True if this is a private channel, is_im: boolean | undefined // True if this is a direct message, is_mpim: boolean | undefined // True if this is a multi-person direct message, is_private: boolean | undefined // True if this is a private channel, created: number // Unix timestamp when channel was created, is_archived: boolean // True if channel is archived, is_general: boolean | undefined // True if this is the #general channel, unlinked: number | undefined // Unix timestamp when channel was unlinked, name_normalized: string | undefined // Normalized channel name, is_shared: boolean | undefined // True if channel is shared with other workspaces, is_ext_shared: boolean | undefined // True if channel is shared externally, is_org_shared: boolean | undefined // True if channel is shared across organization, shared_team_ids: string[] | undefined // IDs of teams this channel is shared with, pending_shared: string[] | undefined // Pending shared connections, pending_connected_team_ids: string[] | undefined // Pending team connection IDs, is_pending_ext_shared: boolean | undefined // True if external sharing is pending, is_member: boolean | undefined // True if the bot is a member of this channel, is_open: boolean | undefined // True if the channel is open, topic: { value: string // Topic text, creator: string // User ID who set the topic, last_set: number // Unix timestamp when topic was last set } | undefined // Channel topic information, purpose: { value: string // Purpose text, creator: string // User ID who set the purpose, last_set: number // Unix timestamp when purpose was last set } | undefined // Channel purpose information, num_members: number | undefined // Number of members in the channel }[] | undefined // Array of channel objects,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Channel Info example\nconst slack_get_channel_info = new SlackBubble({\n operation: \"get_channel_info\", // Get detailed information about a specific channel. Required scopes: channels:read (public), groups:read (private), im:read (DMs), mpim:read (group DMs)\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general)\n include_locale: false // default, // Include locale information in the response\n});\n\nconst result = await slack_get_channel_info.action();\n// outputSchema for result.data when operation === 'get_channel_info':\n// {\n// operation: \"get_channel_info\" // Get detailed information about a specific channel,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: { id: string // Unique channel identifier, name: string // Channel name without # prefix, is_channel: boolean | undefined // True if this is a public channel, is_group: boolean | undefined // True if this is a private channel, is_im: boolean | undefined // True if this is a direct message, is_mpim: boolean | undefined // True if this is a multi-person direct message, is_private: boolean | undefined // True if this is a private channel, created: number // Unix timestamp when channel was created, is_archived: boolean // True if channel is archived, is_general: boolean | undefined // True if this is the #general channel, unlinked: number | undefined // Unix timestamp when channel was unlinked, name_normalized: string | undefined // Normalized channel name, is_shared: boolean | undefined // True if channel is shared with other workspaces, is_ext_shared: boolean | undefined // True if channel is shared externally, is_org_shared: boolean | undefined // True if channel is shared across organization, shared_team_ids: string[] | undefined // IDs of teams this channel is shared with, pending_shared: string[] | undefined // Pending shared connections, pending_connected_team_ids: string[] | undefined // Pending team connection IDs, is_pending_ext_shared: boolean | undefined // True if external sharing is pending, is_member: boolean | undefined // True if the bot is a member of this channel, is_open: boolean | undefined // True if the channel is open, topic: { value: string // Topic text, creator: string // User ID who set the topic, last_set: number // Unix timestamp when topic was last set } | undefined // Channel topic information, purpose: { value: string // Purpose text, creator: string // User ID who set the purpose, last_set: number // Unix timestamp when purpose was last set } | undefined // Channel purpose information, num_members: number | undefined // Number of members in the channel } | undefined // Channel information object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get User Info example\nconst slack_get_user_info = new SlackBubble({\n operation: \"get_user_info\", // Get detailed information about a specific user. Required scopes: users:read (add users:read.email to access email field)\n user: \"example string\", // User ID to get information about\n include_locale: false // default, // Include locale information in the response\n});\n\nconst result = await slack_get_user_info.action();\n// outputSchema for result.data when operation === 'get_user_info':\n// {\n// operation: \"get_user_info\" // Get detailed information about a specific user,\n// ok: boolean // Whether the Slack API call was successful,\n// user: { id: string // Unique user identifier, team_id: string | undefined // Team/workspace ID, name: string // Username (handle without @), deleted: boolean | undefined // True if user account is deleted, color: string | undefined // Color code for user in UI, real_name: string | undefined // Users real name, tz: string | undefined // Timezone identifier, tz_label: string | undefined // Human-readable timezone label, tz_offset: number | undefined // Timezone offset from UTC in seconds, profile: { title: string | undefined // Job title, phone: string | undefined // Phone number, skype: string | undefined // Skype username, real_name: string | undefined // Real name from profile, real_name_normalized: string | undefined // Normalized real name, display_name: string | undefined // Display name, display_name_normalized: string | undefined // Normalized display name, fields: Record<string, unknown> | undefined // Custom profile fields, status_text: string | undefined // Current status text, status_emoji: string | undefined // Current status emoji, status_expiration: number | undefined // Unix timestamp when status expires, avatar_hash: string | undefined // Hash for avatar image, image_original: string | undefined // URL of original avatar image, is_custom_image: boolean | undefined // True if using custom avatar, email: string | undefined // Email address, first_name: string | undefined // First name, last_name: string | undefined // Last name, image_24: string | undefined // 24x24 pixel avatar URL, image_32: string | undefined // 32x32 pixel avatar URL, image_48: string | undefined // 48x48 pixel avatar URL, image_72: string | undefined // 72x72 pixel avatar URL, image_192: string | undefined // 192x192 pixel avatar URL, image_512: string | undefined // 512x512 pixel avatar URL, image_1024: string | undefined // 1024x1024 pixel avatar URL } | undefined // User profile information, is_admin: boolean | undefined // True if user is workspace admin, is_owner: boolean | undefined // True if user is workspace owner, is_primary_owner: boolean | undefined // True if user is primary workspace owner, is_restricted: boolean | undefined // True if user is restricted (single-channel guest), is_ultra_restricted: boolean | undefined // True if user is ultra restricted (multi-channel guest), is_bot: boolean | undefined // True if this is a bot user, is_app_user: boolean | undefined // True if this is an app user, updated: number | undefined // Unix timestamp when user was last updated, has_2fa: boolean | undefined // True if user has two-factor authentication enabled } | undefined // User information object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// List Users example\nconst slack_list_users = new SlackBubble({\n operation: \"list_users\", // List all users in the Slack workspace. Required scopes: users:read (add users:read.email to access email field)\n limit: 50 // default, // Maximum number of users to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n include_locale: false // default, // Include locale information in the response\n});\n\nconst result = await slack_list_users.action();\n// outputSchema for result.data when operation === 'list_users':\n// {\n// operation: \"list_users\" // List all users in the Slack workspace,\n// ok: boolean // Whether the Slack API call was successful,\n// members: { id: string // Unique user identifier, team_id: string | undefined // Team/workspace ID, name: string // Username (handle without @), deleted: boolean | undefined // True if user account is deleted, color: string | undefined // Color code for user in UI, real_name: string | undefined // Users real name, tz: string | undefined // Timezone identifier, tz_label: string | undefined // Human-readable timezone label, tz_offset: number | undefined // Timezone offset from UTC in seconds, profile: { title: string | undefined // Job title, phone: string | undefined // Phone number, skype: string | undefined // Skype username, real_name: string | undefined // Real name from profile, real_name_normalized: string | undefined // Normalized real name, display_name: string | undefined // Display name, display_name_normalized: string | undefined // Normalized display name, fields: Record<string, unknown> | undefined // Custom profile fields, status_text: string | undefined // Current status text, status_emoji: string | undefined // Current status emoji, status_expiration: number | undefined // Unix timestamp when status expires, avatar_hash: string | undefined // Hash for avatar image, image_original: string | undefined // URL of original avatar image, is_custom_image: boolean | undefined // True if using custom avatar, email: string | undefined // Email address, first_name: string | undefined // First name, last_name: string | undefined // Last name, image_24: string | undefined // 24x24 pixel avatar URL, image_32: string | undefined // 32x32 pixel avatar URL, image_48: string | undefined // 48x48 pixel avatar URL, image_72: string | undefined // 72x72 pixel avatar URL, image_192: string | undefined // 192x192 pixel avatar URL, image_512: string | undefined // 512x512 pixel avatar URL, image_1024: string | undefined // 1024x1024 pixel avatar URL } | undefined // User profile information, is_admin: boolean | undefined // True if user is workspace admin, is_owner: boolean | undefined // True if user is workspace owner, is_primary_owner: boolean | undefined // True if user is primary workspace owner, is_restricted: boolean | undefined // True if user is restricted (single-channel guest), is_ultra_restricted: boolean | undefined // True if user is ultra restricted (multi-channel guest), is_bot: boolean | undefined // True if this is a bot user, is_app_user: boolean | undefined // True if this is an app user, updated: number | undefined // Unix timestamp when user was last updated, has_2fa: boolean | undefined // True if user has two-factor authentication enabled }[] | undefined // Array of user objects,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Conversation History example\nconst slack_get_conversation_history = new SlackBubble({\n operation: \"get_conversation_history\", // Retrieve message history from a channel or direct message. Required scopes: channels:history (public), groups:history (private), im:history (DMs), mpim:history (group DMs)\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general)\n latest: \"example string\", // End of time range of messages to include (timestamp)\n oldest: \"example string\", // Start of time range of messages to include (timestamp)\n inclusive: false // default, // Include messages with latest or oldest timestamps in results\n limit: 20 // default, // Maximum number of messages to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n});\n\nconst result = await slack_get_conversation_history.action();\n// outputSchema for result.data when operation === 'get_conversation_history':\n// {\n// operation: \"get_conversation_history\" // Retrieve message history from a channel or direct message,\n// ok: boolean // Whether the Slack API call was successful,\n// messages: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message }[] | undefined // Array of message objects,\n// has_more: boolean | undefined // Whether there are more messages to retrieve,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Get Thread Replies example\nconst slack_get_thread_replies = new SlackBubble({\n operation: \"get_thread_replies\", // Retrieve all replies to a thread in a channel. Required scopes: channels:history (public), groups:history (private), im:history (DMs), mpim:history (group DMs)\n channel: \"example string\", // Channel ID where the thread exists\n ts: \"example string\", // Timestamp of the parent message to get replies for\n latest: \"example string\", // End of time range of messages to include (timestamp)\n oldest: \"example string\", // Start of time range of messages to include (timestamp)\n inclusive: false // default, // Include messages with latest or oldest timestamps in results\n limit: 100 // default, // Maximum number of messages to return (1-1000)\n cursor: \"example string\", // Cursor for pagination to get next set of results\n});\n\nconst result = await slack_get_thread_replies.action();\n// outputSchema for result.data when operation === 'get_thread_replies':\n// {\n// operation: \"get_thread_replies\" // Retrieve all replies to a thread in a channel,\n// ok: boolean // Whether the Slack API call was successful,\n// messages: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message }[] | undefined // Array of message objects in the thread,\n// has_more: boolean | undefined // Whether there are more messages to retrieve,\n// response_metadata: { next_cursor: string // Cursor for pagination to get next set of results } | undefined // Metadata for pagination,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Update Message example\nconst slack_update_message = new SlackBubble({\n operation: \"update_message\", // Update an existing message in a channel. Required scopes: chat:write\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n ts: \"example string\", // Timestamp of the message to update\n text: \"example string\", // New text content for the message\n attachments: [{ color: \"example string\" // Color bar accent (hex color or good/warning/danger), pretext: \"example string\" // Text that appears before the main attachment content, author_name: \"example string\" // Author name displayed at the top, author_link: \"example string\" // URL to link the author name, author_icon: \"example string\" // Author icon image URL, title: \"example string\" // Attachment title text, title_link: \"example string\" // URL to link the title, text: \"example string\" // Main attachment text content, fields: [{ title: \"example string\" // Field title, value: \"example string\" // Field value, short: true // Whether field should be displayed side-by-side }] // Array of field objects for structured data, image_url: \"example string\" // URL of image to display, thumb_url: \"example string\" // URL of thumbnail image, footer: \"example string\" // Footer text, footer_icon: \"example string\" // Footer icon URL, ts: 42 // Timestamp for the attachment }], // New legacy message attachments\n blocks: [{ type: \"example string\" // Block element type (section, divider, button, etc.), text: { type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\" // Text formatting type, text: \"example string\" // The actual text content, emoji: true, verbatim: true } // Text object for the block element, elements: [{ type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\", \"image\" // Element type, text: \"example string\" // Text content, image_url: \"example string\" // Image URL for image elements, alt_text: \"example string\" // Alt text for image elements, emoji: true, verbatim: true }] // Elements array for context blocks }], // New Block Kit structured message blocks\n});\n\nconst result = await slack_update_message.action();\n// outputSchema for result.data when operation === 'update_message':\n// {\n// operation: \"update_message\" // Update an existing message in a channel,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: string | undefined // Channel ID where the message was updated,\n// ts: string | undefined // Timestamp of the updated message,\n// text: string | undefined // Updated text content of the message,\n// message: { type: string // Message type (usually \"message\"), ts: string // Message timestamp (unique identifier), user: string | undefined // User ID who sent the message, bot_id: string | undefined // Bot ID if message was sent by a bot, bot_profile: { name: string | undefined // Bot display name } | undefined // Bot profile information if message was sent by a bot, username: string | undefined // Username of the bot or user who sent the message, text: string | undefined // Message text content, thread_ts: string | undefined // Timestamp of parent message if this is a thread reply, parent_user_id: string | undefined // User ID of thread parent message author, reply_count: number | undefined // Number of replies in this thread, reply_users_count: number | undefined // Number of unique users who replied in thread, latest_reply: string | undefined // Timestamp of most recent reply in thread, reply_users: string[] | undefined // Array of user IDs who replied in thread, is_locked: boolean | undefined // True if thread is locked, subscribed: boolean | undefined // True if current user is subscribed to thread, attachments: unknown[] | undefined // Legacy message attachments, blocks: unknown[] | undefined // Block Kit structured content, reactions: { name: string // Emoji name without colons, users: string[] // User IDs who reacted with this emoji, count: number // Total count of this reaction }[] | undefined // Array of emoji reactions on this message } | undefined // Details of the updated message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Delete Message example\nconst slack_delete_message = new SlackBubble({\n operation: \"delete_message\", // Delete a message from a channel. Required scopes: chat:write. Note: Bot tokens can only delete messages posted by the bot; user tokens can delete any message the user has permission to delete\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n ts: \"example string\", // Timestamp of the message to delete\n});\n\nconst result = await slack_delete_message.action();\n// outputSchema for result.data when operation === 'delete_message':\n// {\n// operation: \"delete_message\" // Delete a message from a channel,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: string | undefined // Channel ID where the message was deleted,\n// ts: string | undefined // Timestamp of the deleted message,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Add Reaction example\nconst slack_add_reaction = new SlackBubble({\n operation: \"add_reaction\", // Add an emoji reaction to a message. Required scopes: reactions:write\n name: \"example string\", // Emoji name without colons (e.g., thumbsup, heart)\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n timestamp: \"example string\", // Timestamp of the message to react to\n});\n\nconst result = await slack_add_reaction.action();\n// outputSchema for result.data when operation === 'add_reaction':\n// {\n// operation: \"add_reaction\" // Add an emoji reaction to a message,\n// ok: boolean // Whether the Slack API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Remove Reaction example\nconst slack_remove_reaction = new SlackBubble({\n operation: \"remove_reaction\", // Remove an emoji reaction from a message. Required scopes: reactions:write\n name: \"example string\", // Emoji name without colons (e.g., thumbsup, heart)\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) where the message is located\n timestamp: \"example string\", // Timestamp of the message to remove reaction from\n});\n\nconst result = await slack_remove_reaction.action();\n// outputSchema for result.data when operation === 'remove_reaction':\n// {\n// operation: \"remove_reaction\" // Remove an emoji reaction from a message,\n// ok: boolean // Whether the Slack API call was successful,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Join Channel example\nconst slack_join_channel = new SlackBubble({\n operation: \"join_channel\", // Join a public Slack channel. Required scopes: channels:join (bot token) or channels:write (user token)\n channel: \"example string\", // Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) to join\n});\n\nconst result = await slack_join_channel.action();\n// outputSchema for result.data when operation === 'join_channel':\n// {\n// operation: \"join_channel\" // Join a public Slack channel,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: { id: string // Unique channel identifier, name: string // Channel name without # prefix, is_channel: boolean | undefined // True if this is a public channel, is_group: boolean | undefined // True if this is a private channel, is_im: boolean | undefined // True if this is a direct message, is_mpim: boolean | undefined // True if this is a multi-person direct message, is_private: boolean | undefined // True if this is a private channel, created: number // Unix timestamp when channel was created, is_archived: boolean // True if channel is archived, is_general: boolean | undefined // True if this is the #general channel, unlinked: number | undefined // Unix timestamp when channel was unlinked, name_normalized: string | undefined // Normalized channel name, is_shared: boolean | undefined // True if channel is shared with other workspaces, is_ext_shared: boolean | undefined // True if channel is shared externally, is_org_shared: boolean | undefined // True if channel is shared across organization, shared_team_ids: string[] | undefined // IDs of teams this channel is shared with, pending_shared: string[] | undefined // Pending shared connections, pending_connected_team_ids: string[] | undefined // Pending team connection IDs, is_pending_ext_shared: boolean | undefined // True if external sharing is pending, is_member: boolean | undefined // True if the bot is a member of this channel, is_open: boolean | undefined // True if the channel is open, topic: { value: string // Topic text, creator: string // User ID who set the topic, last_set: number // Unix timestamp when topic was last set } | undefined // Channel topic information, purpose: { value: string // Purpose text, creator: string // User ID who set the purpose, last_set: number // Unix timestamp when purpose was last set } | undefined // Channel purpose information, num_members: number | undefined // Number of members in the channel } | undefined // Channel information object after joining,\n// already_in_channel: boolean | undefined // Whether the bot was already a member of the channel,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Upload File example\nconst slack_upload_file = new SlackBubble({\n operation: \"upload_file\", // Upload a file to a Slack channel. Required scopes: files:write\n channel: \"example string\", // Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM\n file_path: \"example string\", // Local file path to upload\n filename: \"example string\", // Override filename for the upload\n title: \"example string\", // Title for the file\n initial_comment: \"example string\", // Initial comment to post with the file\n thread_ts: \"example string\", // Timestamp of parent message to upload file in thread\n});\n\nconst result = await slack_upload_file.action();\n// outputSchema for result.data when operation === 'upload_file':\n// {\n// operation: \"upload_file\" // Upload a file to a Slack channel,\n// ok: boolean // Whether the Slack API call was successful,\n// file: { id: string // Unique file identifier, created: number // Unix timestamp when file was created, timestamp: number // Unix timestamp when file was uploaded, name: string // Original filename, title: string | undefined // File title, mimetype: string // MIME type of the file, filetype: string // File type extension, pretty_type: string // Human-readable file type, user: string // User ID who uploaded the file, editable: boolean // Whether the file is editable, size: number // File size in bytes, mode: string // File sharing mode, is_external: boolean // Whether file is from external source, external_type: string // External file type if applicable, is_public: boolean // Whether file is publicly accessible, public_url_shared: boolean // Whether public URL is shared, display_as_bot: boolean // Whether file is displayed as uploaded by bot, username: string // Username of uploader, url_private: string // Private URL to access file, url_private_download: string // Private download URL, permalink: string // Permanent link to file, permalink_public: string | undefined // Public permanent link, shares: { public: Record<string, { reply_users: string[] // User IDs who replied, reply_users_count: number // Number of unique users who replied, reply_count: number // Total number of replies, ts: string // Timestamp of the share, channel_name: string // Name of the channel, team_id: string // Team ID }[]> | undefined // Public channel shares, private: Record<string, { reply_users: string[] // User IDs who replied, reply_users_count: number // Number of unique users who replied, reply_count: number // Total number of replies, ts: string // Timestamp of the share, channel_name: string // Name of the channel, team_id: string // Team ID }[]> | undefined // Private channel shares } | undefined // Information about where file is shared, channels: string[] | undefined // Channel IDs where file is shared, groups: string[] | undefined // Private group IDs where file is shared, ims: string[] | undefined // Direct message IDs where file is shared, has_rich_preview: boolean | undefined // Whether file has rich preview } | undefined // File information object,\n// error: string // Error message if operation failed,\n// success: boolean // Whether the operation was successful\n// }\n\n\n// Schedule Message example\nconst slack_schedule_message = new SlackBubble({\n operation: \"schedule_message\", // Schedule a message to be sent at a future time. Required scopes: chat:write. Max 120 days in advance.\n channel: \"example string\", // Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM\n text: \"example string\", // Message text content\n post_at: 42, // Unix timestamp (seconds) for when to send the message. Must be within 120 days from now.\n thread_ts: \"example string\", // Timestamp of parent message to reply in thread\n blocks: [{ type: \"example string\" // Block element type (section, divider, button, etc.), text: { type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\" // Text formatting type, text: \"example string\" // The actual text content, emoji: true, verbatim: true } // Text object for the block element, elements: [{ type: \"plain_text\" // options: \"plain_text\", \"mrkdwn\", \"image\" // Element type, text: \"example string\" // Text content, image_url: \"example string\" // Image URL for image elements, alt_text: \"example string\" // Alt text for image elements, emoji: true, verbatim: true }] // Elements array for context blocks }], // Block Kit structured message blocks\n unfurl_links: true // default, // Enable automatic link unfurling\n unfurl_media: true // default, // Enable automatic media unfurling\n});\n\nconst result = await slack_schedule_message.action();\n// outputSchema for result.data when operation === 'schedule_message':\n// {\n// operation: \"schedule_message\" // Schedule a message to be sent at a future time,\n// ok: boolean // Whether the Slack API call was successful,\n// channel: string | undefined // Channel ID where message will be posted,\n// scheduled_message_id: string | undefined // Unique identifier for the scheduled message,\n// post_at: number | undefined // Unix timestamp when message will be posted,\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(`slack failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
56
56
  "requiredCredentials": [
57
57
  "SLACK_CRED"
58
58
  ]
@@ -89,10 +89,12 @@
89
89
  "type": "service",
90
90
  "shortDescription": "Makes HTTP requests to external APIs and services",
91
91
  "useCase": "- Calling external REST APIs",
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}",
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 authType: \"none\" | \"bearer\" | \"basic\" | \"api-key\" | \"api-key-header\" | \"custom\" // Authentication type: none (default), bearer (Authorization: Bearer), basic (Authorization: Basic), api-key (X-API-Key), api-key-header (Api-Key), custom (user-specified header),\n authHeader: string | undefined // Custom header name when authType is \"custom\" (e.g., \"X-Custom-Auth\"),\n credentials: Record<string, string> | undefined // Optional credentials for authentication (injected at runtime)\n}",
93
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}",
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);",
95
- "requiredCredentials": []
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 authType: \"none\" // options: \"none\", \"bearer\", \"basic\", \"api-key\", \"api-key-header\", \"custom\", // Authentication type: none (default), bearer (Authorization: Bearer), basic (Authorization: Basic), api-key (X-API-Key), api-key-header (Api-Key), custom (user-specified header),\n authHeader: \"example string\", // Custom header name when authType is \"custom\" (e.g., \"X-Custom-Auth\"),\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);",
95
+ "requiredCredentials": [
96
+ "CUSTOM_AUTH_KEY"
97
+ ]
96
98
  },
97
99
  {
98
100
  "name": "storage",
@@ -182,7 +184,7 @@
182
184
  "useCase": "- Code review automation and PR management",
183
185
  "inputSchema": "Complex schema - see usage example for structure",
184
186
  "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);",
187
+ "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 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);",
186
188
  "requiredCredentials": [
187
189
  "GITHUB_TOKEN"
188
190
  ]
@@ -352,6 +354,17 @@
352
354
  "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);",
353
355
  "requiredCredentials": []
354
356
  },
357
+ {
358
+ "name": "get-trigger-detail-tool",
359
+ "alias": "trigger",
360
+ "type": "tool",
361
+ "shortDescription": "Provides detailed information about BubbleFlow trigger types including setup guides and payload schemas",
362
+ "useCase": "- Understanding how to configure a specific trigger (Slack, Cron, Webhook)",
363
+ "inputSchema": "{\n triggerType: string | undefined // The trigger type to get details about (e.g., 'slack/bot_mentioned', 'webhook/http'). If not provided, returns a list of all available triggers.,\n credentials: Record<string, string> | undefined // Object mapping credential types to values (injected at runtime)\n}",
364
+ "outputSchema": "{\n triggerType: string | undefined // The requested trigger type,\n serviceName: string | undefined // Service name for logo lookup (e.g., Slack, Cron),\n friendlyName: string | undefined // Human-friendly trigger name,\n description: string | undefined // Description of what this trigger does,\n setupGuide: string | undefined // Markdown setup guide for configuring this trigger,\n payloadSchema: string | undefined // JSON Schema string for the payload,\n payloadTypeInterface: string | undefined // TypeScript interface name to use for the payload (e.g., SlackMentionEvent),\n availableTriggers: { type: string, friendlyName: string, description: string }[] | undefined // List of all available triggers (when no specific trigger requested),\n success: boolean // Whether the operation was successful,\n error: string // Error message if operation failed\n}",
365
+ "usageExample": "// Example usage of get-trigger-detail-tool bubble\nconst getTriggerDetailTool = new GetTriggerDetailTool({\n triggerType: \"example string\", // The trigger type to get details about (e.g., 'slack/bot_mentioned', 'webhook/http'). If not provided, returns a list of all available triggers.,\n});\n\nconst result = await getTriggerDetailTool.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// triggerType: string | undefined // The requested trigger type,\n// serviceName: string | undefined // Service name for logo lookup (e.g., Slack, Cron),\n// friendlyName: string | undefined // Human-friendly trigger name,\n// description: string | undefined // Description of what this trigger does,\n// setupGuide: string | undefined // Markdown setup guide for configuring this trigger,\n// payloadSchema: string | undefined // JSON Schema string for the payload,\n// payloadTypeInterface: string | undefined // TypeScript interface name to use for the payload (e.g., SlackMentionEvent),\n// availableTriggers: { type: string, friendlyName: string, description: string }[] | undefined // List of all available triggers (when no specific trigger requested),\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);",
366
+ "requiredCredentials": []
367
+ },
355
368
  {
356
369
  "name": "list-bubbles-tool",
357
370
  "alias": "list",
@@ -430,9 +443,9 @@
430
443
  "type": "tool",
431
444
  "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.",
432
445
  "useCase": "General purpose bubble for various workflow needs",
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}",
446
+ "inputSchema": "{\n url: string // The URL to scrape content from,\n format: \"markdown\" | \"html\" // 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
447
  "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);",
448
+ "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\" // options: \"markdown\", \"html\", // 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);",
436
449
  "requiredCredentials": [
437
450
  "FIRECRAWL_API_KEY"
438
451
  ]
@@ -461,7 +474,11 @@
461
474
  "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);",
462
475
  "requiredCredentials": [
463
476
  "FIRECRAWL_API_KEY",
464
- "GOOGLE_GEMINI_CRED"
477
+ "GOOGLE_GEMINI_CRED",
478
+ "OPENAI_CRED",
479
+ "ANTHROPIC_CRED",
480
+ "OPENROUTER_CRED",
481
+ "APIFY_CRED"
465
482
  ]
466
483
  },
467
484
  {
@@ -494,9 +511,9 @@
494
511
  "type": "tool",
495
512
  "shortDescription": "Scrape LinkedIn posts by profile or search by keyword. Get engagement metrics, media, and complete metadata.",
496
513
  "useCase": "**",
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}",
514
+ "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. Leave empty for no date filter.,\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
515
  "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);",
516
+ "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: \"past-24h\" // options: \"past-24h\", \"past-week\", \"past-month\", // Filter posts/jobs by date range (searchPosts/scrapeJobs). Options: past-24h, past-week, past-month. Leave empty for no date filter.,\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
517
  "requiredCredentials": [
501
518
  "APIFY_CRED"
502
519
  ]
@@ -632,6 +649,38 @@
632
649
  "INSFORGE_BASE_URL",
633
650
  "INSFORGE_API_KEY"
634
651
  ]
652
+ },
653
+ {
654
+ "name": "browserbase",
655
+ "alias": "browser",
656
+ "type": "service",
657
+ "shortDescription": "Browser automation service using BrowserBase cloud browsers",
658
+ "useCase": "- Automated shopping workflows (Amazon, etc.)",
659
+ "inputSchema": "Complex schema - see usage example for structure",
660
+ "outputSchema": "Complex schema - see usage example for structure",
661
+ "usageExample": "// Start Session example\nconst browserbase_start_session = new BrowserBaseBubble({\n operation: \"start_session\", // Create a new BrowserBase browser session\n context_id: \"example string\", // Existing context ID for session persistence\n cookies: [{ name: \"example string\" // Cookie name, value: \"example string\" // Cookie value, domain: \"example string\" // Cookie domain, path: \"example string\" // Cookie path, expires: 42 // Expiration timestamp, httpOnly: true // HTTP only flag, secure: true // Secure flag }], // Cookies to inject into the session\n viewport_width: 1280 // default, // Browser viewport width\n viewport_height: 900 // default, // Browser viewport height\n});\n\nconst result = await browserbase_start_session.action();\n// outputSchema for result.data when operation === 'start_session':\n// {\n// operation: \"start_session\",\n// success: boolean // Whether the operation was successful,\n// session_id: string | undefined // Created session ID,\n// context_id: string | undefined // Context ID for persistence,\n// debug_url: string | undefined // Debug URL for live viewing,\n// error: string // Error message if operation failed\n// }\n\n\n// Navigate example\nconst browserbase_navigate = new BrowserBaseBubble({\n operation: \"navigate\", // Navigate to a URL\n session_id: \"example string\", // Active browser session ID\n url: \"example string\", // URL to navigate to\n wait_until: \"load\" // options: \"load\", \"domcontentloaded\", \"networkidle0\", \"networkidle2\", // Wait condition for navigation\n timeout: 30000 // default, // Navigation timeout in milliseconds\n});\n\nconst result = await browserbase_navigate.action();\n// outputSchema for result.data when operation === 'navigate':\n// {\n// operation: \"navigate\",\n// success: boolean // Whether the operation was successful,\n// url: string | undefined // Final URL after navigation,\n// error: string // Error message if operation failed\n// }\n\n\n// Click example\nconst browserbase_click = new BrowserBaseBubble({\n operation: \"click\", // Click an element on the page\n session_id: \"example string\", // Active browser session ID\n selector: \"example string\", // CSS selector of element to click\n wait_for_navigation: false // default, // Wait for navigation after click\n timeout: 5000 // default, // Element wait timeout in milliseconds\n});\n\nconst result = await browserbase_click.action();\n// outputSchema for result.data when operation === 'click':\n// {\n// operation: \"click\",\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n\n// Type example\nconst browserbase_type = new BrowserBaseBubble({\n operation: \"type\", // Type text into an input element\n session_id: \"example string\", // Active browser session ID\n selector: \"example string\", // CSS selector of input element\n text: \"example string\", // Text to type\n clear_first: false // default, // Clear the input before typing\n delay: 0 // default, // Delay between keystrokes in milliseconds\n});\n\nconst result = await browserbase_type.action();\n// outputSchema for result.data when operation === 'type':\n// {\n// operation: \"type\",\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n\n// Evaluate example\nconst browserbase_evaluate = new BrowserBaseBubble({\n operation: \"evaluate\", // Execute JavaScript in page context\n session_id: \"example string\", // Active browser session ID\n script: \"example string\", // JavaScript code to execute (will be wrapped in a function)\n});\n\nconst result = await browserbase_evaluate.action();\n// outputSchema for result.data when operation === 'evaluate':\n// {\n// operation: \"evaluate\",\n// success: boolean // Whether the operation was successful,\n// result: unknown | undefined // Result of JavaScript execution,\n// error: string // Error message if operation failed\n// }\n\n\n// Get Content example\nconst browserbase_get_content = new BrowserBaseBubble({\n operation: \"get_content\", // Get page or element content\n session_id: \"example string\", // Active browser session ID\n selector: \"example string\", // CSS selector for specific element (optional, defaults to body)\n content_type: \"html\" // options: \"html\", \"text\", \"outer_html\", // Type of content to retrieve\n});\n\nconst result = await browserbase_get_content.action();\n// outputSchema for result.data when operation === 'get_content':\n// {\n// operation: \"get_content\",\n// success: boolean // Whether the operation was successful,\n// content: string | undefined // Retrieved content,\n// error: string // Error message if operation failed\n// }\n\n\n// Screenshot example\nconst browserbase_screenshot = new BrowserBaseBubble({\n operation: \"screenshot\", // Take a screenshot of the page\n session_id: \"example string\", // Active browser session ID\n selector: \"example string\", // CSS selector for specific element (optional, defaults to full page)\n full_page: false // default, // Capture full scrollable page\n format: \"png\" // options: \"png\", \"jpeg\", \"webp\", // Screenshot image format\n quality: 42, // Image quality for jpeg/webp (0-100)\n});\n\nconst result = await browserbase_screenshot.action();\n// outputSchema for result.data when operation === 'screenshot':\n// {\n// operation: \"screenshot\",\n// success: boolean // Whether the operation was successful,\n// data: string | undefined // Base64-encoded screenshot data,\n// format: string | undefined // Image format,\n// error: string // Error message if operation failed\n// }\n\n\n// Wait example\nconst browserbase_wait = new BrowserBaseBubble({\n operation: \"wait\", // Wait for a condition\n session_id: \"example string\", // Active browser session ID\n wait_type: \"selector\" // options: \"selector\", \"timeout\", \"navigation\", // Type of wait condition\n selector: \"example string\", // CSS selector to wait for (for selector wait_type)\n timeout: 5000 // default, // Wait timeout in milliseconds\n});\n\nconst result = await browserbase_wait.action();\n// outputSchema for result.data when operation === 'wait':\n// {\n// operation: \"wait\",\n// success: boolean // Whether the operation was successful,\n// error: string // Error message if operation failed\n// }\n\n\n// Get Cookies example\nconst browserbase_get_cookies = new BrowserBaseBubble({\n operation: \"get_cookies\", // Get cookies from the browser\n session_id: \"example string\", // Active browser session ID\n domain_filter: \"example string\", // Filter cookies by domain (partial match)\n});\n\nconst result = await browserbase_get_cookies.action();\n// outputSchema for result.data when operation === 'get_cookies':\n// {\n// operation: \"get_cookies\",\n// success: boolean // Whether the operation was successful,\n// cookies: { name: string // Cookie name, value: string // Cookie value, domain: string // Cookie domain, path: string // Cookie path, expires: number // Expiration timestamp, httpOnly: boolean // HTTP only flag, secure: boolean // Secure flag }[] | undefined // Retrieved cookies,\n// error: string // Error message if operation failed\n// }\n\n\n// End Session example\nconst browserbase_end_session = new BrowserBaseBubble({\n operation: \"end_session\", // Close browser session and release resources\n session_id: \"example string\", // Session ID to close\n});\n\nconst result = await browserbase_end_session.action();\n// outputSchema for result.data when operation === 'end_session':\n// {\n// operation: \"end_session\",\n// success: boolean // Whether the operation was successful,\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(`browserbase failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
662
+ "requiredCredentials": [
663
+ "AMAZON_CRED",
664
+ "CLOUDFLARE_R2_ACCESS_KEY",
665
+ "CLOUDFLARE_R2_SECRET_KEY",
666
+ "CLOUDFLARE_R2_ACCOUNT_ID"
667
+ ]
668
+ },
669
+ {
670
+ "name": "amazon-shopping-tool",
671
+ "alias": "amazon",
672
+ "type": "tool",
673
+ "shortDescription": "Amazon shopping automation - add to cart, view cart, checkout, search products",
674
+ "useCase": "General purpose bubble for various workflow needs",
675
+ "inputSchema": "Complex schema - see usage example for structure",
676
+ "outputSchema": "Complex schema - see usage example for structure",
677
+ "usageExample": "// Add To Cart example\nconst amazonShoppingTool_add_to_cart = new AmazonShoppingTool({\n operation: \"add_to_cart\", // Add a product to the Amazon shopping cart\n product_url: \"example string\", // Amazon product URL or ASIN (e.g., https://amazon.com/dp/B08N5WRWNW or B08N5WRWNW)\n quantity: 1 // default, // Number of items to add (default: 1)\n});\n\nconst result = await amazonShoppingTool_add_to_cart.action();\n// outputSchema for result.data when operation === 'add_to_cart':\n// {\n// operation: \"add_to_cart\",\n// success: boolean // Whether the operation was successful,\n// message: string | undefined // Success or status message,\n// cart_count: number | undefined // Total items in cart after adding,\n// error: string // Error message if operation failed\n// }\n\n\n// Get Cart example\nconst amazonShoppingTool_get_cart = new AmazonShoppingTool({\n operation: \"get_cart\", // View current Amazon cart contents\n});\n\nconst result = await amazonShoppingTool_get_cart.action();\n// outputSchema for result.data when operation === 'get_cart':\n// {\n// operation: \"get_cart\",\n// success: boolean // Whether the operation was successful,\n// items: { asin: string // Amazon Standard Identification Number, title: string // Product title, price: string // Product price as displayed, quantity: number // Quantity in cart, image: string | undefined // Product image URL, url: string | undefined // Product URL }[] | undefined // Items in the cart,\n// subtotal: string | undefined // Cart subtotal,\n// total_items: number | undefined // Total number of items,\n// screenshot_url: string | undefined // URL to screenshot image of cart confirmation,\n// error: string // Error message if operation failed\n// }\n\n\n// Checkout example\nconst amazonShoppingTool_checkout = new AmazonShoppingTool({\n operation: \"checkout\", // Complete the checkout process (requires saved payment method)\n});\n\nconst result = await amazonShoppingTool_checkout.action();\n// outputSchema for result.data when operation === 'checkout':\n// {\n// operation: \"checkout\",\n// success: boolean // Whether the operation was successful,\n// order_number: string | undefined // Order confirmation number,\n// estimated_delivery: string | undefined // Estimated delivery date,\n// total: string | undefined // Order total,\n// subtotal: string | undefined // Order subtotal before tax/shipping,\n// shipping_cost: string | undefined // Shipping cost,\n// tax: string | undefined // Tax amount,\n// shipping_address: string | undefined // Shipping address,\n// payment_method: string | undefined // Payment method used,\n// items: { title: string // Item title, quantity: number | undefined // Quantity ordered, price: string | undefined // Item price }[] | undefined // Items in the order,\n// screenshot_url: string | undefined // URL to screenshot image of order confirmation,\n// error: string // Error message if operation failed\n// }\n\n\n// Search example\nconst amazonShoppingTool_search = new AmazonShoppingTool({\n operation: \"search\", // Search for products on Amazon\n query: \"example string\", // Search query\n max_results: 5 // default, // Maximum number of results to return\n});\n\nconst result = await amazonShoppingTool_search.action();\n// outputSchema for result.data when operation === 'search':\n// {\n// operation: \"search\",\n// success: boolean // Whether the operation was successful,\n// results: { asin: string // Amazon Standard Identification Number, title: string // Product title, price: string | undefined // Product price, rating: string | undefined // Product rating, reviews_count: string | undefined // Number of reviews, url: string // Product URL, image: string | undefined // Product image URL, prime: boolean | undefined // Whether product has Prime delivery }[] | undefined // Search results,\n// total_results: number | undefined // Total number of results found,\n// error: string // Error message if operation failed\n// }\n\n\n// Get Product example\nconst amazonShoppingTool_get_product = new AmazonShoppingTool({\n operation: \"get_product\", // Get detailed information about a product\n product_url: \"example string\", // Amazon product URL or ASIN\n});\n\nconst result = await amazonShoppingTool_get_product.action();\n// outputSchema for result.data when operation === 'get_product':\n// {\n// operation: \"get_product\",\n// success: boolean // Whether the operation was successful,\n// product: { asin: string // Amazon Standard Identification Number, title: string // Product title, price: string | undefined // Product price, rating: string | undefined // Product rating, reviews_count: string | undefined // Number of reviews, description: string | undefined // Product description, features: string[] | undefined // Product features/bullet points, availability: string | undefined // Stock availability status, url: string // Product URL, images: string[] | undefined // Product image URLs } | undefined // Product details,\n// error: string // Error message if operation failed\n// }\n\n\n// Screenshot example\nconst amazonShoppingTool_screenshot = new AmazonShoppingTool({\n operation: \"screenshot\", // Take a screenshot of the current page and upload to cloud storage\n url: \"example string\", // Optional URL to navigate to before taking screenshot\n full_page: false // default, // Whether to capture the full scrollable page\n});\n\nconst result = await amazonShoppingTool_screenshot.action();\n// outputSchema for result.data when operation === 'screenshot':\n// {\n// operation: \"screenshot\",\n// success: boolean // Whether the operation was successful,\n// screenshot_url: string | undefined // URL to the uploaded screenshot image,\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(`amazon-shopping-tool failed: ${result.error}`);\n}\n\n// Access the actual data\nconst actualData = result.data;\nconsole.log(actualData);",
678
+ "requiredCredentials": [
679
+ "AMAZON_CRED",
680
+ "CLOUDFLARE_R2_ACCESS_KEY",
681
+ "CLOUDFLARE_R2_SECRET_KEY",
682
+ "CLOUDFLARE_R2_ACCOUNT_ID"
683
+ ]
635
684
  }
636
685
  ]
637
686
  }