@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,15 @@
|
|
|
1
|
+
import type { BubbleTriggerEventRegistry } from '@bubblelab/bubble-core';
|
|
2
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
3
|
+
export interface Output {
|
|
4
|
+
success: boolean;
|
|
5
|
+
directAnswer?: string;
|
|
6
|
+
insights?: string[];
|
|
7
|
+
recommendations?: string[];
|
|
8
|
+
slackMessageId?: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class DataAnalystFlow extends BubbleFlow<'slack/bot_mentioned'> {
|
|
12
|
+
constructor();
|
|
13
|
+
handle(payload: BubbleTriggerEventRegistry['slack/bot_mentioned']): Promise<Output>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data-analyst-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-analyst-flow.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/data-analyst-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,UAAU,EAGX,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAgB,SAAQ,UAAU,CAAC,qBAAqB,CAAC;;IAQ9D,MAAM,CACV,OAAO,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,GACzD,OAAO,CAAC,MAAM,CAAC;CAgEnB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BubbleFlow, SlackBubble, SlackDataAssistantWorkflow, } from '@bubblelab/bubble-core';
|
|
2
|
+
export class DataAnalystFlow extends BubbleFlow {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('data-analyst-flow', 'AI-powered database analysis triggered by Slack mentions');
|
|
5
|
+
}
|
|
6
|
+
async handle(payload) {
|
|
7
|
+
try {
|
|
8
|
+
// Extract the question from the Slack message
|
|
9
|
+
const userQuestion = payload.text.replace(/<@[^>]+>/g, '').trim();
|
|
10
|
+
if (!userQuestion) {
|
|
11
|
+
return {
|
|
12
|
+
success: false,
|
|
13
|
+
error: 'Please provide a question after mentioning me.',
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (payload.monthlyLimitError) {
|
|
17
|
+
// Send a message to the user with the monthly limit error message
|
|
18
|
+
await new SlackBubble({
|
|
19
|
+
channel: payload.channel,
|
|
20
|
+
operation: 'send_message',
|
|
21
|
+
thread_ts: payload.thread_ts || payload.slack_event.event.ts,
|
|
22
|
+
text: payload.monthlyLimitError,
|
|
23
|
+
}).action();
|
|
24
|
+
return {
|
|
25
|
+
success: false,
|
|
26
|
+
error: payload.monthlyLimitError,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const workflow = new SlackDataAssistantWorkflow({
|
|
30
|
+
slackChannel: payload.channel,
|
|
31
|
+
userQuestion: userQuestion,
|
|
32
|
+
userName: payload.user,
|
|
33
|
+
dataSourceType: 'postgresql',
|
|
34
|
+
ignoreSSLErrors: true,
|
|
35
|
+
aiModel: 'google/gemini-2.5-pro',
|
|
36
|
+
temperature: 0.3,
|
|
37
|
+
verbosity: '1',
|
|
38
|
+
technicality: '1',
|
|
39
|
+
includeQuery: true,
|
|
40
|
+
includeExplanation: true,
|
|
41
|
+
slackThreadTs: payload.thread_ts || payload.slack_event.event.ts,
|
|
42
|
+
});
|
|
43
|
+
const result = await workflow.action();
|
|
44
|
+
return {
|
|
45
|
+
success: result.success,
|
|
46
|
+
directAnswer: result.data?.formattedResponse,
|
|
47
|
+
insights: result.data?.queryResults?.map((result) => result.summary) ?? [],
|
|
48
|
+
recommendations: result.data?.queryResults?.map((result) => result.summary) ?? [],
|
|
49
|
+
slackMessageId: result.data?.slackMessageTs,
|
|
50
|
+
error: result.error
|
|
51
|
+
? result.error.substring(0, 100) + '...'
|
|
52
|
+
: undefined,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
error: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data-analyst-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-analyst-flow.js","sourceRoot":"","sources":["../../../src/bubble-flow/sample/data-analyst-flow.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,WAAW,EACX,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAWhC,MAAM,OAAO,eAAgB,SAAQ,UAAiC;IACpE;QACE,KAAK,CACH,mBAAmB,EACnB,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAA0D;QAE1D,IAAI,CAAC;YACH,8CAA8C;YAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAElE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gDAAgD;iBACxD,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC9B,kEAAkE;gBAClE,MAAM,IAAI,WAAW,CAAC;oBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,SAAS,EAAE,cAAc;oBACzB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;oBAC5D,IAAI,EAAE,OAAO,CAAC,iBAA2B;iBAC1C,CAAC,CAAC,MAAM,EAAE,CAAC;gBAEZ,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,OAAO,CAAC,iBAA2B;iBAC3C,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAC;gBAC9C,YAAY,EAAE,OAAO,CAAC,OAAO;gBAC7B,YAAY,EAAE,YAAY;gBAC1B,QAAQ,EAAE,OAAO,CAAC,IAAI;gBACtB,cAAc,EAAE,YAAY;gBAC5B,eAAe,EAAE,IAAI;gBACrB,OAAO,EAAE,uBAAuB;gBAChC,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,GAAG;gBACd,YAAY,EAAE,GAAG;gBACjB,YAAY,EAAE,IAAI;gBAClB,kBAAkB,EAAE,IAAI;gBACxB,aAAa,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;aACjE,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,iBAAiB;gBAC5C,QAAQ,EACN,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAC5B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAiB,CACrC,IAAI,EAAE;gBACT,eAAe,EACb,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAC5B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAiB,CACrC,IAAI,EAAE;gBACT,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc;gBAC3C,KAAK,EAAE,MAAM,CAAC,KAAK;oBACjB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK;oBACxC,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;aACpE,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
2
|
+
import type { BubbleTriggerEventRegistry } from '@bubblelab/bubble-core';
|
|
3
|
+
export declare class AIAnalysisFlow extends BubbleFlow<'webhook/http'> {
|
|
4
|
+
constructor();
|
|
5
|
+
handle(payload: BubbleTriggerEventRegistry['webhook/http']): Promise<{
|
|
6
|
+
success: boolean;
|
|
7
|
+
input: {};
|
|
8
|
+
analysis: {
|
|
9
|
+
analysis: string;
|
|
10
|
+
sentiment: string;
|
|
11
|
+
wordCount: number;
|
|
12
|
+
};
|
|
13
|
+
timestamp: string;
|
|
14
|
+
error?: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
success: boolean;
|
|
17
|
+
error: string;
|
|
18
|
+
input?: undefined;
|
|
19
|
+
analysis?: undefined;
|
|
20
|
+
timestamp?: undefined;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=error-ts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-ts.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/error-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,qBAAa,cAAe,SAAQ,UAAU,CAAC,cAAc,CAAC;;IAKtD,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;CAyBjE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
2
|
+
export class AIAnalysisFlow extends BubbleFlow {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('ai-analysis-flow', 'Analyzes text using AI');
|
|
5
|
+
}
|
|
6
|
+
async handle(payload) {
|
|
7
|
+
const text = payload.body?.text || 'Hello, AI!';
|
|
8
|
+
try {
|
|
9
|
+
// Mock AI response for testing
|
|
10
|
+
// In real implementation, this would call AIAgentBubble
|
|
11
|
+
const mockAIResponse = {
|
|
12
|
+
analysis: 'This is a greeting message',
|
|
13
|
+
sentiment: 'positive',
|
|
14
|
+
wordCount: text.split(' ').length,
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
success: true,
|
|
18
|
+
input: text,
|
|
19
|
+
analysis: mockAIResponse,
|
|
20
|
+
timestamp: new Date().toISOString(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
return {
|
|
25
|
+
success: false,
|
|
26
|
+
error: error instanceof Error ? error.message : String(error),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=error-ts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-ts.js","sourceRoot":"","sources":["../../../src/bubble-flow/sample/error-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,OAAO,cAAe,SAAQ,UAA0B;IAC5D;QACE,KAAK,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAmD;QAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC;QAEhD,IAAI,CAAC;YACH,+BAA+B;YAC/B,wDAAwD;YACxD,MAAM,cAAc,GAAG;gBACrB,QAAQ,EAAE,4BAA4B;gBACtC,SAAS,EAAE,UAAU;gBACrB,SAAS,EAAG,IAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM;aAC9C,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,cAAc;gBACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BubbleTriggerEventRegistry } from '@bubblelab/bubble-core';
|
|
2
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
3
|
+
export interface Output {
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class TestBubbleFlow extends BubbleFlow<'webhook/http'> {
|
|
7
|
+
constructor();
|
|
8
|
+
handle(payload: BubbleTriggerEventRegistry['webhook/http']): Promise<Output>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=sanitytest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitytest.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/sanitytest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,qBAAa,cAAe,SAAQ,UAAU,CAAC,cAAc,CAAC;;IAItD,MAAM,CACV,OAAO,EAAE,0BAA0B,CAAC,cAAc,CAAC,GAClD,OAAO,CAAC,MAAM,CAAC;CAKnB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
2
|
+
// This is a test bubble flow that is used to test the bubble flow system
|
|
3
|
+
export class TestBubbleFlow extends BubbleFlow {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('test-flow', 'A flow that handles webhook events');
|
|
6
|
+
}
|
|
7
|
+
async handle(payload) {
|
|
8
|
+
return {
|
|
9
|
+
message: `Response from ${payload.path}, ${payload.timestamp}, ${payload.type}: Hello!${payload.body?.name ?? 'there'}! Welcome to Nodex!`,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sanitytest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitytest.js","sourceRoot":"","sources":["../../../src/bubble-flow/sample/sanitytest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAQpD,yEAAyE;AACzE,MAAM,OAAO,cAAe,SAAQ,UAA0B;IAC5D;QACE,KAAK,CAAC,WAAW,EAAE,oCAAoC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,MAAM,CACV,OAAmD;QAEnD,OAAO;YACL,OAAO,EAAE,iBAAiB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,OAAO,qBAAqB;SAC3I,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { WebhookEvent } from '../../bubble-trigger';
|
|
2
|
+
import { BubbleFlow } from '../bubble-flow-class.js';
|
|
3
|
+
export interface Output {
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CustomWebhookPayload extends WebhookEvent {
|
|
7
|
+
userId: string;
|
|
8
|
+
requestId: string;
|
|
9
|
+
customData: {
|
|
10
|
+
source: string;
|
|
11
|
+
priority: 'low' | 'medium' | 'high';
|
|
12
|
+
metadata: Record<string, any>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare class TestBubbleFlow extends BubbleFlow<'webhook/http'> {
|
|
16
|
+
constructor();
|
|
17
|
+
handle(payload: CustomWebhookPayload): Promise<Output>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=simple-webhook-2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-webhook-2.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/simple-webhook-2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAIrD,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,qBAAa,cAAe,SAAQ,UAAU,CAAC,cAAc,CAAC;;IAItD,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB7D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BubbleFlow } from '../bubble-flow-class.js';
|
|
2
|
+
// Import all services
|
|
3
|
+
import * as bubbles from '@bubblelab/bubble-core';
|
|
4
|
+
export class TestBubbleFlow extends BubbleFlow {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('test-flow', 'A flow that handles webhook events');
|
|
7
|
+
}
|
|
8
|
+
async handle(payload) {
|
|
9
|
+
// Type assertion to access your custom fields
|
|
10
|
+
const customPayload = payload;
|
|
11
|
+
const { userId, requestId, customData } = customPayload;
|
|
12
|
+
const result = await new bubbles.AIAgentBubble({
|
|
13
|
+
message: `Hello user ${userId}, priority: ${customData.priority}`,
|
|
14
|
+
model: {
|
|
15
|
+
model: 'google/gemini-2.5-flash',
|
|
16
|
+
},
|
|
17
|
+
}).action();
|
|
18
|
+
return {
|
|
19
|
+
message: `Response from ${payload.path} (Request: ${requestId}): ${result.data?.response ?? 'No response'}`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=simple-webhook-2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-webhook-2.js","sourceRoot":"","sources":["../../../src/bubble-flow/sample/simple-webhook-2.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,sBAAsB;AACtB,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAiBlD,MAAM,OAAO,cAAe,SAAQ,UAA0B;IAC5D;QACE,KAAK,CAAC,WAAW,EAAE,oCAAoC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,OAA6B;QACxC,8CAA8C;QAC9C,MAAM,aAAa,GAAG,OAAO,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC;QAExD,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;YAC7C,OAAO,EAAE,cAAc,MAAM,eAAe,UAAU,CAAC,QAAQ,EAAE;YACjE,KAAK,EAAE;gBACL,KAAK,EAAE,yBAAyB;aACjC;SACF,CAAC,CAAC,MAAM,EAAE,CAAC;QAEZ,OAAO;YACL,OAAO,EAAE,iBAAiB,OAAO,CAAC,IAAI,cAAc,SAAS,MAAM,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,aAAa,EAAE;SAC5G,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BubbleTriggerEventRegistry } from '@bubblelab/bubble-core';
|
|
2
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
3
|
+
export interface Output {
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class TestBubbleFlow extends BubbleFlow<'webhook/http'> {
|
|
7
|
+
constructor();
|
|
8
|
+
handle(payload: BubbleTriggerEventRegistry['webhook/http']): Promise<Output>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=simple-webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-webhook.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/simple-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAiB,MAAM,wBAAwB,CAAC;AAEnE,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAe,SAAQ,UAAU,CAAC,cAAc,CAAC;;IAItD,MAAM,CACV,OAAO,EAAE,0BAA0B,CAAC,cAAc,CAAC,GAClD,OAAO,CAAC,MAAM,CAAC;CAWnB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BubbleFlow, AIAgentBubble } from '@bubblelab/bubble-core';
|
|
2
|
+
export class TestBubbleFlow extends BubbleFlow {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('test-flow', 'A flow that handles webhook events');
|
|
5
|
+
}
|
|
6
|
+
async handle(payload) {
|
|
7
|
+
const result = await new AIAgentBubble({
|
|
8
|
+
message: 'Hello, how are you?',
|
|
9
|
+
model: {
|
|
10
|
+
model: 'google/gemini-2.5-flash',
|
|
11
|
+
},
|
|
12
|
+
}).action();
|
|
13
|
+
return {
|
|
14
|
+
message: `Response from ${payload.path}: ${result.data?.response ?? 'No response'}`,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=simple-webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-webhook.js","sourceRoot":"","sources":["../../../src/bubble-flow/sample/simple-webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAMnE,MAAM,OAAO,cAAe,SAAQ,UAA0B;IAC5D;QACE,KAAK,CAAC,WAAW,EAAE,oCAAoC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,MAAM,CACV,OAAmD;QAEnD,MAAM,MAAM,GAAG,MAAM,IAAI,aAAa,CAAC;YACrC,OAAO,EAAE,qBAAqB;YAC9B,KAAK,EAAE;gBACL,KAAK,EAAE,yBAAyB;aACjC;SACF,CAAC,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE,iBAAiB,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,aAAa,EAAE;SACpF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BubbleFlow } from '../bubble-flow-class.js';
|
|
2
|
+
import type { BubbleFlowOperationResult } from '../../types/bubble.js';
|
|
3
|
+
import type { BubbleTriggerEventRegistry } from '@bubblelab/bubble-core';
|
|
4
|
+
/**
|
|
5
|
+
* SimplifiedDataAnalysisFlow - Example showing the power of WorkflowBubbles
|
|
6
|
+
*
|
|
7
|
+
* This example demonstrates how WorkflowBubbles dramatically simplify BubbleFlow creation.
|
|
8
|
+
*
|
|
9
|
+
* BEFORE WorkflowBubbles (original integration test):
|
|
10
|
+
* - 200+ lines of code
|
|
11
|
+
* - Manual credential management
|
|
12
|
+
* - Complex error handling
|
|
13
|
+
* - Multiple service bubble orchestration
|
|
14
|
+
* - Manual Slack channel discovery
|
|
15
|
+
* - Manual AI formatting prompts
|
|
16
|
+
*
|
|
17
|
+
* AFTER WorkflowBubbles (this example):
|
|
18
|
+
* - ~50 lines of clean, readable code
|
|
19
|
+
* - Automatic credential injection
|
|
20
|
+
* - Built-in error handling
|
|
21
|
+
* - High-level workflow abstractions
|
|
22
|
+
* - User-friendly parameter names
|
|
23
|
+
* - TypeScript intellisense support
|
|
24
|
+
*/
|
|
25
|
+
export declare class SimplifiedDataAnalysisFlow extends BubbleFlow<'webhook/http'> {
|
|
26
|
+
constructor();
|
|
27
|
+
handle(payload: BubbleTriggerEventRegistry['webhook/http']): Promise<BubbleFlowOperationResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=simplified-data-analysis.flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplified-data-analysis.flow.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/simplified-data-analysis.flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAKrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,0BAA2B,SAAQ,UAAU,CAAC,cAAc,CAAC;;IAQlE,MAAM,CACV,OAAO,EAAE,0BAA0B,CAAC,cAAc,CAAC,GAClD,OAAO,CAAC,yBAAyB,CAAC;CA0ItC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { BubbleFlow } from '../bubble-flow-class.js';
|
|
2
|
+
import { AIAgentBubble } from '../../bubbles/service-bubble/ai-agent.js';
|
|
3
|
+
import { PostgreSQLBubble } from '../../bubbles/service-bubble/postgresql.js';
|
|
4
|
+
import { DatabaseAnalyzerWorkflowBubble } from '../../bubbles/workflow-bubble/database-analyzer.workflow.js';
|
|
5
|
+
import { SlackNotifierWorkflowBubble } from '../../bubbles/workflow-bubble/slack-notifier.workflow.js';
|
|
6
|
+
/**
|
|
7
|
+
* SimplifiedDataAnalysisFlow - Example showing the power of WorkflowBubbles
|
|
8
|
+
*
|
|
9
|
+
* This example demonstrates how WorkflowBubbles dramatically simplify BubbleFlow creation.
|
|
10
|
+
*
|
|
11
|
+
* BEFORE WorkflowBubbles (original integration test):
|
|
12
|
+
* - 200+ lines of code
|
|
13
|
+
* - Manual credential management
|
|
14
|
+
* - Complex error handling
|
|
15
|
+
* - Multiple service bubble orchestration
|
|
16
|
+
* - Manual Slack channel discovery
|
|
17
|
+
* - Manual AI formatting prompts
|
|
18
|
+
*
|
|
19
|
+
* AFTER WorkflowBubbles (this example):
|
|
20
|
+
* - ~50 lines of clean, readable code
|
|
21
|
+
* - Automatic credential injection
|
|
22
|
+
* - Built-in error handling
|
|
23
|
+
* - High-level workflow abstractions
|
|
24
|
+
* - User-friendly parameter names
|
|
25
|
+
* - TypeScript intellisense support
|
|
26
|
+
*/
|
|
27
|
+
export class SimplifiedDataAnalysisFlow extends BubbleFlow {
|
|
28
|
+
constructor() {
|
|
29
|
+
super('simplified-data-analysis', 'AI-powered data analysis with automated Slack reporting using WorkflowBubbles');
|
|
30
|
+
}
|
|
31
|
+
async handle(payload) {
|
|
32
|
+
try {
|
|
33
|
+
// Extract user query from the webhook payload
|
|
34
|
+
const userQuery = payload.body?.userQuery ||
|
|
35
|
+
'How many subscriptions have we acquired in the last 30 days?';
|
|
36
|
+
// Step 1: Analyze database schema using WorkflowBubble
|
|
37
|
+
// This replaces 30+ lines of manual PostgreSQL schema querying
|
|
38
|
+
const schemaAnalysis = await new DatabaseAnalyzerWorkflowBubble({
|
|
39
|
+
dataSourceType: 'postgresql',
|
|
40
|
+
ignoreSSLErrors: true,
|
|
41
|
+
includeMetadata: true,
|
|
42
|
+
}).action();
|
|
43
|
+
// Step 2: Generate SQL query using AI Agent
|
|
44
|
+
// User-friendly parameter names make intent crystal clear
|
|
45
|
+
const sqlQueryResult = await new AIAgentBubble({
|
|
46
|
+
message: userQuery,
|
|
47
|
+
systemPrompt: `You are a helpful assistant that writes PostgreSQL queries.
|
|
48
|
+
|
|
49
|
+
Using this database schema: ${schemaAnalysis.data?.databaseSchema?.cleanedJSON}
|
|
50
|
+
|
|
51
|
+
Write a SQL query to answer the user's question. Return only the query between \`\`\`sql\`\`\` blocks, no other text.`,
|
|
52
|
+
model: {
|
|
53
|
+
model: 'google/gemini-2.5-pro',
|
|
54
|
+
},
|
|
55
|
+
}).action();
|
|
56
|
+
// Extract clean SQL query from AI response
|
|
57
|
+
const sqlMatch = sqlQueryResult.data?.response?.match(/```(?:sql|postgresql)\n([\s\S]*?)\n```/);
|
|
58
|
+
const cleanQuery = sqlMatch ? sqlMatch[1].trim() : null;
|
|
59
|
+
if (!cleanQuery) {
|
|
60
|
+
throw new Error('No valid SQL query generated by AI');
|
|
61
|
+
}
|
|
62
|
+
// Step 3: Execute the generated query
|
|
63
|
+
const queryResult = await new PostgreSQLBubble({
|
|
64
|
+
query: cleanQuery,
|
|
65
|
+
ignoreSSL: true,
|
|
66
|
+
allowedOperations: [
|
|
67
|
+
'SELECT',
|
|
68
|
+
'WITH',
|
|
69
|
+
'EXPLAIN',
|
|
70
|
+
'ANALYZE',
|
|
71
|
+
'SHOW',
|
|
72
|
+
'DESCRIBE',
|
|
73
|
+
'DESC',
|
|
74
|
+
'CREATE',
|
|
75
|
+
], // Allow comprehensive analysis
|
|
76
|
+
}).action();
|
|
77
|
+
if (!queryResult.success) {
|
|
78
|
+
throw new Error(`Query execution failed: ${queryResult.error}`);
|
|
79
|
+
}
|
|
80
|
+
console.log(`📈 Query executed successfully: ${JSON.stringify(queryResult.data?.rows).length} characters of data`);
|
|
81
|
+
// Step 4: Send intelligent Slack notification using WorkflowBubble
|
|
82
|
+
// This replaces 50+ lines of manual Slack channel discovery, AI formatting, and message sending
|
|
83
|
+
const slackNotification = await new SlackNotifierWorkflowBubble({
|
|
84
|
+
contentToFormat: JSON.stringify(queryResult.data, null, 2),
|
|
85
|
+
originalUserQuery: userQuery,
|
|
86
|
+
targetChannel: 'staging-bot', // User-friendly channel name (no # needed)
|
|
87
|
+
messageTitle: '📊 Data Analysis Results',
|
|
88
|
+
messageStyle: 'professional',
|
|
89
|
+
includeFormatting: true,
|
|
90
|
+
maxMessageLength: 3000,
|
|
91
|
+
aiModel: {
|
|
92
|
+
model: 'google/gemini-2.5-flash',
|
|
93
|
+
temperature: 0.3,
|
|
94
|
+
maxTokens: 1000,
|
|
95
|
+
},
|
|
96
|
+
}).action();
|
|
97
|
+
console.log(`🎉 Analysis complete! Message sent to #${slackNotification.data?.messageInfo?.channelName}`);
|
|
98
|
+
// Return comprehensive workflow results
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
results: {
|
|
102
|
+
userQuery,
|
|
103
|
+
analysis: {
|
|
104
|
+
tablesAnalyzed: schemaAnalysis.data?.databaseSchema?.tableCount,
|
|
105
|
+
queryGenerated: cleanQuery,
|
|
106
|
+
dataPointsReturned: Array.isArray(queryResult.data?.rows)
|
|
107
|
+
? queryResult.data.rows.length
|
|
108
|
+
: 0,
|
|
109
|
+
},
|
|
110
|
+
notification: {
|
|
111
|
+
channelName: slackNotification.data?.messageInfo?.channelName,
|
|
112
|
+
messageTimestamp: slackNotification.data?.messageInfo?.messageTimestamp,
|
|
113
|
+
messageLength: slackNotification.data?.messageInfo?.messageLength,
|
|
114
|
+
formattingStyle: slackNotification.data?.formattingInfo?.modelUsed,
|
|
115
|
+
},
|
|
116
|
+
executionSummary: {
|
|
117
|
+
totalSteps: 4,
|
|
118
|
+
completedAt: new Date().toISOString(),
|
|
119
|
+
workflowBubblesUsed: ['database-analyzer', 'slack-notifier'],
|
|
120
|
+
serviceBubblesUsed: ['ai-agent', 'postgresql'],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('❌ Data analysis workflow failed:', error);
|
|
127
|
+
// Even error handling is simplified with WorkflowBubbles!
|
|
128
|
+
// Send error notification to Slack automatically
|
|
129
|
+
try {
|
|
130
|
+
await new SlackNotifierWorkflowBubble({
|
|
131
|
+
contentToFormat: `Error in data analysis workflow: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
132
|
+
originalUserQuery: payload.body?.userQuery || 'Unknown query',
|
|
133
|
+
targetChannel: 'staging-bot',
|
|
134
|
+
messageTitle: '⚠️ Data Analysis Error',
|
|
135
|
+
messageStyle: 'concise',
|
|
136
|
+
includeFormatting: true,
|
|
137
|
+
}).action();
|
|
138
|
+
}
|
|
139
|
+
catch (notificationError) {
|
|
140
|
+
console.error('Failed to send error notification:', notificationError);
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
error: error instanceof Error ? error.message : 'Unknown workflow error',
|
|
145
|
+
timestamp: new Date().toISOString(),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=simplified-data-analysis.flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplified-data-analysis.flow.js","sourceRoot":"","sources":["../../../src/bubble-flow/sample/simplified-data-analysis.flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BubbleTriggerEventRegistry } from '@bubblelab/bubble-core';
|
|
2
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
3
|
+
export interface Output {
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class TestBubbleFlow extends BubbleFlow<'slack/bot_mentioned'> {
|
|
7
|
+
constructor();
|
|
8
|
+
handle(payload: BubbleTriggerEventRegistry['slack/bot_mentioned']): Promise<Output>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=slack-v0.1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-v0.1.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/slack-v0.1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,UAAU,EAKX,MAAM,wBAAwB,CAAC;AAIhC,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,qBAAa,cAAe,SAAQ,UAAU,CAAC,qBAAqB,CAAC;;IAI7D,MAAM,CACV,OAAO,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,GACzD,OAAO,CAAC,MAAM,CAAC;CA4DnB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { BubbleFlow, DatabaseAnalyzerWorkflowBubble, AIAgentBubble, PostgreSQLBubble, SlackNotifierWorkflowBubble, } from '@bubblelab/bubble-core';
|
|
2
|
+
// This is a test bubble flow that is used to test the bubble flow system
|
|
3
|
+
export class TestBubbleFlow extends BubbleFlow {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('test-flow', 'A flow that handles webhook events');
|
|
6
|
+
}
|
|
7
|
+
async handle(payload) {
|
|
8
|
+
const schemaAnalysis = await new DatabaseAnalyzerWorkflowBubble({
|
|
9
|
+
dataSourceType: 'postgresql',
|
|
10
|
+
ignoreSSLErrors: true,
|
|
11
|
+
includeMetadata: true,
|
|
12
|
+
}).action();
|
|
13
|
+
const sqlQueryResult = await new AIAgentBubble({
|
|
14
|
+
message: payload.text,
|
|
15
|
+
systemPrompt: `You are a helpful assistant that writes PostgreSQL queries.
|
|
16
|
+
|
|
17
|
+
Using this database schema: ${schemaAnalysis.data?.databaseSchema?.cleanedJSON}
|
|
18
|
+
|
|
19
|
+
Write a SQL query to answer the user's question. Return only the query between \`\`\`sql\`\`\` blocks, no other text.`,
|
|
20
|
+
model: {
|
|
21
|
+
model: 'google/gemini-2.5-pro',
|
|
22
|
+
maxTokens: 5000,
|
|
23
|
+
},
|
|
24
|
+
}).action();
|
|
25
|
+
// Extract clean SQL query from AI response
|
|
26
|
+
const sqlMatch = sqlQueryResult.data?.response?.match(/```(?:sql|postgresql)\n([\s\S]*?)\n```/);
|
|
27
|
+
const cleanQuery = sqlMatch ? sqlMatch[1].trim() : null;
|
|
28
|
+
if (!cleanQuery) {
|
|
29
|
+
throw new Error('No valid SQL query generated by AI');
|
|
30
|
+
}
|
|
31
|
+
const queryResult = await new PostgreSQLBubble({
|
|
32
|
+
query: cleanQuery,
|
|
33
|
+
ignoreSSL: true,
|
|
34
|
+
allowedOperations: ['SELECT'], // Safety first!
|
|
35
|
+
timeout: 30000,
|
|
36
|
+
maxRows: 1000,
|
|
37
|
+
}).action();
|
|
38
|
+
if (!queryResult.success) {
|
|
39
|
+
throw new Error(`Query execution failed: ${queryResult.error}`);
|
|
40
|
+
}
|
|
41
|
+
const slackNotification = await new SlackNotifierWorkflowBubble({
|
|
42
|
+
contentToFormat: JSON.stringify(queryResult.data, null, 2),
|
|
43
|
+
originalUserQuery: payload.text,
|
|
44
|
+
targetChannel: 'staging-bot',
|
|
45
|
+
messageTitle: '📊 Automated Data Analysis Results',
|
|
46
|
+
messageStyle: 'professional',
|
|
47
|
+
includeFormatting: true,
|
|
48
|
+
maxMessageLength: 3000,
|
|
49
|
+
aiModel: {
|
|
50
|
+
model: 'google/gemini-2.5-flash',
|
|
51
|
+
temperature: 0.3,
|
|
52
|
+
},
|
|
53
|
+
}).action();
|
|
54
|
+
return {
|
|
55
|
+
message: `Response from ${payload.path}, ${payload.timestamp}, ${payload.type}: ${slackNotification.data?.messageInfo?.formattedMessage} Analysis complete!`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=slack-v0.1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-v0.1.js","sourceRoot":"","sources":["../../../src/bubble-flow/sample/slack-v0.1.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,8BAA8B,EAC9B,aAAa,EACb,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAQhC,yEAAyE;AACzE,MAAM,OAAO,cAAe,SAAQ,UAAiC;IACnE;QACE,KAAK,CAAC,WAAW,EAAE,oCAAoC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,MAAM,CACV,OAA0D;QAE1D,MAAM,cAAc,GAAG,MAAM,IAAI,8BAA8B,CAAC;YAC9D,cAAc,EAAE,YAAY;YAC5B,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC,MAAM,EAAE,CAAC;QAEZ,MAAM,cAAc,GAAG,MAAM,IAAI,aAAa,CAAC;YAC7C,OAAO,EAAE,OAAO,CAAC,IAAc;YAC/B,YAAY,EAAE;;8BAEU,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW;;sHAEwC;YAChH,KAAK,EAAE;gBACL,KAAK,EAAE,uBAAuB;gBAC9B,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC,MAAM,EAAE,CAAC;QAEZ,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CACnD,wCAAwC,CACzC,CAAC;QACF,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAExD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,gBAAgB,CAAC;YAC7C,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,CAAC,QAAQ,CAAC,EAAE,gBAAgB;YAC/C,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,MAAM,EAAE,CAAC;QAEZ,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,IAAI,2BAA2B,CAAC;YAC9D,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,iBAAiB,EAAE,OAAO,CAAC,IAAc;YACzC,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,oCAAoC;YAClD,YAAY,EAAE,cAAc;YAC5B,iBAAiB,EAAE,IAAI;YACvB,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE;gBACP,KAAK,EAAE,yBAAyB;gBAChC,WAAW,EAAE,GAAG;aACjB;SACF,CAAC,CAAC,MAAM,EAAE,CAAC;QAEZ,OAAO;YACL,OAAO,EAAE,iBAAiB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,IAAI,KAAK,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,gBAAgB,qBAAqB;SAC7J,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BubbleTriggerEventRegistry } from '@bubblelab/bubble-core';
|
|
2
|
+
import { BubbleFlow } from '@bubblelab/bubble-core';
|
|
3
|
+
export interface Output {
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class TestBubbleFlow extends BubbleFlow<'webhook/http'> {
|
|
7
|
+
constructor();
|
|
8
|
+
handle(payload: BubbleTriggerEventRegistry['webhook/http']): Promise<Output>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=slackagenttest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slackagenttest.d.ts","sourceRoot":"","sources":["../../../src/bubble-flow/sample/slackagenttest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,UAAU,EAKX,MAAM,wBAAwB,CAAC;AAIhC,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,qBAAa,cAAe,SAAQ,UAAU,CAAC,cAAc,CAAC;;IAItD,MAAM,CACV,OAAO,EAAE,0BAA0B,CAAC,cAAc,CAAC,GAClD,OAAO,CAAC,MAAM,CAAC;CA4DnB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { BubbleFlow, DatabaseAnalyzerWorkflowBubble, AIAgentBubble, PostgreSQLBubble, SlackNotifierWorkflowBubble, } from '@bubblelab/bubble-core';
|
|
2
|
+
// This is a test bubble flow that is used to test the bubble flow system
|
|
3
|
+
export class TestBubbleFlow extends BubbleFlow {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('test-flow', 'A flow that handles webhook events');
|
|
6
|
+
}
|
|
7
|
+
async handle(payload) {
|
|
8
|
+
const schemaAnalysis = await new DatabaseAnalyzerWorkflowBubble({
|
|
9
|
+
dataSourceType: 'postgresql',
|
|
10
|
+
ignoreSSLErrors: true,
|
|
11
|
+
includeMetadata: true,
|
|
12
|
+
}).action();
|
|
13
|
+
const sqlQueryResult = await new AIAgentBubble({
|
|
14
|
+
message: payload.body?.userQuery,
|
|
15
|
+
systemPrompt: `You are a helpful assistant that writes PostgreSQL queries.
|
|
16
|
+
|
|
17
|
+
Using this database schema: ${schemaAnalysis.data?.databaseSchema?.cleanedJSON}
|
|
18
|
+
|
|
19
|
+
Write a SQL query to answer the user's question. Return only the query between \`\`\`sql\`\`\` blocks, no other text.`,
|
|
20
|
+
model: {
|
|
21
|
+
model: 'google/gemini-2.5-pro',
|
|
22
|
+
maxTokens: 5000,
|
|
23
|
+
},
|
|
24
|
+
}).action();
|
|
25
|
+
// Extract clean SQL query from AI response
|
|
26
|
+
const sqlMatch = sqlQueryResult.data?.response?.match(/```(?:sql|postgresql)\n([\s\S]*?)\n```/);
|
|
27
|
+
const cleanQuery = sqlMatch ? sqlMatch[1].trim() : null;
|
|
28
|
+
if (!cleanQuery) {
|
|
29
|
+
throw new Error('No valid SQL query generated by AI');
|
|
30
|
+
}
|
|
31
|
+
const queryResult = await new PostgreSQLBubble({
|
|
32
|
+
query: cleanQuery,
|
|
33
|
+
ignoreSSL: true,
|
|
34
|
+
allowedOperations: ['SELECT'], // Safety first!
|
|
35
|
+
timeout: 30000,
|
|
36
|
+
maxRows: 1000,
|
|
37
|
+
}).action();
|
|
38
|
+
if (!queryResult.success) {
|
|
39
|
+
throw new Error(`Query execution failed: ${queryResult.error}`);
|
|
40
|
+
}
|
|
41
|
+
const slackNotification = await new SlackNotifierWorkflowBubble({
|
|
42
|
+
contentToFormat: JSON.stringify(queryResult.data, null, 2),
|
|
43
|
+
originalUserQuery: payload.body?.userQuery,
|
|
44
|
+
targetChannel: 'staging-bot',
|
|
45
|
+
messageTitle: '📊 Automated Data Analysis Results',
|
|
46
|
+
messageStyle: 'professional',
|
|
47
|
+
includeFormatting: true,
|
|
48
|
+
maxMessageLength: 3000,
|
|
49
|
+
aiModel: {
|
|
50
|
+
model: 'google/gemini-2.5-flash',
|
|
51
|
+
temperature: 0.3,
|
|
52
|
+
},
|
|
53
|
+
}).action();
|
|
54
|
+
return {
|
|
55
|
+
message: `Response from ${payload.path}, ${payload.timestamp}, ${payload.type}: ${slackNotification.data?.messageInfo?.formattedMessage} Analysis complete!`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=slackagenttest.js.map
|