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