opensentinel 2.1.1 → 3.1.1

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 (268) hide show
  1. package/README.md +354 -283
  2. package/dist/archiver-AVNBYCKQ.js +15340 -0
  3. package/dist/archiver-AVNBYCKQ.js.map +1 -0
  4. package/dist/audit-logger-OBPR7CRO.js +22 -0
  5. package/dist/auth-UOX5K2BE.js +18 -0
  6. package/dist/autonomy-ZXDBDQUJ.js +86 -0
  7. package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
  8. package/dist/aws-s3-Q4LLZZPD.js +146 -0
  9. package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
  10. package/dist/backup-restore-PZ7CYYB7.js +16 -0
  11. package/dist/blocks-R3PODY47.js +23 -0
  12. package/dist/bot-QRARP4UN.js +36 -0
  13. package/dist/brain-7XLLM3KC.js +56 -0
  14. package/dist/camera-monitor-M5CYKUU4.js +335 -0
  15. package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
  16. package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
  17. package/dist/chunk-22VGGA7S.js +330 -0
  18. package/dist/chunk-22VGGA7S.js.map +1 -0
  19. package/dist/chunk-35WYTA3C.js +382 -0
  20. package/dist/chunk-35WYTA3C.js.map +1 -0
  21. package/dist/chunk-3E2PSU2C.js +146 -0
  22. package/dist/chunk-3E2PSU2C.js.map +1 -0
  23. package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
  24. package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
  25. package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
  26. package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
  27. package/dist/chunk-6KONMXQ6.js +297 -0
  28. package/dist/chunk-6KONMXQ6.js.map +1 -0
  29. package/dist/chunk-6PMVAAA7.js +196 -0
  30. package/dist/chunk-6PMVAAA7.js.map +1 -0
  31. package/dist/chunk-766ASQWE.js +32620 -0
  32. package/dist/chunk-766ASQWE.js.map +1 -0
  33. package/dist/chunk-7WQO5J2M.js +29 -0
  34. package/dist/chunk-7WQO5J2M.js.map +1 -0
  35. package/dist/chunk-APHSRMBS.js +148 -0
  36. package/dist/chunk-APHSRMBS.js.map +1 -0
  37. package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
  38. package/dist/chunk-AYUKPTSM.js.map +1 -0
  39. package/dist/chunk-BIPYADGB.js +84 -0
  40. package/dist/chunk-BIPYADGB.js.map +1 -0
  41. package/dist/chunk-BRBWNV65.js +457 -0
  42. package/dist/chunk-BRBWNV65.js.map +1 -0
  43. package/dist/chunk-BXZ6EA52.js +382 -0
  44. package/dist/chunk-BXZ6EA52.js.map +1 -0
  45. package/dist/chunk-EVE7MIIY.js +290 -0
  46. package/dist/chunk-EVE7MIIY.js.map +1 -0
  47. package/dist/chunk-F3TTNID2.js +138 -0
  48. package/dist/chunk-F3TTNID2.js.map +1 -0
  49. package/dist/chunk-H5RQOFO2.js +190 -0
  50. package/dist/chunk-H5RQOFO2.js.map +1 -0
  51. package/dist/chunk-HN3F4WSW.js +145 -0
  52. package/dist/chunk-HN3F4WSW.js.map +1 -0
  53. package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
  54. package/dist/chunk-I6BDYQIG.js.map +1 -0
  55. package/dist/chunk-IZJMVV7O.js +347 -0
  56. package/dist/chunk-IZJMVV7O.js.map +1 -0
  57. package/dist/chunk-KM22GV7G.js +211 -0
  58. package/dist/chunk-KM22GV7G.js.map +1 -0
  59. package/dist/chunk-MGFBLVR7.js +103 -0
  60. package/dist/chunk-MGFBLVR7.js.map +1 -0
  61. package/dist/chunk-MQJ2ECQT.js +228 -0
  62. package/dist/chunk-MQJ2ECQT.js.map +1 -0
  63. package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
  64. package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
  65. package/dist/chunk-NPRTSZIF.js +131 -0
  66. package/dist/chunk-NPRTSZIF.js.map +1 -0
  67. package/dist/chunk-O7IH7JTI.js +1898 -0
  68. package/dist/chunk-O7IH7JTI.js.map +1 -0
  69. package/dist/chunk-OCVQGBJK.js +293 -0
  70. package/dist/chunk-OCVQGBJK.js.map +1 -0
  71. package/dist/chunk-P6QINGFL.js +332 -0
  72. package/dist/chunk-P6QINGFL.js.map +1 -0
  73. package/dist/chunk-PHDZKPNE.js +91 -0
  74. package/dist/chunk-PHDZKPNE.js.map +1 -0
  75. package/dist/chunk-PLDDJCW6.js +49 -0
  76. package/dist/chunk-PTGTGXV2.js +164 -0
  77. package/dist/chunk-PTGTGXV2.js.map +1 -0
  78. package/dist/chunk-REMIY4U2.js +171 -0
  79. package/dist/chunk-REMIY4U2.js.map +1 -0
  80. package/dist/chunk-RZ4YESBG.js +141 -0
  81. package/dist/chunk-RZ4YESBG.js.map +1 -0
  82. package/dist/chunk-SAX5MHK4.js +111 -0
  83. package/dist/chunk-SAX5MHK4.js.map +1 -0
  84. package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
  85. package/dist/chunk-SPPMCAKG.js +777 -0
  86. package/dist/chunk-SPPMCAKG.js.map +1 -0
  87. package/dist/chunk-SVAPX2XN.js +2441 -0
  88. package/dist/chunk-SVAPX2XN.js.map +1 -0
  89. package/dist/chunk-TVEWKIK3.js +452 -0
  90. package/dist/chunk-TVEWKIK3.js.map +1 -0
  91. package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
  92. package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
  93. package/dist/chunk-VNX5GMTN.js +128 -0
  94. package/dist/chunk-VNX5GMTN.js.map +1 -0
  95. package/dist/chunk-VRD5CYRL.js +1568 -0
  96. package/dist/chunk-VRD5CYRL.js.map +1 -0
  97. package/dist/chunk-WLUHNG6X.js +122 -0
  98. package/dist/chunk-WLUHNG6X.js.map +1 -0
  99. package/dist/chunk-WRAKK6K6.js +265 -0
  100. package/dist/chunk-WRAKK6K6.js.map +1 -0
  101. package/dist/chunk-XKYRH4FM.js +681 -0
  102. package/dist/chunk-XKYRH4FM.js.map +1 -0
  103. package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
  104. package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
  105. package/dist/chunk-ZLZKF2PM.js +310 -0
  106. package/dist/chunk-ZLZKF2PM.js.map +1 -0
  107. package/dist/cli.js +5 -1
  108. package/dist/cli.js.map +1 -1
  109. package/dist/client-ZQSFPMOB.js +21 -0
  110. package/dist/clipboard-manager-TEO2GEDN.js +24 -0
  111. package/dist/commands/setup.js +3 -3
  112. package/dist/commands/setup.js.map +1 -1
  113. package/dist/commands/start.js +3 -3
  114. package/dist/commands/status.js +2 -2
  115. package/dist/commands/stop.js +2 -2
  116. package/dist/commands/utils.js +2 -2
  117. package/dist/cron-explain-HHQKPD3M.js +16 -0
  118. package/dist/crypto-4AP47IKC.js +14 -0
  119. package/dist/crypto-4AP47IKC.js.map +1 -0
  120. package/dist/databases-37X4CI2Y.js +21 -0
  121. package/dist/databases-37X4CI2Y.js.map +1 -0
  122. package/dist/discord-B3HUPGQ6.js +70 -0
  123. package/dist/discord-B3HUPGQ6.js.map +1 -0
  124. package/dist/dist-UISMLMFN.js +21847 -0
  125. package/dist/dist-UISMLMFN.js.map +1 -0
  126. package/dist/email-K7LO2IPB.js +268 -0
  127. package/dist/email-K7LO2IPB.js.map +1 -0
  128. package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
  129. package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
  130. package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
  131. package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
  132. package/dist/entity-resolution-Y3IUWEAT.js +24 -0
  133. package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
  134. package/dist/env-IWXUVTCB.js +12 -0
  135. package/dist/env-IWXUVTCB.js.map +1 -0
  136. package/dist/google-workspace-DKWUVNGC.js +169 -0
  137. package/dist/google-workspace-DKWUVNGC.js.map +1 -0
  138. package/dist/hash-tool-ULQYD7B5.js +22 -0
  139. package/dist/hash-tool-ULQYD7B5.js.map +1 -0
  140. package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
  141. package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
  142. package/dist/image-generation-OSU7FP6F.js +486 -0
  143. package/dist/image-generation-OSU7FP6F.js.map +1 -0
  144. package/dist/imessage-NGA2XF2V.js +35 -0
  145. package/dist/imessage-NGA2XF2V.js.map +1 -0
  146. package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
  147. package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
  148. package/dist/incident-response-C5J7Q6DT.js +244 -0
  149. package/dist/incident-response-C5J7Q6DT.js.map +1 -0
  150. package/dist/inventory-manager-352OHXWD.js +24 -0
  151. package/dist/inventory-manager-352OHXWD.js.map +1 -0
  152. package/dist/jira-GSGDBMIG.js +199 -0
  153. package/dist/jira-GSGDBMIG.js.map +1 -0
  154. package/dist/json-tool-QE2SYHEG.js +26 -0
  155. package/dist/json-tool-QE2SYHEG.js.map +1 -0
  156. package/dist/key-rotation-DPHU4ZTB.js +18 -0
  157. package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
  158. package/dist/lib.d.ts +603 -11
  159. package/dist/lib.js +161 -35
  160. package/dist/lib.js.map +1 -1
  161. package/dist/mailchimp-KKNF6QJ7.js +152 -0
  162. package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
  163. package/dist/matrix-QVHG76I7.js +279 -0
  164. package/dist/matrix-QVHG76I7.js.map +1 -0
  165. package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
  166. package/dist/mcp-3JI6W7ZE.js.map +1 -0
  167. package/dist/microsoft365-UCBKJHNX.js +164 -0
  168. package/dist/microsoft365-UCBKJHNX.js.map +1 -0
  169. package/dist/ocr-AC7NPX33.js +22 -0
  170. package/dist/ocr-AC7NPX33.js.map +1 -0
  171. package/dist/ollama-BOAMSPLJ.js +8 -0
  172. package/dist/ollama-BOAMSPLJ.js.map +1 -0
  173. package/dist/pages-MI523RB7.js +26 -0
  174. package/dist/pages-MI523RB7.js.map +1 -0
  175. package/dist/pair-JDFTERIK.js +24 -0
  176. package/dist/pair-JDFTERIK.js.map +1 -0
  177. package/dist/pairing-IFQYCPNS.js +10 -0
  178. package/dist/pairing-IFQYCPNS.js.map +1 -0
  179. package/dist/pdf-ALQVOEJR.js +17 -0
  180. package/dist/pdf-ALQVOEJR.js.map +1 -0
  181. package/dist/presentations-DSV5IHG5.js +1002 -0
  182. package/dist/presentations-DSV5IHG5.js.map +1 -0
  183. package/dist/prometheus-JNT2BD4L.js +10 -0
  184. package/dist/prometheus-JNT2BD4L.js.map +1 -0
  185. package/dist/providers-J4LYPHDR.js +19 -0
  186. package/dist/providers-J4LYPHDR.js.map +1 -0
  187. package/dist/qr-code-WIX4PB4U.js +16 -0
  188. package/dist/qr-code-WIX4PB4U.js.map +1 -0
  189. package/dist/quickbooks-XB4NII2S.js +190 -0
  190. package/dist/quickbooks-XB4NII2S.js.map +1 -0
  191. package/dist/regex-tool-W4ABRKGK.js +24 -0
  192. package/dist/regex-tool-W4ABRKGK.js.map +1 -0
  193. package/dist/scheduler-VK4WFERV.js +63 -0
  194. package/dist/scheduler-VK4WFERV.js.map +1 -0
  195. package/dist/search-BCLBO5E3.js +25 -0
  196. package/dist/search-BCLBO5E3.js.map +1 -0
  197. package/dist/sendgrid-RNXCAFKM.js +152 -0
  198. package/dist/sendgrid-RNXCAFKM.js.map +1 -0
  199. package/dist/shopify-NCXYJB4R.js +171 -0
  200. package/dist/shopify-NCXYJB4R.js.map +1 -0
  201. package/dist/signal-6CGDFYL2.js +35 -0
  202. package/dist/signal-6CGDFYL2.js.map +1 -0
  203. package/dist/slack-IZQWIKOH.js +75 -0
  204. package/dist/slack-IZQWIKOH.js.map +1 -0
  205. package/dist/sms-M3JIOTCW.js +23 -0
  206. package/dist/sms-M3JIOTCW.js.map +1 -0
  207. package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
  208. package/dist/src-VYUE6LRA.js.map +1 -0
  209. package/dist/stocks-XXWBPOCU.js +14 -0
  210. package/dist/stocks-XXWBPOCU.js.map +1 -0
  211. package/dist/text-transform-6SGUA5Z4.js +22 -0
  212. package/dist/text-transform-6SGUA5Z4.js.map +1 -0
  213. package/dist/tools-2RLEI2N6.js +38 -0
  214. package/dist/tools-2RLEI2N6.js.map +1 -0
  215. package/dist/tunnel-IWMXUML4.js +301 -0
  216. package/dist/tunnel-IWMXUML4.js.map +1 -0
  217. package/dist/twilio-53GEW5JT.js +139 -0
  218. package/dist/twilio-53GEW5JT.js.map +1 -0
  219. package/dist/unit-converter-ZYXMEZOE.js +14 -0
  220. package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
  221. package/dist/whatsapp-LFX6YKCM.js +35 -0
  222. package/dist/whatsapp-LFX6YKCM.js.map +1 -0
  223. package/dist/word-document-7B6SJMAY.js +902 -0
  224. package/dist/word-document-7B6SJMAY.js.map +1 -0
  225. package/dist/xero-QYO66D45.js +162 -0
  226. package/dist/xero-QYO66D45.js.map +1 -0
  227. package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
  228. package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
  229. package/drizzle/0002_mushy_master_mold.sql +140 -0
  230. package/drizzle/meta/0002_snapshot.json +3637 -0
  231. package/drizzle/meta/_journal.json +7 -0
  232. package/package.json +100 -98
  233. package/dist/bot-KJ26BG56.js +0 -15
  234. package/dist/chunk-4LVWXUNC.js.map +0 -1
  235. package/dist/chunk-4TG2IG5K.js +0 -5249
  236. package/dist/chunk-4TG2IG5K.js.map +0 -1
  237. package/dist/chunk-6DRDKB45.js.map +0 -1
  238. package/dist/chunk-CI6Q63MM.js +0 -1613
  239. package/dist/chunk-CI6Q63MM.js.map +0 -1
  240. package/dist/chunk-KHNYJY2Z.js +0 -178
  241. package/dist/chunk-KHNYJY2Z.js.map +0 -1
  242. package/dist/chunk-NSBPE2FW.js +0 -17
  243. package/dist/discord-ZOJFTVTB.js +0 -49
  244. package/dist/imessage-JFRB6EJ7.js +0 -14
  245. package/dist/scheduler-EZ7CZMCS.js +0 -42
  246. package/dist/signal-T3MCSULM.js +0 -14
  247. package/dist/slack-N2M4FHAJ.js +0 -54
  248. package/dist/src-K7GASHRH.js.map +0 -1
  249. package/dist/tools-24GZHYRF.js +0 -16
  250. package/dist/whatsapp-VCRUPAO5.js +0 -14
  251. /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
  252. /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
  253. /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
  254. /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
  255. /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
  256. /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
  257. /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
  258. /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
  259. /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
  260. /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
  261. /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
  262. /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
  263. /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
  264. /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
  265. /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
  266. /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
  267. /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
  268. /package/dist/{whatsapp-VCRUPAO5.js.map → cron-explain-HHQKPD3M.js.map} +0 -0
