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.
- package/README.md +354 -283
- package/dist/archiver-AVNBYCKQ.js +15340 -0
- package/dist/archiver-AVNBYCKQ.js.map +1 -0
- package/dist/audit-logger-OBPR7CRO.js +22 -0
- package/dist/auth-UOX5K2BE.js +18 -0
- package/dist/autonomy-ZXDBDQUJ.js +86 -0
- package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
- package/dist/aws-s3-Q4LLZZPD.js +146 -0
- package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
- package/dist/backup-restore-PZ7CYYB7.js +16 -0
- package/dist/blocks-R3PODY47.js +23 -0
- package/dist/bot-QRARP4UN.js +36 -0
- package/dist/brain-7XLLM3KC.js +56 -0
- package/dist/camera-monitor-M5CYKUU4.js +335 -0
- package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
- package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
- package/dist/chunk-22VGGA7S.js +330 -0
- package/dist/chunk-22VGGA7S.js.map +1 -0
- package/dist/chunk-35WYTA3C.js +382 -0
- package/dist/chunk-35WYTA3C.js.map +1 -0
- package/dist/chunk-3E2PSU2C.js +146 -0
- package/dist/chunk-3E2PSU2C.js.map +1 -0
- package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
- package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
- package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
- package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
- package/dist/chunk-6KONMXQ6.js +297 -0
- package/dist/chunk-6KONMXQ6.js.map +1 -0
- package/dist/chunk-6PMVAAA7.js +196 -0
- package/dist/chunk-6PMVAAA7.js.map +1 -0
- package/dist/chunk-766ASQWE.js +32620 -0
- package/dist/chunk-766ASQWE.js.map +1 -0
- package/dist/chunk-7WQO5J2M.js +29 -0
- package/dist/chunk-7WQO5J2M.js.map +1 -0
- package/dist/chunk-APHSRMBS.js +148 -0
- package/dist/chunk-APHSRMBS.js.map +1 -0
- package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
- package/dist/chunk-AYUKPTSM.js.map +1 -0
- package/dist/chunk-BIPYADGB.js +84 -0
- package/dist/chunk-BIPYADGB.js.map +1 -0
- package/dist/chunk-BRBWNV65.js +457 -0
- package/dist/chunk-BRBWNV65.js.map +1 -0
- package/dist/chunk-BXZ6EA52.js +382 -0
- package/dist/chunk-BXZ6EA52.js.map +1 -0
- package/dist/chunk-EVE7MIIY.js +290 -0
- package/dist/chunk-EVE7MIIY.js.map +1 -0
- package/dist/chunk-F3TTNID2.js +138 -0
- package/dist/chunk-F3TTNID2.js.map +1 -0
- package/dist/chunk-H5RQOFO2.js +190 -0
- package/dist/chunk-H5RQOFO2.js.map +1 -0
- package/dist/chunk-HN3F4WSW.js +145 -0
- package/dist/chunk-HN3F4WSW.js.map +1 -0
- package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
- package/dist/chunk-I6BDYQIG.js.map +1 -0
- package/dist/chunk-IZJMVV7O.js +347 -0
- package/dist/chunk-IZJMVV7O.js.map +1 -0
- package/dist/chunk-KM22GV7G.js +211 -0
- package/dist/chunk-KM22GV7G.js.map +1 -0
- package/dist/chunk-MGFBLVR7.js +103 -0
- package/dist/chunk-MGFBLVR7.js.map +1 -0
- package/dist/chunk-MQJ2ECQT.js +228 -0
- package/dist/chunk-MQJ2ECQT.js.map +1 -0
- package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
- package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
- package/dist/chunk-NPRTSZIF.js +131 -0
- package/dist/chunk-NPRTSZIF.js.map +1 -0
- package/dist/chunk-O7IH7JTI.js +1898 -0
- package/dist/chunk-O7IH7JTI.js.map +1 -0
- package/dist/chunk-OCVQGBJK.js +293 -0
- package/dist/chunk-OCVQGBJK.js.map +1 -0
- package/dist/chunk-P6QINGFL.js +332 -0
- package/dist/chunk-P6QINGFL.js.map +1 -0
- package/dist/chunk-PHDZKPNE.js +91 -0
- package/dist/chunk-PHDZKPNE.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PTGTGXV2.js +164 -0
- package/dist/chunk-PTGTGXV2.js.map +1 -0
- package/dist/chunk-REMIY4U2.js +171 -0
- package/dist/chunk-REMIY4U2.js.map +1 -0
- package/dist/chunk-RZ4YESBG.js +141 -0
- package/dist/chunk-RZ4YESBG.js.map +1 -0
- package/dist/chunk-SAX5MHK4.js +111 -0
- package/dist/chunk-SAX5MHK4.js.map +1 -0
- package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
- package/dist/chunk-SPPMCAKG.js +777 -0
- package/dist/chunk-SPPMCAKG.js.map +1 -0
- package/dist/chunk-SVAPX2XN.js +2441 -0
- package/dist/chunk-SVAPX2XN.js.map +1 -0
- package/dist/chunk-TVEWKIK3.js +452 -0
- package/dist/chunk-TVEWKIK3.js.map +1 -0
- package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
- package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
- package/dist/chunk-VNX5GMTN.js +128 -0
- package/dist/chunk-VNX5GMTN.js.map +1 -0
- package/dist/chunk-VRD5CYRL.js +1568 -0
- package/dist/chunk-VRD5CYRL.js.map +1 -0
- package/dist/chunk-WLUHNG6X.js +122 -0
- package/dist/chunk-WLUHNG6X.js.map +1 -0
- package/dist/chunk-WRAKK6K6.js +265 -0
- package/dist/chunk-WRAKK6K6.js.map +1 -0
- package/dist/chunk-XKYRH4FM.js +681 -0
- package/dist/chunk-XKYRH4FM.js.map +1 -0
- package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
- package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
- package/dist/chunk-ZLZKF2PM.js +310 -0
- package/dist/chunk-ZLZKF2PM.js.map +1 -0
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-ZQSFPMOB.js +21 -0
- package/dist/clipboard-manager-TEO2GEDN.js +24 -0
- package/dist/commands/setup.js +3 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.js +3 -3
- package/dist/commands/status.js +2 -2
- package/dist/commands/stop.js +2 -2
- package/dist/commands/utils.js +2 -2
- package/dist/cron-explain-HHQKPD3M.js +16 -0
- package/dist/crypto-4AP47IKC.js +14 -0
- package/dist/crypto-4AP47IKC.js.map +1 -0
- package/dist/databases-37X4CI2Y.js +21 -0
- package/dist/databases-37X4CI2Y.js.map +1 -0
- package/dist/discord-B3HUPGQ6.js +70 -0
- package/dist/discord-B3HUPGQ6.js.map +1 -0
- package/dist/dist-UISMLMFN.js +21847 -0
- package/dist/dist-UISMLMFN.js.map +1 -0
- package/dist/email-K7LO2IPB.js +268 -0
- package/dist/email-K7LO2IPB.js.map +1 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
- package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
- package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
- package/dist/entity-resolution-Y3IUWEAT.js +24 -0
- package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
- package/dist/env-IWXUVTCB.js +12 -0
- package/dist/env-IWXUVTCB.js.map +1 -0
- package/dist/google-workspace-DKWUVNGC.js +169 -0
- package/dist/google-workspace-DKWUVNGC.js.map +1 -0
- package/dist/hash-tool-ULQYD7B5.js +22 -0
- package/dist/hash-tool-ULQYD7B5.js.map +1 -0
- package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
- package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
- package/dist/image-generation-OSU7FP6F.js +486 -0
- package/dist/image-generation-OSU7FP6F.js.map +1 -0
- package/dist/imessage-NGA2XF2V.js +35 -0
- package/dist/imessage-NGA2XF2V.js.map +1 -0
- package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
- package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
- package/dist/incident-response-C5J7Q6DT.js +244 -0
- package/dist/incident-response-C5J7Q6DT.js.map +1 -0
- package/dist/inventory-manager-352OHXWD.js +24 -0
- package/dist/inventory-manager-352OHXWD.js.map +1 -0
- package/dist/jira-GSGDBMIG.js +199 -0
- package/dist/jira-GSGDBMIG.js.map +1 -0
- package/dist/json-tool-QE2SYHEG.js +26 -0
- package/dist/json-tool-QE2SYHEG.js.map +1 -0
- package/dist/key-rotation-DPHU4ZTB.js +18 -0
- package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
- package/dist/lib.d.ts +603 -11
- package/dist/lib.js +161 -35
- package/dist/lib.js.map +1 -1
- package/dist/mailchimp-KKNF6QJ7.js +152 -0
- package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
- package/dist/matrix-QVHG76I7.js +279 -0
- package/dist/matrix-QVHG76I7.js.map +1 -0
- package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
- package/dist/mcp-3JI6W7ZE.js.map +1 -0
- package/dist/microsoft365-UCBKJHNX.js +164 -0
- package/dist/microsoft365-UCBKJHNX.js.map +1 -0
- package/dist/ocr-AC7NPX33.js +22 -0
- package/dist/ocr-AC7NPX33.js.map +1 -0
- package/dist/ollama-BOAMSPLJ.js +8 -0
- package/dist/ollama-BOAMSPLJ.js.map +1 -0
- package/dist/pages-MI523RB7.js +26 -0
- package/dist/pages-MI523RB7.js.map +1 -0
- package/dist/pair-JDFTERIK.js +24 -0
- package/dist/pair-JDFTERIK.js.map +1 -0
- package/dist/pairing-IFQYCPNS.js +10 -0
- package/dist/pairing-IFQYCPNS.js.map +1 -0
- package/dist/pdf-ALQVOEJR.js +17 -0
- package/dist/pdf-ALQVOEJR.js.map +1 -0
- package/dist/presentations-DSV5IHG5.js +1002 -0
- package/dist/presentations-DSV5IHG5.js.map +1 -0
- package/dist/prometheus-JNT2BD4L.js +10 -0
- package/dist/prometheus-JNT2BD4L.js.map +1 -0
- package/dist/providers-J4LYPHDR.js +19 -0
- package/dist/providers-J4LYPHDR.js.map +1 -0
- package/dist/qr-code-WIX4PB4U.js +16 -0
- package/dist/qr-code-WIX4PB4U.js.map +1 -0
- package/dist/quickbooks-XB4NII2S.js +190 -0
- package/dist/quickbooks-XB4NII2S.js.map +1 -0
- package/dist/regex-tool-W4ABRKGK.js +24 -0
- package/dist/regex-tool-W4ABRKGK.js.map +1 -0
- package/dist/scheduler-VK4WFERV.js +63 -0
- package/dist/scheduler-VK4WFERV.js.map +1 -0
- package/dist/search-BCLBO5E3.js +25 -0
- package/dist/search-BCLBO5E3.js.map +1 -0
- package/dist/sendgrid-RNXCAFKM.js +152 -0
- package/dist/sendgrid-RNXCAFKM.js.map +1 -0
- package/dist/shopify-NCXYJB4R.js +171 -0
- package/dist/shopify-NCXYJB4R.js.map +1 -0
- package/dist/signal-6CGDFYL2.js +35 -0
- package/dist/signal-6CGDFYL2.js.map +1 -0
- package/dist/slack-IZQWIKOH.js +75 -0
- package/dist/slack-IZQWIKOH.js.map +1 -0
- package/dist/sms-M3JIOTCW.js +23 -0
- package/dist/sms-M3JIOTCW.js.map +1 -0
- package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
- package/dist/src-VYUE6LRA.js.map +1 -0
- package/dist/stocks-XXWBPOCU.js +14 -0
- package/dist/stocks-XXWBPOCU.js.map +1 -0
- package/dist/text-transform-6SGUA5Z4.js +22 -0
- package/dist/text-transform-6SGUA5Z4.js.map +1 -0
- package/dist/tools-2RLEI2N6.js +38 -0
- package/dist/tools-2RLEI2N6.js.map +1 -0
- package/dist/tunnel-IWMXUML4.js +301 -0
- package/dist/tunnel-IWMXUML4.js.map +1 -0
- package/dist/twilio-53GEW5JT.js +139 -0
- package/dist/twilio-53GEW5JT.js.map +1 -0
- package/dist/unit-converter-ZYXMEZOE.js +14 -0
- package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
- package/dist/whatsapp-LFX6YKCM.js +35 -0
- package/dist/whatsapp-LFX6YKCM.js.map +1 -0
- package/dist/word-document-7B6SJMAY.js +902 -0
- package/dist/word-document-7B6SJMAY.js.map +1 -0
- package/dist/xero-QYO66D45.js +162 -0
- package/dist/xero-QYO66D45.js.map +1 -0
- package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
- package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
- package/drizzle/0002_mushy_master_mold.sql +140 -0
- package/drizzle/meta/0002_snapshot.json +3637 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +100 -98
- package/dist/bot-KJ26BG56.js +0 -15
- package/dist/chunk-4LVWXUNC.js.map +0 -1
- package/dist/chunk-4TG2IG5K.js +0 -5249
- package/dist/chunk-4TG2IG5K.js.map +0 -1
- package/dist/chunk-6DRDKB45.js.map +0 -1
- package/dist/chunk-CI6Q63MM.js +0 -1613
- package/dist/chunk-CI6Q63MM.js.map +0 -1
- package/dist/chunk-KHNYJY2Z.js +0 -178
- package/dist/chunk-KHNYJY2Z.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -17
- package/dist/discord-ZOJFTVTB.js +0 -49
- package/dist/imessage-JFRB6EJ7.js +0 -14
- package/dist/scheduler-EZ7CZMCS.js +0 -42
- package/dist/signal-T3MCSULM.js +0 -14
- package/dist/slack-N2M4FHAJ.js +0 -54
- package/dist/src-K7GASHRH.js.map +0 -1
- package/dist/tools-24GZHYRF.js +0 -16
- package/dist/whatsapp-VCRUPAO5.js +0 -14
- /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
- /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
- /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
- /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
- /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
- /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
- /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
- /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
- /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
- /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
- /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
- /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
- /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
- /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
- /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
- /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
- /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
- /package/dist/{whatsapp-VCRUPAO5.js.map → cron-explain-HHQKPD3M.js.map} +0 -0
package/dist/lib.js
CHANGED
|
@@ -1,54 +1,140 @@
|
|
|
1
1
|
import {
|
|
2
2
|
app
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-O7IH7JTI.js";
|
|
4
|
+
import {
|
|
5
|
+
SignalBot
|
|
6
|
+
} from "./chunk-VEHFVBLI.js";
|
|
4
7
|
import {
|
|
5
8
|
iMessageBot
|
|
6
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-NHMBTUMW.js";
|
|
7
10
|
import {
|
|
8
11
|
createBot
|
|
9
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-I6BDYQIG.js";
|
|
10
13
|
import {
|
|
11
14
|
DiscordBot
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-TYAGMJNV.js";
|
|
16
|
+
import "./chunk-MXAPLSJ5.js";
|
|
14
17
|
import {
|
|
15
18
|
SlackBot
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-4UOE5TUZ.js";
|
|
20
|
+
import "./chunk-SJSUSJ47.js";
|
|
18
21
|
import {
|
|
19
22
|
cancelTask,
|
|
20
23
|
generateBriefing,
|
|
21
24
|
scheduleReminder,
|
|
22
25
|
scheduleTask
|
|
23
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-AYUKPTSM.js";
|
|
24
27
|
import {
|
|
25
28
|
WhatsAppBot
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import {
|
|
28
|
-
SignalBot
|
|
29
|
-
} from "./chunk-JXUP2X7V.js";
|
|
29
|
+
} from "./chunk-66OJ3WB4.js";
|
|
30
30
|
import {
|
|
31
31
|
SYSTEM_PROMPT,
|
|
32
|
-
|
|
32
|
+
TOOLS,
|
|
33
33
|
chat,
|
|
34
34
|
chatWithTools,
|
|
35
|
+
executeTool,
|
|
36
|
+
streamChat,
|
|
37
|
+
streamChatWithTools
|
|
38
|
+
} from "./chunk-766ASQWE.js";
|
|
39
|
+
import {
|
|
40
|
+
buildMemoryContext,
|
|
35
41
|
extractMemories,
|
|
36
42
|
generateEmbedding,
|
|
37
43
|
searchMemories,
|
|
38
|
-
storeMemory
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
storeMemory
|
|
45
|
+
} from "./chunk-IZJMVV7O.js";
|
|
46
|
+
import {
|
|
47
|
+
changeCase,
|
|
48
|
+
countText,
|
|
49
|
+
detectLanguage,
|
|
50
|
+
extractKeywords,
|
|
51
|
+
transformText
|
|
52
|
+
} from "./chunk-PTGTGXV2.js";
|
|
53
|
+
import {
|
|
54
|
+
diffJson,
|
|
55
|
+
flattenJson,
|
|
56
|
+
formatJson,
|
|
57
|
+
jsonTool,
|
|
58
|
+
queryJson,
|
|
59
|
+
validateJson
|
|
60
|
+
} from "./chunk-F3TTNID2.js";
|
|
61
|
+
import {
|
|
62
|
+
cronTool,
|
|
63
|
+
explainCron,
|
|
64
|
+
getNextRuns,
|
|
65
|
+
validateCron
|
|
66
|
+
} from "./chunk-APHSRMBS.js";
|
|
67
|
+
import {
|
|
68
|
+
compareHashes,
|
|
69
|
+
generateToken,
|
|
70
|
+
hashString,
|
|
71
|
+
hashTool
|
|
72
|
+
} from "./chunk-PHDZKPNE.js";
|
|
73
|
+
import {
|
|
74
|
+
extractCaptures,
|
|
75
|
+
regexTool,
|
|
76
|
+
replaceWithRegex,
|
|
77
|
+
testRegex
|
|
78
|
+
} from "./chunk-WLUHNG6X.js";
|
|
79
|
+
import {
|
|
80
|
+
convert,
|
|
81
|
+
unitConverter
|
|
82
|
+
} from "./chunk-REMIY4U2.js";
|
|
83
|
+
import {
|
|
84
|
+
generateQRSvg,
|
|
85
|
+
qrCodeTool
|
|
86
|
+
} from "./chunk-VNX5GMTN.js";
|
|
87
|
+
import {
|
|
88
|
+
clipboardTool
|
|
89
|
+
} from "./chunk-MGFBLVR7.js";
|
|
90
|
+
import {
|
|
91
|
+
generateEncryptionKey,
|
|
92
|
+
getRotationInfo,
|
|
93
|
+
reEncryptValue
|
|
94
|
+
} from "./chunk-BIPYADGB.js";
|
|
95
|
+
import {
|
|
96
|
+
createDatabaseBackup,
|
|
97
|
+
listBackups,
|
|
98
|
+
restoreDatabase
|
|
99
|
+
} from "./chunk-NPRTSZIF.js";
|
|
100
|
+
import {
|
|
101
|
+
checkHeartbeats,
|
|
102
|
+
getHeartbeatSummary,
|
|
103
|
+
recordBeat,
|
|
104
|
+
registerService
|
|
105
|
+
} from "./chunk-SAX5MHK4.js";
|
|
106
|
+
import "./chunk-6PMVAAA7.js";
|
|
107
|
+
import "./chunk-MQJ2ECQT.js";
|
|
108
|
+
import "./chunk-TVEWKIK3.js";
|
|
109
|
+
import "./chunk-BRBWNV65.js";
|
|
110
|
+
import "./chunk-H5RQOFO2.js";
|
|
111
|
+
import "./chunk-VRD5CYRL.js";
|
|
112
|
+
import "./chunk-KM22GV7G.js";
|
|
113
|
+
import "./chunk-P6QINGFL.js";
|
|
114
|
+
import "./chunk-HN3F4WSW.js";
|
|
115
|
+
import "./chunk-SVAPX2XN.js";
|
|
116
|
+
import "./chunk-WRAKK6K6.js";
|
|
117
|
+
import "./chunk-7WQO5J2M.js";
|
|
118
|
+
import {
|
|
119
|
+
initializeProviders
|
|
120
|
+
} from "./chunk-BXZ6EA52.js";
|
|
121
|
+
import "./chunk-4GLYY4NN.js";
|
|
122
|
+
import "./chunk-EVE7MIIY.js";
|
|
123
|
+
import "./chunk-RZ4YESBG.js";
|
|
124
|
+
import "./chunk-CQ4JURG7.js";
|
|
125
|
+
import "./chunk-OCVQGBJK.js";
|
|
126
|
+
import {
|
|
127
|
+
db
|
|
128
|
+
} from "./chunk-XKYRH4FM.js";
|
|
42
129
|
import {
|
|
43
|
-
TOOLS,
|
|
44
130
|
configure,
|
|
45
|
-
db,
|
|
46
131
|
env,
|
|
47
|
-
|
|
48
|
-
} from "./chunk-
|
|
49
|
-
import "./chunk-
|
|
50
|
-
import "./chunk-
|
|
51
|
-
import "./chunk-
|
|
132
|
+
ready
|
|
133
|
+
} from "./chunk-ZLZKF2PM.js";
|
|
134
|
+
import "./chunk-6KONMXQ6.js";
|
|
135
|
+
import "./chunk-22VGGA7S.js";
|
|
136
|
+
import "./chunk-35WYTA3C.js";
|
|
137
|
+
import "./chunk-PLDDJCW6.js";
|
|
52
138
|
|
|
53
139
|
// src/app.ts
|
|
54
140
|
var OpenSentinel = class {
|
|
@@ -66,7 +152,7 @@ var OpenSentinel = class {
|
|
|
66
152
|
if (this._running) return;
|
|
67
153
|
const services = this.config.services || {};
|
|
68
154
|
if (services.telegram && env.TELEGRAM_BOT_TOKEN) {
|
|
69
|
-
const { createBot: createBot2 } = await import("./bot-
|
|
155
|
+
const { createBot: createBot2 } = await import("./bot-QRARP4UN.js");
|
|
70
156
|
this._services.telegramBot = createBot2();
|
|
71
157
|
this._services.telegramBot.start({
|
|
72
158
|
onStart: (botInfo) => {
|
|
@@ -76,7 +162,7 @@ var OpenSentinel = class {
|
|
|
76
162
|
}
|
|
77
163
|
if (services.scheduler) {
|
|
78
164
|
try {
|
|
79
|
-
const { startWorker } = await import("./scheduler-
|
|
165
|
+
const { startWorker } = await import("./scheduler-VK4WFERV.js");
|
|
80
166
|
startWorker(async (task) => {
|
|
81
167
|
console.log(`[Scheduler] Executing task: ${task.type}`);
|
|
82
168
|
if (task.chatId && task.message && this._services.telegramBot) {
|
|
@@ -96,8 +182,8 @@ var OpenSentinel = class {
|
|
|
96
182
|
}
|
|
97
183
|
if (services.mcp !== false && env.MCP_ENABLED) {
|
|
98
184
|
try {
|
|
99
|
-
const { initMCPRegistry, getMCPToolSummary } = await import("./mcp-
|
|
100
|
-
const { setMCPRegistry } = await import("./tools-
|
|
185
|
+
const { initMCPRegistry, getMCPToolSummary } = await import("./mcp-3JI6W7ZE.js");
|
|
186
|
+
const { setMCPRegistry } = await import("./tools-2RLEI2N6.js");
|
|
101
187
|
this._services.mcpRegistry = await initMCPRegistry(env.MCP_CONFIG_PATH);
|
|
102
188
|
setMCPRegistry(this._services.mcpRegistry);
|
|
103
189
|
if (this._services.mcpRegistry.connectedCount > 0) {
|
|
@@ -113,7 +199,7 @@ var OpenSentinel = class {
|
|
|
113
199
|
}
|
|
114
200
|
if (services.discord && env.DISCORD_BOT_TOKEN) {
|
|
115
201
|
try {
|
|
116
|
-
const { DiscordBot: DiscordBot2 } = await import("./discord-
|
|
202
|
+
const { DiscordBot: DiscordBot2 } = await import("./discord-B3HUPGQ6.js");
|
|
117
203
|
this._services.discordBot = new DiscordBot2({
|
|
118
204
|
token: env.DISCORD_BOT_TOKEN,
|
|
119
205
|
clientId: env.DISCORD_CLIENT_ID || "",
|
|
@@ -130,7 +216,7 @@ var OpenSentinel = class {
|
|
|
130
216
|
}
|
|
131
217
|
if (services.slack && env.SLACK_BOT_TOKEN && env.SLACK_SIGNING_SECRET) {
|
|
132
218
|
try {
|
|
133
|
-
const { SlackBot: SlackBot2 } = await import("./slack-
|
|
219
|
+
const { SlackBot: SlackBot2 } = await import("./slack-IZQWIKOH.js");
|
|
134
220
|
this._services.slackBot = new SlackBot2({
|
|
135
221
|
token: env.SLACK_BOT_TOKEN,
|
|
136
222
|
signingSecret: env.SLACK_SIGNING_SECRET,
|
|
@@ -149,7 +235,7 @@ var OpenSentinel = class {
|
|
|
149
235
|
}
|
|
150
236
|
if (services.whatsapp && env.WHATSAPP_ENABLED) {
|
|
151
237
|
try {
|
|
152
|
-
const { WhatsAppBot: WhatsAppBot2 } = await import("./whatsapp-
|
|
238
|
+
const { WhatsAppBot: WhatsAppBot2 } = await import("./whatsapp-LFX6YKCM.js");
|
|
153
239
|
this._services.whatsappBot = new WhatsAppBot2({
|
|
154
240
|
authDir: env.WHATSAPP_AUTH_DIR,
|
|
155
241
|
allowedNumbers: env.WHATSAPP_ALLOWED_NUMBERS?.split(",").filter(Boolean) || [],
|
|
@@ -164,7 +250,7 @@ var OpenSentinel = class {
|
|
|
164
250
|
}
|
|
165
251
|
if (services.signal && env.SIGNAL_ENABLED && env.SIGNAL_PHONE_NUMBER) {
|
|
166
252
|
try {
|
|
167
|
-
const { SignalBot: SignalBot2 } = await import("./signal-
|
|
253
|
+
const { SignalBot: SignalBot2 } = await import("./signal-6CGDFYL2.js");
|
|
168
254
|
this._services.signalBot = new SignalBot2({
|
|
169
255
|
phoneNumber: env.SIGNAL_PHONE_NUMBER,
|
|
170
256
|
signalCliPath: env.SIGNAL_CLI_PATH,
|
|
@@ -179,7 +265,7 @@ var OpenSentinel = class {
|
|
|
179
265
|
}
|
|
180
266
|
if (services.imessage && env.IMESSAGE_ENABLED) {
|
|
181
267
|
try {
|
|
182
|
-
const { iMessageBot: iMessageBot2 } = await import("./imessage-
|
|
268
|
+
const { iMessageBot: iMessageBot2 } = await import("./imessage-NGA2XF2V.js");
|
|
183
269
|
this._services.imessageBot = new iMessageBot2({
|
|
184
270
|
mode: env.IMESSAGE_MODE,
|
|
185
271
|
serverUrl: env.IMESSAGE_BLUEBUBBLES_URL,
|
|
@@ -198,7 +284,7 @@ var OpenSentinel = class {
|
|
|
198
284
|
async stop() {
|
|
199
285
|
if (!this._running) return;
|
|
200
286
|
console.log("Shutting down OpenSentinel...");
|
|
201
|
-
const { stopWorker } = await import("./scheduler-
|
|
287
|
+
const { stopWorker } = await import("./scheduler-VK4WFERV.js");
|
|
202
288
|
stopWorker();
|
|
203
289
|
if (this._services.mcpRegistry) {
|
|
204
290
|
await this._services.mcpRegistry.shutdown();
|
|
@@ -253,22 +339,62 @@ export {
|
|
|
253
339
|
app as apiApp,
|
|
254
340
|
buildMemoryContext,
|
|
255
341
|
cancelTask,
|
|
342
|
+
changeCase,
|
|
256
343
|
chat,
|
|
257
344
|
chatWithTools,
|
|
345
|
+
checkHeartbeats,
|
|
346
|
+
clipboardTool,
|
|
347
|
+
compareHashes,
|
|
258
348
|
configure,
|
|
349
|
+
convert,
|
|
350
|
+
countText,
|
|
351
|
+
createDatabaseBackup,
|
|
259
352
|
createBot as createTelegramBot,
|
|
353
|
+
cronTool,
|
|
260
354
|
db,
|
|
355
|
+
detectLanguage,
|
|
356
|
+
diffJson,
|
|
261
357
|
env,
|
|
262
358
|
executeTool,
|
|
359
|
+
explainCron,
|
|
360
|
+
extractCaptures,
|
|
361
|
+
extractKeywords,
|
|
263
362
|
extractMemories,
|
|
363
|
+
flattenJson,
|
|
364
|
+
formatJson,
|
|
264
365
|
generateBriefing,
|
|
265
366
|
generateEmbedding,
|
|
367
|
+
generateEncryptionKey,
|
|
368
|
+
generateQRSvg,
|
|
369
|
+
generateToken,
|
|
370
|
+
getHeartbeatSummary,
|
|
371
|
+
getNextRuns,
|
|
372
|
+
getRotationInfo,
|
|
373
|
+
hashString,
|
|
374
|
+
hashTool,
|
|
266
375
|
iMessageBot,
|
|
376
|
+
initializeProviders,
|
|
377
|
+
jsonTool,
|
|
378
|
+
listBackups,
|
|
379
|
+
qrCodeTool,
|
|
380
|
+
queryJson,
|
|
381
|
+
reEncryptValue,
|
|
382
|
+
ready,
|
|
383
|
+
recordBeat,
|
|
384
|
+
regexTool,
|
|
385
|
+
registerService,
|
|
386
|
+
replaceWithRegex,
|
|
387
|
+
restoreDatabase,
|
|
267
388
|
scheduleReminder,
|
|
268
389
|
scheduleTask,
|
|
269
390
|
searchMemories,
|
|
270
391
|
storeMemory,
|
|
271
392
|
streamChat,
|
|
272
|
-
streamChatWithTools
|
|
393
|
+
streamChatWithTools,
|
|
394
|
+
testRegex,
|
|
395
|
+
transformText,
|
|
396
|
+
unitConverter,
|
|
397
|
+
validateCron,
|
|
398
|
+
validateJson
|
|
273
399
|
};
|
|
274
400
|
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app.ts"],"sourcesContent":["/**\n * OpenSentinel - Programmatic API\n *\n * Usage:\n * import { OpenSentinel } from 'opensentinel';\n *\n * const sentinel = new OpenSentinel({\n * claudeApiKey: 'sk-ant-...',\n * env: { DATABASE_URL: 'postgresql://...', TELEGRAM_BOT_TOKEN: '...' },\n * services: { telegram: true, api: true },\n * });\n *\n * await sentinel.start();\n */\n\nimport { configure, env, type Env } from \"./config/env\";\nimport { chat, chatWithTools, type Message, type BrainResponse } from \"./core/brain\";\n\nexport interface OpenSentinelConfig {\n /** Required: your Claude API key */\n claudeApiKey: string;\n /** All other env vars as optional overrides */\n env?: Partial<Env>;\n /** Which services to start (all default to false except api) */\n services?: {\n telegram?: boolean;\n discord?: boolean;\n slack?: boolean;\n whatsapp?: boolean;\n signal?: boolean;\n imessage?: boolean;\n api?: boolean;\n scheduler?: boolean;\n mcp?: boolean;\n websocket?: boolean;\n };\n}\n\nexport class OpenSentinel {\n private config: OpenSentinelConfig;\n private _running = false;\n private _services: {\n telegramBot?: any;\n discordBot?: any;\n slackBot?: any;\n whatsappBot?: any;\n signalBot?: any;\n imessageBot?: any;\n mcpRegistry?: any;\n server?: any;\n } = {};\n\n constructor(config: OpenSentinelConfig) {\n this.config = config;\n\n // Configure the env singleton\n configure({\n CLAUDE_API_KEY: config.claudeApiKey,\n ...(config.env || {}),\n } as Partial<Env> & { CLAUDE_API_KEY: string });\n }\n\n async start(): Promise<void> {\n if (this._running) return;\n\n const services = this.config.services || {};\n\n // Start Telegram bot\n if (services.telegram && env.TELEGRAM_BOT_TOKEN) {\n const { createBot } = await import(\"./inputs/telegram/bot\");\n this._services.telegramBot = createBot();\n this._services.telegramBot.start({\n onStart: (botInfo: any) => {\n console.log(`[Telegram] Bot started as @${botInfo.username}`);\n },\n });\n }\n\n // Start scheduler\n if (services.scheduler) {\n try {\n const { startWorker } = await import(\"./core/scheduler\");\n startWorker(async (task: any) => {\n console.log(`[Scheduler] Executing task: ${task.type}`);\n if (task.chatId && task.message && this._services.telegramBot) {\n try {\n await this._services.telegramBot.api.sendMessage(\n task.chatId,\n `Reminder: ${task.message}`\n );\n } catch (err) {\n console.error(\"[Scheduler] Failed to send reminder:\", err);\n }\n }\n });\n } catch (err) {\n console.warn(\"[Scheduler] Could not start worker:\", err);\n }\n }\n\n // Initialize MCP\n if (services.mcp !== false && env.MCP_ENABLED) {\n try {\n const { initMCPRegistry, getMCPToolSummary } = await import(\"./core/mcp\");\n const { setMCPRegistry } = await import(\"./tools\");\n this._services.mcpRegistry = await initMCPRegistry(env.MCP_CONFIG_PATH);\n setMCPRegistry(this._services.mcpRegistry);\n\n if (this._services.mcpRegistry.connectedCount > 0) {\n console.log(\n `[MCP] Connected to ${this._services.mcpRegistry.connectedCount} server(s), ${this._services.mcpRegistry.totalToolCount} tools available`\n );\n console.log(getMCPToolSummary(this._services.mcpRegistry));\n }\n } catch (err) {\n console.warn(\"[MCP] Failed to initialize:\", err);\n this._services.mcpRegistry = null;\n }\n }\n\n // Start Discord bot\n if (services.discord && env.DISCORD_BOT_TOKEN) {\n try {\n const { DiscordBot } = await import(\"./inputs/discord\");\n this._services.discordBot = new DiscordBot({\n token: env.DISCORD_BOT_TOKEN,\n clientId: env.DISCORD_CLIENT_ID || \"\",\n guildId: env.DISCORD_GUILD_ID,\n allowedUserIds: env.DISCORD_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedRoleIds: env.DISCORD_ALLOWED_ROLE_IDS?.split(\",\") || [],\n });\n await this._services.discordBot.start();\n console.log(\"[Discord] Bot started\");\n } catch (err: any) {\n console.warn(\"[Discord] Failed to start bot:\", err.message);\n this._services.discordBot = null;\n }\n }\n\n // Start Slack bot\n if (services.slack && env.SLACK_BOT_TOKEN && env.SLACK_SIGNING_SECRET) {\n try {\n const { SlackBot } = await import(\"./inputs/slack\");\n this._services.slackBot = new SlackBot({\n token: env.SLACK_BOT_TOKEN,\n signingSecret: env.SLACK_SIGNING_SECRET,\n appToken: env.SLACK_APP_TOKEN,\n socketMode: env.SLACK_SOCKET_MODE,\n port: parseInt(String(env.SLACK_PORT) || \"3000\"),\n allowedUserIds: env.SLACK_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedChannelIds: env.SLACK_ALLOWED_CHANNEL_IDS?.split(\",\") || [],\n });\n await this._services.slackBot.start();\n console.log(\"[Slack] Bot started\");\n } catch (err: any) {\n console.warn(\"[Slack] Failed to start bot:\", err.message);\n this._services.slackBot = null;\n }\n }\n\n // Start WhatsApp bot\n if (services.whatsapp && env.WHATSAPP_ENABLED) {\n try {\n const { WhatsAppBot } = await import(\"./inputs/whatsapp\");\n this._services.whatsappBot = new WhatsAppBot({\n authDir: env.WHATSAPP_AUTH_DIR,\n allowedNumbers:\n env.WHATSAPP_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n printQR: true,\n });\n await this._services.whatsappBot.start();\n console.log(\"[WhatsApp] Bot started\");\n } catch (err: any) {\n console.warn(\"[WhatsApp] Failed to start bot:\", err.message);\n this._services.whatsappBot = null;\n }\n }\n\n // Start Signal bot\n if (services.signal && env.SIGNAL_ENABLED && env.SIGNAL_PHONE_NUMBER) {\n try {\n const { SignalBot } = await import(\"./inputs/signal\");\n this._services.signalBot = new SignalBot({\n phoneNumber: env.SIGNAL_PHONE_NUMBER,\n signalCliPath: env.SIGNAL_CLI_PATH,\n allowedNumbers:\n env.SIGNAL_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.signalBot.start();\n console.log(\"[Signal] Bot started\");\n } catch (err: any) {\n console.warn(\"[Signal] Failed to start bot:\", err.message);\n this._services.signalBot = null;\n }\n }\n\n // Start iMessage bot\n if (services.imessage && env.IMESSAGE_ENABLED) {\n try {\n const { iMessageBot } = await import(\"./inputs/imessage\");\n this._services.imessageBot = new iMessageBot({\n mode: env.IMESSAGE_MODE as \"bluebubbles\" | \"applescript\",\n serverUrl: env.IMESSAGE_BLUEBUBBLES_URL,\n password: env.IMESSAGE_BLUEBUBBLES_PASSWORD,\n allowedNumbers:\n env.IMESSAGE_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.imessageBot.start();\n console.log(\"[iMessage] Bot started\");\n } catch (err: any) {\n console.warn(\"[iMessage] Failed to start bot:\", err.message);\n this._services.imessageBot = null;\n }\n }\n\n this._running = true;\n }\n\n async stop(): Promise<void> {\n if (!this._running) return;\n\n console.log(\"Shutting down OpenSentinel...\");\n\n const { stopWorker } = await import(\"./core/scheduler\");\n stopWorker();\n\n if (this._services.mcpRegistry) {\n await this._services.mcpRegistry.shutdown();\n }\n if (this._services.telegramBot) {\n await this._services.telegramBot.stop();\n }\n if (this._services.discordBot) {\n await this._services.discordBot.stop();\n }\n if (this._services.slackBot) {\n await this._services.slackBot.stop();\n }\n if (this._services.whatsappBot) {\n await this._services.whatsappBot.stop();\n }\n if (this._services.signalBot) {\n await this._services.signalBot.stop();\n }\n if (this._services.imessageBot) {\n await this._services.imessageBot.stop();\n }\n if (this._services.server) {\n this._services.server.stop();\n }\n\n this._running = false;\n console.log(\"OpenSentinel stopped.\");\n }\n\n /** Send a simple chat message (no tools) */\n async chat(\n messages: Message[],\n systemPrompt?: string\n ): Promise<BrainResponse> {\n return chat(messages, systemPrompt);\n }\n\n /** Send a chat message with tool execution */\n async chatWithTools(\n messages: Message[],\n userId?: string,\n onToolUse?: (toolName: string, input: unknown) => void\n ): Promise<BrainResponse> {\n return chatWithTools(messages, userId, onToolUse);\n }\n\n get running(): boolean {\n return this._running;\n }\n\n get services() {\n return { ...this._services };\n }\n}\n"],"mappings":"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","names":["createBot","DiscordBot","SlackBot","WhatsAppBot","SignalBot","iMessageBot"]}
|
|
1
|
+
{"version":3,"sources":["../src/app.ts"],"sourcesContent":["/**\n * OpenSentinel - Programmatic API\n *\n * Usage:\n * import { OpenSentinel } from 'opensentinel';\n *\n * const sentinel = new OpenSentinel({\n * claudeApiKey: 'sk-ant-...',\n * env: { DATABASE_URL: 'postgresql://...', TELEGRAM_BOT_TOKEN: '...' },\n * services: { telegram: true, api: true },\n * });\n *\n * await sentinel.start();\n */\n\nimport { configure, env, type Env } from \"./config/env\";\nimport { chat, chatWithTools, type Message, type BrainResponse } from \"./core/brain\";\n\nexport interface OpenSentinelConfig {\n /** Required: your Claude API key */\n claudeApiKey: string;\n /** All other env vars as optional overrides */\n env?: Partial<Env>;\n /** Which services to start (all default to false except api) */\n services?: {\n telegram?: boolean;\n discord?: boolean;\n slack?: boolean;\n whatsapp?: boolean;\n signal?: boolean;\n imessage?: boolean;\n api?: boolean;\n scheduler?: boolean;\n mcp?: boolean;\n websocket?: boolean;\n };\n}\n\nexport class OpenSentinel {\n private config: OpenSentinelConfig;\n private _running = false;\n private _services: {\n telegramBot?: any;\n discordBot?: any;\n slackBot?: any;\n whatsappBot?: any;\n signalBot?: any;\n imessageBot?: any;\n mcpRegistry?: any;\n server?: any;\n } = {};\n\n constructor(config: OpenSentinelConfig) {\n this.config = config;\n\n // Configure the env singleton\n configure({\n CLAUDE_API_KEY: config.claudeApiKey,\n ...(config.env || {}),\n } as Partial<Env> & { CLAUDE_API_KEY: string });\n }\n\n async start(): Promise<void> {\n if (this._running) return;\n\n const services = this.config.services || {};\n\n // Start Telegram bot\n if (services.telegram && env.TELEGRAM_BOT_TOKEN) {\n const { createBot } = await import(\"./inputs/telegram/bot\");\n this._services.telegramBot = createBot();\n this._services.telegramBot.start({\n onStart: (botInfo: any) => {\n console.log(`[Telegram] Bot started as @${botInfo.username}`);\n },\n });\n }\n\n // Start scheduler\n if (services.scheduler) {\n try {\n const { startWorker } = await import(\"./core/scheduler\");\n startWorker(async (task: any) => {\n console.log(`[Scheduler] Executing task: ${task.type}`);\n if (task.chatId && task.message && this._services.telegramBot) {\n try {\n await this._services.telegramBot.api.sendMessage(\n task.chatId,\n `Reminder: ${task.message}`\n );\n } catch (err) {\n console.error(\"[Scheduler] Failed to send reminder:\", err);\n }\n }\n });\n } catch (err) {\n console.warn(\"[Scheduler] Could not start worker:\", err);\n }\n }\n\n // Initialize MCP\n if (services.mcp !== false && env.MCP_ENABLED) {\n try {\n const { initMCPRegistry, getMCPToolSummary } = await import(\"./core/mcp\");\n const { setMCPRegistry } = await import(\"./tools\");\n this._services.mcpRegistry = await initMCPRegistry(env.MCP_CONFIG_PATH);\n setMCPRegistry(this._services.mcpRegistry);\n\n if (this._services.mcpRegistry.connectedCount > 0) {\n console.log(\n `[MCP] Connected to ${this._services.mcpRegistry.connectedCount} server(s), ${this._services.mcpRegistry.totalToolCount} tools available`\n );\n console.log(getMCPToolSummary(this._services.mcpRegistry));\n }\n } catch (err) {\n console.warn(\"[MCP] Failed to initialize:\", err);\n this._services.mcpRegistry = null;\n }\n }\n\n // Start Discord bot\n if (services.discord && env.DISCORD_BOT_TOKEN) {\n try {\n const { DiscordBot } = await import(\"./inputs/discord\");\n this._services.discordBot = new DiscordBot({\n token: env.DISCORD_BOT_TOKEN,\n clientId: env.DISCORD_CLIENT_ID || \"\",\n guildId: env.DISCORD_GUILD_ID,\n allowedUserIds: env.DISCORD_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedRoleIds: env.DISCORD_ALLOWED_ROLE_IDS?.split(\",\") || [],\n });\n await this._services.discordBot.start();\n console.log(\"[Discord] Bot started\");\n } catch (err: any) {\n console.warn(\"[Discord] Failed to start bot:\", err.message);\n this._services.discordBot = null;\n }\n }\n\n // Start Slack bot\n if (services.slack && env.SLACK_BOT_TOKEN && env.SLACK_SIGNING_SECRET) {\n try {\n const { SlackBot } = await import(\"./inputs/slack\");\n this._services.slackBot = new SlackBot({\n token: env.SLACK_BOT_TOKEN,\n signingSecret: env.SLACK_SIGNING_SECRET,\n appToken: env.SLACK_APP_TOKEN,\n socketMode: env.SLACK_SOCKET_MODE,\n port: parseInt(String(env.SLACK_PORT) || \"3000\"),\n allowedUserIds: env.SLACK_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedChannelIds: env.SLACK_ALLOWED_CHANNEL_IDS?.split(\",\") || [],\n });\n await this._services.slackBot.start();\n console.log(\"[Slack] Bot started\");\n } catch (err: any) {\n console.warn(\"[Slack] Failed to start bot:\", err.message);\n this._services.slackBot = null;\n }\n }\n\n // Start WhatsApp bot\n if (services.whatsapp && env.WHATSAPP_ENABLED) {\n try {\n const { WhatsAppBot } = await import(\"./inputs/whatsapp\");\n this._services.whatsappBot = new WhatsAppBot({\n authDir: env.WHATSAPP_AUTH_DIR,\n allowedNumbers:\n env.WHATSAPP_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n printQR: true,\n });\n await this._services.whatsappBot.start();\n console.log(\"[WhatsApp] Bot started\");\n } catch (err: any) {\n console.warn(\"[WhatsApp] Failed to start bot:\", err.message);\n this._services.whatsappBot = null;\n }\n }\n\n // Start Signal bot\n if (services.signal && env.SIGNAL_ENABLED && env.SIGNAL_PHONE_NUMBER) {\n try {\n const { SignalBot } = await import(\"./inputs/signal\");\n this._services.signalBot = new SignalBot({\n phoneNumber: env.SIGNAL_PHONE_NUMBER,\n signalCliPath: env.SIGNAL_CLI_PATH,\n allowedNumbers:\n env.SIGNAL_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.signalBot.start();\n console.log(\"[Signal] Bot started\");\n } catch (err: any) {\n console.warn(\"[Signal] Failed to start bot:\", err.message);\n this._services.signalBot = null;\n }\n }\n\n // Start iMessage bot\n if (services.imessage && env.IMESSAGE_ENABLED) {\n try {\n const { iMessageBot } = await import(\"./inputs/imessage\");\n this._services.imessageBot = new iMessageBot({\n mode: env.IMESSAGE_MODE as \"bluebubbles\" | \"applescript\",\n serverUrl: env.IMESSAGE_BLUEBUBBLES_URL,\n password: env.IMESSAGE_BLUEBUBBLES_PASSWORD,\n allowedNumbers:\n env.IMESSAGE_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.imessageBot.start();\n console.log(\"[iMessage] Bot started\");\n } catch (err: any) {\n console.warn(\"[iMessage] Failed to start bot:\", err.message);\n this._services.imessageBot = null;\n }\n }\n\n this._running = true;\n }\n\n async stop(): Promise<void> {\n if (!this._running) return;\n\n console.log(\"Shutting down OpenSentinel...\");\n\n const { stopWorker } = await import(\"./core/scheduler\");\n stopWorker();\n\n if (this._services.mcpRegistry) {\n await this._services.mcpRegistry.shutdown();\n }\n if (this._services.telegramBot) {\n await this._services.telegramBot.stop();\n }\n if (this._services.discordBot) {\n await this._services.discordBot.stop();\n }\n if (this._services.slackBot) {\n await this._services.slackBot.stop();\n }\n if (this._services.whatsappBot) {\n await this._services.whatsappBot.stop();\n }\n if (this._services.signalBot) {\n await this._services.signalBot.stop();\n }\n if (this._services.imessageBot) {\n await this._services.imessageBot.stop();\n }\n if (this._services.server) {\n this._services.server.stop();\n }\n\n this._running = false;\n console.log(\"OpenSentinel stopped.\");\n }\n\n /** Send a simple chat message (no tools) */\n async chat(\n messages: Message[],\n systemPrompt?: string\n ): Promise<BrainResponse> {\n return chat(messages, systemPrompt);\n }\n\n /** Send a chat message with tool execution */\n async chatWithTools(\n messages: Message[],\n userId?: string,\n onToolUse?: (toolName: string, input: unknown) => void\n ): Promise<BrainResponse> {\n return chatWithTools(messages, userId, onToolUse);\n }\n\n get running(): boolean {\n return this._running;\n }\n\n get services() {\n return { ...this._services };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,EACX,YASJ,CAAC;AAAA,EAEL,YAAY,QAA4B;AACtC,SAAK,SAAS;AAGd,cAAU;AAAA,MACR,gBAAgB,OAAO;AAAA,MACvB,GAAI,OAAO,OAAO,CAAC;AAAA,IACrB,CAA8C;AAAA,EAChD;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,SAAU;AAEnB,UAAM,WAAW,KAAK,OAAO,YAAY,CAAC;AAG1C,QAAI,SAAS,YAAY,IAAI,oBAAoB;AAC/C,YAAM,EAAE,WAAAA,WAAU,IAAI,MAAM,OAAO,mBAAuB;AAC1D,WAAK,UAAU,cAAcA,WAAU;AACvC,WAAK,UAAU,YAAY,MAAM;AAAA,QAC/B,SAAS,CAAC,YAAiB;AACzB,kBAAQ,IAAI,8BAA8B,QAAQ,QAAQ,EAAE;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,SAAS,WAAW;AACtB,UAAI;AACF,cAAM,EAAE,YAAY,IAAI,MAAM,OAAO,yBAAkB;AACvD,oBAAY,OAAO,SAAc;AAC/B,kBAAQ,IAAI,+BAA+B,KAAK,IAAI,EAAE;AACtD,cAAI,KAAK,UAAU,KAAK,WAAW,KAAK,UAAU,aAAa;AAC7D,gBAAI;AACF,oBAAM,KAAK,UAAU,YAAY,IAAI;AAAA,gBACnC,KAAK;AAAA,gBACL,aAAa,KAAK,OAAO;AAAA,cAC3B;AAAA,YACF,SAAS,KAAK;AACZ,sBAAQ,MAAM,wCAAwC,GAAG;AAAA,YAC3D;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,gBAAQ,KAAK,uCAAuC,GAAG;AAAA,MACzD;AAAA,IACF;AAGA,QAAI,SAAS,QAAQ,SAAS,IAAI,aAAa;AAC7C,UAAI;AACF,cAAM,EAAE,iBAAiB,kBAAkB,IAAI,MAAM,OAAO,mBAAY;AACxE,cAAM,EAAE,eAAe,IAAI,MAAM,OAAO,qBAAS;AACjD,aAAK,UAAU,cAAc,MAAM,gBAAgB,IAAI,eAAe;AACtE,uBAAe,KAAK,UAAU,WAAW;AAEzC,YAAI,KAAK,UAAU,YAAY,iBAAiB,GAAG;AACjD,kBAAQ;AAAA,YACN,sBAAsB,KAAK,UAAU,YAAY,cAAc,eAAe,KAAK,UAAU,YAAY,cAAc;AAAA,UACzH;AACA,kBAAQ,IAAI,kBAAkB,KAAK,UAAU,WAAW,CAAC;AAAA,QAC3D;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,KAAK,+BAA+B,GAAG;AAC/C,aAAK,UAAU,cAAc;AAAA,MAC/B;AAAA,IACF;AAGA,QAAI,SAAS,WAAW,IAAI,mBAAmB;AAC7C,UAAI;AACF,cAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,uBAAkB;AACtD,aAAK,UAAU,aAAa,IAAIA,YAAW;AAAA,UACzC,OAAO,IAAI;AAAA,UACX,UAAU,IAAI,qBAAqB;AAAA,UACnC,SAAS,IAAI;AAAA,UACb,gBAAgB,IAAI,0BAA0B,MAAM,GAAG,KAAK,CAAC;AAAA,UAC7D,gBAAgB,IAAI,0BAA0B,MAAM,GAAG,KAAK,CAAC;AAAA,QAC/D,CAAC;AACD,cAAM,KAAK,UAAU,WAAW,MAAM;AACtC,gBAAQ,IAAI,uBAAuB;AAAA,MACrC,SAAS,KAAU;AACjB,gBAAQ,KAAK,kCAAkC,IAAI,OAAO;AAC1D,aAAK,UAAU,aAAa;AAAA,MAC9B;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,IAAI,mBAAmB,IAAI,sBAAsB;AACrE,UAAI;AACF,cAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,qBAAgB;AAClD,aAAK,UAAU,WAAW,IAAIA,UAAS;AAAA,UACrC,OAAO,IAAI;AAAA,UACX,eAAe,IAAI;AAAA,UACnB,UAAU,IAAI;AAAA,UACd,YAAY,IAAI;AAAA,UAChB,MAAM,SAAS,OAAO,IAAI,UAAU,KAAK,MAAM;AAAA,UAC/C,gBAAgB,IAAI,wBAAwB,MAAM,GAAG,KAAK,CAAC;AAAA,UAC3D,mBAAmB,IAAI,2BAA2B,MAAM,GAAG,KAAK,CAAC;AAAA,QACnE,CAAC;AACD,cAAM,KAAK,UAAU,SAAS,MAAM;AACpC,gBAAQ,IAAI,qBAAqB;AAAA,MACnC,SAAS,KAAU;AACjB,gBAAQ,KAAK,gCAAgC,IAAI,OAAO;AACxD,aAAK,UAAU,WAAW;AAAA,MAC5B;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,IAAI,kBAAkB;AAC7C,UAAI;AACF,cAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,wBAAmB;AACxD,aAAK,UAAU,cAAc,IAAIA,aAAY;AAAA,UAC3C,SAAS,IAAI;AAAA,UACb,gBACE,IAAI,0BAA0B,MAAM,GAAG,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,UAC/D,SAAS;AAAA,QACX,CAAC;AACD,cAAM,KAAK,UAAU,YAAY,MAAM;AACvC,gBAAQ,IAAI,wBAAwB;AAAA,MACtC,SAAS,KAAU;AACjB,gBAAQ,KAAK,mCAAmC,IAAI,OAAO;AAC3D,aAAK,UAAU,cAAc;AAAA,MAC/B;AAAA,IACF;AAGA,QAAI,SAAS,UAAU,IAAI,kBAAkB,IAAI,qBAAqB;AACpE,UAAI;AACF,cAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,sBAAiB;AACpD,aAAK,UAAU,YAAY,IAAIA,WAAU;AAAA,UACvC,aAAa,IAAI;AAAA,UACjB,eAAe,IAAI;AAAA,UACnB,gBACE,IAAI,wBAAwB,MAAM,GAAG,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,QAC/D,CAAC;AACD,cAAM,KAAK,UAAU,UAAU,MAAM;AACrC,gBAAQ,IAAI,sBAAsB;AAAA,MACpC,SAAS,KAAU;AACjB,gBAAQ,KAAK,iCAAiC,IAAI,OAAO;AACzD,aAAK,UAAU,YAAY;AAAA,MAC7B;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,IAAI,kBAAkB;AAC7C,UAAI;AACF,cAAM,EAAE,aAAAC,aAAY,IAAI,MAAM,OAAO,wBAAmB;AACxD,aAAK,UAAU,cAAc,IAAIA,aAAY;AAAA,UAC3C,MAAM,IAAI;AAAA,UACV,WAAW,IAAI;AAAA,UACf,UAAU,IAAI;AAAA,UACd,gBACE,IAAI,0BAA0B,MAAM,GAAG,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,QACjE,CAAC;AACD,cAAM,KAAK,UAAU,YAAY,MAAM;AACvC,gBAAQ,IAAI,wBAAwB;AAAA,MACtC,SAAS,KAAU;AACjB,gBAAQ,KAAK,mCAAmC,IAAI,OAAO;AAC3D,aAAK,UAAU,cAAc;AAAA,MAC/B;AAAA,IACF;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,SAAU;AAEpB,YAAQ,IAAI,+BAA+B;AAE3C,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,yBAAkB;AACtD,eAAW;AAEX,QAAI,KAAK,UAAU,aAAa;AAC9B,YAAM,KAAK,UAAU,YAAY,SAAS;AAAA,IAC5C;AACA,QAAI,KAAK,UAAU,aAAa;AAC9B,YAAM,KAAK,UAAU,YAAY,KAAK;AAAA,IACxC;AACA,QAAI,KAAK,UAAU,YAAY;AAC7B,YAAM,KAAK,UAAU,WAAW,KAAK;AAAA,IACvC;AACA,QAAI,KAAK,UAAU,UAAU;AAC3B,YAAM,KAAK,UAAU,SAAS,KAAK;AAAA,IACrC;AACA,QAAI,KAAK,UAAU,aAAa;AAC9B,YAAM,KAAK,UAAU,YAAY,KAAK;AAAA,IACxC;AACA,QAAI,KAAK,UAAU,WAAW;AAC5B,YAAM,KAAK,UAAU,UAAU,KAAK;AAAA,IACtC;AACA,QAAI,KAAK,UAAU,aAAa;AAC9B,YAAM,KAAK,UAAU,YAAY,KAAK;AAAA,IACxC;AACA,QAAI,KAAK,UAAU,QAAQ;AACzB,WAAK,UAAU,OAAO,KAAK;AAAA,IAC7B;AAEA,SAAK,WAAW;AAChB,YAAQ,IAAI,uBAAuB;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,KACJ,UACA,cACwB;AACxB,WAAO,KAAK,UAAU,YAAY;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,cACJ,UACA,QACA,WACwB;AACxB,WAAO,cAAc,UAAU,QAAQ,SAAS;AAAA,EAClD;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,EAAE,GAAG,KAAK,UAAU;AAAA,EAC7B;AACF;","names":["createBot","DiscordBot","SlackBot","WhatsAppBot","SignalBot","iMessageBot"]}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseAdapter
|
|
3
|
+
} from "./chunk-7WQO5J2M.js";
|
|
4
|
+
import "./chunk-PLDDJCW6.js";
|
|
5
|
+
|
|
6
|
+
// src/core/adapters/adapters/mailchimp.ts
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
var MailchimpAdapter = class extends BaseAdapter {
|
|
9
|
+
metadata = {
|
|
10
|
+
name: "Mailchimp",
|
|
11
|
+
slug: "mailchimp",
|
|
12
|
+
displayName: "Mailchimp",
|
|
13
|
+
description: "Manage subscribers, create and send email campaigns with Mailchimp",
|
|
14
|
+
category: "marketing",
|
|
15
|
+
authType: "api_key"
|
|
16
|
+
};
|
|
17
|
+
async authenticate(credentials) {
|
|
18
|
+
const apiKey = credentials.apiKey || credentials.accessToken || "";
|
|
19
|
+
const dc = apiKey.includes("-") ? apiKey.split("-").pop() : credentials.dc || "us1";
|
|
20
|
+
return {
|
|
21
|
+
accessToken: apiKey,
|
|
22
|
+
metadata: {
|
|
23
|
+
dc,
|
|
24
|
+
defaultListId: credentials.defaultListId
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
getBaseUrl(auth) {
|
|
29
|
+
const dc = auth.metadata?.dc || "us1";
|
|
30
|
+
return `https://${dc}.api.mailchimp.com/3.0`;
|
|
31
|
+
}
|
|
32
|
+
actions = {
|
|
33
|
+
addSubscriber: {
|
|
34
|
+
name: "Add Subscriber",
|
|
35
|
+
description: "Add or update a subscriber in a Mailchimp audience",
|
|
36
|
+
inputSchema: z.object({
|
|
37
|
+
listId: z.string().optional(),
|
|
38
|
+
email: z.string().email(),
|
|
39
|
+
firstName: z.string().optional(),
|
|
40
|
+
lastName: z.string().optional(),
|
|
41
|
+
status: z.enum(["subscribed", "unsubscribed", "cleaned", "pending"]).optional().default("subscribed"),
|
|
42
|
+
tags: z.array(z.string()).optional(),
|
|
43
|
+
mergeFields: z.record(z.string()).optional()
|
|
44
|
+
}),
|
|
45
|
+
outputSchema: z.object({ id: z.string(), email_address: z.string(), status: z.string(), list_id: z.string() }),
|
|
46
|
+
execute: async (input, auth) => {
|
|
47
|
+
const { listId, email, firstName, lastName, status, tags, mergeFields } = input;
|
|
48
|
+
const baseUrl = this.getBaseUrl(auth);
|
|
49
|
+
const audienceId = listId || auth.metadata?.defaultListId || "";
|
|
50
|
+
const member = {
|
|
51
|
+
email_address: email,
|
|
52
|
+
status,
|
|
53
|
+
merge_fields: {
|
|
54
|
+
...mergeFields || {},
|
|
55
|
+
...firstName ? { FNAME: firstName } : {},
|
|
56
|
+
...lastName ? { LNAME: lastName } : {}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
if (tags) member.tags = tags.map((tag) => ({ name: tag, status: "active" }));
|
|
60
|
+
const response = await this.makeRequest(
|
|
61
|
+
`${baseUrl}/lists/${audienceId}/members`,
|
|
62
|
+
{ method: "POST", body: JSON.stringify(member), auth }
|
|
63
|
+
);
|
|
64
|
+
return response.json();
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
createCampaign: {
|
|
68
|
+
name: "Create Campaign",
|
|
69
|
+
description: "Create a new email campaign in Mailchimp",
|
|
70
|
+
inputSchema: z.object({
|
|
71
|
+
listId: z.string().optional(),
|
|
72
|
+
subject: z.string(),
|
|
73
|
+
previewText: z.string().optional(),
|
|
74
|
+
fromName: z.string(),
|
|
75
|
+
replyTo: z.string().email(),
|
|
76
|
+
templateId: z.number().optional(),
|
|
77
|
+
htmlContent: z.string().optional(),
|
|
78
|
+
type: z.enum(["regular", "plaintext", "absplit"]).optional().default("regular")
|
|
79
|
+
}),
|
|
80
|
+
outputSchema: z.object({ id: z.string(), web_id: z.number(), status: z.string(), archive_url: z.string() }),
|
|
81
|
+
execute: async (input, auth) => {
|
|
82
|
+
const { listId, subject, previewText, fromName, replyTo, templateId, htmlContent, type } = input;
|
|
83
|
+
const baseUrl = this.getBaseUrl(auth);
|
|
84
|
+
const audienceId = listId || auth.metadata?.defaultListId || "";
|
|
85
|
+
const campaign = {
|
|
86
|
+
type,
|
|
87
|
+
recipients: { list_id: audienceId },
|
|
88
|
+
settings: {
|
|
89
|
+
subject_line: subject,
|
|
90
|
+
preview_text: previewText || "",
|
|
91
|
+
from_name: fromName,
|
|
92
|
+
reply_to: replyTo,
|
|
93
|
+
template_id: templateId
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const response = await this.makeRequest(
|
|
97
|
+
`${baseUrl}/campaigns`,
|
|
98
|
+
{ method: "POST", body: JSON.stringify(campaign), auth }
|
|
99
|
+
);
|
|
100
|
+
const result = await response.json();
|
|
101
|
+
if (htmlContent && result.id) {
|
|
102
|
+
await this.makeRequest(
|
|
103
|
+
`${baseUrl}/campaigns/${result.id}/content`,
|
|
104
|
+
{ method: "PUT", body: JSON.stringify({ html: htmlContent }), auth }
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
sendCampaign: {
|
|
111
|
+
name: "Send Campaign",
|
|
112
|
+
description: "Send an existing Mailchimp campaign",
|
|
113
|
+
inputSchema: z.object({
|
|
114
|
+
campaignId: z.string()
|
|
115
|
+
}),
|
|
116
|
+
outputSchema: z.object({ complete: z.boolean(), campaignId: z.string() }),
|
|
117
|
+
execute: async (input, auth) => {
|
|
118
|
+
const { campaignId } = input;
|
|
119
|
+
const baseUrl = this.getBaseUrl(auth);
|
|
120
|
+
await this.makeRequest(
|
|
121
|
+
`${baseUrl}/campaigns/${campaignId}/actions/send`,
|
|
122
|
+
{ method: "POST", auth }
|
|
123
|
+
);
|
|
124
|
+
return { complete: true, campaignId };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
triggers = {
|
|
129
|
+
onNewSubscriber: {
|
|
130
|
+
name: "New Subscriber",
|
|
131
|
+
description: "Triggered when a new subscriber is added to an audience",
|
|
132
|
+
outputSchema: z.object({ email: z.string(), firstName: z.string().optional(), lastName: z.string().optional(), listId: z.string() }),
|
|
133
|
+
subscribe: async (_config, _auth) => {
|
|
134
|
+
},
|
|
135
|
+
unsubscribe: async (_config, _auth) => {
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
onCampaignSent: {
|
|
139
|
+
name: "Campaign Sent",
|
|
140
|
+
description: "Triggered when a campaign is sent",
|
|
141
|
+
outputSchema: z.object({ campaignId: z.string(), subject: z.string(), sendTime: z.string(), emailsSent: z.number() }),
|
|
142
|
+
subscribe: async (_config, _auth) => {
|
|
143
|
+
},
|
|
144
|
+
unsubscribe: async (_config, _auth) => {
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
export {
|
|
150
|
+
MailchimpAdapter
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=mailchimp-KKNF6QJ7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/adapters/adapters/mailchimp.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { BaseAdapter } from \"../base-adapter\";\nimport type { AuthResult, ActionDefinition, TriggerDefinition, TriggerConfig } from \"../types\";\n\nexport class MailchimpAdapter extends BaseAdapter {\n metadata = {\n name: \"Mailchimp\",\n slug: \"mailchimp\",\n displayName: \"Mailchimp\",\n description: \"Manage subscribers, create and send email campaigns with Mailchimp\",\n category: \"marketing\",\n authType: \"api_key\" as const,\n };\n\n async authenticate(credentials: Record<string, string>): Promise<AuthResult> {\n const apiKey = credentials.apiKey || credentials.accessToken || \"\";\n const dc = apiKey.includes(\"-\") ? apiKey.split(\"-\").pop() : credentials.dc || \"us1\";\n return {\n accessToken: apiKey,\n metadata: {\n dc,\n defaultListId: credentials.defaultListId,\n },\n };\n }\n\n private getBaseUrl(auth: AuthResult): string {\n const dc = (auth.metadata?.dc as string) || \"us1\";\n return `https://${dc}.api.mailchimp.com/3.0`;\n }\n\n actions: Record<string, ActionDefinition> = {\n addSubscriber: {\n name: \"Add Subscriber\",\n description: \"Add or update a subscriber in a Mailchimp audience\",\n inputSchema: z.object({\n listId: z.string().optional(),\n email: z.string().email(),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n status: z.enum([\"subscribed\", \"unsubscribed\", \"cleaned\", \"pending\"]).optional().default(\"subscribed\"),\n tags: z.array(z.string()).optional(),\n mergeFields: z.record(z.string()).optional(),\n }),\n outputSchema: z.object({ id: z.string(), email_address: z.string(), status: z.string(), list_id: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { listId, email, firstName, lastName, status, tags, mergeFields } = input as {\n listId?: string; email: string; firstName?: string; lastName?: string;\n status: string; tags?: string[]; mergeFields?: Record<string, string>;\n };\n const baseUrl = this.getBaseUrl(auth);\n const audienceId = listId || (auth.metadata?.defaultListId as string) || \"\";\n const member: Record<string, unknown> = {\n email_address: email,\n status,\n merge_fields: {\n ...(mergeFields || {}),\n ...(firstName ? { FNAME: firstName } : {}),\n ...(lastName ? { LNAME: lastName } : {}),\n },\n };\n if (tags) member.tags = tags.map((tag) => ({ name: tag, status: \"active\" }));\n const response = await this.makeRequest(\n `${baseUrl}/lists/${audienceId}/members`,\n { method: \"POST\", body: JSON.stringify(member), auth }\n );\n return response.json();\n },\n },\n createCampaign: {\n name: \"Create Campaign\",\n description: \"Create a new email campaign in Mailchimp\",\n inputSchema: z.object({\n listId: z.string().optional(),\n subject: z.string(),\n previewText: z.string().optional(),\n fromName: z.string(),\n replyTo: z.string().email(),\n templateId: z.number().optional(),\n htmlContent: z.string().optional(),\n type: z.enum([\"regular\", \"plaintext\", \"absplit\"]).optional().default(\"regular\"),\n }),\n outputSchema: z.object({ id: z.string(), web_id: z.number(), status: z.string(), archive_url: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { listId, subject, previewText, fromName, replyTo, templateId, htmlContent, type } = input as {\n listId?: string; subject: string; previewText?: string; fromName: string;\n replyTo: string; templateId?: number; htmlContent?: string; type: string;\n };\n const baseUrl = this.getBaseUrl(auth);\n const audienceId = listId || (auth.metadata?.defaultListId as string) || \"\";\n const campaign = {\n type,\n recipients: { list_id: audienceId },\n settings: {\n subject_line: subject,\n preview_text: previewText || \"\",\n from_name: fromName,\n reply_to: replyTo,\n template_id: templateId,\n },\n };\n const response = await this.makeRequest(\n `${baseUrl}/campaigns`,\n { method: \"POST\", body: JSON.stringify(campaign), auth }\n );\n const result = await response.json() as { id: string; web_id: number; status: string; archive_url: string };\n if (htmlContent && result.id) {\n await this.makeRequest(\n `${baseUrl}/campaigns/${result.id}/content`,\n { method: \"PUT\", body: JSON.stringify({ html: htmlContent }), auth }\n );\n }\n return result;\n },\n },\n sendCampaign: {\n name: \"Send Campaign\",\n description: \"Send an existing Mailchimp campaign\",\n inputSchema: z.object({\n campaignId: z.string(),\n }),\n outputSchema: z.object({ complete: z.boolean(), campaignId: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { campaignId } = input as { campaignId: string };\n const baseUrl = this.getBaseUrl(auth);\n await this.makeRequest(\n `${baseUrl}/campaigns/${campaignId}/actions/send`,\n { method: \"POST\", auth }\n );\n return { complete: true, campaignId };\n },\n },\n };\n\n triggers: Record<string, TriggerDefinition> = {\n onNewSubscriber: {\n name: \"New Subscriber\",\n description: \"Triggered when a new subscriber is added to an audience\",\n outputSchema: z.object({ email: z.string(), firstName: z.string().optional(), lastName: z.string().optional(), listId: z.string() }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n onCampaignSent: {\n name: \"Campaign Sent\",\n description: \"Triggered when a campaign is sent\",\n outputSchema: z.object({ campaignId: z.string(), subject: z.string(), sendTime: z.string(), emailsSent: z.number() }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n };\n}\n"],"mappings":"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","names":[]}
|