@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.
Files changed (160) hide show
  1. package/dist/bubble-bundle.d.ts +625 -296
  2. package/dist/bubble-factory.d.ts.map +1 -1
  3. package/dist/bubble-factory.js +13 -9
  4. package/dist/bubble-factory.js.map +1 -1
  5. package/dist/bubbles/service-bubble/ai-agent.d.ts +135 -117
  6. package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -1
  7. package/dist/bubbles/service-bubble/ai-agent.js +273 -95
  8. package/dist/bubbles/service-bubble/ai-agent.js.map +1 -1
  9. package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts +805 -0
  10. package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts.map +1 -0
  11. package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.js +131 -0
  12. package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.js.map +1 -0
  13. package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts +485 -0
  14. package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts.map +1 -0
  15. package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.js +176 -0
  16. package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.js.map +1 -0
  17. package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts +302 -0
  18. package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts.map +1 -0
  19. package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.js +138 -0
  20. package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.js.map +1 -0
  21. package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts +642 -0
  22. package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts.map +1 -0
  23. package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.js +123 -0
  24. package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.js.map +1 -0
  25. package/dist/bubbles/service-bubble/apify/api-scraper.schema.d.ts +370 -0
  26. package/dist/bubbles/service-bubble/apify/api-scraper.schema.d.ts.map +1 -0
  27. package/dist/bubbles/service-bubble/apify/api-scraper.schema.js +14 -0
  28. package/dist/bubbles/service-bubble/apify/api-scraper.schema.js.map +1 -0
  29. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts +1770 -0
  30. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts.map +1 -0
  31. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js +38 -0
  32. package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js.map +1 -0
  33. package/dist/bubbles/service-bubble/apify/apify.d.ts +143 -0
  34. package/dist/bubbles/service-bubble/apify/apify.d.ts.map +1 -0
  35. package/dist/bubbles/service-bubble/apify/apify.js +276 -0
  36. package/dist/bubbles/service-bubble/apify/apify.js.map +1 -0
  37. package/dist/bubbles/service-bubble/apify/index.d.ts +4 -0
  38. package/dist/bubbles/service-bubble/apify/index.d.ts.map +1 -0
  39. package/dist/bubbles/service-bubble/apify/index.js +3 -0
  40. package/dist/bubbles/service-bubble/apify/index.js.map +1 -0
  41. package/dist/bubbles/service-bubble/apify/types.d.ts +7 -0
  42. package/dist/bubbles/service-bubble/apify/types.d.ts.map +1 -0
  43. package/dist/bubbles/service-bubble/apify/types.js +6 -0
  44. package/dist/bubbles/service-bubble/apify/types.js.map +1 -0
  45. package/dist/bubbles/service-bubble/apify.d.ts +136 -0
  46. package/dist/bubbles/service-bubble/apify.d.ts.map +1 -0
  47. package/dist/bubbles/service-bubble/apify.js +282 -0
  48. package/dist/bubbles/service-bubble/apify.js.map +1 -0
  49. package/dist/bubbles/service-bubble/gmail.d.ts +52 -52
  50. package/dist/bubbles/service-bubble/google-calendar.d.ts +24 -24
  51. package/dist/bubbles/service-bubble/google-drive.d.ts +68 -68
  52. package/dist/bubbles/service-bubble/google-sheets.d.ts +64 -64
  53. package/dist/bubbles/service-bubble/hello-world.d.ts +4 -4
  54. package/dist/bubbles/service-bubble/http.d.ts +4 -4
  55. package/dist/bubbles/service-bubble/postgresql.d.ts +12 -12
  56. package/dist/bubbles/service-bubble/resend.d.ts +13 -13
  57. package/dist/bubbles/service-bubble/resend.d.ts.map +1 -1
  58. package/dist/bubbles/service-bubble/resend.js +16 -5
  59. package/dist/bubbles/service-bubble/resend.js.map +1 -1
  60. package/dist/bubbles/service-bubble/slack.d.ts +462 -462
  61. package/dist/bubbles/service-bubble/storage.d.ts +32 -32
  62. package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +12 -12
  63. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts +14 -1
  64. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts.map +1 -1
  65. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js +85 -39
  66. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js.map +1 -1
  67. package/dist/bubbles/tool-bubble/instagram-tool.d.ts +435 -0
  68. package/dist/bubbles/tool-bubble/instagram-tool.d.ts.map +1 -0
  69. package/dist/bubbles/tool-bubble/instagram-tool.js +474 -0
  70. package/dist/bubbles/tool-bubble/instagram-tool.js.map +1 -0
  71. package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +2136 -0
  72. package/dist/bubbles/tool-bubble/linkedin-tool.d.ts.map +1 -0
  73. package/dist/bubbles/tool-bubble/linkedin-tool.js +608 -0
  74. package/dist/bubbles/tool-bubble/linkedin-tool.js.map +1 -0
  75. package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +14 -14
  76. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +6 -6
  77. package/dist/bubbles/tool-bubble/research-agent-tool.js +1 -1
  78. package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -1
  79. package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +8 -8
  80. package/dist/bubbles/tool-bubble/tool-template.d.ts +4 -4
  81. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +4 -4
  82. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +8 -8
  83. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +16 -16
  84. package/dist/bubbles/tool-bubble/web-scrape-tool.js +1 -1
  85. package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -1
  86. package/dist/bubbles/tool-bubble/web-search-tool.d.ts +10 -10
  87. package/dist/bubbles/tool-bubble/web-search-tool.js +1 -1
  88. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts.map +1 -1
  89. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js +5 -0
  90. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js.map +1 -1
  91. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts +4 -4
  92. package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +78 -78
  93. package/dist/bubbles/workflow-bubble/generate-document.workflow.js +1 -1
  94. package/dist/bubbles/workflow-bubble/generate-document.workflow.js.map +1 -1
  95. package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts +50 -50
  96. package/dist/bubbles/workflow-bubble/parse-document.workflow.js +1 -1
  97. package/dist/bubbles/workflow-bubble/parse-document.workflow.js.map +1 -1
  98. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +42 -42
  99. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts.map +1 -1
  100. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js +1 -4
  101. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js.map +1 -1
  102. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +36 -36
  103. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js +1 -1
  104. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js.map +1 -1
  105. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +40 -40
  106. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js +1 -1
  107. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js.map +1 -1
  108. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +34 -34
  109. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js +1 -1
  110. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js.map +1 -1
  111. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts +10 -10
  112. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts.map +1 -1
  113. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js +1 -2
  114. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js.map +1 -1
  115. package/dist/bubbles.json +474 -0
  116. package/dist/index.d.ts +12 -1
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +6 -0
  119. package/dist/index.js.map +1 -1
  120. package/dist/logging/BubbleLogger.d.ts +11 -0
  121. package/dist/logging/BubbleLogger.d.ts.map +1 -1
  122. package/dist/logging/BubbleLogger.js +69 -22
  123. package/dist/logging/BubbleLogger.js.map +1 -1
  124. package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -1
  125. package/dist/logging/StreamingBubbleLogger.js +18 -11
  126. package/dist/logging/StreamingBubbleLogger.js.map +1 -1
  127. package/dist/types/ai-models.d.ts +1 -1
  128. package/dist/types/ai-models.d.ts.map +1 -1
  129. package/dist/types/ai-models.js +4 -0
  130. package/dist/types/ai-models.js.map +1 -1
  131. package/dist/types/api-scraper.schema.d.ts +453 -0
  132. package/dist/types/api-scraper.schema.d.ts.map +1 -0
  133. package/dist/types/api-scraper.schema.js +160 -0
  134. package/dist/types/api-scraper.schema.js.map +1 -0
  135. package/dist/types/available-tools.d.ts +1 -1
  136. package/dist/types/available-tools.d.ts.map +1 -1
  137. package/dist/types/available-tools.js +2 -0
  138. package/dist/types/available-tools.js.map +1 -1
  139. package/dist/types/base-bubble-class.d.ts +5 -0
  140. package/dist/types/base-bubble-class.d.ts.map +1 -1
  141. package/dist/types/base-bubble-class.js +18 -3
  142. package/dist/types/base-bubble-class.js.map +1 -1
  143. package/dist/types/bubble.d.ts +2 -3
  144. package/dist/types/bubble.d.ts.map +1 -1
  145. package/dist/types/service-bubble-class.d.ts +4 -4
  146. package/dist/types/service-bubble-class.d.ts.map +1 -1
  147. package/dist/types/service-bubble-class.js +6 -7
  148. package/dist/types/service-bubble-class.js.map +1 -1
  149. package/dist/types/tool-bubble-class.d.ts.map +1 -1
  150. package/dist/types/tool-bubble-class.js +9 -1
  151. package/dist/types/tool-bubble-class.js.map +1 -1
  152. package/dist/utils/agent-formatter.d.ts +17 -0
  153. package/dist/utils/agent-formatter.d.ts.map +1 -0
  154. package/dist/utils/agent-formatter.js +139 -0
  155. package/dist/utils/agent-formatter.js.map +1 -0
  156. package/dist/utils/json-parsing.d.ts +1 -0
  157. package/dist/utils/json-parsing.d.ts.map +1 -1
  158. package/dist/utils/json-parsing.js +205 -32
  159. package/dist/utils/json-parsing.js.map +1 -1
  160. 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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"}