@bubblelab/bubble-core 0.1.8 → 0.1.9
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/dist/bubble-bundle.d.ts +625 -296
- package/dist/bubble-factory.d.ts.map +1 -1
- package/dist/bubble-factory.js +13 -9
- package/dist/bubble-factory.js.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.d.ts +135 -117
- package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.js +273 -95
- package/dist/bubbles/service-bubble/ai-agent.js.map +1 -1
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts +805 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.js +131 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts +485 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.js +176 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts +302 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.js +138 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts +642 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.js +123 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.d.ts +370 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.js +14 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts +1770 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js +38 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify.d.ts +143 -0
- package/dist/bubbles/service-bubble/apify/apify.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify.js +276 -0
- package/dist/bubbles/service-bubble/apify/apify.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/index.d.ts +4 -0
- package/dist/bubbles/service-bubble/apify/index.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/index.js +3 -0
- package/dist/bubbles/service-bubble/apify/index.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/types.d.ts +7 -0
- package/dist/bubbles/service-bubble/apify/types.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/types.js +6 -0
- package/dist/bubbles/service-bubble/apify/types.js.map +1 -0
- package/dist/bubbles/service-bubble/apify.d.ts +136 -0
- package/dist/bubbles/service-bubble/apify.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify.js +282 -0
- package/dist/bubbles/service-bubble/apify.js.map +1 -0
- package/dist/bubbles/service-bubble/gmail.d.ts +52 -52
- package/dist/bubbles/service-bubble/google-calendar.d.ts +24 -24
- package/dist/bubbles/service-bubble/google-drive.d.ts +68 -68
- package/dist/bubbles/service-bubble/google-sheets.d.ts +64 -64
- package/dist/bubbles/service-bubble/hello-world.d.ts +4 -4
- package/dist/bubbles/service-bubble/http.d.ts +4 -4
- package/dist/bubbles/service-bubble/postgresql.d.ts +12 -12
- package/dist/bubbles/service-bubble/resend.d.ts +13 -13
- package/dist/bubbles/service-bubble/resend.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/resend.js +16 -5
- package/dist/bubbles/service-bubble/resend.js.map +1 -1
- package/dist/bubbles/service-bubble/slack.d.ts +462 -462
- package/dist/bubbles/service-bubble/storage.d.ts +32 -32
- package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +12 -12
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts +14 -1
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.js +85 -39
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/instagram-tool.d.ts +435 -0
- package/dist/bubbles/tool-bubble/instagram-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/instagram-tool.js +474 -0
- package/dist/bubbles/tool-bubble/instagram-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +2136 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.js +608 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +14 -14
- package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +6 -6
- package/dist/bubbles/tool-bubble/research-agent-tool.js +1 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/tool-template.d.ts +4 -4
- package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +16 -16
- package/dist/bubbles/tool-bubble/web-scrape-tool.js +1 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/web-search-tool.d.ts +10 -10
- package/dist/bubbles/tool-bubble/web-search-tool.js +1 -1
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts.map +1 -1
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js +5 -0
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts +4 -4
- package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +78 -78
- package/dist/bubbles/workflow-bubble/generate-document.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/generate-document.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts +50 -50
- package/dist/bubbles/workflow-bubble/parse-document.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/parse-document.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +42 -42
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js +1 -4
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +36 -36
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +40 -40
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +34 -34
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.js +1 -1
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.js.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts +10 -10
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js +1 -2
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js.map +1 -1
- package/dist/bubbles.json +474 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/logging/BubbleLogger.d.ts +11 -0
- package/dist/logging/BubbleLogger.d.ts.map +1 -1
- package/dist/logging/BubbleLogger.js +69 -22
- package/dist/logging/BubbleLogger.js.map +1 -1
- package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -1
- package/dist/logging/StreamingBubbleLogger.js +18 -11
- package/dist/logging/StreamingBubbleLogger.js.map +1 -1
- package/dist/types/ai-models.d.ts +1 -1
- package/dist/types/ai-models.d.ts.map +1 -1
- package/dist/types/ai-models.js +4 -0
- package/dist/types/ai-models.js.map +1 -1
- package/dist/types/api-scraper.schema.d.ts +453 -0
- package/dist/types/api-scraper.schema.d.ts.map +1 -0
- package/dist/types/api-scraper.schema.js +160 -0
- package/dist/types/api-scraper.schema.js.map +1 -0
- package/dist/types/available-tools.d.ts +1 -1
- package/dist/types/available-tools.d.ts.map +1 -1
- package/dist/types/available-tools.js +2 -0
- package/dist/types/available-tools.js.map +1 -1
- package/dist/types/base-bubble-class.d.ts +5 -0
- package/dist/types/base-bubble-class.d.ts.map +1 -1
- package/dist/types/base-bubble-class.js +18 -3
- package/dist/types/base-bubble-class.js.map +1 -1
- package/dist/types/bubble.d.ts +2 -3
- package/dist/types/bubble.d.ts.map +1 -1
- package/dist/types/service-bubble-class.d.ts +4 -4
- package/dist/types/service-bubble-class.d.ts.map +1 -1
- package/dist/types/service-bubble-class.js +6 -7
- package/dist/types/service-bubble-class.js.map +1 -1
- package/dist/types/tool-bubble-class.d.ts.map +1 -1
- package/dist/types/tool-bubble-class.js +9 -1
- package/dist/types/tool-bubble-class.js.map +1 -1
- package/dist/utils/agent-formatter.d.ts +17 -0
- package/dist/utils/agent-formatter.d.ts.map +1 -0
- package/dist/utils/agent-formatter.js +139 -0
- package/dist/utils/agent-formatter.js.map +1 -0
- package/dist/utils/json-parsing.d.ts +1 -0
- package/dist/utils/json-parsing.d.ts.map +1 -1
- package/dist/utils/json-parsing.js +205 -32
- package/dist/utils/json-parsing.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ServiceBubble } from '../../../types/service-bubble-class.js';
|
|
3
|
+
import type { BubbleContext } from '../../../types/bubble.js';
|
|
4
|
+
import { CredentialType } from '@bubblelab/shared-schemas';
|
|
5
|
+
import type { ActorId, ActorOutput } from '../../../types/api-scraper.schema.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generic Apify Bubble - Works with ANY Apify Actor
|
|
8
|
+
*
|
|
9
|
+
* This is a universal service bubble that can run any Apify actor.
|
|
10
|
+
* Actor-specific logic and data transformation should be handled by Tool Bubbles.
|
|
11
|
+
*
|
|
12
|
+
* Examples:
|
|
13
|
+
* - InstagramTool uses this to run 'apify/instagram-scraper'
|
|
14
|
+
* - RedditTool could use this to run 'apify/reddit-scraper'
|
|
15
|
+
* - LinkedInTool could use this to run 'apify/linkedin-scraper'
|
|
16
|
+
*/
|
|
17
|
+
declare const ApifyParamsSchema: z.ZodObject<{
|
|
18
|
+
actorId: z.ZodString;
|
|
19
|
+
input: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
20
|
+
waitForFinish: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
21
|
+
timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
22
|
+
credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
actorId: string;
|
|
25
|
+
input: Record<string, unknown>;
|
|
26
|
+
waitForFinish: boolean;
|
|
27
|
+
timeout: number;
|
|
28
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
29
|
+
}, {
|
|
30
|
+
actorId: string;
|
|
31
|
+
input: Record<string, unknown>;
|
|
32
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
33
|
+
waitForFinish?: boolean | undefined;
|
|
34
|
+
timeout?: number | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
declare const ApifyResultSchema: z.ZodObject<{
|
|
37
|
+
runId: z.ZodString;
|
|
38
|
+
status: z.ZodString;
|
|
39
|
+
datasetId: z.ZodOptional<z.ZodString>;
|
|
40
|
+
items: z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>;
|
|
41
|
+
itemsCount: z.ZodOptional<z.ZodNumber>;
|
|
42
|
+
consoleUrl: z.ZodString;
|
|
43
|
+
success: z.ZodBoolean;
|
|
44
|
+
error: z.ZodString;
|
|
45
|
+
}, "strip", z.ZodTypeAny, {
|
|
46
|
+
status: string;
|
|
47
|
+
success: boolean;
|
|
48
|
+
error: string;
|
|
49
|
+
runId: string;
|
|
50
|
+
consoleUrl: string;
|
|
51
|
+
items?: unknown[] | undefined;
|
|
52
|
+
itemsCount?: number | undefined;
|
|
53
|
+
datasetId?: string | undefined;
|
|
54
|
+
}, {
|
|
55
|
+
status: string;
|
|
56
|
+
success: boolean;
|
|
57
|
+
error: string;
|
|
58
|
+
runId: string;
|
|
59
|
+
consoleUrl: string;
|
|
60
|
+
items?: unknown[] | undefined;
|
|
61
|
+
itemsCount?: number | undefined;
|
|
62
|
+
datasetId?: string | undefined;
|
|
63
|
+
}>;
|
|
64
|
+
export type ApifyParamsInput = z.input<typeof ApifyParamsSchema>;
|
|
65
|
+
export type ApifyActorInput = Record<string, unknown>;
|
|
66
|
+
type ApifyParams = z.output<typeof ApifyParamsSchema>;
|
|
67
|
+
type ApifyResult = z.output<typeof ApifyResultSchema>;
|
|
68
|
+
type TypedApifyResult<T extends string> = T extends ActorId ? Omit<ApifyResult, 'items'> & {
|
|
69
|
+
items?: ActorOutput<T>[];
|
|
70
|
+
} : ApifyResult;
|
|
71
|
+
export declare class ApifyBubble<T extends string = string> extends ServiceBubble<ApifyParams, TypedApifyResult<T>> {
|
|
72
|
+
static readonly service = "apify";
|
|
73
|
+
static readonly authType: "apikey";
|
|
74
|
+
static readonly bubbleName = "apify";
|
|
75
|
+
static readonly type: "service";
|
|
76
|
+
static readonly schema: z.ZodObject<{
|
|
77
|
+
actorId: z.ZodString;
|
|
78
|
+
input: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
79
|
+
waitForFinish: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
80
|
+
timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
81
|
+
credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
|
|
82
|
+
}, "strip", z.ZodTypeAny, {
|
|
83
|
+
actorId: string;
|
|
84
|
+
input: Record<string, unknown>;
|
|
85
|
+
waitForFinish: boolean;
|
|
86
|
+
timeout: number;
|
|
87
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
88
|
+
}, {
|
|
89
|
+
actorId: string;
|
|
90
|
+
input: Record<string, unknown>;
|
|
91
|
+
credentials?: Partial<Record<CredentialType, string>> | undefined;
|
|
92
|
+
waitForFinish?: boolean | undefined;
|
|
93
|
+
timeout?: number | undefined;
|
|
94
|
+
}>;
|
|
95
|
+
static readonly resultSchema: z.ZodObject<{
|
|
96
|
+
runId: z.ZodString;
|
|
97
|
+
status: z.ZodString;
|
|
98
|
+
datasetId: z.ZodOptional<z.ZodString>;
|
|
99
|
+
items: z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>;
|
|
100
|
+
itemsCount: z.ZodOptional<z.ZodNumber>;
|
|
101
|
+
consoleUrl: z.ZodString;
|
|
102
|
+
success: z.ZodBoolean;
|
|
103
|
+
error: z.ZodString;
|
|
104
|
+
}, "strip", z.ZodTypeAny, {
|
|
105
|
+
status: string;
|
|
106
|
+
success: boolean;
|
|
107
|
+
error: string;
|
|
108
|
+
runId: string;
|
|
109
|
+
consoleUrl: string;
|
|
110
|
+
items?: unknown[] | undefined;
|
|
111
|
+
itemsCount?: number | undefined;
|
|
112
|
+
datasetId?: string | undefined;
|
|
113
|
+
}, {
|
|
114
|
+
status: string;
|
|
115
|
+
success: boolean;
|
|
116
|
+
error: string;
|
|
117
|
+
runId: string;
|
|
118
|
+
consoleUrl: string;
|
|
119
|
+
items?: unknown[] | undefined;
|
|
120
|
+
itemsCount?: number | undefined;
|
|
121
|
+
datasetId?: string | undefined;
|
|
122
|
+
}>;
|
|
123
|
+
static readonly shortDescription = "Run any Apify actor for web scraping and automation";
|
|
124
|
+
static readonly longDescription = "\n Universal integration with Apify platform for running any Apify actor.\n\n This is a generic service bubble that can execute any Apify actor with any input.\n Actor-specific logic and data transformation should be handled by Tool Bubbles.\n\n Supported Actors (examples):\n - apify/instagram-scraper - Instagram posts, profiles, hashtags\n - apify/reddit-scraper - Reddit posts, comments, subreddits\n - apify/linkedin-scraper - LinkedIn profiles, companies, jobs\n - apify/web-scraper - Generic web scraping\n - apify/google-search-scraper - Google search results\n - And any other Apify actor available in the marketplace\n\n Features:\n - Asynchronous actor execution with optional wait for completion\n - Automatic result fetching from datasets\n - Generic result handling (works with any actor output)\n - Configurable limits and timeouts\n - Direct access to Apify console for monitoring\n\n Use cases:\n - Social media scraping (Instagram, Reddit, LinkedIn, etc.)\n - Web scraping and data extraction\n - Search engine result scraping\n - E-commerce data collection\n - Market research and competitor analysis\n\n Architecture:\n - Service Bubble (this): Generic Apify API integration\n - Tool Bubbles (e.g. InstagramTool): Domain-specific data transformation\n\n Security:\n - API key authentication (APIFY_CRED)\n - Secure credential injection at runtime\n ";
|
|
125
|
+
static readonly alias = "scrape";
|
|
126
|
+
constructor(params?: ApifyParamsInput, context?: BubbleContext);
|
|
127
|
+
protected chooseCredential(): string | undefined;
|
|
128
|
+
testCredential(): Promise<boolean>;
|
|
129
|
+
protected performAction(context?: BubbleContext): Promise<TypedApifyResult<T>>;
|
|
130
|
+
private startActorRun;
|
|
131
|
+
private waitForActorCompletion;
|
|
132
|
+
private getRunStatus;
|
|
133
|
+
private fetchDatasetItems;
|
|
134
|
+
}
|
|
135
|
+
export {};
|
|
136
|
+
//# sourceMappingURL=apify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apify.d.ts","sourceRoot":"","sources":["../../../src/bubbles/service-bubble/apify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE3E;;;;;;;;;;GAUG;AAGH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EA+BrB,CAAC;AAGH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBrB,CAAC;AAGH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACjE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,KAAK,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACtD,KAAK,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAGtD,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,OAAO,GACvD,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;CAAE,GACzD,WAAW,CAAC;AAWhB,qBAAa,WAAW,CACtB,CAAC,SAAS,MAAM,GAAG,MAAM,CACzB,SAAQ,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAClC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAC7C,MAAM,CAAC,QAAQ,CAAC,UAAU,WAAW;IACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;OAAqB;IAC3C,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAqB;IACjD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,yDACwB;IACxD,MAAM,CAAC,QAAQ,CAAC,eAAe,o7CAmC7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,YAAY;gBAG/B,MAAM,GAAE,gBAMP,EACD,OAAO,CAAC,EAAE,aAAa;IAKzB,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAQnC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;cAoB/B,aAAa,CAC3B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAkGjB,aAAa;YA4Bb,sBAAsB;YA2BtB,YAAY;YAuBZ,iBAAiB;CAoBhC"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ServiceBubble } from '../../types/service-bubble-class.js';
|
|
3
|
+
import { CredentialType } from '@bubblelab/shared-schemas';
|
|
4
|
+
/**
|
|
5
|
+
* Generic Apify Bubble - Works with ANY Apify Actor
|
|
6
|
+
*
|
|
7
|
+
* This is a universal service bubble that can run any Apify actor.
|
|
8
|
+
* Actor-specific logic and data transformation should be handled by Tool Bubbles.
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* - InstagramTool uses this to run 'apify/instagram-scraper'
|
|
12
|
+
* - RedditTool could use this to run 'apify/reddit-scraper'
|
|
13
|
+
* - LinkedInTool could use this to run 'apify/linkedin-scraper'
|
|
14
|
+
*/
|
|
15
|
+
// Define the parameters schema for Apify operations
|
|
16
|
+
const ApifyParamsSchema = z.object({
|
|
17
|
+
actorId: z
|
|
18
|
+
.string()
|
|
19
|
+
.describe('The Apify actor to run. Examples: "apify/instagram-scraper", "apify/reddit-scraper", etc.'),
|
|
20
|
+
input: z
|
|
21
|
+
.record(z.unknown())
|
|
22
|
+
.describe('Input parameters for the actor. Structure depends on the specific actor being used.'),
|
|
23
|
+
waitForFinish: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.optional()
|
|
26
|
+
.default(true)
|
|
27
|
+
.describe('Whether to wait for the actor run to complete before returning'),
|
|
28
|
+
timeout: z
|
|
29
|
+
.number()
|
|
30
|
+
.min(1000)
|
|
31
|
+
.max(300000)
|
|
32
|
+
.optional()
|
|
33
|
+
.default(120000)
|
|
34
|
+
.describe('Maximum time to wait for actor completion in milliseconds (default: 120000)'),
|
|
35
|
+
credentials: z
|
|
36
|
+
.record(z.nativeEnum(CredentialType), z.string())
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('Object mapping credential types to values (injected at runtime)'),
|
|
39
|
+
});
|
|
40
|
+
// Result schema for Apify operations (generic for any actor)
|
|
41
|
+
const ApifyResultSchema = z.object({
|
|
42
|
+
runId: z.string().describe('Apify actor run ID'),
|
|
43
|
+
status: z
|
|
44
|
+
.string()
|
|
45
|
+
.describe('Actor run status (READY, RUNNING, SUCCEEDED, FAILED, etc.)'),
|
|
46
|
+
datasetId: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Dataset ID where results are stored'),
|
|
50
|
+
items: z
|
|
51
|
+
.array(z.unknown())
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('Array of scraped items (if waitForFinish is true). Structure depends on the actor.'),
|
|
54
|
+
itemsCount: z.number().optional().describe('Total number of items scraped'),
|
|
55
|
+
consoleUrl: z.string().describe('URL to view the actor run in Apify console'),
|
|
56
|
+
success: z.boolean().describe('Whether the operation was successful'),
|
|
57
|
+
error: z.string().describe('Error message if operation failed'),
|
|
58
|
+
});
|
|
59
|
+
export class ApifyBubble extends ServiceBubble {
|
|
60
|
+
static service = 'apify';
|
|
61
|
+
static authType = 'apikey';
|
|
62
|
+
static bubbleName = 'apify';
|
|
63
|
+
static type = 'service';
|
|
64
|
+
static schema = ApifyParamsSchema;
|
|
65
|
+
static resultSchema = ApifyResultSchema;
|
|
66
|
+
static shortDescription = 'Run any Apify actor for web scraping and automation';
|
|
67
|
+
static longDescription = `
|
|
68
|
+
Universal integration with Apify platform for running any Apify actor.
|
|
69
|
+
|
|
70
|
+
This is a generic service bubble that can execute any Apify actor with any input.
|
|
71
|
+
Actor-specific logic and data transformation should be handled by Tool Bubbles.
|
|
72
|
+
|
|
73
|
+
Supported Actors (examples):
|
|
74
|
+
- apify/instagram-scraper - Instagram posts, profiles, hashtags
|
|
75
|
+
- apify/reddit-scraper - Reddit posts, comments, subreddits
|
|
76
|
+
- apify/linkedin-scraper - LinkedIn profiles, companies, jobs
|
|
77
|
+
- apify/web-scraper - Generic web scraping
|
|
78
|
+
- apify/google-search-scraper - Google search results
|
|
79
|
+
- And any other Apify actor available in the marketplace
|
|
80
|
+
|
|
81
|
+
Features:
|
|
82
|
+
- Asynchronous actor execution with optional wait for completion
|
|
83
|
+
- Automatic result fetching from datasets
|
|
84
|
+
- Generic result handling (works with any actor output)
|
|
85
|
+
- Configurable limits and timeouts
|
|
86
|
+
- Direct access to Apify console for monitoring
|
|
87
|
+
|
|
88
|
+
Use cases:
|
|
89
|
+
- Social media scraping (Instagram, Reddit, LinkedIn, etc.)
|
|
90
|
+
- Web scraping and data extraction
|
|
91
|
+
- Search engine result scraping
|
|
92
|
+
- E-commerce data collection
|
|
93
|
+
- Market research and competitor analysis
|
|
94
|
+
|
|
95
|
+
Architecture:
|
|
96
|
+
- Service Bubble (this): Generic Apify API integration
|
|
97
|
+
- Tool Bubbles (e.g. InstagramTool): Domain-specific data transformation
|
|
98
|
+
|
|
99
|
+
Security:
|
|
100
|
+
- API key authentication (APIFY_CRED)
|
|
101
|
+
- Secure credential injection at runtime
|
|
102
|
+
`;
|
|
103
|
+
static alias = 'scrape';
|
|
104
|
+
constructor(params = {
|
|
105
|
+
actorId: 'apify/web-scraper',
|
|
106
|
+
input: {
|
|
107
|
+
startUrls: [{ url: 'https://example.com' }],
|
|
108
|
+
maxRequestsPerCrawl: 10,
|
|
109
|
+
},
|
|
110
|
+
}, context) {
|
|
111
|
+
super(params, context);
|
|
112
|
+
}
|
|
113
|
+
chooseCredential() {
|
|
114
|
+
const credentials = this.params.credentials;
|
|
115
|
+
if (!credentials || typeof credentials !== 'object') {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
return credentials[CredentialType.APIFY_CRED];
|
|
119
|
+
}
|
|
120
|
+
async testCredential() {
|
|
121
|
+
const apiToken = this.chooseCredential();
|
|
122
|
+
if (!apiToken) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
// Test the credential by making a simple API call to get user info
|
|
127
|
+
const response = await fetch('https://api.apify.com/v2/users/me', {
|
|
128
|
+
headers: {
|
|
129
|
+
Authorization: `Bearer ${apiToken}`,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
return response.ok;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async performAction(context) {
|
|
139
|
+
void context;
|
|
140
|
+
const apiToken = this.chooseCredential();
|
|
141
|
+
if (!apiToken) {
|
|
142
|
+
return {
|
|
143
|
+
runId: '',
|
|
144
|
+
status: 'FAILED',
|
|
145
|
+
consoleUrl: '',
|
|
146
|
+
success: false,
|
|
147
|
+
error: 'Apify API token is required but was not provided',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const { actorId, input, waitForFinish, timeout } = this.params;
|
|
152
|
+
// Start the actor run
|
|
153
|
+
const runResponse = await this.startActorRun(apiToken, actorId, input);
|
|
154
|
+
if (!runResponse.data?.id) {
|
|
155
|
+
return {
|
|
156
|
+
runId: '',
|
|
157
|
+
status: 'FAILED',
|
|
158
|
+
consoleUrl: '',
|
|
159
|
+
success: false,
|
|
160
|
+
error: 'Failed to start actor run - no run ID returned',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const runId = runResponse.data.id;
|
|
164
|
+
const consoleUrl = `https://console.apify.com/actors/runs/${runId}`;
|
|
165
|
+
// If not waiting for finish, return immediately
|
|
166
|
+
if (!waitForFinish) {
|
|
167
|
+
return {
|
|
168
|
+
runId,
|
|
169
|
+
status: runResponse.data.status,
|
|
170
|
+
datasetId: runResponse.data.defaultDatasetId,
|
|
171
|
+
consoleUrl,
|
|
172
|
+
success: true,
|
|
173
|
+
error: '',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Wait for actor to finish
|
|
177
|
+
const finalStatus = await this.waitForActorCompletion(apiToken, runId, timeout || 120000);
|
|
178
|
+
if (finalStatus.status !== 'SUCCEEDED') {
|
|
179
|
+
return {
|
|
180
|
+
runId,
|
|
181
|
+
status: finalStatus.status,
|
|
182
|
+
datasetId: finalStatus.defaultDatasetId,
|
|
183
|
+
consoleUrl,
|
|
184
|
+
success: false,
|
|
185
|
+
error: `Actor run ${finalStatus.status.toLowerCase()}: ${finalStatus.status}`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// Fetch results from dataset
|
|
189
|
+
const items = [];
|
|
190
|
+
let itemsCount = 0;
|
|
191
|
+
if (finalStatus.defaultDatasetId) {
|
|
192
|
+
const datasetItems = await this.fetchDatasetItems(apiToken, finalStatus.defaultDatasetId);
|
|
193
|
+
items.push(...datasetItems);
|
|
194
|
+
itemsCount = items.length;
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
runId,
|
|
198
|
+
status: finalStatus.status,
|
|
199
|
+
datasetId: finalStatus.defaultDatasetId,
|
|
200
|
+
items,
|
|
201
|
+
itemsCount,
|
|
202
|
+
consoleUrl,
|
|
203
|
+
success: true,
|
|
204
|
+
error: '',
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return {
|
|
209
|
+
runId: '',
|
|
210
|
+
status: 'FAILED',
|
|
211
|
+
consoleUrl: '',
|
|
212
|
+
success: false,
|
|
213
|
+
error: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async startActorRun(apiToken, actorId, input) {
|
|
218
|
+
// Replace '/' with '~' in actor ID for API endpoint
|
|
219
|
+
const apiActorId = actorId.replace('/', '~');
|
|
220
|
+
const url = `https://api.apify.com/v2/acts/${apiActorId}/runs`;
|
|
221
|
+
const response = await fetch(url, {
|
|
222
|
+
method: 'POST',
|
|
223
|
+
headers: {
|
|
224
|
+
'Content-Type': 'application/json',
|
|
225
|
+
Authorization: `Bearer ${apiToken}`,
|
|
226
|
+
},
|
|
227
|
+
body: JSON.stringify(input),
|
|
228
|
+
});
|
|
229
|
+
if (!response.ok) {
|
|
230
|
+
const errorText = await response.text();
|
|
231
|
+
throw new Error(`Failed to start Apify actor: ${response.status} - ${errorText}`);
|
|
232
|
+
}
|
|
233
|
+
return response.json();
|
|
234
|
+
}
|
|
235
|
+
async waitForActorCompletion(apiToken, runId, timeout) {
|
|
236
|
+
const startTime = Date.now();
|
|
237
|
+
const pollInterval = 2000; // Poll every 2 seconds
|
|
238
|
+
while (Date.now() - startTime < timeout) {
|
|
239
|
+
const status = await this.getRunStatus(apiToken, runId);
|
|
240
|
+
if (status.status === 'SUCCEEDED' ||
|
|
241
|
+
status.status === 'FAILED' ||
|
|
242
|
+
status.status === 'ABORTED' ||
|
|
243
|
+
status.status === 'TIMED-OUT') {
|
|
244
|
+
return status;
|
|
245
|
+
}
|
|
246
|
+
// Wait before polling again
|
|
247
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
248
|
+
}
|
|
249
|
+
throw new Error(`Actor run timed out after ${timeout}ms`);
|
|
250
|
+
}
|
|
251
|
+
async getRunStatus(apiToken, runId) {
|
|
252
|
+
const url = `https://api.apify.com/v2/actor-runs/${runId}`;
|
|
253
|
+
const response = await fetch(url, {
|
|
254
|
+
headers: {
|
|
255
|
+
Authorization: `Bearer ${apiToken}`,
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
if (!response.ok) {
|
|
259
|
+
throw new Error(`Failed to get run status: ${response.status}`);
|
|
260
|
+
}
|
|
261
|
+
const data = (await response.json());
|
|
262
|
+
return {
|
|
263
|
+
status: data.data.status,
|
|
264
|
+
defaultDatasetId: data.data.defaultDatasetId,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
async fetchDatasetItems(apiToken, datasetId) {
|
|
268
|
+
const url = `https://api.apify.com/v2/datasets/${datasetId}/items`;
|
|
269
|
+
const response = await fetch(url, {
|
|
270
|
+
headers: {
|
|
271
|
+
Authorization: `Bearer ${apiToken}`,
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
if (!response.ok) {
|
|
275
|
+
throw new Error(`Failed to fetch dataset items: ${response.status}`);
|
|
276
|
+
}
|
|
277
|
+
// Apify returns items directly as an array, not wrapped in a data object
|
|
278
|
+
const items = (await response.json());
|
|
279
|
+
return items;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=apify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apify.js","sourceRoot":"","sources":["../../../src/bubbles/service-bubble/apify.ts"],"names":[],"mappings":"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"}
|