@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.
Files changed (275) hide show
  1. package/LICENSE.txt +202 -0
  2. package/dist/bubble-bundle.d.ts +2021 -0
  3. package/dist/bubble-factory.d.ts +161 -0
  4. package/dist/bubble-factory.d.ts.map +1 -0
  5. package/dist/bubble-factory.js +426 -0
  6. package/dist/bubble-factory.js.map +1 -0
  7. package/dist/bubble-flow/bubble-flow-class.d.ts +19 -0
  8. package/dist/bubble-flow/bubble-flow-class.d.ts.map +1 -0
  9. package/dist/bubble-flow/bubble-flow-class.js +23 -0
  10. package/dist/bubble-flow/bubble-flow-class.js.map +1 -0
  11. package/dist/bubble-flow/sample/data-analyst-flow.d.ts +15 -0
  12. package/dist/bubble-flow/sample/data-analyst-flow.d.ts.map +1 -0
  13. package/dist/bubble-flow/sample/data-analyst-flow.js +63 -0
  14. package/dist/bubble-flow/sample/data-analyst-flow.js.map +1 -0
  15. package/dist/bubble-flow/sample/error-ts.d.ts +23 -0
  16. package/dist/bubble-flow/sample/error-ts.d.ts.map +1 -0
  17. package/dist/bubble-flow/sample/error-ts.js +31 -0
  18. package/dist/bubble-flow/sample/error-ts.js.map +1 -0
  19. package/dist/bubble-flow/sample/sanitytest.d.ts +10 -0
  20. package/dist/bubble-flow/sample/sanitytest.d.ts.map +1 -0
  21. package/dist/bubble-flow/sample/sanitytest.js +13 -0
  22. package/dist/bubble-flow/sample/sanitytest.js.map +1 -0
  23. package/dist/bubble-flow/sample/simple-webhook-2.d.ts +19 -0
  24. package/dist/bubble-flow/sample/simple-webhook-2.d.ts.map +1 -0
  25. package/dist/bubble-flow/sample/simple-webhook-2.js +23 -0
  26. package/dist/bubble-flow/sample/simple-webhook-2.js.map +1 -0
  27. package/dist/bubble-flow/sample/simple-webhook.d.ts +10 -0
  28. package/dist/bubble-flow/sample/simple-webhook.d.ts.map +1 -0
  29. package/dist/bubble-flow/sample/simple-webhook.js +18 -0
  30. package/dist/bubble-flow/sample/simple-webhook.js.map +1 -0
  31. package/dist/bubble-flow/sample/simplified-data-analysis.flow.d.ts +29 -0
  32. package/dist/bubble-flow/sample/simplified-data-analysis.flow.d.ts.map +1 -0
  33. package/dist/bubble-flow/sample/simplified-data-analysis.flow.js +150 -0
  34. package/dist/bubble-flow/sample/simplified-data-analysis.flow.js.map +1 -0
  35. package/dist/bubble-flow/sample/slack-v0.1.d.ts +10 -0
  36. package/dist/bubble-flow/sample/slack-v0.1.d.ts.map +1 -0
  37. package/dist/bubble-flow/sample/slack-v0.1.js +59 -0
  38. package/dist/bubble-flow/sample/slack-v0.1.js.map +1 -0
  39. package/dist/bubble-flow/sample/slackagenttest.d.ts +10 -0
  40. package/dist/bubble-flow/sample/slackagenttest.d.ts.map +1 -0
  41. package/dist/bubble-flow/sample/slackagenttest.js +59 -0
  42. package/dist/bubble-flow/sample/slackagenttest.js.map +1 -0
  43. package/dist/bubble-trigger/index.d.ts +2 -0
  44. package/dist/bubble-trigger/index.d.ts.map +1 -0
  45. package/dist/bubble-trigger/index.js +2 -0
  46. package/dist/bubble-trigger/index.js.map +1 -0
  47. package/dist/bubble-trigger/types.d.ts +87 -0
  48. package/dist/bubble-trigger/types.d.ts.map +1 -0
  49. package/dist/bubble-trigger/types.js +14 -0
  50. package/dist/bubble-trigger/types.js.map +1 -0
  51. package/dist/bubbles/service-bubble/ai-agent.d.ts +428 -0
  52. package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -0
  53. package/dist/bubbles/service-bubble/ai-agent.js +881 -0
  54. package/dist/bubbles/service-bubble/ai-agent.js.map +1 -0
  55. package/dist/bubbles/service-bubble/gmail.d.ts +3073 -0
  56. package/dist/bubbles/service-bubble/gmail.d.ts.map +1 -0
  57. package/dist/bubbles/service-bubble/gmail.js +908 -0
  58. package/dist/bubbles/service-bubble/gmail.js.map +1 -0
  59. package/dist/bubbles/service-bubble/google-calendar.d.ts +3377 -0
  60. package/dist/bubbles/service-bubble/google-calendar.d.ts.map +1 -0
  61. package/dist/bubbles/service-bubble/google-calendar.js +527 -0
  62. package/dist/bubbles/service-bubble/google-calendar.js.map +1 -0
  63. package/dist/bubbles/service-bubble/google-drive.d.ts +1152 -0
  64. package/dist/bubbles/service-bubble/google-drive.d.ts.map +1 -0
  65. package/dist/bubbles/service-bubble/google-drive.js +943 -0
  66. package/dist/bubbles/service-bubble/google-drive.js.map +1 -0
  67. package/dist/bubbles/service-bubble/google-sheets.d.ts +1811 -0
  68. package/dist/bubbles/service-bubble/google-sheets.d.ts.map +1 -0
  69. package/dist/bubbles/service-bubble/google-sheets.js +904 -0
  70. package/dist/bubbles/service-bubble/google-sheets.js.map +1 -0
  71. package/dist/bubbles/service-bubble/hello-world.d.ts +74 -0
  72. package/dist/bubbles/service-bubble/hello-world.d.ts.map +1 -0
  73. package/dist/bubbles/service-bubble/hello-world.js +67 -0
  74. package/dist/bubbles/service-bubble/hello-world.js.map +1 -0
  75. package/dist/bubbles/service-bubble/http.d.ts +134 -0
  76. package/dist/bubbles/service-bubble/http.d.ts.map +1 -0
  77. package/dist/bubbles/service-bubble/http.js +184 -0
  78. package/dist/bubbles/service-bubble/http.js.map +1 -0
  79. package/dist/bubbles/service-bubble/postgresql.d.ts +180 -0
  80. package/dist/bubbles/service-bubble/postgresql.d.ts.map +1 -0
  81. package/dist/bubbles/service-bubble/postgresql.js +448 -0
  82. package/dist/bubbles/service-bubble/postgresql.js.map +1 -0
  83. package/dist/bubbles/service-bubble/resend.d.ts +301 -0
  84. package/dist/bubbles/service-bubble/resend.d.ts.map +1 -0
  85. package/dist/bubbles/service-bubble/resend.js +253 -0
  86. package/dist/bubbles/service-bubble/resend.js.map +1 -0
  87. package/dist/bubbles/service-bubble/slack.d.ts +5869 -0
  88. package/dist/bubbles/service-bubble/slack.d.ts.map +1 -0
  89. package/dist/bubbles/service-bubble/slack.js +1536 -0
  90. package/dist/bubbles/service-bubble/slack.js.map +1 -0
  91. package/dist/bubbles/service-bubble/storage.d.ts +571 -0
  92. package/dist/bubbles/service-bubble/storage.d.ts.map +1 -0
  93. package/dist/bubbles/service-bubble/storage.js +504 -0
  94. package/dist/bubbles/service-bubble/storage.js.map +1 -0
  95. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +308 -0
  96. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts.map +1 -0
  97. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js +285 -0
  98. package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.js.map +1 -0
  99. package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +416 -0
  100. package/dist/bubbles/tool-bubble/chart-js-tool.d.ts.map +1 -0
  101. package/dist/bubbles/tool-bubble/chart-js-tool.js +570 -0
  102. package/dist/bubbles/tool-bubble/chart-js-tool.js.map +1 -0
  103. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts +99 -0
  104. package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts.map +1 -0
  105. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js +645 -0
  106. package/dist/bubbles/tool-bubble/get-bubble-details-tool.js.map +1 -0
  107. package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts +112 -0
  108. package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts.map +1 -0
  109. package/dist/bubbles/tool-bubble/list-bubbles-tool.js +82 -0
  110. package/dist/bubbles/tool-bubble/list-bubbles-tool.js.map +1 -0
  111. package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +413 -0
  112. package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts.map +1 -0
  113. package/dist/bubbles/tool-bubble/reddit-scrape-tool.js +327 -0
  114. package/dist/bubbles/tool-bubble/reddit-scrape-tool.js.map +1 -0
  115. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +122 -0
  116. package/dist/bubbles/tool-bubble/research-agent-tool.d.ts.map +1 -0
  117. package/dist/bubbles/tool-bubble/research-agent-tool.js +343 -0
  118. package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -0
  119. package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +131 -0
  120. package/dist/bubbles/tool-bubble/sql-query-tool.d.ts.map +1 -0
  121. package/dist/bubbles/tool-bubble/sql-query-tool.js +147 -0
  122. package/dist/bubbles/tool-bubble/sql-query-tool.js.map +1 -0
  123. package/dist/bubbles/tool-bubble/tool-template.d.ts +257 -0
  124. package/dist/bubbles/tool-bubble/tool-template.d.ts.map +1 -0
  125. package/dist/bubbles/tool-bubble/tool-template.js +238 -0
  126. package/dist/bubbles/tool-bubble/tool-template.js.map +1 -0
  127. package/dist/bubbles/tool-bubble/virtual-file-editor-example.d.ts +8 -0
  128. package/dist/bubbles/tool-bubble/virtual-file-editor-example.d.ts.map +1 -0
  129. package/dist/bubbles/tool-bubble/virtual-file-editor-example.js +65 -0
  130. package/dist/bubbles/tool-bubble/virtual-file-editor-example.js.map +1 -0
  131. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.d.ts +125 -0
  132. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.d.ts.map +1 -0
  133. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.js +169 -0
  134. package/dist/bubbles/tool-bubble/virtual-file-editor.tool.js.map +1 -0
  135. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +218 -0
  136. package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts.map +1 -0
  137. package/dist/bubbles/tool-bubble/web-crawl-tool.js +255 -0
  138. package/dist/bubbles/tool-bubble/web-crawl-tool.js.map +1 -0
  139. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +134 -0
  140. package/dist/bubbles/tool-bubble/web-extract-tool.d.ts.map +1 -0
  141. package/dist/bubbles/tool-bubble/web-extract-tool.js +175 -0
  142. package/dist/bubbles/tool-bubble/web-extract-tool.js.map +1 -0
  143. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +228 -0
  144. package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts.map +1 -0
  145. package/dist/bubbles/tool-bubble/web-scrape-tool.js +214 -0
  146. package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -0
  147. package/dist/bubbles/tool-bubble/web-search-tool.d.ts +134 -0
  148. package/dist/bubbles/tool-bubble/web-search-tool.d.ts.map +1 -0
  149. package/dist/bubbles/tool-bubble/web-search-tool.js +155 -0
  150. package/dist/bubbles/tool-bubble/web-search-tool.js.map +1 -0
  151. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts +114 -0
  152. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts.map +1 -0
  153. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js +777 -0
  154. package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js.map +1 -0
  155. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.d.ts +97 -0
  156. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.d.ts.map +1 -0
  157. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.js +327 -0
  158. package/dist/bubbles/workflow-bubble/bubblscript-generateor.workflow.js.map +1 -0
  159. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts +303 -0
  160. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts.map +1 -0
  161. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.js +297 -0
  162. package/dist/bubbles/workflow-bubble/database-analyzer.workflow.js.map +1 -0
  163. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.d.ts +157 -0
  164. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.d.ts.map +1 -0
  165. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.js +310 -0
  166. package/dist/bubbles/workflow-bubble/file-editor-agent.workflow.js.map +1 -0
  167. package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +543 -0
  168. package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts.map +1 -0
  169. package/dist/bubbles/workflow-bubble/generate-document.workflow.js +628 -0
  170. package/dist/bubbles/workflow-bubble/generate-document.workflow.js.map +1 -0
  171. package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts +679 -0
  172. package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts.map +1 -0
  173. package/dist/bubbles/workflow-bubble/parse-document.workflow.js +604 -0
  174. package/dist/bubbles/workflow-bubble/parse-document.workflow.js.map +1 -0
  175. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +1011 -0
  176. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts.map +1 -0
  177. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js +841 -0
  178. package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js.map +1 -0
  179. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +883 -0
  180. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts.map +1 -0
  181. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js +781 -0
  182. package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js.map +1 -0
  183. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +300 -0
  184. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts.map +1 -0
  185. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js +508 -0
  186. package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js.map +1 -0
  187. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +731 -0
  188. package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts.map +1 -0
  189. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js +690 -0
  190. package/dist/bubbles/workflow-bubble/slack-formatter-agent.js.map +1 -0
  191. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts +401 -0
  192. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts.map +1 -0
  193. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js +382 -0
  194. package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js.map +1 -0
  195. package/dist/bubbles/workflow-bubble/workflow-template.d.ts +144 -0
  196. package/dist/bubbles/workflow-bubble/workflow-template.d.ts.map +1 -0
  197. package/dist/bubbles/workflow-bubble/workflow-template.js +124 -0
  198. package/dist/bubbles/workflow-bubble/workflow-template.js.map +1 -0
  199. package/dist/index.d.ts +46 -0
  200. package/dist/index.d.ts.map +1 -0
  201. package/dist/index.js +53 -0
  202. package/dist/index.js.map +1 -0
  203. package/dist/logging/BubbleLogger.d.ts +146 -0
  204. package/dist/logging/BubbleLogger.d.ts.map +1 -0
  205. package/dist/logging/BubbleLogger.js +472 -0
  206. package/dist/logging/BubbleLogger.js.map +1 -0
  207. package/dist/logging/StreamingBubbleLogger.d.ts +85 -0
  208. package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -0
  209. package/dist/logging/StreamingBubbleLogger.js +340 -0
  210. package/dist/logging/StreamingBubbleLogger.js.map +1 -0
  211. package/dist/types/ai-models.d.ts +4 -0
  212. package/dist/types/ai-models.d.ts.map +1 -0
  213. package/dist/types/ai-models.js +14 -0
  214. package/dist/types/ai-models.js.map +1 -0
  215. package/dist/types/available-tools.d.ts +4 -0
  216. package/dist/types/available-tools.d.ts.map +1 -0
  217. package/dist/types/available-tools.js +19 -0
  218. package/dist/types/available-tools.js.map +1 -0
  219. package/dist/types/base-bubble-class.d.ts +47 -0
  220. package/dist/types/base-bubble-class.d.ts.map +1 -0
  221. package/dist/types/base-bubble-class.js +212 -0
  222. package/dist/types/base-bubble-class.js.map +1 -0
  223. package/dist/types/bubble-errors.d.ts +44 -0
  224. package/dist/types/bubble-errors.d.ts.map +1 -0
  225. package/dist/types/bubble-errors.js +51 -0
  226. package/dist/types/bubble-errors.js.map +1 -0
  227. package/dist/types/bubble.d.ts +73 -0
  228. package/dist/types/bubble.d.ts.map +1 -0
  229. package/dist/types/bubble.js +2 -0
  230. package/dist/types/bubble.js.map +1 -0
  231. package/dist/types/credentials.d.ts +6 -0
  232. package/dist/types/credentials.d.ts.map +1 -0
  233. package/dist/types/credentials.js +6 -0
  234. package/dist/types/credentials.js.map +1 -0
  235. package/dist/types/service-bubble-class.d.ts +31 -0
  236. package/dist/types/service-bubble-class.d.ts.map +1 -0
  237. package/dist/types/service-bubble-class.js +36 -0
  238. package/dist/types/service-bubble-class.js.map +1 -0
  239. package/dist/types/streaming-events.d.ts +18 -0
  240. package/dist/types/streaming-events.d.ts.map +1 -0
  241. package/dist/types/streaming-events.js +5 -0
  242. package/dist/types/streaming-events.js.map +1 -0
  243. package/dist/types/tool-bubble-class.d.ts +19 -0
  244. package/dist/types/tool-bubble-class.d.ts.map +1 -0
  245. package/dist/types/tool-bubble-class.js +48 -0
  246. package/dist/types/tool-bubble-class.js.map +1 -0
  247. package/dist/types/workflow-bubble-class.d.ts +25 -0
  248. package/dist/types/workflow-bubble-class.d.ts.map +1 -0
  249. package/dist/types/workflow-bubble-class.js +30 -0
  250. package/dist/types/workflow-bubble-class.js.map +1 -0
  251. package/dist/utils/bubbleflow-parser.d.ts +32 -0
  252. package/dist/utils/bubbleflow-parser.d.ts.map +1 -0
  253. package/dist/utils/bubbleflow-parser.js +332 -0
  254. package/dist/utils/bubbleflow-parser.js.map +1 -0
  255. package/dist/utils/bubbleflow-validation.d.ts +9 -0
  256. package/dist/utils/bubbleflow-validation.d.ts.map +1 -0
  257. package/dist/utils/bubbleflow-validation.js +116 -0
  258. package/dist/utils/bubbleflow-validation.js.map +1 -0
  259. package/dist/utils/json-parsing.d.ts +20 -0
  260. package/dist/utils/json-parsing.d.ts.map +1 -0
  261. package/dist/utils/json-parsing.js +394 -0
  262. package/dist/utils/json-parsing.js.map +1 -0
  263. package/dist/utils/mock-data-generator.d.ts +43 -0
  264. package/dist/utils/mock-data-generator.d.ts.map +1 -0
  265. package/dist/utils/mock-data-generator.js +312 -0
  266. package/dist/utils/mock-data-generator.js.map +1 -0
  267. package/dist/utils/param-helper.d.ts +2 -0
  268. package/dist/utils/param-helper.d.ts.map +1 -0
  269. package/dist/utils/param-helper.js +5 -0
  270. package/dist/utils/param-helper.js.map +1 -0
  271. package/dist/utils/source-bubble-parser.d.ts +31 -0
  272. package/dist/utils/source-bubble-parser.d.ts.map +1 -0
  273. package/dist/utils/source-bubble-parser.js +231 -0
  274. package/dist/utils/source-bubble-parser.js.map +1 -0
  275. package/package.json +63 -0
