@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,228 @@
|
|
|
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 WebScrapeToolParamsSchema: z.ZodObject<{
|
|
6
|
+
url: z.ZodString;
|
|
7
|
+
format: z.ZodDefault<z.ZodEnum<["markdown"]>>;
|
|
8
|
+
onlyMainContent: z.ZodDefault<z.ZodBoolean>;
|
|
9
|
+
actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
10
|
+
type: z.ZodEnum<["wait", "click", "write", "press", "scroll", "executeJavascript"]>;
|
|
11
|
+
milliseconds: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
selector: z.ZodOptional<z.ZodString>;
|
|
13
|
+
text: z.ZodOptional<z.ZodString>;
|
|
14
|
+
key: z.ZodOptional<z.ZodString>;
|
|
15
|
+
direction: z.ZodOptional<z.ZodEnum<["up", "down"]>>;
|
|
16
|
+
script: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
19
|
+
script?: string | undefined;
|
|
20
|
+
text?: string | undefined;
|
|
21
|
+
key?: string | undefined;
|
|
22
|
+
milliseconds?: number | undefined;
|
|
23
|
+
selector?: string | undefined;
|
|
24
|
+
direction?: "up" | "down" | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
27
|
+
script?: string | undefined;
|
|
28
|
+
text?: string | undefined;
|
|
29
|
+
key?: string | undefined;
|
|
30
|
+
milliseconds?: number | undefined;
|
|
31
|
+
selector?: string | undefined;
|
|
32
|
+
direction?: "up" | "down" | undefined;
|
|
33
|
+
}>, "many">>;
|
|
34
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
35
|
+
waitFor: z.ZodDefault<z.ZodNumber>;
|
|
36
|
+
credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
format: "markdown";
|
|
39
|
+
url: string;
|
|
40
|
+
onlyMainContent: boolean;
|
|
41
|
+
waitFor: number;
|
|
42
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
43
|
+
headers?: Record<string, string> | undefined;
|
|
44
|
+
actions?: {
|
|
45
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
46
|
+
script?: string | undefined;
|
|
47
|
+
text?: string | undefined;
|
|
48
|
+
key?: string | undefined;
|
|
49
|
+
milliseconds?: number | undefined;
|
|
50
|
+
selector?: string | undefined;
|
|
51
|
+
direction?: "up" | "down" | undefined;
|
|
52
|
+
}[] | undefined;
|
|
53
|
+
}, {
|
|
54
|
+
url: string;
|
|
55
|
+
format?: "markdown" | undefined;
|
|
56
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
57
|
+
onlyMainContent?: boolean | undefined;
|
|
58
|
+
waitFor?: number | undefined;
|
|
59
|
+
headers?: Record<string, string> | undefined;
|
|
60
|
+
actions?: {
|
|
61
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
62
|
+
script?: string | undefined;
|
|
63
|
+
text?: string | undefined;
|
|
64
|
+
key?: string | undefined;
|
|
65
|
+
milliseconds?: number | undefined;
|
|
66
|
+
selector?: string | undefined;
|
|
67
|
+
direction?: "up" | "down" | undefined;
|
|
68
|
+
}[] | undefined;
|
|
69
|
+
}>;
|
|
70
|
+
declare const WebScrapeToolResultSchema: z.ZodObject<{
|
|
71
|
+
content: z.ZodString;
|
|
72
|
+
title: z.ZodString;
|
|
73
|
+
url: z.ZodString;
|
|
74
|
+
format: z.ZodString;
|
|
75
|
+
success: z.ZodBoolean;
|
|
76
|
+
error: z.ZodString;
|
|
77
|
+
metadata: z.ZodOptional<z.ZodObject<{
|
|
78
|
+
statusCode: z.ZodOptional<z.ZodNumber>;
|
|
79
|
+
loadTime: z.ZodOptional<z.ZodNumber>;
|
|
80
|
+
}, "strip", z.ZodTypeAny, {
|
|
81
|
+
loadTime?: number | undefined;
|
|
82
|
+
statusCode?: number | undefined;
|
|
83
|
+
}, {
|
|
84
|
+
loadTime?: number | undefined;
|
|
85
|
+
statusCode?: number | undefined;
|
|
86
|
+
}>>;
|
|
87
|
+
}, "strip", z.ZodTypeAny, {
|
|
88
|
+
format: string;
|
|
89
|
+
title: string;
|
|
90
|
+
success: boolean;
|
|
91
|
+
error: string;
|
|
92
|
+
content: string;
|
|
93
|
+
url: string;
|
|
94
|
+
metadata?: {
|
|
95
|
+
loadTime?: number | undefined;
|
|
96
|
+
statusCode?: number | undefined;
|
|
97
|
+
} | undefined;
|
|
98
|
+
}, {
|
|
99
|
+
format: string;
|
|
100
|
+
title: string;
|
|
101
|
+
success: boolean;
|
|
102
|
+
error: string;
|
|
103
|
+
content: string;
|
|
104
|
+
url: string;
|
|
105
|
+
metadata?: {
|
|
106
|
+
loadTime?: number | undefined;
|
|
107
|
+
statusCode?: number | undefined;
|
|
108
|
+
} | undefined;
|
|
109
|
+
}>;
|
|
110
|
+
type WebScrapeToolParams = z.output<typeof WebScrapeToolParamsSchema>;
|
|
111
|
+
type WebScrapeToolResult = z.output<typeof WebScrapeToolResultSchema>;
|
|
112
|
+
type WebScrapeToolParamsInput = z.input<typeof WebScrapeToolParamsSchema>;
|
|
113
|
+
export declare class WebScrapeTool extends ToolBubble<WebScrapeToolParams, WebScrapeToolResult> {
|
|
114
|
+
static readonly bubbleName: BubbleName;
|
|
115
|
+
static readonly schema: z.ZodObject<{
|
|
116
|
+
url: z.ZodString;
|
|
117
|
+
format: z.ZodDefault<z.ZodEnum<["markdown"]>>;
|
|
118
|
+
onlyMainContent: z.ZodDefault<z.ZodBoolean>;
|
|
119
|
+
actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
120
|
+
type: z.ZodEnum<["wait", "click", "write", "press", "scroll", "executeJavascript"]>;
|
|
121
|
+
milliseconds: z.ZodOptional<z.ZodNumber>;
|
|
122
|
+
selector: z.ZodOptional<z.ZodString>;
|
|
123
|
+
text: z.ZodOptional<z.ZodString>;
|
|
124
|
+
key: z.ZodOptional<z.ZodString>;
|
|
125
|
+
direction: z.ZodOptional<z.ZodEnum<["up", "down"]>>;
|
|
126
|
+
script: z.ZodOptional<z.ZodString>;
|
|
127
|
+
}, "strip", z.ZodTypeAny, {
|
|
128
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
129
|
+
script?: string | undefined;
|
|
130
|
+
text?: string | undefined;
|
|
131
|
+
key?: string | undefined;
|
|
132
|
+
milliseconds?: number | undefined;
|
|
133
|
+
selector?: string | undefined;
|
|
134
|
+
direction?: "up" | "down" | undefined;
|
|
135
|
+
}, {
|
|
136
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
137
|
+
script?: string | undefined;
|
|
138
|
+
text?: string | undefined;
|
|
139
|
+
key?: string | undefined;
|
|
140
|
+
milliseconds?: number | undefined;
|
|
141
|
+
selector?: string | undefined;
|
|
142
|
+
direction?: "up" | "down" | undefined;
|
|
143
|
+
}>, "many">>;
|
|
144
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
145
|
+
waitFor: z.ZodDefault<z.ZodNumber>;
|
|
146
|
+
credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
|
|
147
|
+
}, "strip", z.ZodTypeAny, {
|
|
148
|
+
format: "markdown";
|
|
149
|
+
url: string;
|
|
150
|
+
onlyMainContent: boolean;
|
|
151
|
+
waitFor: number;
|
|
152
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
153
|
+
headers?: Record<string, string> | undefined;
|
|
154
|
+
actions?: {
|
|
155
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
156
|
+
script?: string | undefined;
|
|
157
|
+
text?: string | undefined;
|
|
158
|
+
key?: string | undefined;
|
|
159
|
+
milliseconds?: number | undefined;
|
|
160
|
+
selector?: string | undefined;
|
|
161
|
+
direction?: "up" | "down" | undefined;
|
|
162
|
+
}[] | undefined;
|
|
163
|
+
}, {
|
|
164
|
+
url: string;
|
|
165
|
+
format?: "markdown" | undefined;
|
|
166
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
167
|
+
onlyMainContent?: boolean | undefined;
|
|
168
|
+
waitFor?: number | undefined;
|
|
169
|
+
headers?: Record<string, string> | undefined;
|
|
170
|
+
actions?: {
|
|
171
|
+
type: "wait" | "click" | "write" | "press" | "scroll" | "executeJavascript";
|
|
172
|
+
script?: string | undefined;
|
|
173
|
+
text?: string | undefined;
|
|
174
|
+
key?: string | undefined;
|
|
175
|
+
milliseconds?: number | undefined;
|
|
176
|
+
selector?: string | undefined;
|
|
177
|
+
direction?: "up" | "down" | undefined;
|
|
178
|
+
}[] | undefined;
|
|
179
|
+
}>;
|
|
180
|
+
static readonly resultSchema: z.ZodObject<{
|
|
181
|
+
content: z.ZodString;
|
|
182
|
+
title: z.ZodString;
|
|
183
|
+
url: z.ZodString;
|
|
184
|
+
format: z.ZodString;
|
|
185
|
+
success: z.ZodBoolean;
|
|
186
|
+
error: z.ZodString;
|
|
187
|
+
metadata: z.ZodOptional<z.ZodObject<{
|
|
188
|
+
statusCode: z.ZodOptional<z.ZodNumber>;
|
|
189
|
+
loadTime: z.ZodOptional<z.ZodNumber>;
|
|
190
|
+
}, "strip", z.ZodTypeAny, {
|
|
191
|
+
loadTime?: number | undefined;
|
|
192
|
+
statusCode?: number | undefined;
|
|
193
|
+
}, {
|
|
194
|
+
loadTime?: number | undefined;
|
|
195
|
+
statusCode?: number | undefined;
|
|
196
|
+
}>>;
|
|
197
|
+
}, "strip", z.ZodTypeAny, {
|
|
198
|
+
format: string;
|
|
199
|
+
title: string;
|
|
200
|
+
success: boolean;
|
|
201
|
+
error: string;
|
|
202
|
+
content: string;
|
|
203
|
+
url: string;
|
|
204
|
+
metadata?: {
|
|
205
|
+
loadTime?: number | undefined;
|
|
206
|
+
statusCode?: number | undefined;
|
|
207
|
+
} | undefined;
|
|
208
|
+
}, {
|
|
209
|
+
format: string;
|
|
210
|
+
title: string;
|
|
211
|
+
success: boolean;
|
|
212
|
+
error: string;
|
|
213
|
+
content: string;
|
|
214
|
+
url: string;
|
|
215
|
+
metadata?: {
|
|
216
|
+
loadTime?: number | undefined;
|
|
217
|
+
statusCode?: number | undefined;
|
|
218
|
+
} | undefined;
|
|
219
|
+
}>;
|
|
220
|
+
static readonly shortDescription = "Scrapes content from a single web page using Firecrawl, good to use after web-search-tool to get the full content of a page";
|
|
221
|
+
static readonly longDescription = "\n A simple and powerful web scraping tool that extracts content from any web page.\n \n Features:\n - Clean content extraction with main content focus\n - Multiple format support (markdown, html, rawHtml)\n - Fast and reliable using Firecrawl\n - Handles JavaScript-rendered pages\n - Optional browser automation for authentication flows\n - Custom headers support for session-based scraping\n - Requires FIRECRAWL_API_KEY credential\n \n Basic use cases:\n - Extract article content for analysis\n - Scrape product information from e-commerce sites\n - Get clean text from documentation pages\n - Extract data from any public web page\n \n Advanced use cases (with actions):\n - Login and scrape protected content\n - Navigate multi-step authentication flows\n - Interact with dynamic content requiring clicks/scrolls\n - Execute custom JavaScript for complex scenarios\n ";
|
|
222
|
+
static readonly alias = "scrape";
|
|
223
|
+
static readonly type = "tool";
|
|
224
|
+
constructor(params?: WebScrapeToolParamsInput, context?: BubbleContext);
|
|
225
|
+
performAction(): Promise<WebScrapeToolResult>;
|
|
226
|
+
}
|
|
227
|
+
export {};
|
|
228
|
+
//# sourceMappingURL=web-scrape-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-scrape-tool.d.ts","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/web-scrape-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAgC5E,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC7B,CAAC;AAGH,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc7B,CAAC;AAGH,KAAK,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,yBAAyB,CAAC,CAAC;AACtE,KAAK,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,yBAAyB,CAAC,CAAC;AACtE,KAAK,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE1E,qBAAa,aAAc,SAAQ,UAAU,CAC3C,mBAAmB,EACnB,mBAAmB,CACpB;IAEC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAqB;IAC3D,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA6B;IACnD,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA6B;IACzD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,iIACgG;IAChI,MAAM,CAAC,QAAQ,CAAC,eAAe,m7BAuB7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,YAAY;IACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;gBAG5B,MAAM,GAAE,wBAAsC,EAC9C,OAAO,CAAC,EAAE,aAAa;IAKnB,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAgIpD"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ToolBubble } from '../../types/tool-bubble-class.js';
|
|
3
|
+
import FirecrawlApp from '@mendable/firecrawl-js';
|
|
4
|
+
import { CredentialType } from '@bubblelab/shared-schemas';
|
|
5
|
+
import { AIAgentBubble } from '../service-bubble/ai-agent.js';
|
|
6
|
+
// Action types for browser automation (Gemini-compatible: avoid const/anyOf)
|
|
7
|
+
const ActionSchema = z.object({
|
|
8
|
+
type: z
|
|
9
|
+
.enum(['wait', 'click', 'write', 'press', 'scroll', 'executeJavascript'])
|
|
10
|
+
.describe('Action type to perform'),
|
|
11
|
+
milliseconds: z
|
|
12
|
+
.number()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe('Time to wait in milliseconds (for wait)'),
|
|
15
|
+
selector: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('CSS selector to interact with (wait/click/write/scroll)'),
|
|
19
|
+
text: z.string().optional().describe('Text to write (for write)'),
|
|
20
|
+
key: z
|
|
21
|
+
.string()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Key to press (e.g., "Enter") (for press)'),
|
|
24
|
+
direction: z
|
|
25
|
+
.enum(['up', 'down'])
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Scroll direction (for scroll)'),
|
|
28
|
+
script: z
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('JavaScript code (for executeJavascript)'),
|
|
32
|
+
});
|
|
33
|
+
// Simple, focused parameters with optional advanced features
|
|
34
|
+
const WebScrapeToolParamsSchema = z.object({
|
|
35
|
+
url: z
|
|
36
|
+
.string()
|
|
37
|
+
.url('Must be a valid URL')
|
|
38
|
+
.describe('The URL to scrape content from'),
|
|
39
|
+
format: z
|
|
40
|
+
.enum(['markdown'])
|
|
41
|
+
.default('markdown')
|
|
42
|
+
.describe('Content format to extract (default: markdown)'),
|
|
43
|
+
onlyMainContent: z
|
|
44
|
+
.boolean()
|
|
45
|
+
.default(true)
|
|
46
|
+
.describe('Extract only main content, filtering out navigation/footers'),
|
|
47
|
+
actions: z
|
|
48
|
+
.array(ActionSchema)
|
|
49
|
+
.optional()
|
|
50
|
+
.describe('Optional browser actions for authentication/navigation (e.g., login flows)'),
|
|
51
|
+
headers: z
|
|
52
|
+
.record(z.string())
|
|
53
|
+
.optional()
|
|
54
|
+
.describe('Optional HTTP headers (e.g., for session cookies)'),
|
|
55
|
+
waitFor: z
|
|
56
|
+
.number()
|
|
57
|
+
.min(0)
|
|
58
|
+
.max(30000)
|
|
59
|
+
.default(3000)
|
|
60
|
+
.describe('Time to wait for dynamic content in milliseconds (default: 3000)'),
|
|
61
|
+
credentials: z
|
|
62
|
+
.record(z.nativeEnum(CredentialType), z.string())
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('Required credentials including FIRECRAWL_API_KEY'),
|
|
65
|
+
});
|
|
66
|
+
// Result schema
|
|
67
|
+
const WebScrapeToolResultSchema = z.object({
|
|
68
|
+
content: z.string().describe('Scraped content in requested format'),
|
|
69
|
+
title: z.string().describe('Page title if available'),
|
|
70
|
+
url: z.string().url().describe('The original URL that was scraped'),
|
|
71
|
+
format: z.string().describe('Format of the returned content'),
|
|
72
|
+
success: z.boolean().describe('Whether the scraping was successful'),
|
|
73
|
+
error: z.string().describe('Error message if scraping failed'),
|
|
74
|
+
metadata: z
|
|
75
|
+
.object({
|
|
76
|
+
statusCode: z.number().optional(),
|
|
77
|
+
loadTime: z.number().optional(),
|
|
78
|
+
})
|
|
79
|
+
.optional()
|
|
80
|
+
.describe('Additional metadata about the scrape'),
|
|
81
|
+
});
|
|
82
|
+
export class WebScrapeTool extends ToolBubble {
|
|
83
|
+
// Required static metadata
|
|
84
|
+
static bubbleName = 'web-scrape-tool';
|
|
85
|
+
static schema = WebScrapeToolParamsSchema;
|
|
86
|
+
static resultSchema = WebScrapeToolResultSchema;
|
|
87
|
+
static shortDescription = 'Scrapes content from a single web page using Firecrawl, good to use after web-search-tool to get the full content of a page';
|
|
88
|
+
static longDescription = `
|
|
89
|
+
A simple and powerful web scraping tool that extracts content from any web page.
|
|
90
|
+
|
|
91
|
+
Features:
|
|
92
|
+
- Clean content extraction with main content focus
|
|
93
|
+
- Multiple format support (markdown, html, rawHtml)
|
|
94
|
+
- Fast and reliable using Firecrawl
|
|
95
|
+
- Handles JavaScript-rendered pages
|
|
96
|
+
- Optional browser automation for authentication flows
|
|
97
|
+
- Custom headers support for session-based scraping
|
|
98
|
+
- Requires FIRECRAWL_API_KEY credential
|
|
99
|
+
|
|
100
|
+
Basic use cases:
|
|
101
|
+
- Extract article content for analysis
|
|
102
|
+
- Scrape product information from e-commerce sites
|
|
103
|
+
- Get clean text from documentation pages
|
|
104
|
+
- Extract data from any public web page
|
|
105
|
+
|
|
106
|
+
Advanced use cases (with actions):
|
|
107
|
+
- Login and scrape protected content
|
|
108
|
+
- Navigate multi-step authentication flows
|
|
109
|
+
- Interact with dynamic content requiring clicks/scrolls
|
|
110
|
+
- Execute custom JavaScript for complex scenarios
|
|
111
|
+
`;
|
|
112
|
+
static alias = 'scrape';
|
|
113
|
+
static type = 'tool';
|
|
114
|
+
constructor(params = { url: '' }, context) {
|
|
115
|
+
super(params, context);
|
|
116
|
+
}
|
|
117
|
+
async performAction() {
|
|
118
|
+
const { url, format, onlyMainContent, actions, headers, waitFor } = this.params;
|
|
119
|
+
const startTime = Date.now();
|
|
120
|
+
try {
|
|
121
|
+
// Get Firecrawl API key from credentials
|
|
122
|
+
const apiKey = this.params.credentials?.FIRECRAWL_API_KEY;
|
|
123
|
+
if (!apiKey) {
|
|
124
|
+
throw new Error('FIRECRAWL_API_KEY is required but not provided in credentials');
|
|
125
|
+
}
|
|
126
|
+
// Initialize Firecrawl client
|
|
127
|
+
const firecrawl = new FirecrawlApp({ apiKey });
|
|
128
|
+
console.log('[WebScrapeTool] Scraping URL:', url, 'with format:', format);
|
|
129
|
+
// Configure scraping options
|
|
130
|
+
const scrapeOptions = {
|
|
131
|
+
formats: [format],
|
|
132
|
+
onlyMainContent,
|
|
133
|
+
// Sensible defaults for most use cases
|
|
134
|
+
removeBase64Images: true,
|
|
135
|
+
waitFor,
|
|
136
|
+
};
|
|
137
|
+
// Add optional parameters if provided
|
|
138
|
+
if (actions && actions.length > 0) {
|
|
139
|
+
console.log('[WebScrapeTool] Using browser actions:', actions.length, 'steps');
|
|
140
|
+
scrapeOptions.actions = actions;
|
|
141
|
+
}
|
|
142
|
+
if (headers) {
|
|
143
|
+
console.log('[WebScrapeTool] Using custom headers');
|
|
144
|
+
scrapeOptions.headers = headers;
|
|
145
|
+
}
|
|
146
|
+
// Execute scrape
|
|
147
|
+
const response = await firecrawl.scrape(url, scrapeOptions);
|
|
148
|
+
// Extract content based on format
|
|
149
|
+
let content;
|
|
150
|
+
let title = '';
|
|
151
|
+
if (format === 'markdown' && response.markdown) {
|
|
152
|
+
content = response.markdown;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
throw new Error(`No content available in ${format} format`);
|
|
156
|
+
}
|
|
157
|
+
// Summarize the scraped content for better consumption
|
|
158
|
+
if (content && content.length > 500) {
|
|
159
|
+
try {
|
|
160
|
+
const summarizeAgent = new AIAgentBubble({
|
|
161
|
+
message: `Summarize the scraped content to condense all information and remove any non-essential information, include all links, contact information, companies, don't omit any information. Content: ${content}`,
|
|
162
|
+
model: {
|
|
163
|
+
model: 'google/gemini-2.5-flash-lite',
|
|
164
|
+
},
|
|
165
|
+
name: 'Scrape Content Summarizer Agent',
|
|
166
|
+
credentials: this.params.credentials,
|
|
167
|
+
}, this.context);
|
|
168
|
+
const result = await summarizeAgent.action();
|
|
169
|
+
if (result.data?.response) {
|
|
170
|
+
console.log('[WebScrapeTool] Summarized scraped content for:', url, result.data.response);
|
|
171
|
+
content = result.data.response;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error('[WebScrapeTool] Error summarizing content:', url, error);
|
|
176
|
+
// Keep original content if summarization fails
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Extract title from metadata
|
|
180
|
+
if (response.metadata?.title) {
|
|
181
|
+
title = response.metadata.title;
|
|
182
|
+
}
|
|
183
|
+
const loadTime = Date.now() - startTime;
|
|
184
|
+
return {
|
|
185
|
+
content: content.trim(),
|
|
186
|
+
title,
|
|
187
|
+
url,
|
|
188
|
+
format,
|
|
189
|
+
success: true,
|
|
190
|
+
error: '',
|
|
191
|
+
metadata: {
|
|
192
|
+
statusCode: response.metadata?.statusCode,
|
|
193
|
+
loadTime,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error('[WebScrapeTool] Scrape error:', error);
|
|
199
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
200
|
+
return {
|
|
201
|
+
content: '',
|
|
202
|
+
title: '',
|
|
203
|
+
url,
|
|
204
|
+
format,
|
|
205
|
+
success: false,
|
|
206
|
+
error: errorMessage,
|
|
207
|
+
metadata: {
|
|
208
|
+
loadTime: Date.now() - startTime,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=web-scrape-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-scrape-tool.js","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/web-scrape-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ToolBubble } from '../../types/tool-bubble-class.js';
|
|
3
|
+
import type { BubbleContext } from '../../types/bubble.js';
|
|
4
|
+
import { CredentialType, type BubbleName } from '@bubblelab/shared-schemas';
|
|
5
|
+
declare const WebSearchToolParamsSchema: z.ZodObject<{
|
|
6
|
+
query: z.ZodString;
|
|
7
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
location: z.ZodOptional<z.ZodString>;
|
|
9
|
+
credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
query: string;
|
|
12
|
+
limit: number;
|
|
13
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
14
|
+
location?: string | undefined;
|
|
15
|
+
}, {
|
|
16
|
+
query: string;
|
|
17
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
18
|
+
limit?: number | undefined;
|
|
19
|
+
location?: string | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
declare const WebSearchToolResultSchema: z.ZodObject<{
|
|
22
|
+
results: z.ZodArray<z.ZodObject<{
|
|
23
|
+
title: z.ZodString;
|
|
24
|
+
url: z.ZodString;
|
|
25
|
+
content: z.ZodString;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
title: string;
|
|
28
|
+
content: string;
|
|
29
|
+
url: string;
|
|
30
|
+
}, {
|
|
31
|
+
title: string;
|
|
32
|
+
content: string;
|
|
33
|
+
url: string;
|
|
34
|
+
}>, "many">;
|
|
35
|
+
query: z.ZodString;
|
|
36
|
+
totalResults: z.ZodNumber;
|
|
37
|
+
searchEngine: z.ZodString;
|
|
38
|
+
success: z.ZodBoolean;
|
|
39
|
+
error: z.ZodString;
|
|
40
|
+
}, "strip", z.ZodTypeAny, {
|
|
41
|
+
success: boolean;
|
|
42
|
+
error: string;
|
|
43
|
+
query: string;
|
|
44
|
+
results: {
|
|
45
|
+
title: string;
|
|
46
|
+
content: string;
|
|
47
|
+
url: string;
|
|
48
|
+
}[];
|
|
49
|
+
totalResults: number;
|
|
50
|
+
searchEngine: string;
|
|
51
|
+
}, {
|
|
52
|
+
success: boolean;
|
|
53
|
+
error: string;
|
|
54
|
+
query: string;
|
|
55
|
+
results: {
|
|
56
|
+
title: string;
|
|
57
|
+
content: string;
|
|
58
|
+
url: string;
|
|
59
|
+
}[];
|
|
60
|
+
totalResults: number;
|
|
61
|
+
searchEngine: string;
|
|
62
|
+
}>;
|
|
63
|
+
type WebSearchToolParams = z.output<typeof WebSearchToolParamsSchema>;
|
|
64
|
+
type WebSearchToolResult = z.output<typeof WebSearchToolResultSchema>;
|
|
65
|
+
type WebSearchToolParamsInput = z.input<typeof WebSearchToolParamsSchema>;
|
|
66
|
+
export declare class WebSearchTool extends ToolBubble<WebSearchToolParams, WebSearchToolResult> {
|
|
67
|
+
static readonly bubbleName: BubbleName;
|
|
68
|
+
static readonly schema: z.ZodObject<{
|
|
69
|
+
query: z.ZodString;
|
|
70
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
71
|
+
location: z.ZodOptional<z.ZodString>;
|
|
72
|
+
credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
|
|
73
|
+
}, "strip", z.ZodTypeAny, {
|
|
74
|
+
query: string;
|
|
75
|
+
limit: number;
|
|
76
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
77
|
+
location?: string | undefined;
|
|
78
|
+
}, {
|
|
79
|
+
query: string;
|
|
80
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
81
|
+
limit?: number | undefined;
|
|
82
|
+
location?: string | undefined;
|
|
83
|
+
}>;
|
|
84
|
+
static readonly resultSchema: z.ZodObject<{
|
|
85
|
+
results: z.ZodArray<z.ZodObject<{
|
|
86
|
+
title: z.ZodString;
|
|
87
|
+
url: z.ZodString;
|
|
88
|
+
content: z.ZodString;
|
|
89
|
+
}, "strip", z.ZodTypeAny, {
|
|
90
|
+
title: string;
|
|
91
|
+
content: string;
|
|
92
|
+
url: string;
|
|
93
|
+
}, {
|
|
94
|
+
title: string;
|
|
95
|
+
content: string;
|
|
96
|
+
url: string;
|
|
97
|
+
}>, "many">;
|
|
98
|
+
query: z.ZodString;
|
|
99
|
+
totalResults: z.ZodNumber;
|
|
100
|
+
searchEngine: z.ZodString;
|
|
101
|
+
success: z.ZodBoolean;
|
|
102
|
+
error: z.ZodString;
|
|
103
|
+
}, "strip", z.ZodTypeAny, {
|
|
104
|
+
success: boolean;
|
|
105
|
+
error: string;
|
|
106
|
+
query: string;
|
|
107
|
+
results: {
|
|
108
|
+
title: string;
|
|
109
|
+
content: string;
|
|
110
|
+
url: string;
|
|
111
|
+
}[];
|
|
112
|
+
totalResults: number;
|
|
113
|
+
searchEngine: string;
|
|
114
|
+
}, {
|
|
115
|
+
success: boolean;
|
|
116
|
+
error: string;
|
|
117
|
+
query: string;
|
|
118
|
+
results: {
|
|
119
|
+
title: string;
|
|
120
|
+
content: string;
|
|
121
|
+
url: string;
|
|
122
|
+
}[];
|
|
123
|
+
totalResults: number;
|
|
124
|
+
searchEngine: string;
|
|
125
|
+
}>;
|
|
126
|
+
static readonly shortDescription = "Performs web searches using Firecrawl to find current information from the web";
|
|
127
|
+
static readonly longDescription = "\n A comprehensive web search tool that uses Firecrawl to find current information from the web.\n \n Features:\n - High-quality web search results with content extraction\n - Configurable result limits (1-20 results)\n - Location-based search for regional results\n - Clean, structured content extraction from search results\n - Requires FIRECRAWL_API_KEY credential\n \n Use cases:\n - Finding current events and news\n - Researching topics with web content\n - Getting up-to-date information for decision making\n - Answering questions that require web knowledge\n - Market research and competitive analysis\n - Real-time data gathering from the web\n ";
|
|
128
|
+
static readonly alias = "websearch";
|
|
129
|
+
static readonly type = "tool";
|
|
130
|
+
constructor(params?: WebSearchToolParamsInput, context?: BubbleContext);
|
|
131
|
+
performAction(context?: BubbleContext): Promise<WebSearchToolResult>;
|
|
132
|
+
}
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=web-search-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search-tool.d.ts","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/web-search-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAoB5E,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;EAmB7B,CAAC;AAGH,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe7B,CAAC;AAGH,KAAK,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,yBAAyB,CAAC,CAAC;AACtE,KAAK,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,yBAAyB,CAAC,CAAC;AACtE,KAAK,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE1E,qBAAa,aAAc,SAAQ,UAAU,CAC3C,mBAAmB,EACnB,mBAAmB,CACpB;IAEC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAqB;IAC3D,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;OAA6B;IACnD,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA6B;IACzD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,oFACmD;IACnF,MAAM,CAAC,QAAQ,CAAC,eAAe,ssBAiB7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,eAAe;IACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;gBAG5B,MAAM,GAAE,wBAAwC,EAChD,OAAO,CAAC,EAAE,aAAa;IAKnB,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAoG3E"}
|