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,196 @@
1
+ import {
2
+ env
3
+ } from "./chunk-ZLZKF2PM.js";
4
+ import {
5
+ __require
6
+ } from "./chunk-PLDDJCW6.js";
7
+
8
+ // src/integrations/twilio/sms.ts
9
+ var TWILIO_API_URL = "https://api.twilio.com/2010-04-01";
10
+ function getTwilioConfig() {
11
+ if (!env.TWILIO_ACCOUNT_SID || !env.TWILIO_AUTH_TOKEN || !env.TWILIO_PHONE_NUMBER) {
12
+ return null;
13
+ }
14
+ return {
15
+ accountSid: env.TWILIO_ACCOUNT_SID,
16
+ authToken: env.TWILIO_AUTH_TOKEN,
17
+ phoneNumber: env.TWILIO_PHONE_NUMBER
18
+ };
19
+ }
20
+ function createAuthHeader(accountSid, authToken) {
21
+ const credentials = Buffer.from(`${accountSid}:${authToken}`).toString("base64");
22
+ return `Basic ${credentials}`;
23
+ }
24
+ async function sendSMS(message, config) {
25
+ const twilioConfig = config || getTwilioConfig();
26
+ if (!twilioConfig) {
27
+ return {
28
+ success: false,
29
+ error: "Twilio is not configured. Set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER."
30
+ };
31
+ }
32
+ const { accountSid, authToken, phoneNumber } = twilioConfig;
33
+ try {
34
+ const formData = new URLSearchParams();
35
+ formData.append("To", message.to);
36
+ formData.append("From", phoneNumber);
37
+ formData.append("Body", message.body);
38
+ if (message.mediaUrl) {
39
+ const mediaUrls = Array.isArray(message.mediaUrl) ? message.mediaUrl : [message.mediaUrl];
40
+ for (const url of mediaUrls) {
41
+ formData.append("MediaUrl", url);
42
+ }
43
+ }
44
+ if (message.statusCallback) {
45
+ formData.append("StatusCallback", message.statusCallback);
46
+ }
47
+ const response = await fetch(
48
+ `${TWILIO_API_URL}/Accounts/${accountSid}/Messages.json`,
49
+ {
50
+ method: "POST",
51
+ headers: {
52
+ Authorization: createAuthHeader(accountSid, authToken),
53
+ "Content-Type": "application/x-www-form-urlencoded"
54
+ },
55
+ body: formData.toString()
56
+ }
57
+ );
58
+ const data = await response.json();
59
+ if (!response.ok) {
60
+ return {
61
+ success: false,
62
+ error: data.message || `HTTP ${response.status}: ${response.statusText}`
63
+ };
64
+ }
65
+ return {
66
+ success: true,
67
+ messageSid: data.sid,
68
+ status: data.status,
69
+ dateCreated: data.date_created,
70
+ direction: data.direction,
71
+ from: data.from,
72
+ to: data.to
73
+ };
74
+ } catch (error) {
75
+ console.error("Error sending SMS:", error);
76
+ return {
77
+ success: false,
78
+ error: error instanceof Error ? error.message : "Unknown error sending SMS"
79
+ };
80
+ }
81
+ }
82
+ async function sendMMS(to, body, mediaUrls, config) {
83
+ return sendSMS(
84
+ {
85
+ to,
86
+ body,
87
+ mediaUrl: mediaUrls
88
+ },
89
+ config
90
+ );
91
+ }
92
+ async function getMessageStatus(messageSid, config) {
93
+ const twilioConfig = config || getTwilioConfig();
94
+ if (!twilioConfig) {
95
+ return {
96
+ success: false,
97
+ error: "Twilio is not configured."
98
+ };
99
+ }
100
+ const { accountSid, authToken } = twilioConfig;
101
+ try {
102
+ const response = await fetch(
103
+ `${TWILIO_API_URL}/Accounts/${accountSid}/Messages/${messageSid}.json`,
104
+ {
105
+ method: "GET",
106
+ headers: {
107
+ Authorization: createAuthHeader(accountSid, authToken)
108
+ }
109
+ }
110
+ );
111
+ const data = await response.json();
112
+ if (!response.ok) {
113
+ return {
114
+ success: false,
115
+ error: data.message || `HTTP ${response.status}`
116
+ };
117
+ }
118
+ return {
119
+ success: true,
120
+ messageSid: data.sid,
121
+ status: data.status,
122
+ dateCreated: data.date_created,
123
+ direction: data.direction,
124
+ from: data.from,
125
+ to: data.to
126
+ };
127
+ } catch (error) {
128
+ console.error("Error getting message status:", error);
129
+ return {
130
+ success: false,
131
+ error: error instanceof Error ? error.message : "Unknown error"
132
+ };
133
+ }
134
+ }
135
+ function parseIncomingSMS(body) {
136
+ const numMedia = parseInt(body.NumMedia || "0", 10);
137
+ const mediaUrls = [];
138
+ const mediaContentTypes = [];
139
+ for (let i = 0; i < numMedia; i++) {
140
+ if (body[`MediaUrl${i}`]) {
141
+ mediaUrls.push(body[`MediaUrl${i}`]);
142
+ }
143
+ if (body[`MediaContentType${i}`]) {
144
+ mediaContentTypes.push(body[`MediaContentType${i}`]);
145
+ }
146
+ }
147
+ return {
148
+ messageSid: body.MessageSid || body.SmsSid || "",
149
+ accountSid: body.AccountSid || "",
150
+ from: body.From || "",
151
+ to: body.To || "",
152
+ body: body.Body || "",
153
+ numMedia,
154
+ mediaUrls: mediaUrls.length > 0 ? mediaUrls : void 0,
155
+ mediaContentTypes: mediaContentTypes.length > 0 ? mediaContentTypes : void 0,
156
+ fromCity: body.FromCity,
157
+ fromState: body.FromState,
158
+ fromCountry: body.FromCountry,
159
+ fromZip: body.FromZip
160
+ };
161
+ }
162
+ function generateSMSResponse(message) {
163
+ if (!message) {
164
+ return '<?xml version="1.0" encoding="UTF-8"?><Response></Response>';
165
+ }
166
+ const escapedMessage = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
167
+ return `<?xml version="1.0" encoding="UTF-8"?><Response><Message>${escapedMessage}</Message></Response>`;
168
+ }
169
+ function validateTwilioSignature(signature, url, params, authToken) {
170
+ let data = url;
171
+ const sortedKeys = Object.keys(params).sort();
172
+ for (const key of sortedKeys) {
173
+ data += key + params[key];
174
+ }
175
+ const crypto = __require("crypto");
176
+ const expectedSignature = crypto.createHmac("sha1", authToken).update(data, "utf-8").digest("base64");
177
+ return crypto.timingSafeEqual(
178
+ Buffer.from(signature),
179
+ Buffer.from(expectedSignature)
180
+ );
181
+ }
182
+ function isTwilioConfigured() {
183
+ return getTwilioConfig() !== null;
184
+ }
185
+
186
+ export {
187
+ getTwilioConfig,
188
+ sendSMS,
189
+ sendMMS,
190
+ getMessageStatus,
191
+ parseIncomingSMS,
192
+ generateSMSResponse,
193
+ validateTwilioSignature,
194
+ isTwilioConfigured
195
+ };
196
+ //# sourceMappingURL=chunk-6PMVAAA7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integrations/twilio/sms.ts"],"sourcesContent":["/**\n * Twilio SMS Integration for OpenSentinel\n *\n * Provides functionality to send and receive SMS/MMS messages via Twilio.\n */\n\nimport { env } from \"../../config/env\";\n\n// Twilio API base URL\nconst TWILIO_API_URL = \"https://api.twilio.com/2010-04-01\";\n\nexport interface SMSMessage {\n to: string;\n body: string;\n mediaUrl?: string | string[];\n statusCallback?: string;\n}\n\nexport interface SMSResponse {\n success: boolean;\n messageSid?: string;\n status?: string;\n error?: string;\n dateCreated?: string;\n direction?: string;\n from?: string;\n to?: string;\n}\n\nexport interface IncomingSMS {\n messageSid: string;\n accountSid: string;\n from: string;\n to: string;\n body: string;\n numMedia: number;\n mediaUrls?: string[];\n mediaContentTypes?: string[];\n fromCity?: string;\n fromState?: string;\n fromCountry?: string;\n fromZip?: string;\n}\n\nexport interface SMSConfig {\n accountSid: string;\n authToken: string;\n phoneNumber: string;\n}\n\n/**\n * Get Twilio configuration from environment\n */\nexport function getTwilioConfig(): SMSConfig | null {\n if (!env.TWILIO_ACCOUNT_SID || !env.TWILIO_AUTH_TOKEN || !env.TWILIO_PHONE_NUMBER) {\n return null;\n }\n\n return {\n accountSid: env.TWILIO_ACCOUNT_SID,\n authToken: env.TWILIO_AUTH_TOKEN,\n phoneNumber: env.TWILIO_PHONE_NUMBER,\n };\n}\n\n/**\n * Create basic auth header for Twilio API\n */\nfunction createAuthHeader(accountSid: string, authToken: string): string {\n const credentials = Buffer.from(`${accountSid}:${authToken}`).toString(\"base64\");\n return `Basic ${credentials}`;\n}\n\n/**\n * Send an SMS message\n */\nexport async function sendSMS(\n message: SMSMessage,\n config?: SMSConfig\n): Promise<SMSResponse> {\n const twilioConfig = config || getTwilioConfig();\n\n if (!twilioConfig) {\n return {\n success: false,\n error: \"Twilio is not configured. Set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER.\",\n };\n }\n\n const { accountSid, authToken, phoneNumber } = twilioConfig;\n\n try {\n // Build form data\n const formData = new URLSearchParams();\n formData.append(\"To\", message.to);\n formData.append(\"From\", phoneNumber);\n formData.append(\"Body\", message.body);\n\n // Add media URLs for MMS\n if (message.mediaUrl) {\n const mediaUrls = Array.isArray(message.mediaUrl) ? message.mediaUrl : [message.mediaUrl];\n for (const url of mediaUrls) {\n formData.append(\"MediaUrl\", url);\n }\n }\n\n // Add status callback if provided\n if (message.statusCallback) {\n formData.append(\"StatusCallback\", message.statusCallback);\n }\n\n const response = await fetch(\n `${TWILIO_API_URL}/Accounts/${accountSid}/Messages.json`,\n {\n method: \"POST\",\n headers: {\n Authorization: createAuthHeader(accountSid, authToken),\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: formData.toString(),\n }\n );\n\n const data = await response.json() as Record<string, unknown>;\n\n if (!response.ok) {\n return {\n success: false,\n error: (data.message as string) || `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n return {\n success: true,\n messageSid: data.sid as string,\n status: data.status as string,\n dateCreated: data.date_created as string,\n direction: data.direction as string,\n from: data.from as string,\n to: data.to as string,\n };\n } catch (error) {\n console.error(\"Error sending SMS:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error sending SMS\",\n };\n }\n}\n\n/**\n * Send an MMS message with media attachments\n */\nexport async function sendMMS(\n to: string,\n body: string,\n mediaUrls: string | string[],\n config?: SMSConfig\n): Promise<SMSResponse> {\n return sendSMS(\n {\n to,\n body,\n mediaUrl: mediaUrls,\n },\n config\n );\n}\n\n/**\n * Get message status by SID\n */\nexport async function getMessageStatus(\n messageSid: string,\n config?: SMSConfig\n): Promise<SMSResponse> {\n const twilioConfig = config || getTwilioConfig();\n\n if (!twilioConfig) {\n return {\n success: false,\n error: \"Twilio is not configured.\",\n };\n }\n\n const { accountSid, authToken } = twilioConfig;\n\n try {\n const response = await fetch(\n `${TWILIO_API_URL}/Accounts/${accountSid}/Messages/${messageSid}.json`,\n {\n method: \"GET\",\n headers: {\n Authorization: createAuthHeader(accountSid, authToken),\n },\n }\n );\n\n const data = await response.json() as Record<string, unknown>;\n\n if (!response.ok) {\n return {\n success: false,\n error: (data.message as string) || `HTTP ${response.status}`,\n };\n }\n\n return {\n success: true,\n messageSid: data.sid as string,\n status: data.status as string,\n dateCreated: data.date_created as string,\n direction: data.direction as string,\n from: data.from as string,\n to: data.to as string,\n };\n } catch (error) {\n console.error(\"Error getting message status:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Parse incoming SMS webhook data from Twilio\n */\nexport function parseIncomingSMS(body: Record<string, string>): IncomingSMS {\n const numMedia = parseInt(body.NumMedia || \"0\", 10);\n const mediaUrls: string[] = [];\n const mediaContentTypes: string[] = [];\n\n // Extract media URLs if present\n for (let i = 0; i < numMedia; i++) {\n if (body[`MediaUrl${i}`]) {\n mediaUrls.push(body[`MediaUrl${i}`]);\n }\n if (body[`MediaContentType${i}`]) {\n mediaContentTypes.push(body[`MediaContentType${i}`]);\n }\n }\n\n return {\n messageSid: body.MessageSid || body.SmsSid || \"\",\n accountSid: body.AccountSid || \"\",\n from: body.From || \"\",\n to: body.To || \"\",\n body: body.Body || \"\",\n numMedia,\n mediaUrls: mediaUrls.length > 0 ? mediaUrls : undefined,\n mediaContentTypes: mediaContentTypes.length > 0 ? mediaContentTypes : undefined,\n fromCity: body.FromCity,\n fromState: body.FromState,\n fromCountry: body.FromCountry,\n fromZip: body.FromZip,\n };\n}\n\n/**\n * Generate TwiML response for SMS\n */\nexport function generateSMSResponse(message?: string): string {\n if (!message) {\n return '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Response></Response>';\n }\n\n // Escape XML special characters\n const escapedMessage = message\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><Response><Message>${escapedMessage}</Message></Response>`;\n}\n\n/**\n * Validate Twilio webhook signature\n */\nexport function validateTwilioSignature(\n signature: string,\n url: string,\n params: Record<string, string>,\n authToken: string\n): boolean {\n // Build the string to sign\n let data = url;\n const sortedKeys = Object.keys(params).sort();\n for (const key of sortedKeys) {\n data += key + params[key];\n }\n\n // Create HMAC-SHA1 signature\n const crypto = require(\"crypto\");\n const expectedSignature = crypto\n .createHmac(\"sha1\", authToken)\n .update(data, \"utf-8\")\n .digest(\"base64\");\n\n // Constant-time comparison\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n}\n\n/**\n * Check if Twilio is configured\n */\nexport function isTwilioConfigured(): boolean {\n return getTwilioConfig() !== null;\n}\n"],"mappings":"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","names":[]}