@@ -0,0 +1,180 @@
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, type DatabaseMetadata } from '@bubblelab/shared-schemas';
5
+ export declare const SqlOperations: z.ZodEnum<["SELECT", "INSERT", "UPDATE", "DELETE", "WITH", "EXPLAIN", "ANALYZE", "SHOW", "DESCRIBE", "DESC", "CREATE"]>;
6
+ declare const PostgreSQLParamsSchema: z.ZodObject<{
7
+ ignoreSSL: z.ZodDefault<z.ZodBoolean>;
8
+ query: z.ZodEffects<z.ZodString, string, string>;
9
+ allowedOperations: z.ZodDefault<z.ZodArray<z.ZodEnum<["SELECT", "INSERT", "UPDATE", "DELETE", "WITH", "EXPLAIN", "ANALYZE", "SHOW", "DESCRIBE", "DESC", "CREATE"]>, "many">>;
10
+ parameters: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>>;
11
+ timeout: z.ZodDefault<z.ZodNumber>;
12
+ maxRows: z.ZodDefault<z.ZodNumber>;
13
+ credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ parameters: unknown[];
16
+ timeout: number;
17
+ ignoreSSL: boolean;
18
+ query: string;
19
+ allowedOperations: ("SELECT" | "INSERT" | "UPDATE" | "DELETE" | "WITH" | "EXPLAIN" | "ANALYZE" | "SHOW" | "DESCRIBE" | "DESC" | "CREATE")[];
20
+ maxRows: number;
21
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
22
+ }, {
23
+ query: string;
24
+ parameters?: unknown[] | undefined;
25
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
26
+ timeout?: number | undefined;
27
+ ignoreSSL?: boolean | undefined;
28
+ allowedOperations?: ("SELECT" | "INSERT" | "UPDATE" | "DELETE" | "WITH" | "EXPLAIN" | "ANALYZE" | "SHOW" | "DESCRIBE" | "DESC" | "CREATE")[] | undefined;
29
+ maxRows?: number | undefined;
30
+ }>;
31
+ type PostgreSQLParamsInput = z.input<typeof PostgreSQLParamsSchema>;
32
+ type PostgreSQLParams = z.output<typeof PostgreSQLParamsSchema>;
33
+ declare const PostgreSQLResultSchema: z.ZodObject<{
34
+ rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
35
+ rowCount: z.ZodNullable<z.ZodNumber>;
36
+ command: z.ZodString;
37
+ fields: z.ZodOptional<z.ZodArray<z.ZodObject<{
38
+ name: z.ZodString;
39
+ dataTypeID: z.ZodNumber;
40
+ }, "strip", z.ZodTypeAny, {
41
+ name: string;
42
+ dataTypeID: number;
43
+ }, {
44
+ name: string;
45
+ dataTypeID: number;
46
+ }>, "many">>;
47
+ executionTime: z.ZodNumber;
48
+ success: z.ZodBoolean;
49
+ error: z.ZodString;
50
+ cleanedJSONString: z.ZodString;
51
+ }, "strip", z.ZodTypeAny, {
52
+ success: boolean;
53
+ error: string;
54
+ rows: Record<string, unknown>[];
55
+ rowCount: number | null;
56
+ command: string;
57
+ executionTime: number;
58
+ cleanedJSONString: string;
59
+ fields?: {
60
+ name: string;
61
+ dataTypeID: number;
62
+ }[] | undefined;
63
+ }, {
64
+ success: boolean;
65
+ error: string;
66
+ rows: Record<string, unknown>[];
67
+ rowCount: number | null;
68
+ command: string;
69
+ executionTime: number;
70
+ cleanedJSONString: string;
71
+ fields?: {
72
+ name: string;
73
+ dataTypeID: number;
74
+ }[] | undefined;
75
+ }>;
76
+ type PostgreSQLResult = z.output<typeof PostgreSQLResultSchema>;
77
+ export declare class PostgreSQLBubble extends ServiceBubble<PostgreSQLParams, PostgreSQLResult> {
78
+ testCredential(): Promise<boolean>;
79
+ static readonly type: "service";
80
+ static readonly service = "postgresql";
81
+ static readonly authType: "connection-string";
82
+ static readonly bubbleName = "postgresql";
83
+ static readonly schema: z.ZodObject<{
84
+ ignoreSSL: z.ZodDefault<z.ZodBoolean>;
85
+ query: z.ZodEffects<z.ZodString, string, string>;
86
+ allowedOperations: z.ZodDefault<z.ZodArray<z.ZodEnum<["SELECT", "INSERT", "UPDATE", "DELETE", "WITH", "EXPLAIN", "ANALYZE", "SHOW", "DESCRIBE", "DESC", "CREATE"]>, "many">>;
87
+ parameters: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>>;
88
+ timeout: z.ZodDefault<z.ZodNumber>;
89
+ maxRows: z.ZodDefault<z.ZodNumber>;
90
+ credentials: z.ZodOptional<z.ZodRecord<z.ZodNativeEnum<typeof CredentialType>, z.ZodString>>;
91
+ }, "strip", z.ZodTypeAny, {
92
+ parameters: unknown[];
93
+ timeout: number;
94
+ ignoreSSL: boolean;
95
+ query: string;
96
+ allowedOperations: ("SELECT" | "INSERT" | "UPDATE" | "DELETE" | "WITH" | "EXPLAIN" | "ANALYZE" | "SHOW" | "DESCRIBE" | "DESC" | "CREATE")[];
97
+ maxRows: number;
98
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
99
+ }, {
100
+ query: string;
101
+ parameters?: unknown[] | undefined;
102
+ credentials?: Partial<Record<CredentialType, string>> | undefined;
103
+ timeout?: number | undefined;
104
+ ignoreSSL?: boolean | undefined;
105
+ allowedOperations?: ("SELECT" | "INSERT" | "UPDATE" | "DELETE" | "WITH" | "EXPLAIN" | "ANALYZE" | "SHOW" | "DESCRIBE" | "DESC" | "CREATE")[] | undefined;
106
+ maxRows?: number | undefined;
107
+ }>;
108
+ static readonly resultSchema: z.ZodObject<{
109
+ rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
110
+ rowCount: z.ZodNullable<z.ZodNumber>;
111
+ command: z.ZodString;
112
+ fields: z.ZodOptional<z.ZodArray<z.ZodObject<{
113
+ name: z.ZodString;
114
+ dataTypeID: z.ZodNumber;
115
+ }, "strip", z.ZodTypeAny, {
116
+ name: string;
117
+ dataTypeID: number;
118
+ }, {
119
+ name: string;
120
+ dataTypeID: number;
121
+ }>, "many">>;
122
+ executionTime: z.ZodNumber;
123
+ success: z.ZodBoolean;
124
+ error: z.ZodString;
125
+ cleanedJSONString: z.ZodString;
126
+ }, "strip", z.ZodTypeAny, {
127
+ success: boolean;
128
+ error: string;
129
+ rows: Record<string, unknown>[];
130
+ rowCount: number | null;
131
+ command: string;
132
+ executionTime: number;
133
+ cleanedJSONString: string;
134
+ fields?: {
135
+ name: string;
136
+ dataTypeID: number;
137
+ }[] | undefined;
138
+ }, {
139
+ success: boolean;
140
+ error: string;
141
+ rows: Record<string, unknown>[];
142
+ rowCount: number | null;
143
+ command: string;
144
+ executionTime: number;
145
+ cleanedJSONString: string;
146
+ fields?: {
147
+ name: string;
148
+ dataTypeID: number;
149
+ }[] | undefined;
150
+ }>;
151
+ static readonly shortDescription = "Execute PostgreSQL queries with operation validation";
152
+ static readonly longDescription = "\n Execute SQL queries against PostgreSQL databases with proper validation and security controls.\n Use cases:\n - Data retrieval with SELECT queries\n - Data manipulation with INSERT, UPDATE, DELETE (when explicitly allowed)\n - Database reporting and analytics\n - Data migration and synchronization tasks\n - JSON string output for integration with other systems\n \n Security Features:\n - Operation whitelist (defaults to SELECT only)\n - Parameterized queries to prevent SQL injection\n - Connection timeout controls\n - Result sanitization for JSON output\n ";
153
+ static readonly alias = "pg";
154
+ constructor(params?: PostgreSQLParamsInput, context?: BubbleContext);
155
+ protected performAction(context?: BubbleContext): Promise<PostgreSQLResult>;
156
+ getCredentialMetadata(): Promise<DatabaseMetadata | undefined>;
157
+ /**
158
+ * Validate that the SQL query operation is allowed
159
+ */
160
+ private validateSqlOperation;
161
+ /**
162
+ * Validate parameter usage to encourage parameterized queries
163
+ */
164
+ private validateParameterUsage;
165
+ /**
166
+ * Validate parentheses and quotes are balanced
167
+ */
168
+ private validateParenthesesBalance;
169
+ /**
170
+ * Clean and format query results as a JSON string
171
+ */
172
+ private cleanJSONString;
173
+ /**
174
+ * Clean an object by handling special values and preventing circular references
175
+ */
176
+ private cleanObject;
177
+ protected chooseCredential(): string | undefined;
178
+ }
179
+ export {};
180
+ //# sourceMappingURL=postgresql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../../src/bubbles/service-bubble/postgresql.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,EACL,cAAc,EACd,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,aAAa,yHAYxB,CAAC;AAGH,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;EA2F1B,CAAC;AAEH,KAAK,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACpE,KAAK,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGhE,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC1B,CAAC;AAEH,KAAK,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAahE,qBAAa,gBAAiB,SAAQ,aAAa,CACjD,gBAAgB,EAChB,gBAAgB,CACjB;IACc,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAe/C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,gBAAgB;IACvC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAG,mBAAmB,CAAU;IAExD,MAAM,CAAC,QAAQ,CAAC,UAAU,gBAAgB;IAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;OAA0B;IAChD,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA0B;IACtD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,0DACyB;IACzD,MAAM,CAAC,QAAQ,CAAC,eAAe,mmBAc7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ;gBAG3B,MAAM,GAAE,qBAMP,EACD,OAAO,CAAC,EAAE,aAAa;cAST,aAAa,CAC3B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,gBAAgB,CAAC;IAkEtB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAiEpE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuD5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAmClC;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,WAAW;IA2CnB,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;CAWjD"}
@@ -0,0 +1,448 @@
1
+ import { z } from 'zod';
2
+ import { ServiceBubble } from '../../types/service-bubble-class.js';
3
+ import { CredentialType, } from '@bubblelab/shared-schemas';
4
+ import { Pool } from 'pg';
5
+ // Define available SQL operations
6
+ export const SqlOperations = z.enum([
7
+ 'SELECT',
8
+ 'INSERT',
9
+ 'UPDATE',
10
+ 'DELETE',
11
+ 'WITH', // Common Table Expressions for complex analysis
12
+ 'EXPLAIN', // Query execution plans for optimization
13
+ 'ANALYZE', // Table statistics for analysis
14
+ 'SHOW', // Show database/table information
15
+ 'DESCRIBE', // Describe table structure
16
+ 'DESC', // Alias for DESCRIBE
17
+ 'CREATE', // Allow CREATE TEMPORARY for analysis
18
+ ]);
19
+ // Define the parameters schema for the PostgreSQL bubble
20
+ const PostgreSQLParamsSchema = z.object({
21
+ ignoreSSL: z
22
+ .boolean()
23
+ .default(true)
24
+ .describe('Ignore SSL certificate errors when connecting to the database'),
25
+ query: z
26
+ .string()
27
+ .min(1, 'Query is required')
28
+ .refine((query) => {
29
+ // Basic SQL injection patterns to reject
30
+ const suspiciousPatterns = [
31
+ /;\s*--/, // Comment injection
32
+ /;\s*\/\*/, // Block comment injection
33
+ /'\s*;\s*drop/i, // Drop table injection
34
+ /;\s*delete\s+from/i, // Delete injection via semicolon
35
+ /;\s*insert\s+into/i, // Insert injection via semicolon
36
+ /;\s*update\s+\w+\s+set/i, // Update injection via semicolon
37
+ /'\s*;\s*alter/i, // Alter injection
38
+ /'\s*;\s*create/i, // Create injection
39
+ /union\s+select/i, // Union select injection
40
+ /'\s*or\s+1\s*=\s*1/i, // Classic OR injection
41
+ /'\s*or\s+true/i, // OR true injection
42
+ /'\s*and\s+1\s*=\s*1/i, // AND injection
43
+ /exec\s*\(/i, // Stored procedure execution
44
+ /sp_/i, // System stored procedures
45
+ /xp_/i, // Extended stored procedures
46
+ /declare\s+@/i, // Variable declaration
47
+ /cast\s*\(/i, // Type casting (can be used maliciously)
48
+ /convert\s*\(/i, // Type conversion
49
+ /waitfor\s+delay/i, // Time-based attacks
50
+ /benchmark\s*\(/i, // MySQL benchmark attacks
51
+ /sleep\s*\(/i, // Sleep attacks
52
+ /load_file\s*\(/i, // File reading attacks
53
+ /into\s+outfile/i, // File writing attacks
54
+ /information_schema.*password/i, // Block password-related schema probing
55
+ /pg_stat_/i, // PostgreSQL statistics
56
+ /pg_user/i, // PostgreSQL user info
57
+ /current_user\s*\(\)/i, // Function call for user enumeration (but allow current_user as column)
58
+ /session_user/i, // Session enumeration
59
+ /version\s*\(/i, // Version enumeration
60
+ /\bxp_cmdshell\b/i, // Command execution
61
+ /\bdbms_/i, // Oracle DBMS packages
62
+ /\butl_/i, // Oracle UTL packages
63
+ ];
64
+ return !suspiciousPatterns.some((pattern) => pattern.test(query));
65
+ }, 'Query contains potentially dangerous SQL patterns')
66
+ .describe('SQL query to execute against the PostgreSQL database (use parameterized queries with $1, $2, etc.)'),
67
+ allowedOperations: z
68
+ .array(SqlOperations)
69
+ .default([
70
+ 'SELECT',
71
+ 'WITH',
72
+ 'EXPLAIN',
73
+ 'ANALYZE',
74
+ 'SHOW',
75
+ 'DESCRIBE',
76
+ 'DESC',
77
+ ])
78
+ .describe('List of allowed SQL operations for security (defaults to read-only operations)'),
79
+ parameters: z
80
+ .array(z.unknown())
81
+ .optional()
82
+ .default([])
83
+ .describe('Parameters for parameterized queries (e.g., [value1, value2] for $1, $2)'),
84
+ timeout: z
85
+ .number()
86
+ .positive()
87
+ .default(30000)
88
+ .describe('Query timeout in milliseconds (default: 30 seconds, max recommended: 300000)'),
89
+ maxRows: z
90
+ .number()
91
+ .positive()
92
+ .default(1000)
93
+ .describe('Maximum number of rows to return to prevent large result sets (default: 1000)'),
94
+ credentials: z
95
+ .record(z.nativeEnum(CredentialType), z.string())
96
+ .optional()
97
+ .describe('Object mapping credential types to values (injected at runtime)'),
98
+ });
99
+ // Define the result schema for validation
100
+ const PostgreSQLResultSchema = z.object({
101
+ rows: z
102
+ .array(z.record(z.unknown()))
103
+ .describe('Array of result rows, each row is an object with column names as keys'),
104
+ rowCount: z
105
+ .number()
106
+ .nullable()
107
+ .describe('Number of rows affected by the query (null for SELECT queries)'),
108
+ command: z
109
+ .string()
110
+ .describe('SQL command that was executed (SELECT, INSERT, UPDATE, DELETE)'),
111
+ fields: z
112
+ .array(z.object({
113
+ name: z.string().describe('Column name'),
114
+ dataTypeID: z.number().describe('PostgreSQL data type identifier'),
115
+ }))
116
+ .optional()
117
+ .describe('Metadata about the columns returned by the query'),
118
+ executionTime: z.number().describe('Query execution time in milliseconds'),
119
+ success: z.boolean().describe('Whether the query executed successfully'),
120
+ // Make error optional or undefined
121
+ error: z
122
+ .string()
123
+ .describe('Error message if query execution failed (empty string if successful)'),
124
+ cleanedJSONString: z
125
+ .string()
126
+ .describe('Clean JSON string representation of the row data, suitable for AI prompts and integrations'),
127
+ });
128
+ // Example usage:
129
+ // const pgBubble = new PostgreSQLBubble({
130
+ // connectionString: 'postgresql://user:pass@localhost:5432/db',
131
+ // ignoreSSL: false, // Set to true to ignore SSL certificate errors
132
+ // query: 'SELECT * FROM users WHERE active = $1 AND role = $2',
133
+ // parameters: [true, 'admin'],
134
+ // allowedOperations: ['SELECT'],
135
+ // maxRows: 100,
136
+ // timeout: 30000,
137
+ // returnCleanedJSONString: true, // Optional: return results as cleaned JSON string
138
+ // });
139
+ export class PostgreSQLBubble extends ServiceBubble {
140
+ async testCredential() {
141
+ // Make a query to the database to test the credential
142
+ const connectionString = this.chooseCredential();
143
+ const pool = new Pool({
144
+ connectionString,
145
+ ssl: this.params.ignoreSSL ? { rejectUnauthorized: false } : undefined,
146
+ });
147
+ try {
148
+ await pool.query('SELECT 1');
149
+ return true;
150
+ }
151
+ finally {
152
+ await pool.end();
153
+ }
154
+ }
155
+ static type = 'service';
156
+ static service = 'postgresql';
157
+ static authType = 'connection-string';
158
+ // Required static metadata - TypeScript will enforce these exist
159
+ static bubbleName = 'postgresql';
160
+ static schema = PostgreSQLParamsSchema;
161
+ static resultSchema = PostgreSQLResultSchema;
162
+ static shortDescription = 'Execute PostgreSQL queries with operation validation';
163
+ static longDescription = `
164
+ Execute SQL queries against PostgreSQL databases with proper validation and security controls.
165
+ Use cases:
166
+ - Data retrieval with SELECT queries
167
+ - Data manipulation with INSERT, UPDATE, DELETE (when explicitly allowed)
168
+ - Database reporting and analytics
169
+ - Data migration and synchronization tasks
170
+ - JSON string output for integration with other systems
171
+
172
+ Security Features:
173
+ - Operation whitelist (defaults to SELECT only)
174
+ - Parameterized queries to prevent SQL injection
175
+ - Connection timeout controls
176
+ - Result sanitization for JSON output
177
+ `;
178
+ static alias = 'pg';
179
+ constructor(params = {
180
+ query: 'SELECT 1',
181
+ allowedOperations: ['SELECT'],
182
+ parameters: [],
183
+ timeout: 30000,
184
+ maxRows: 1000,
185
+ }, context) {
186
+ super(params, context);
187
+ // Perform additional validation after Zod schema validation
188
+ this.validateSqlOperation(this.params.query, this.params.allowedOperations);
189
+ this.validateParameterUsage(this.params.query, this.params.parameters);
190
+ }
191
+ async performAction(context) {
192
+ // Context is available but not currently used in this implementation
193
+ void context;
194
+ const { ignoreSSL, query, allowedOperations, parameters, timeout, maxRows, } = this.params;
195
+ const startTime = Date.now();
196
+ // Validate the SQL operation against allowed operations
197
+ this.validateSqlOperation(query, allowedOperations);
198
+ // Additional validation: ensure parameters are used for any dynamic values
199
+ this.validateParameterUsage(query, parameters);
200
+ // Create connection pool with strict settings
201
+ // Use chooseCredential to get the appropriate credential
202
+ const connectionString = this.chooseCredential();
203
+ const pool = new Pool({
204
+ connectionString,
205
+ connectionTimeoutMillis: timeout,
206
+ idleTimeoutMillis: timeout,
207
+ max: 1, // Single connection for bubble execution
208
+ allowExitOnIdle: true, // Exit when idle
209
+ statement_timeout: timeout, // Query timeout
210
+ ssl: ignoreSSL ? { rejectUnauthorized: false } : undefined, // SSL configuration
211
+ });
212
+ try {
213
+ // Execute the query with parameters (prevents SQL injection)
214
+ const result = await pool.query(query, parameters);
215
+ const executionTime = Date.now() - startTime;
216
+ // Additional safety: truncate rows if they exceed maxRows
217
+ const truncatedRows = result.rows.slice(0, maxRows);
218
+ const wasTruncated = result.rows.length > maxRows;
219
+ if (wasTruncated) {
220
+ console.warn(`Result set truncated to ${maxRows} rows`);
221
+ }
222
+ return {
223
+ rows: truncatedRows,
224
+ rowCount: result.rowCount,
225
+ command: result.command,
226
+ fields: result.fields?.map((field) => ({
227
+ name: field.name,
228
+ dataTypeID: field.dataTypeID,
229
+ })),
230
+ executionTime,
231
+ success: true,
232
+ error: '',
233
+ cleanedJSONString: this.cleanJSONString(truncatedRows),
234
+ };
235
+ }
236
+ finally {
237
+ // Always close the pool
238
+ await pool.end();
239
+ }
240
+ }
241
+ async getCredentialMetadata() {
242
+ const connectionString = this.chooseCredential();
243
+ if (!connectionString) {
244
+ return undefined;
245
+ }
246
+ const pool = new Pool({
247
+ connectionString,
248
+ ssl: this.params.ignoreSSL ? { rejectUnauthorized: false } : undefined,
249
+ });
250
+ try {
251
+ // Query all schemas, not just 'public'
252
+ const schemaQuery = `
253
+ SELECT
254
+ t.table_schema,
255
+ t.table_name,
256
+ c.column_name,
257
+ c.data_type,
258
+ c.is_nullable,
259
+ c.column_default,
260
+ c.ordinal_position
261
+ FROM information_schema.tables t
262
+ JOIN information_schema.columns c ON t.table_name = c.table_name
263
+ AND t.table_schema = c.table_schema
264
+ WHERE t.table_type = 'BASE TABLE'
265
+ AND t.table_schema NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
266
+ ORDER BY t.table_schema, t.table_name, c.ordinal_position
267
+ `;
268
+ const result = await pool.query(schemaQuery);
269
+ const rawData = result.rows;
270
+ // Process the schema data into the same compact format as database-analyzer
271
+ // Tables from 'public' schema will not have schema prefix, others will
272
+ const compactSchema = {};
273
+ rawData.forEach((row) => {
274
+ const tableSchema = row.table_schema;
275
+ const tableName = row.table_name;
276
+ const columnName = row.column_name;
277
+ const dataType = row.data_type;
278
+ // Format table name: public schema tables have no prefix, others have schema prefix
279
+ const formattedTableName = `${tableSchema}.${tableName}`;
280
+ if (!compactSchema[formattedTableName]) {
281
+ compactSchema[formattedTableName] = {};
282
+ }
283
+ compactSchema[formattedTableName][columnName] = dataType;
284
+ });
285
+ return {
286
+ tables: compactSchema,
287
+ databaseName: 'postgresql_database',
288
+ databaseType: 'postgresql',
289
+ };
290
+ }
291
+ catch (error) {
292
+ console.error('Error getting credential metadata:', error);
293
+ return undefined;
294
+ }
295
+ finally {
296
+ await pool.end();
297
+ }
298
+ }
299
+ /**
300
+ * Validate that the SQL query operation is allowed
301
+ */
302
+ validateSqlOperation(query, allowedOperations) {
303
+ // Extract the first SQL keyword (operation) from the query
304
+ const trimmedQuery = query.trim().toUpperCase();
305
+ const firstKeyword = trimmedQuery.split(/\s+/)[0];
306
+ // Check if the operation is in the allowed list
307
+ const isAllowed = allowedOperations.some((op) => firstKeyword.startsWith(op));
308
+ if (!isAllowed) {
309
+ throw new Error(`SQL operation '${firstKeyword}' is not allowed. Allowed operations: ${allowedOperations.join(', ')}`);
310
+ }
311
+ // Additional validation for dangerous operations
312
+ if (firstKeyword === 'DELETE' && !trimmedQuery.includes('WHERE')) {
313
+ throw new Error('DELETE queries must include a WHERE clause for safety');
314
+ }
315
+ if (firstKeyword === 'UPDATE' && !trimmedQuery.includes('WHERE')) {
316
+ throw new Error('UPDATE queries must include a WHERE clause for safety');
317
+ }
318
+ // Block potentially dangerous keywords using word boundaries
319
+ // Allow CREATE TEMPORARY for analysis but block permanent CREATE operations
320
+ const dangerousKeywords = [
321
+ '\\bDROP\\b',
322
+ '\\bALTER\\b',
323
+ '\\bTRUNCATE\\b',
324
+ '\\bGRANT\\b',
325
+ '\\bREVOKE\\b',
326
+ '\\bCOPY\\b',
327
+ '\\bBULK\\b',
328
+ '\\bLOAD\\b',
329
+ ];
330
+ const containsDangerous = dangerousKeywords.some((keyword) => new RegExp(keyword, 'i').test(trimmedQuery));
331
+ if (containsDangerous) {
332
+ throw new Error(`Query contains potentially dangerous operations. This bubble only supports: ${allowedOperations.join(', ')}`);
333
+ }
334
+ // Validate parentheses balance to prevent injection through unclosed strings
335
+ this.validateParenthesesBalance(query);
336
+ }
337
+ /**
338
+ * Validate parameter usage to encourage parameterized queries
339
+ */
340
+ validateParameterUsage(query, parameters) {
341
+ // Count parameter placeholders ($1, $2, etc.)
342
+ const paramPlaceholders = (query.match(/\$\d+/g) || []).length;
343
+ if (paramPlaceholders !== parameters.length) {
344
+ throw new Error(`Parameter count mismatch: query has ${paramPlaceholders} placeholders but ${parameters.length} parameters provided`);
345
+ }
346
+ // Warn if query contains string literals with potential variables
347
+ const hasStringLiterals = /['"][^'"]*\$[^'"]*['"]/.test(query);
348
+ if (hasStringLiterals) {
349
+ console.warn('Query contains string literals with $ symbols. Consider using parameterized queries.');
350
+ }
351
+ }
352
+ /**
353
+ * Validate parentheses and quotes are balanced
354
+ */
355
+ validateParenthesesBalance(query) {
356
+ let parenCount = 0;
357
+ let singleQuoteCount = 0;
358
+ let doubleQuoteCount = 0;
359
+ for (const char of query) {
360
+ switch (char) {
361
+ case '(':
362
+ parenCount++;
363
+ break;
364
+ case ')':
365
+ parenCount--;
366
+ break;
367
+ case "'":
368
+ singleQuoteCount++;
369
+ break;
370
+ case '"':
371
+ doubleQuoteCount++;
372
+ break;
373
+ }
374
+ }
375
+ if (parenCount !== 0) {
376
+ throw new Error('Unbalanced parentheses in query');
377
+ }
378
+ if (singleQuoteCount % 2 !== 0) {
379
+ throw new Error('Unbalanced single quotes in query');
380
+ }
381
+ if (doubleQuoteCount % 2 !== 0) {
382
+ throw new Error('Unbalanced double quotes in query');
383
+ }
384
+ }
385
+ /**
386
+ * Clean and format query results as a JSON string
387
+ */
388
+ cleanJSONString(rows) {
389
+ try {
390
+ // Clean the data by removing any potential circular references and handling special values
391
+ const cleanedRows = rows.map((row) => this.cleanObject(row));
392
+ // Return just the essential data as a clean JSON string
393
+ return JSON.stringify(cleanedRows, null, 2);
394
+ }
395
+ catch (error) {
396
+ // Fallback to basic JSON stringify if cleaning fails
397
+ console.warn('Failed to clean JSON data, using basic stringify:', error);
398
+ return JSON.stringify(rows, null, 2);
399
+ }
400
+ }
401
+ /**
402
+ * Clean an object by handling special values and preventing circular references
403
+ */
404
+ cleanObject(obj) {
405
+ if (obj === null || obj === undefined) {
406
+ return obj;
407
+ }
408
+ if (typeof obj === 'bigint') {
409
+ return obj.toString();
410
+ }
411
+ if (obj instanceof Date) {
412
+ return obj.toISOString();
413
+ }
414
+ if (obj instanceof Buffer) {
415
+ return `<Buffer ${obj.length} bytes>`;
416
+ }
417
+ if (typeof obj === 'function') {
418
+ return '<function>';
419
+ }
420
+ if (typeof obj === 'symbol') {
421
+ return obj.toString();
422
+ }
423
+ if (Array.isArray(obj)) {
424
+ return obj.map((item) => this.cleanObject(item));
425
+ }
426
+ if (typeof obj === 'object' && obj !== null) {
427
+ const cleaned = {};
428
+ for (const [key, value] of Object.entries(obj)) {
429
+ // Skip functions and symbols as keys
430
+ if (typeof key === 'string') {
431
+ cleaned[key] = this.cleanObject(value);
432
+ }
433
+ }
434
+ return cleaned;
435
+ }
436
+ return obj;
437
+ }
438
+ chooseCredential() {
439
+ const { credentials } = this.params;
440
+ // If no credentials were injected, return undefined
441
+ if (!credentials || typeof credentials !== 'object') {
442
+ throw new Error('No postgres credentials provided');
443
+ }
444
+ // PostgreSQL bubble always uses database credentials
445
+ return credentials[CredentialType.DATABASE_CRED];
446
+ }
447
+ }
448
+ //# sourceMappingURL=postgresql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../../src/bubbles/service-bubble/postgresql.ts"],"names":[],"mappings":"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"}