@@ -0,0 +1,301 @@
1
+ import "./chunk-PLDDJCW6.js";
2
+
3
+ // src/core/tunnel/cloudflare.ts
4
+ var CloudflareTunnel = class {
5
+ name = "cloudflare";
6
+ process = null;
7
+ publicUrl = null;
8
+ running = false;
9
+ async start(port) {
10
+ if (this.running) {
11
+ throw new Error("Cloudflare tunnel is already running");
12
+ }
13
+ const urlPattern = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/;
14
+ return new Promise((resolve, reject) => {
15
+ const timeout = setTimeout(() => {
16
+ this.stop().catch(() => {
17
+ });
18
+ reject(
19
+ new Error(
20
+ "Timed out waiting for Cloudflare tunnel URL (15s). Is cloudflared installed?"
21
+ )
22
+ );
23
+ }, 15e3);
24
+ try {
25
+ this.process = Bun.spawn(
26
+ ["cloudflared", "tunnel", "--url", `http://localhost:${port}`],
27
+ {
28
+ stdout: "pipe",
29
+ stderr: "pipe"
30
+ }
31
+ );
32
+ this.running = true;
33
+ const readStderr = async () => {
34
+ if (!this.process?.stderr) return;
35
+ const reader = this.process.stderr.getReader();
36
+ const decoder = new TextDecoder();
37
+ let buffer = "";
38
+ try {
39
+ while (true) {
40
+ const { done, value } = await reader.read();
41
+ if (done) break;
42
+ buffer += decoder.decode(value, { stream: true });
43
+ const match = buffer.match(urlPattern);
44
+ if (match) {
45
+ this.publicUrl = match[0];
46
+ clearTimeout(timeout);
47
+ resolve(this.publicUrl);
48
+ return;
49
+ }
50
+ }
51
+ } catch {
52
+ }
53
+ };
54
+ const readStdout = async () => {
55
+ if (!this.process?.stdout) return;
56
+ const reader = this.process.stdout.getReader();
57
+ const decoder = new TextDecoder();
58
+ let buffer = "";
59
+ try {
60
+ while (true) {
61
+ const { done, value } = await reader.read();
62
+ if (done) break;
63
+ buffer += decoder.decode(value, { stream: true });
64
+ const match = buffer.match(urlPattern);
65
+ if (match && !this.publicUrl) {
66
+ this.publicUrl = match[0];
67
+ clearTimeout(timeout);
68
+ resolve(this.publicUrl);
69
+ return;
70
+ }
71
+ }
72
+ } catch {
73
+ }
74
+ };
75
+ readStderr();
76
+ readStdout();
77
+ this.process.exited.then((code) => {
78
+ if (!this.publicUrl) {
79
+ this.running = false;
80
+ clearTimeout(timeout);
81
+ reject(
82
+ new Error(`cloudflared exited with code ${code} before providing a URL`)
83
+ );
84
+ }
85
+ });
86
+ } catch (err) {
87
+ clearTimeout(timeout);
88
+ this.running = false;
89
+ reject(new Error(`Failed to spawn cloudflared: ${err.message}`));
90
+ }
91
+ });
92
+ }
93
+ async stop() {
94
+ if (this.process) {
95
+ try {
96
+ this.process.kill();
97
+ await this.process.exited;
98
+ } catch {
99
+ }
100
+ this.process = null;
101
+ }
102
+ this.running = false;
103
+ this.publicUrl = null;
104
+ }
105
+ getPublicUrl() {
106
+ return this.publicUrl;
107
+ }
108
+ isRunning() {
109
+ return this.running;
110
+ }
111
+ };
112
+
113
+ // src/core/tunnel/ngrok.ts
114
+ var NgrokTunnel = class {
115
+ name = "ngrok";
116
+ process = null;
117
+ publicUrl = null;
118
+ running = false;
119
+ authToken;
120
+ constructor(authToken) {
121
+ this.authToken = authToken;
122
+ }
123
+ async start(port) {
124
+ if (this.running) {
125
+ throw new Error("ngrok tunnel is already running");
126
+ }
127
+ const args = ["ngrok", "http", String(port)];
128
+ if (this.authToken) {
129
+ args.push("--authtoken", this.authToken);
130
+ }
131
+ try {
132
+ this.process = Bun.spawn(args, {
133
+ stdout: "pipe",
134
+ stderr: "pipe"
135
+ });
136
+ this.running = true;
137
+ } catch (err) {
138
+ throw new Error(`Failed to spawn ngrok: ${err.message}`);
139
+ }
140
+ this.process.exited.then((code) => {
141
+ if (this.running) {
142
+ this.running = false;
143
+ console.warn(`[Tunnel] ngrok exited unexpectedly with code ${code}`);
144
+ }
145
+ });
146
+ const url = await this.pollForUrl(5, 1e3);
147
+ if (!url) {
148
+ await this.stop();
149
+ throw new Error(
150
+ "Failed to retrieve ngrok public URL after 5 retries. Is ngrok installed and working?"
151
+ );
152
+ }
153
+ this.publicUrl = url;
154
+ return this.publicUrl;
155
+ }
156
+ async pollForUrl(maxRetries, delayMs) {
157
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
158
+ await this.sleep(delayMs);
159
+ try {
160
+ const response = await fetch("http://localhost:4040/api/tunnels");
161
+ if (!response.ok) continue;
162
+ const data = await response.json();
163
+ const httpsTunnel = data.tunnels.find((t) => t.proto === "https");
164
+ const tunnel = httpsTunnel || data.tunnels[0];
165
+ if (tunnel?.public_url) {
166
+ return tunnel.public_url;
167
+ }
168
+ } catch {
169
+ }
170
+ }
171
+ return null;
172
+ }
173
+ sleep(ms) {
174
+ return new Promise((resolve) => setTimeout(resolve, ms));
175
+ }
176
+ async stop() {
177
+ if (this.process) {
178
+ try {
179
+ this.process.kill();
180
+ await this.process.exited;
181
+ } catch {
182
+ }
183
+ this.process = null;
184
+ }
185
+ this.running = false;
186
+ this.publicUrl = null;
187
+ }
188
+ getPublicUrl() {
189
+ return this.publicUrl;
190
+ }
191
+ isRunning() {
192
+ return this.running;
193
+ }
194
+ };
195
+
196
+ // src/core/tunnel/localtunnel.ts
197
+ var LocalTunnel = class {
198
+ name = "localtunnel";
199
+ tunnel = null;
200
+ publicUrl = null;
201
+ running = false;
202
+ subdomain;
203
+ constructor(subdomain) {
204
+ this.subdomain = subdomain;
205
+ }
206
+ async start(port) {
207
+ if (this.running) {
208
+ throw new Error("localtunnel is already running");
209
+ }
210
+ let localtunnel;
211
+ try {
212
+ const mod = await import("localtunnel");
213
+ localtunnel = mod.default || mod;
214
+ } catch {
215
+ throw new Error(
216
+ 'localtunnel is not installed. Run "bun add localtunnel" to install it.'
217
+ );
218
+ }
219
+ const opts = { port };
220
+ if (this.subdomain) {
221
+ opts.subdomain = this.subdomain;
222
+ }
223
+ try {
224
+ this.tunnel = await localtunnel(opts);
225
+ } catch (err) {
226
+ throw new Error(`Failed to create localtunnel: ${err.message}`);
227
+ }
228
+ this.publicUrl = this.tunnel.url;
229
+ this.running = true;
230
+ this.tunnel.on("close", () => {
231
+ this.running = false;
232
+ this.publicUrl = null;
233
+ });
234
+ this.tunnel.on("error", (err) => {
235
+ console.warn(`[Tunnel] localtunnel error: ${err.message}`);
236
+ this.running = false;
237
+ this.publicUrl = null;
238
+ });
239
+ return this.publicUrl;
240
+ }
241
+ async stop() {
242
+ if (this.tunnel) {
243
+ try {
244
+ this.tunnel.close();
245
+ } catch {
246
+ }
247
+ this.tunnel = null;
248
+ }
249
+ this.running = false;
250
+ this.publicUrl = null;
251
+ }
252
+ getPublicUrl() {
253
+ return this.publicUrl;
254
+ }
255
+ isRunning() {
256
+ return this.running;
257
+ }
258
+ };
259
+
260
+ // src/core/tunnel/index.ts
261
+ function createTunnel(provider, options) {
262
+ switch (provider) {
263
+ case "cloudflare":
264
+ return new CloudflareTunnel();
265
+ case "ngrok":
266
+ return new NgrokTunnel(options?.authToken);
267
+ case "localtunnel":
268
+ return new LocalTunnel(options?.subdomain);
269
+ default:
270
+ throw new Error(`Unknown tunnel provider: ${provider}`);
271
+ }
272
+ }
273
+ var activeTunnel = null;
274
+ async function autoStartTunnel(port, provider, options) {
275
+ try {
276
+ activeTunnel = createTunnel(provider, options);
277
+ const url = await activeTunnel.start(port);
278
+ console.log(`[Tunnel] Public URL: ${url}`);
279
+ return url;
280
+ } catch (err) {
281
+ console.warn(`[Tunnel] Failed to start ${provider}: ${err.message}`);
282
+ activeTunnel = null;
283
+ return null;
284
+ }
285
+ }
286
+ async function stopTunnel() {
287
+ if (activeTunnel) {
288
+ await activeTunnel.stop();
289
+ activeTunnel = null;
290
+ }
291
+ }
292
+ function getActiveTunnel() {
293
+ return activeTunnel;
294
+ }
295
+ export {
296
+ autoStartTunnel,
297
+ createTunnel,
298
+ getActiveTunnel,
299
+ stopTunnel
300
+ };
301
+ //# sourceMappingURL=tunnel-IWMXUML4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/tunnel/cloudflare.ts","../src/core/tunnel/ngrok.ts","../src/core/tunnel/localtunnel.ts","../src/core/tunnel/index.ts"],"sourcesContent":["import type { TunnelProvider } from \"./types\";\n\nexport class CloudflareTunnel implements TunnelProvider {\n readonly name = \"cloudflare\";\n\n private process: ReturnType<typeof Bun.spawn> | null = null;\n private publicUrl: string | null = null;\n private running = false;\n\n async start(port: number): Promise<string> {\n if (this.running) {\n throw new Error(\"Cloudflare tunnel is already running\");\n }\n\n const urlPattern = /https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/;\n\n return new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.stop().catch(() => {});\n reject(\n new Error(\n \"Timed out waiting for Cloudflare tunnel URL (15s). Is cloudflared installed?\"\n )\n );\n }, 15_000);\n\n try {\n this.process = Bun.spawn(\n [\"cloudflared\", \"tunnel\", \"--url\", `http://localhost:${port}`],\n {\n stdout: \"pipe\",\n stderr: \"pipe\",\n }\n );\n\n this.running = true;\n\n // cloudflared outputs the URL on stderr\n const readStderr = async () => {\n if (!this.process?.stderr) return;\n\n const reader = this.process.stderr.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const match = buffer.match(urlPattern);\n if (match) {\n this.publicUrl = match[0];\n clearTimeout(timeout);\n resolve(this.publicUrl);\n return;\n }\n }\n } catch {\n // Process may have been killed; ignore read errors\n }\n };\n\n // Also check stdout in case cloudflared version outputs there\n const readStdout = async () => {\n if (!this.process?.stdout) return;\n\n const reader = this.process.stdout.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const match = buffer.match(urlPattern);\n if (match && !this.publicUrl) {\n this.publicUrl = match[0];\n clearTimeout(timeout);\n resolve(this.publicUrl);\n return;\n }\n }\n } catch {\n // Process may have been killed; ignore read errors\n }\n };\n\n readStderr();\n readStdout();\n\n // Handle process exit before URL is found\n this.process.exited.then((code) => {\n if (!this.publicUrl) {\n this.running = false;\n clearTimeout(timeout);\n reject(\n new Error(`cloudflared exited with code ${code} before providing a URL`)\n );\n }\n });\n } catch (err: any) {\n clearTimeout(timeout);\n this.running = false;\n reject(new Error(`Failed to spawn cloudflared: ${err.message}`));\n }\n });\n }\n\n async stop(): Promise<void> {\n if (this.process) {\n try {\n this.process.kill();\n await this.process.exited;\n } catch {\n // Process may already be dead\n }\n this.process = null;\n }\n this.running = false;\n this.publicUrl = null;\n }\n\n getPublicUrl(): string | null {\n return this.publicUrl;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import type { TunnelProvider } from \"./types\";\n\ninterface NgrokApiTunnel {\n public_url: string;\n proto: string;\n config: { addr: string };\n}\n\ninterface NgrokApiResponse {\n tunnels: NgrokApiTunnel[];\n}\n\nexport class NgrokTunnel implements TunnelProvider {\n readonly name = \"ngrok\";\n\n private process: ReturnType<typeof Bun.spawn> | null = null;\n private publicUrl: string | null = null;\n private running = false;\n private authToken?: string;\n\n constructor(authToken?: string) {\n this.authToken = authToken;\n }\n\n async start(port: number): Promise<string> {\n if (this.running) {\n throw new Error(\"ngrok tunnel is already running\");\n }\n\n const args = [\"ngrok\", \"http\", String(port)];\n if (this.authToken) {\n args.push(\"--authtoken\", this.authToken);\n }\n\n try {\n this.process = Bun.spawn(args, {\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n this.running = true;\n } catch (err: any) {\n throw new Error(`Failed to spawn ngrok: ${err.message}`);\n }\n\n // Handle unexpected early exit\n this.process.exited.then((code) => {\n if (this.running) {\n this.running = false;\n console.warn(`[Tunnel] ngrok exited unexpectedly with code ${code}`);\n }\n });\n\n // Poll the ngrok local API to get the public URL\n const url = await this.pollForUrl(5, 1000);\n if (!url) {\n await this.stop();\n throw new Error(\n \"Failed to retrieve ngrok public URL after 5 retries. Is ngrok installed and working?\"\n );\n }\n\n this.publicUrl = url;\n return this.publicUrl;\n }\n\n private async pollForUrl(\n maxRetries: number,\n delayMs: number\n ): Promise<string | null> {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n await this.sleep(delayMs);\n\n try {\n const response = await fetch(\"http://localhost:4040/api/tunnels\");\n if (!response.ok) continue;\n\n const data = (await response.json()) as NgrokApiResponse;\n const httpsTunnel = data.tunnels.find((t) => t.proto === \"https\");\n const tunnel = httpsTunnel || data.tunnels[0];\n\n if (tunnel?.public_url) {\n return tunnel.public_url;\n }\n } catch {\n // ngrok API not ready yet; retry\n }\n }\n\n return null;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async stop(): Promise<void> {\n if (this.process) {\n try {\n this.process.kill();\n await this.process.exited;\n } catch {\n // Process may already be dead\n }\n this.process = null;\n }\n this.running = false;\n this.publicUrl = null;\n }\n\n getPublicUrl(): string | null {\n return this.publicUrl;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import type { TunnelProvider } from \"./types\";\n\ninterface LocalTunnelInstance {\n url: string;\n close(): void;\n on(event: string, callback: (...args: any[]) => void): void;\n}\n\ntype LocalTunnelFactory = (opts: {\n port: number;\n subdomain?: string;\n}) => Promise<LocalTunnelInstance>;\n\nexport class LocalTunnel implements TunnelProvider {\n readonly name = \"localtunnel\";\n\n private tunnel: LocalTunnelInstance | null = null;\n private publicUrl: string | null = null;\n private running = false;\n private subdomain?: string;\n\n constructor(subdomain?: string) {\n this.subdomain = subdomain;\n }\n\n async start(port: number): Promise<string> {\n if (this.running) {\n throw new Error(\"localtunnel is already running\");\n }\n\n let localtunnel: LocalTunnelFactory;\n\n try {\n // Dynamic import for lazy loading - localtunnel may not be installed\n const mod = await import(\"localtunnel\");\n localtunnel = (mod.default || mod) as LocalTunnelFactory;\n } catch {\n throw new Error(\n 'localtunnel is not installed. Run \"bun add localtunnel\" to install it.'\n );\n }\n\n const opts: { port: number; subdomain?: string } = { port };\n if (this.subdomain) {\n opts.subdomain = this.subdomain;\n }\n\n try {\n this.tunnel = await localtunnel(opts);\n } catch (err: any) {\n throw new Error(`Failed to create localtunnel: ${err.message}`);\n }\n\n this.publicUrl = this.tunnel.url;\n this.running = true;\n\n // Listen for tunnel close events\n this.tunnel.on(\"close\", () => {\n this.running = false;\n this.publicUrl = null;\n });\n\n // Listen for errors\n this.tunnel.on(\"error\", (err: Error) => {\n console.warn(`[Tunnel] localtunnel error: ${err.message}`);\n this.running = false;\n this.publicUrl = null;\n });\n\n return this.publicUrl;\n }\n\n async stop(): Promise<void> {\n if (this.tunnel) {\n try {\n this.tunnel.close();\n } catch {\n // Tunnel may already be closed\n }\n this.tunnel = null;\n }\n this.running = false;\n this.publicUrl = null;\n }\n\n getPublicUrl(): string | null {\n return this.publicUrl;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import type { TunnelProvider } from \"./types\";\nimport { CloudflareTunnel } from \"./cloudflare\";\nimport { NgrokTunnel } from \"./ngrok\";\nimport { LocalTunnel } from \"./localtunnel\";\n\nexport function createTunnel(\n provider: string,\n options?: { authToken?: string; subdomain?: string }\n): TunnelProvider {\n switch (provider) {\n case \"cloudflare\":\n return new CloudflareTunnel();\n case \"ngrok\":\n return new NgrokTunnel(options?.authToken);\n case \"localtunnel\":\n return new LocalTunnel(options?.subdomain);\n default:\n throw new Error(`Unknown tunnel provider: ${provider}`);\n }\n}\n\nlet activeTunnel: TunnelProvider | null = null;\n\nexport async function autoStartTunnel(\n port: number,\n provider: string,\n options?: { authToken?: string; subdomain?: string }\n): Promise<string | null> {\n try {\n activeTunnel = createTunnel(provider, options);\n const url = await activeTunnel.start(port);\n console.log(`[Tunnel] Public URL: ${url}`);\n return url;\n } catch (err: any) {\n console.warn(`[Tunnel] Failed to start ${provider}: ${err.message}`);\n activeTunnel = null;\n return null;\n }\n}\n\nexport async function stopTunnel(): Promise<void> {\n if (activeTunnel) {\n await activeTunnel.stop();\n activeTunnel = null;\n }\n}\n\nexport function getActiveTunnel(): TunnelProvider | null {\n return activeTunnel;\n}\n\nexport type { TunnelProvider } from \"./types\";\n"],"mappings":"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","names":[]}
@@ -0,0 +1,139 @@
1
+ import {
2
+ BaseAdapter
3
+ } from "./chunk-7WQO5J2M.js";
4
+ import "./chunk-PLDDJCW6.js";
5
+
6
+ // src/core/adapters/adapters/twilio.ts
7
+ import { z } from "zod";
8
+ var TwilioAdapter = class extends BaseAdapter {
9
+ metadata = {
10
+ name: "Twilio",
11
+ slug: "twilio",
12
+ displayName: "Twilio",
13
+ description: "Send SMS, make phone calls, and send WhatsApp messages with Twilio",
14
+ category: "communications",
15
+ authType: "api_key"
16
+ };
17
+ async authenticate(credentials) {
18
+ return {
19
+ accessToken: credentials.authToken || credentials.accessToken || "",
20
+ metadata: {
21
+ accountSid: credentials.accountSid,
22
+ fromNumber: credentials.fromNumber
23
+ }
24
+ };
25
+ }
26
+ getBaseUrl(auth) {
27
+ const accountSid = auth.metadata?.accountSid || "";
28
+ return `https://api.twilio.com/2010-04-01/Accounts/${accountSid}`;
29
+ }
30
+ getAuthHeaders(auth) {
31
+ const accountSid = auth.metadata?.accountSid || "";
32
+ return {
33
+ Authorization: `Basic ${btoa(`${accountSid}:${auth.accessToken}`)}`,
34
+ "Content-Type": "application/x-www-form-urlencoded"
35
+ };
36
+ }
37
+ actions = {
38
+ sendSMS: {
39
+ name: "Send SMS",
40
+ description: "Send an SMS message via Twilio",
41
+ inputSchema: z.object({
42
+ to: z.string(),
43
+ body: z.string(),
44
+ from: z.string().optional(),
45
+ statusCallback: z.string().url().optional()
46
+ }),
47
+ outputSchema: z.object({ sid: z.string(), status: z.string(), dateCreated: z.string() }),
48
+ execute: async (input, auth) => {
49
+ const { to, body, from, statusCallback } = input;
50
+ const baseUrl = this.getBaseUrl(auth);
51
+ const fromNumber = from || auth.metadata?.fromNumber || "";
52
+ const params = new URLSearchParams({ To: to, From: fromNumber, Body: body });
53
+ if (statusCallback) params.set("StatusCallback", statusCallback);
54
+ const response = await this.makeRequest(
55
+ `${baseUrl}/Messages.json`,
56
+ { method: "POST", body: params.toString(), headers: this.getAuthHeaders(auth) }
57
+ );
58
+ return response.json();
59
+ }
60
+ },
61
+ makeCall: {
62
+ name: "Make Call",
63
+ description: "Initiate a phone call via Twilio",
64
+ inputSchema: z.object({
65
+ to: z.string(),
66
+ from: z.string().optional(),
67
+ twiml: z.string().optional(),
68
+ url: z.string().url().optional(),
69
+ statusCallback: z.string().url().optional()
70
+ }),
71
+ outputSchema: z.object({ sid: z.string(), status: z.string(), dateCreated: z.string() }),
72
+ execute: async (input, auth) => {
73
+ const { to, from, twiml, url, statusCallback } = input;
74
+ const baseUrl = this.getBaseUrl(auth);
75
+ const fromNumber = from || auth.metadata?.fromNumber || "";
76
+ const params = new URLSearchParams({ To: to, From: fromNumber });
77
+ if (twiml) params.set("Twiml", twiml);
78
+ if (url) params.set("Url", url);
79
+ if (statusCallback) params.set("StatusCallback", statusCallback);
80
+ const response = await this.makeRequest(
81
+ `${baseUrl}/Calls.json`,
82
+ { method: "POST", body: params.toString(), headers: this.getAuthHeaders(auth) }
83
+ );
84
+ return response.json();
85
+ }
86
+ },
87
+ sendWhatsApp: {
88
+ name: "Send WhatsApp Message",
89
+ description: "Send a WhatsApp message via Twilio",
90
+ inputSchema: z.object({
91
+ to: z.string(),
92
+ body: z.string(),
93
+ from: z.string().optional(),
94
+ mediaUrl: z.string().url().optional()
95
+ }),
96
+ outputSchema: z.object({ sid: z.string(), status: z.string(), dateCreated: z.string() }),
97
+ execute: async (input, auth) => {
98
+ const { to, body, from, mediaUrl } = input;
99
+ const baseUrl = this.getBaseUrl(auth);
100
+ const fromNumber = from || auth.metadata?.fromNumber || "";
101
+ const params = new URLSearchParams({
102
+ To: `whatsapp:${to}`,
103
+ From: `whatsapp:${fromNumber}`,
104
+ Body: body
105
+ });
106
+ if (mediaUrl) params.set("MediaUrl", mediaUrl);
107
+ const response = await this.makeRequest(
108
+ `${baseUrl}/Messages.json`,
109
+ { method: "POST", body: params.toString(), headers: this.getAuthHeaders(auth) }
110
+ );
111
+ return response.json();
112
+ }
113
+ }
114
+ };
115
+ triggers = {
116
+ onIncomingSMS: {
117
+ name: "Incoming SMS",
118
+ description: "Triggered when an SMS message is received",
119
+ outputSchema: z.object({ messageSid: z.string(), from: z.string(), to: z.string(), body: z.string() }),
120
+ subscribe: async (_config, _auth) => {
121
+ },
122
+ unsubscribe: async (_config, _auth) => {
123
+ }
124
+ },
125
+ onIncomingCall: {
126
+ name: "Incoming Call",
127
+ description: "Triggered when a phone call is received",
128
+ outputSchema: z.object({ callSid: z.string(), from: z.string(), to: z.string(), status: z.string() }),
129
+ subscribe: async (_config, _auth) => {
130
+ },
131
+ unsubscribe: async (_config, _auth) => {
132
+ }
133
+ }
134
+ };
135
+ };
136
+ export {
137
+ TwilioAdapter
138
+ };
139
+ //# sourceMappingURL=twilio-53GEW5JT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/adapters/adapters/twilio.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { BaseAdapter } from \"../base-adapter\";\nimport type { AuthResult, ActionDefinition, TriggerDefinition, TriggerConfig } from \"../types\";\n\nexport class TwilioAdapter extends BaseAdapter {\n metadata = {\n name: \"Twilio\",\n slug: \"twilio\",\n displayName: \"Twilio\",\n description: \"Send SMS, make phone calls, and send WhatsApp messages with Twilio\",\n category: \"communications\",\n authType: \"api_key\" as const,\n };\n\n async authenticate(credentials: Record<string, string>): Promise<AuthResult> {\n return {\n accessToken: credentials.authToken || credentials.accessToken || \"\",\n metadata: {\n accountSid: credentials.accountSid,\n fromNumber: credentials.fromNumber,\n },\n };\n }\n\n private getBaseUrl(auth: AuthResult): string {\n const accountSid = (auth.metadata?.accountSid as string) || \"\";\n return `https://api.twilio.com/2010-04-01/Accounts/${accountSid}`;\n }\n\n private getAuthHeaders(auth: AuthResult): Record<string, string> {\n const accountSid = (auth.metadata?.accountSid as string) || \"\";\n return {\n Authorization: `Basic ${btoa(`${accountSid}:${auth.accessToken}`)}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n };\n }\n\n actions: Record<string, ActionDefinition> = {\n sendSMS: {\n name: \"Send SMS\",\n description: \"Send an SMS message via Twilio\",\n inputSchema: z.object({\n to: z.string(),\n body: z.string(),\n from: z.string().optional(),\n statusCallback: z.string().url().optional(),\n }),\n outputSchema: z.object({ sid: z.string(), status: z.string(), dateCreated: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { to, body, from, statusCallback } = input as {\n to: string; body: string; from?: string; statusCallback?: string;\n };\n const baseUrl = this.getBaseUrl(auth);\n const fromNumber = from || (auth.metadata?.fromNumber as string) || \"\";\n const params = new URLSearchParams({ To: to, From: fromNumber, Body: body });\n if (statusCallback) params.set(\"StatusCallback\", statusCallback);\n const response = await this.makeRequest(\n `${baseUrl}/Messages.json`,\n { method: \"POST\", body: params.toString(), headers: this.getAuthHeaders(auth) }\n );\n return response.json();\n },\n },\n makeCall: {\n name: \"Make Call\",\n description: \"Initiate a phone call via Twilio\",\n inputSchema: z.object({\n to: z.string(),\n from: z.string().optional(),\n twiml: z.string().optional(),\n url: z.string().url().optional(),\n statusCallback: z.string().url().optional(),\n }),\n outputSchema: z.object({ sid: z.string(), status: z.string(), dateCreated: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { to, from, twiml, url, statusCallback } = input as {\n to: string; from?: string; twiml?: string; url?: string; statusCallback?: string;\n };\n const baseUrl = this.getBaseUrl(auth);\n const fromNumber = from || (auth.metadata?.fromNumber as string) || \"\";\n const params = new URLSearchParams({ To: to, From: fromNumber });\n if (twiml) params.set(\"Twiml\", twiml);\n if (url) params.set(\"Url\", url);\n if (statusCallback) params.set(\"StatusCallback\", statusCallback);\n const response = await this.makeRequest(\n `${baseUrl}/Calls.json`,\n { method: \"POST\", body: params.toString(), headers: this.getAuthHeaders(auth) }\n );\n return response.json();\n },\n },\n sendWhatsApp: {\n name: \"Send WhatsApp Message\",\n description: \"Send a WhatsApp message via Twilio\",\n inputSchema: z.object({\n to: z.string(),\n body: z.string(),\n from: z.string().optional(),\n mediaUrl: z.string().url().optional(),\n }),\n outputSchema: z.object({ sid: z.string(), status: z.string(), dateCreated: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { to, body, from, mediaUrl } = input as {\n to: string; body: string; from?: string; mediaUrl?: string;\n };\n const baseUrl = this.getBaseUrl(auth);\n const fromNumber = from || (auth.metadata?.fromNumber as string) || \"\";\n const params = new URLSearchParams({\n To: `whatsapp:${to}`,\n From: `whatsapp:${fromNumber}`,\n Body: body,\n });\n if (mediaUrl) params.set(\"MediaUrl\", mediaUrl);\n const response = await this.makeRequest(\n `${baseUrl}/Messages.json`,\n { method: \"POST\", body: params.toString(), headers: this.getAuthHeaders(auth) }\n );\n return response.json();\n },\n },\n };\n\n triggers: Record<string, TriggerDefinition> = {\n onIncomingSMS: {\n name: \"Incoming SMS\",\n description: \"Triggered when an SMS message is received\",\n outputSchema: z.object({ messageSid: z.string(), from: z.string(), to: z.string(), body: z.string() }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n onIncomingCall: {\n name: \"Incoming Call\",\n description: \"Triggered when a phone call is received\",\n outputSchema: z.object({ callSid: z.string(), from: z.string(), to: z.string(), status: z.string() }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ import {
2
+ convert,
3
+ listUnits,
4
+ unitConverter,
5
+ unit_converter_default
6
+ } from "./chunk-REMIY4U2.js";
7
+ import "./chunk-PLDDJCW6.js";
8
+ export {
9
+ convert,
10
+ unit_converter_default as default,
11
+ listUnits,
12
+ unitConverter
13
+ };
14
+ //# sourceMappingURL=unit-converter-ZYXMEZOE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ WhatsAppBot,
3
+ whatsapp_default
4
+ } from "./chunk-66OJ3WB4.js";
5
+ import "./chunk-766ASQWE.js";
6
+ import "./chunk-IZJMVV7O.js";
7
+ import "./chunk-6PMVAAA7.js";
8
+ import "./chunk-MQJ2ECQT.js";
9
+ import "./chunk-TVEWKIK3.js";
10
+ import "./chunk-BRBWNV65.js";
11
+ import "./chunk-H5RQOFO2.js";
12
+ import "./chunk-VRD5CYRL.js";
13
+ import "./chunk-KM22GV7G.js";
14
+ import "./chunk-P6QINGFL.js";
15
+ import "./chunk-HN3F4WSW.js";
16
+ import "./chunk-SVAPX2XN.js";
17
+ import "./chunk-WRAKK6K6.js";
18
+ import "./chunk-7WQO5J2M.js";
19
+ import "./chunk-BXZ6EA52.js";
20
+ import "./chunk-4GLYY4NN.js";
21
+ import "./chunk-EVE7MIIY.js";
22
+ import "./chunk-RZ4YESBG.js";
23
+ import "./chunk-CQ4JURG7.js";
24
+ import "./chunk-OCVQGBJK.js";
25
+ import "./chunk-XKYRH4FM.js";
26
+ import "./chunk-ZLZKF2PM.js";
27
+ import "./chunk-6KONMXQ6.js";
28
+ import "./chunk-22VGGA7S.js";
29
+ import "./chunk-35WYTA3C.js";
30
+ import "./chunk-PLDDJCW6.js";
31
+ export {
32
+ WhatsAppBot,
33
+ whatsapp_default as default
34
+ };
35
+ //# sourceMappingURL=whatsapp-LFX6YKCM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}