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,21 @@
1
+ import {
2
+ getNotionClient,
3
+ getRootPageId,
4
+ import_client,
5
+ initNotionClient,
6
+ init_client,
7
+ isNotionInitialized,
8
+ resetNotionClient
9
+ } from "./chunk-VRD5CYRL.js";
10
+ import "./chunk-PLDDJCW6.js";
11
+ init_client();
12
+ var export_Client = import_client.Client;
13
+ export {
14
+ export_Client as Client,
15
+ getNotionClient,
16
+ getRootPageId,
17
+ initNotionClient,
18
+ isNotionInitialized,
19
+ resetNotionClient
20
+ };
21
+ //# sourceMappingURL=client-ZQSFPMOB.js.map
@@ -0,0 +1,24 @@
1
+ import {
2
+ clearAll,
3
+ clipboardTool,
4
+ clipboard_manager_default,
5
+ get,
6
+ getHistory,
7
+ list,
8
+ remove,
9
+ save,
10
+ search
11
+ } from "./chunk-MGFBLVR7.js";
12
+ import "./chunk-PLDDJCW6.js";
13
+ export {
14
+ clearAll,
15
+ clipboardTool,
16
+ clipboard_manager_default as default,
17
+ get,
18
+ getHistory,
19
+ list,
20
+ remove,
21
+ save,
22
+ search
23
+ };
24
+ //# sourceMappingURL=clipboard-manager-TEO2GEDN.js.map
@@ -11,8 +11,8 @@ import {
11
11
  printBanner,
12
12
  prompt,
13
13
  which
14
- } from "../chunk-GUBEEYDW.js";
15
- import "../chunk-NSBPE2FW.js";
14
+ } from "../chunk-XMCVRVTF.js";
15
+ import "../chunk-PLDDJCW6.js";
16
16
 
17
17
  // src/commands/setup.ts
18
18
  import { writeFileSync, chmodSync, existsSync } from "fs";
@@ -196,7 +196,7 @@ async function installPostgres(platform) {
196
196
  await exec("sudo systemctl start postgresql");
197
197
  } else {
198
198
  console.log(` ${colors.yellow}Unsupported package manager. Please install PostgreSQL 16 + pgvector manually.${colors.reset}`);
199
- return { databaseUrl: "postgresql://opensentinel:opensentinel@localhost:5432/opensentinel" };
199
+ return { databaseUrl: "" };
200
200
  }
201
201
  console.log(` ${colors.green}PostgreSQL installed.${colors.reset}`);
202
202
  return await configureExistingPostgres(5432);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/setup.ts"],"sourcesContent":["/**\n * OpenSentinel Setup Wizard\n *\n * Interactive setup that installs dependencies, configures the database,\n * generates config, and optionally installs a system service.\n */\n\nimport { writeFileSync, chmodSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n prompt,\n confirm,\n exec,\n which,\n detectPlatform,\n getConfigDir,\n getPackageRoot,\n getMigrationsDir,\n checkPostgres,\n checkRedis,\n colors,\n printBanner,\n type Platform,\n} from \"./utils\";\n\nexport default async function setup() {\n printBanner();\n console.log(`${colors.bold}Setup Wizard${colors.reset}\\n`);\n\n const platform = detectPlatform();\n if (platform.os === \"other\") {\n console.log(`${colors.yellow}Warning: Only Linux and macOS are fully supported.`);\n console.log(`On Windows, use WSL or Docker.${colors.reset}\\n`);\n }\n\n const configDir = getConfigDir();\n console.log(`${colors.dim}Config directory: ${configDir}${colors.reset}\\n`);\n\n // ── Step 1: API Keys ─────────────────────────────────────────────────────\n\n console.log(`${colors.cyan}${colors.bold}[1/5] API Keys${colors.reset}\\n`);\n\n let claudeKey = process.env.CLAUDE_API_KEY || \"\";\n if (!claudeKey) {\n claudeKey = await prompt(` Claude API Key ${colors.red}(required)${colors.reset}: `);\n if (!claudeKey) {\n console.error(`\\n${colors.red}Claude API Key is required. Get one at https://console.anthropic.com${colors.reset}`);\n process.exit(1);\n }\n } else {\n console.log(` Claude API Key: ${colors.green}configured${colors.reset} (***${claudeKey.slice(-4)})`);\n }\n\n const telegramToken = process.env.TELEGRAM_BOT_TOKEN || await prompt(` Telegram Bot Token ${colors.dim}(optional, Enter to skip)${colors.reset}: `);\n const telegramChatId = telegramToken ? (process.env.TELEGRAM_CHAT_ID || await prompt(` Telegram Chat ID: `)) : \"\";\n const discordToken = process.env.DISCORD_BOT_TOKEN || await prompt(` Discord Bot Token ${colors.dim}(optional, Enter to skip)${colors.reset}: `);\n const discordClientId = discordToken ? (process.env.DISCORD_CLIENT_ID || await prompt(` Discord Client ID: `)) : \"\";\n const discordGuildId = discordToken ? (process.env.DISCORD_GUILD_ID || await prompt(` Discord Guild ID: `)) : \"\";\n const discordAllowedUsers = discordToken ? (process.env.DISCORD_ALLOWED_USER_IDS || await prompt(` Discord Allowed User IDs ${colors.dim}(comma-separated)${colors.reset}: `)) : \"\";\n const openaiKey = process.env.OPENAI_API_KEY || await prompt(` OpenAI API Key ${colors.dim}(optional, for voice/images)${colors.reset}: `);\n const elevenlabsKey = process.env.ELEVENLABS_API_KEY || await prompt(` ElevenLabs API Key ${colors.dim}(optional, for TTS)${colors.reset}: `);\n const elevenlabsVoice = elevenlabsKey ? (process.env.ELEVENLABS_VOICE_ID || await prompt(` ElevenLabs Voice ID: `)) : \"\";\n\n console.log(`\\n${colors.green} API keys collected.${colors.reset}\\n`);\n\n // ── Step 2: Infrastructure ────────────────────────────────────────────────\n\n console.log(`${colors.cyan}${colors.bold}[2/5] Infrastructure${colors.reset}\\n`);\n\n const { databaseUrl } = await setupPostgres(platform);\n const { redisUrl } = await setupRedis(platform);\n\n // ── Step 3: Database Migrations ───────────────────────────────────────────\n\n console.log(`\\n${colors.cyan}${colors.bold}[3/5] Database${colors.reset}\\n`);\n\n await runMigrations(databaseUrl);\n\n // ── Step 4: Generate Config ───────────────────────────────────────────────\n\n console.log(`\\n${colors.cyan}${colors.bold}[4/5] Configuration${colors.reset}\\n`);\n\n const port = process.env.PORT || \"8030\";\n\n const envContent = `# OpenSentinel Configuration\n# Generated by opensentinel setup on ${new Date().toISOString()}\n\n# Core AI\nCLAUDE_API_KEY=${claudeKey}\n${openaiKey ? `OPENAI_API_KEY=${openaiKey}` : \"# OPENAI_API_KEY=\"}\n${elevenlabsKey ? `ELEVENLABS_API_KEY=${elevenlabsKey}` : \"# ELEVENLABS_API_KEY=\"}\n${elevenlabsVoice ? `ELEVENLABS_VOICE_ID=${elevenlabsVoice}` : \"# ELEVENLABS_VOICE_ID=\"}\n\n# Telegram\n${telegramToken ? `TELEGRAM_BOT_TOKEN=${telegramToken}` : \"# TELEGRAM_BOT_TOKEN=\"}\n${telegramChatId ? `TELEGRAM_CHAT_ID=${telegramChatId}` : \"# TELEGRAM_CHAT_ID=\"}\n\n# Discord\n${discordToken ? `DISCORD_BOT_TOKEN=${discordToken}` : \"# DISCORD_BOT_TOKEN=\"}\n${discordClientId ? `DISCORD_CLIENT_ID=${discordClientId}` : \"# DISCORD_CLIENT_ID=\"}\n${discordGuildId ? `DISCORD_GUILD_ID=${discordGuildId}` : \"# DISCORD_GUILD_ID=\"}\n${discordAllowedUsers ? `DISCORD_ALLOWED_USER_IDS=${discordAllowedUsers}` : \"# DISCORD_ALLOWED_USER_IDS=\"}\n\n# Database & Cache\nDATABASE_URL=${databaseUrl}\nREDIS_URL=${redisUrl}\n\n# Server\nPORT=${port}\nNODE_ENV=production\n`;\n\n const envPath = join(configDir, \".env\");\n writeFileSync(envPath, envContent);\n chmodSync(envPath, 0o600);\n console.log(` Config written to ${colors.green}${envPath}${colors.reset}`);\n\n // ── Step 5: System Service ────────────────────────────────────────────────\n\n console.log(`\\n${colors.cyan}${colors.bold}[5/5] System Service${colors.reset}\\n`);\n\n await setupDaemon(platform, configDir);\n\n // ── Done ──────────────────────────────────────────────────────────────────\n\n console.log(`\n${colors.green}${colors.bold}Setup complete!${colors.reset}\n\n${colors.bold}Quick reference:${colors.reset}\n opensentinel start Start the server\n opensentinel stop Stop the service\n opensentinel status Check health\n opensentinel help Show all commands\n\n${colors.bold}Config:${colors.reset} ${envPath}\n${colors.bold}Docs:${colors.reset} https://docs.opensentinel.ai\n`);\n}\n\n// ── PostgreSQL Setup ─────────────────────────────────────────────────────────\n\nasync function setupPostgres(platform: Platform): Promise<{ databaseUrl: string }> {\n const pg = await checkPostgres();\n\n if (pg.running) {\n console.log(` PostgreSQL: ${colors.green}running${colors.reset} (port ${pg.port})`);\n const useExisting = await confirm(\" Use existing PostgreSQL?\");\n if (useExisting) {\n return await configureExistingPostgres(pg.port);\n }\n } else if (pg.installed) {\n console.log(` PostgreSQL: ${colors.yellow}installed but not running${colors.reset}`);\n const startIt = await confirm(\" Start PostgreSQL?\");\n if (startIt) {\n await startPostgres(platform);\n return await configureExistingPostgres(5432);\n }\n } else {\n console.log(` PostgreSQL: ${colors.red}not found${colors.reset}`);\n }\n\n const install = await confirm(\" Install PostgreSQL 16 + pgvector?\");\n if (!install) {\n console.log(`\\n${colors.yellow} Skipping PostgreSQL. The app will start but memory and history won't persist.${colors.reset}`);\n return { databaseUrl: \"postgresql://localhost:5432/opensentinel\" };\n }\n\n return await installPostgres(platform);\n}\n\nasync function configureExistingPostgres(port: number): Promise<{ databaseUrl: string }> {\n // Try to create the database and user\n const dbUser = \"opensentinel\";\n const dbPass = \"opensentinel\";\n const dbName = \"opensentinel\";\n\n console.log(` Creating database '${dbName}'...`);\n\n // Try as postgres superuser first (common on Linux)\n try {\n await exec(`sudo -u postgres psql -c \"SELECT 1 FROM pg_roles WHERE rolname='${dbUser}'\" 2>/dev/null | grep -q 1 || sudo -u postgres psql -c \"CREATE USER ${dbUser} WITH PASSWORD '${dbPass}'\"`, { throws: false });\n await exec(`sudo -u postgres psql -c \"SELECT 1 FROM pg_database WHERE datname='${dbName}'\" 2>/dev/null | grep -q 1 || sudo -u postgres psql -c \"CREATE DATABASE ${dbName} OWNER ${dbUser}\"`, { throws: false });\n await exec(`sudo -u postgres psql -d ${dbName} -c \"CREATE EXTENSION IF NOT EXISTS vector\" 2>/dev/null`, { throws: false });\n console.log(` ${colors.green}Database ready.${colors.reset}`);\n } catch {\n // On macOS or systems where current user is superuser\n try {\n await exec(`psql -c \"SELECT 1 FROM pg_roles WHERE rolname='${dbUser}'\" postgres 2>/dev/null | grep -q 1 || createuser ${dbUser} 2>/dev/null`, { throws: false });\n await exec(`psql -c \"SELECT 1 FROM pg_database WHERE datname='${dbName}'\" postgres 2>/dev/null | grep -q 1 || createdb -O ${dbUser} ${dbName} 2>/dev/null`, { throws: false });\n await exec(`psql -d ${dbName} -c \"CREATE EXTENSION IF NOT EXISTS vector\" 2>/dev/null`, { throws: false });\n console.log(` ${colors.green}Database ready.${colors.reset}`);\n } catch {\n console.log(` ${colors.yellow}Could not auto-configure database. You may need to create it manually.${colors.reset}`);\n }\n }\n\n return { databaseUrl: `postgresql://${dbUser}:${dbPass}@localhost:${port}/${dbName}` };\n}\n\nasync function startPostgres(platform: Platform) {\n if (platform.os === \"linux\") {\n await exec(\"sudo systemctl start postgresql\", { throws: false });\n } else if (platform.os === \"darwin\") {\n await exec(\"brew services start postgresql@16\", { throws: false });\n }\n}\n\nasync function installPostgres(platform: Platform): Promise<{ databaseUrl: string }> {\n console.log(`\\n Installing PostgreSQL 16 + pgvector...`);\n\n if (platform.packageManager === \"apt\") {\n // Check if PostgreSQL APT repo is available for PG16\n const hasRepo = await exec(\"apt-cache show postgresql-16 2>/dev/null\", { throws: false });\n if (hasRepo.exitCode !== 0) {\n console.log(` Adding PostgreSQL APT repository...`);\n await exec(`sudo sh -c 'echo \"deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main\" > /etc/apt/sources.list.d/pgdg.list'`);\n await exec(\"curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg\");\n }\n await exec(\"sudo apt-get update -qq\");\n await exec(\"sudo apt-get install -y postgresql-16 postgresql-16-pgvector\");\n await exec(\"sudo systemctl enable postgresql\");\n await exec(\"sudo systemctl start postgresql\");\n } else if (platform.packageManager === \"brew\") {\n await exec(\"brew install postgresql@16 pgvector\");\n await exec(\"brew services start postgresql@16\");\n // Wait for PG to start\n await new Promise((r) => setTimeout(r, 2000));\n } else if (platform.packageManager === \"dnf\") {\n await exec(\"sudo dnf install -y postgresql16-server postgresql16-pgvector\");\n await exec(\"sudo postgresql-setup --initdb 2>/dev/null || true\");\n await exec(\"sudo systemctl enable postgresql\");\n await exec(\"sudo systemctl start postgresql\");\n } else {\n console.log(` ${colors.yellow}Unsupported package manager. Please install PostgreSQL 16 + pgvector manually.${colors.reset}`);\n return { databaseUrl: \"postgresql://opensentinel:opensentinel@localhost:5432/opensentinel\" };\n }\n\n console.log(` ${colors.green}PostgreSQL installed.${colors.reset}`);\n return await configureExistingPostgres(5432);\n}\n\n// ── Redis Setup ──────────────────────────────────────────────────────────────\n\nasync function setupRedis(platform: Platform): Promise<{ redisUrl: string }> {\n const redis = await checkRedis();\n\n if (redis.running) {\n console.log(` Redis: ${colors.green}running${colors.reset} (port ${redis.port})`);\n return { redisUrl: `redis://localhost:${redis.port}` };\n } else if (redis.installed) {\n console.log(` Redis: ${colors.yellow}installed but not running${colors.reset}`);\n const startIt = await confirm(\" Start Redis?\");\n if (startIt) {\n await startRedis(platform);\n return { redisUrl: \"redis://localhost:6379\" };\n }\n } else {\n console.log(` Redis: ${colors.red}not found${colors.reset}`);\n }\n\n const install = await confirm(\" Install Redis?\");\n if (!install) {\n console.log(`\\n${colors.yellow} Skipping Redis. Scheduled tasks and job queues will be unavailable.${colors.reset}`);\n return { redisUrl: \"redis://localhost:6379\" };\n }\n\n return await installRedis(platform);\n}\n\nasync function startRedis(platform: Platform) {\n if (platform.os === \"linux\") {\n await exec(\"sudo systemctl start redis-server 2>/dev/null || sudo systemctl start redis 2>/dev/null\", { throws: false });\n } else if (platform.os === \"darwin\") {\n await exec(\"brew services start redis\", { throws: false });\n }\n}\n\nasync function installRedis(platform: Platform): Promise<{ redisUrl: string }> {\n console.log(`\\n Installing Redis...`);\n\n if (platform.packageManager === \"apt\") {\n await exec(\"sudo apt-get install -y redis-server\");\n await exec(\"sudo systemctl enable redis-server\");\n await exec(\"sudo systemctl start redis-server\");\n } else if (platform.packageManager === \"brew\") {\n await exec(\"brew install redis\");\n await exec(\"brew services start redis\");\n } else if (platform.packageManager === \"dnf\") {\n await exec(\"sudo dnf install -y redis\");\n await exec(\"sudo systemctl enable redis\");\n await exec(\"sudo systemctl start redis\");\n } else {\n console.log(` ${colors.yellow}Unsupported package manager. Please install Redis manually.${colors.reset}`);\n return { redisUrl: \"redis://localhost:6379\" };\n }\n\n // Configure Redis for BullMQ (noeviction policy)\n await exec('redis-cli CONFIG SET maxmemory-policy noeviction 2>/dev/null', { throws: false });\n\n console.log(` ${colors.green}Redis installed.${colors.reset}`);\n return { redisUrl: \"redis://localhost:6379\" };\n}\n\n// ── Database Migrations ──────────────────────────────────────────────────────\n\nasync function runMigrations(databaseUrl: string) {\n console.log(` Running database migrations...`);\n\n try {\n const migrationsDir = getMigrationsDir();\n if (!existsSync(migrationsDir)) {\n console.log(` ${colors.yellow}Migrations folder not found at ${migrationsDir}. Skipping.${colors.reset}`);\n return;\n }\n\n // Use dynamic imports to load database modules\n const { default: postgres } = await import(\"postgres\");\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const { migrate } = await import(\"drizzle-orm/postgres-js/migrator\");\n\n const client = postgres(databaseUrl, { max: 1 });\n const db = drizzle(client);\n\n // Enable pgvector extension\n await client`CREATE EXTENSION IF NOT EXISTS vector`;\n\n await migrate(db, { migrationsFolder: migrationsDir });\n\n await client.end();\n console.log(` ${colors.green}Migrations complete.${colors.reset}`);\n } catch (err: any) {\n console.log(` ${colors.yellow}Migration warning: ${err.message}${colors.reset}`);\n console.log(` ${colors.dim}You can run migrations later with: opensentinel start${colors.reset}`);\n }\n}\n\n// ── Daemon Setup ─────────────────────────────────────────────────────────────\n\nasync function setupDaemon(platform: Platform, configDir: string) {\n const installDaemon = await confirm(\" Install as system service (auto-start on boot)?\");\n if (!installDaemon) {\n console.log(` ${colors.dim}Skipped. Run manually with: opensentinel start${colors.reset}`);\n return;\n }\n\n if (platform.os === \"linux\") {\n await setupSystemd(configDir);\n } else if (platform.os === \"darwin\") {\n await setupLaunchd(configDir);\n } else {\n console.log(` ${colors.yellow}Daemon setup not supported on this platform. Run manually with: opensentinel start${colors.reset}`);\n }\n}\n\nasync function setupSystemd(configDir: string) {\n const bunPath = await which(\"bun\") || \"/usr/local/bin/bun\";\n const opensentinelPath = await which(\"opensentinel\") || `${bunPath} ${join(getPackageRoot(), \"dist\", \"cli.js\")}`;\n const user = process.env.USER || \"root\";\n\n const unit = `[Unit]\nDescription=OpenSentinel AI Assistant\nAfter=network.target postgresql.service redis-server.service\nWants=postgresql.service redis-server.service\n\n[Service]\nType=simple\nUser=${user}\nWorkingDirectory=${configDir}\nEnvironmentFile=${configDir}/.env\nExecStart=${opensentinelPath} start\nRestart=on-failure\nRestartSec=5\nStandardOutput=journal\nStandardError=journal\nSyslogIdentifier=opensentinel\n\n[Install]\nWantedBy=multi-user.target\n`;\n\n const unitPath = \"/etc/systemd/system/opensentinel.service\";\n writeFileSync(\"/tmp/opensentinel.service\", unit);\n await exec(`sudo cp /tmp/opensentinel.service ${unitPath}`);\n await exec(\"sudo systemctl daemon-reload\");\n await exec(\"sudo systemctl enable opensentinel\");\n\n console.log(` ${colors.green}Systemd service installed.${colors.reset}`);\n console.log(` ${colors.dim}Unit file: ${unitPath}${colors.reset}`);\n\n const startNow = await confirm(\" Start OpenSentinel now?\");\n if (startNow) {\n await exec(\"sudo systemctl start opensentinel\");\n console.log(` ${colors.green}Service started!${colors.reset}`);\n console.log(` ${colors.dim}Logs: journalctl -u opensentinel -f${colors.reset}`);\n }\n}\n\nasync function setupLaunchd(configDir: string) {\n const opensentinelPath = await which(\"opensentinel\") || join(getPackageRoot(), \"dist\", \"cli.js\");\n\n const logsDir = join(configDir, \"logs\");\n if (!existsSync(logsDir)) {\n const { mkdirSync } = await import(\"node:fs\");\n mkdirSync(logsDir, { recursive: true });\n }\n\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>ai.opensentinel.daemon</string>\n <key>ProgramArguments</key>\n <array>\n <string>${opensentinelPath}</string>\n <string>start</string>\n </array>\n <key>WorkingDirectory</key>\n <string>${configDir}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logsDir}/opensentinel.log</string>\n <key>StandardErrorPath</key>\n <string>${logsDir}/opensentinel-error.log</string>\n</dict>\n</plist>`;\n\n const plistPath = join(homedir(), \"Library\", \"LaunchAgents\", \"ai.opensentinel.daemon.plist\");\n writeFileSync(plistPath, plist);\n\n console.log(` ${colors.green}LaunchAgent installed.${colors.reset}`);\n console.log(` ${colors.dim}Plist: ${plistPath}${colors.reset}`);\n\n const startNow = await confirm(\" Start OpenSentinel now?\");\n if (startNow) {\n await exec(`launchctl load ${plistPath}`);\n console.log(` ${colors.green}Service started!${colors.reset}`);\n console.log(` ${colors.dim}Logs: tail -f ${logsDir}/opensentinel.log${colors.reset}`);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/commands/setup.ts"],"sourcesContent":["/**\n * OpenSentinel Setup Wizard\n *\n * Interactive setup that installs dependencies, configures the database,\n * generates config, and optionally installs a system service.\n */\n\nimport { writeFileSync, chmodSync, existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n prompt,\n confirm,\n exec,\n which,\n detectPlatform,\n getConfigDir,\n getPackageRoot,\n getMigrationsDir,\n checkPostgres,\n checkRedis,\n colors,\n printBanner,\n type Platform,\n} from \"./utils\";\n\nexport default async function setup() {\n printBanner();\n console.log(`${colors.bold}Setup Wizard${colors.reset}\\n`);\n\n const platform = detectPlatform();\n if (platform.os === \"other\") {\n console.log(`${colors.yellow}Warning: Only Linux and macOS are fully supported.`);\n console.log(`On Windows, use WSL or Docker.${colors.reset}\\n`);\n }\n\n const configDir = getConfigDir();\n console.log(`${colors.dim}Config directory: ${configDir}${colors.reset}\\n`);\n\n // ── Step 1: API Keys ─────────────────────────────────────────────────────\n\n console.log(`${colors.cyan}${colors.bold}[1/5] API Keys${colors.reset}\\n`);\n\n let claudeKey = process.env.CLAUDE_API_KEY || \"\";\n if (!claudeKey) {\n claudeKey = await prompt(` Claude API Key ${colors.red}(required)${colors.reset}: `);\n if (!claudeKey) {\n console.error(`\\n${colors.red}Claude API Key is required. Get one at https://console.anthropic.com${colors.reset}`);\n process.exit(1);\n }\n } else {\n console.log(` Claude API Key: ${colors.green}configured${colors.reset} (***${claudeKey.slice(-4)})`);\n }\n\n const telegramToken = process.env.TELEGRAM_BOT_TOKEN || await prompt(` Telegram Bot Token ${colors.dim}(optional, Enter to skip)${colors.reset}: `);\n const telegramChatId = telegramToken ? (process.env.TELEGRAM_CHAT_ID || await prompt(` Telegram Chat ID: `)) : \"\";\n const discordToken = process.env.DISCORD_BOT_TOKEN || await prompt(` Discord Bot Token ${colors.dim}(optional, Enter to skip)${colors.reset}: `);\n const discordClientId = discordToken ? (process.env.DISCORD_CLIENT_ID || await prompt(` Discord Client ID: `)) : \"\";\n const discordGuildId = discordToken ? (process.env.DISCORD_GUILD_ID || await prompt(` Discord Guild ID: `)) : \"\";\n const discordAllowedUsers = discordToken ? (process.env.DISCORD_ALLOWED_USER_IDS || await prompt(` Discord Allowed User IDs ${colors.dim}(comma-separated)${colors.reset}: `)) : \"\";\n const openaiKey = process.env.OPENAI_API_KEY || await prompt(` OpenAI API Key ${colors.dim}(optional, for voice/images)${colors.reset}: `);\n const elevenlabsKey = process.env.ELEVENLABS_API_KEY || await prompt(` ElevenLabs API Key ${colors.dim}(optional, for TTS)${colors.reset}: `);\n const elevenlabsVoice = elevenlabsKey ? (process.env.ELEVENLABS_VOICE_ID || await prompt(` ElevenLabs Voice ID: `)) : \"\";\n\n console.log(`\\n${colors.green} API keys collected.${colors.reset}\\n`);\n\n // ── Step 2: Infrastructure ────────────────────────────────────────────────\n\n console.log(`${colors.cyan}${colors.bold}[2/5] Infrastructure${colors.reset}\\n`);\n\n const { databaseUrl } = await setupPostgres(platform);\n const { redisUrl } = await setupRedis(platform);\n\n // ── Step 3: Database Migrations ───────────────────────────────────────────\n\n console.log(`\\n${colors.cyan}${colors.bold}[3/5] Database${colors.reset}\\n`);\n\n await runMigrations(databaseUrl);\n\n // ── Step 4: Generate Config ───────────────────────────────────────────────\n\n console.log(`\\n${colors.cyan}${colors.bold}[4/5] Configuration${colors.reset}\\n`);\n\n const port = process.env.PORT || \"8030\";\n\n const envContent = `# OpenSentinel Configuration\n# Generated by opensentinel setup on ${new Date().toISOString()}\n\n# Core AI\nCLAUDE_API_KEY=${claudeKey}\n${openaiKey ? `OPENAI_API_KEY=${openaiKey}` : \"# OPENAI_API_KEY=\"}\n${elevenlabsKey ? `ELEVENLABS_API_KEY=${elevenlabsKey}` : \"# ELEVENLABS_API_KEY=\"}\n${elevenlabsVoice ? `ELEVENLABS_VOICE_ID=${elevenlabsVoice}` : \"# ELEVENLABS_VOICE_ID=\"}\n\n# Telegram\n${telegramToken ? `TELEGRAM_BOT_TOKEN=${telegramToken}` : \"# TELEGRAM_BOT_TOKEN=\"}\n${telegramChatId ? `TELEGRAM_CHAT_ID=${telegramChatId}` : \"# TELEGRAM_CHAT_ID=\"}\n\n# Discord\n${discordToken ? `DISCORD_BOT_TOKEN=${discordToken}` : \"# DISCORD_BOT_TOKEN=\"}\n${discordClientId ? `DISCORD_CLIENT_ID=${discordClientId}` : \"# DISCORD_CLIENT_ID=\"}\n${discordGuildId ? `DISCORD_GUILD_ID=${discordGuildId}` : \"# DISCORD_GUILD_ID=\"}\n${discordAllowedUsers ? `DISCORD_ALLOWED_USER_IDS=${discordAllowedUsers}` : \"# DISCORD_ALLOWED_USER_IDS=\"}\n\n# Database & Cache\nDATABASE_URL=${databaseUrl}\nREDIS_URL=${redisUrl}\n\n# Server\nPORT=${port}\nNODE_ENV=production\n`;\n\n const envPath = join(configDir, \".env\");\n writeFileSync(envPath, envContent);\n chmodSync(envPath, 0o600);\n console.log(` Config written to ${colors.green}${envPath}${colors.reset}`);\n\n // ── Step 5: System Service ────────────────────────────────────────────────\n\n console.log(`\\n${colors.cyan}${colors.bold}[5/5] System Service${colors.reset}\\n`);\n\n await setupDaemon(platform, configDir);\n\n // ── Done ──────────────────────────────────────────────────────────────────\n\n console.log(`\n${colors.green}${colors.bold}Setup complete!${colors.reset}\n\n${colors.bold}Quick reference:${colors.reset}\n opensentinel start Start the server\n opensentinel stop Stop the service\n opensentinel status Check health\n opensentinel help Show all commands\n\n${colors.bold}Config:${colors.reset} ${envPath}\n${colors.bold}Docs:${colors.reset} https://docs.opensentinel.ai\n`);\n}\n\n// ── PostgreSQL Setup ─────────────────────────────────────────────────────────\n\nasync function setupPostgres(platform: Platform): Promise<{ databaseUrl: string }> {\n const pg = await checkPostgres();\n\n if (pg.running) {\n console.log(` PostgreSQL: ${colors.green}running${colors.reset} (port ${pg.port})`);\n const useExisting = await confirm(\" Use existing PostgreSQL?\");\n if (useExisting) {\n return await configureExistingPostgres(pg.port);\n }\n } else if (pg.installed) {\n console.log(` PostgreSQL: ${colors.yellow}installed but not running${colors.reset}`);\n const startIt = await confirm(\" Start PostgreSQL?\");\n if (startIt) {\n await startPostgres(platform);\n return await configureExistingPostgres(5432);\n }\n } else {\n console.log(` PostgreSQL: ${colors.red}not found${colors.reset}`);\n }\n\n const install = await confirm(\" Install PostgreSQL 16 + pgvector?\");\n if (!install) {\n console.log(`\\n${colors.yellow} Skipping PostgreSQL. The app will start but memory and history won't persist.${colors.reset}`);\n return { databaseUrl: \"postgresql://localhost:5432/opensentinel\" };\n }\n\n return await installPostgres(platform);\n}\n\nasync function configureExistingPostgres(port: number): Promise<{ databaseUrl: string }> {\n // Try to create the database and user\n const dbUser = \"opensentinel\";\n const dbPass = \"opensentinel\";\n const dbName = \"opensentinel\";\n\n console.log(` Creating database '${dbName}'...`);\n\n // Try as postgres superuser first (common on Linux)\n try {\n await exec(`sudo -u postgres psql -c \"SELECT 1 FROM pg_roles WHERE rolname='${dbUser}'\" 2>/dev/null | grep -q 1 || sudo -u postgres psql -c \"CREATE USER ${dbUser} WITH PASSWORD '${dbPass}'\"`, { throws: false });\n await exec(`sudo -u postgres psql -c \"SELECT 1 FROM pg_database WHERE datname='${dbName}'\" 2>/dev/null | grep -q 1 || sudo -u postgres psql -c \"CREATE DATABASE ${dbName} OWNER ${dbUser}\"`, { throws: false });\n await exec(`sudo -u postgres psql -d ${dbName} -c \"CREATE EXTENSION IF NOT EXISTS vector\" 2>/dev/null`, { throws: false });\n console.log(` ${colors.green}Database ready.${colors.reset}`);\n } catch {\n // On macOS or systems where current user is superuser\n try {\n await exec(`psql -c \"SELECT 1 FROM pg_roles WHERE rolname='${dbUser}'\" postgres 2>/dev/null | grep -q 1 || createuser ${dbUser} 2>/dev/null`, { throws: false });\n await exec(`psql -c \"SELECT 1 FROM pg_database WHERE datname='${dbName}'\" postgres 2>/dev/null | grep -q 1 || createdb -O ${dbUser} ${dbName} 2>/dev/null`, { throws: false });\n await exec(`psql -d ${dbName} -c \"CREATE EXTENSION IF NOT EXISTS vector\" 2>/dev/null`, { throws: false });\n console.log(` ${colors.green}Database ready.${colors.reset}`);\n } catch {\n console.log(` ${colors.yellow}Could not auto-configure database. You may need to create it manually.${colors.reset}`);\n }\n }\n\n return { databaseUrl: `postgresql://${dbUser}:${dbPass}@localhost:${port}/${dbName}` };\n}\n\nasync function startPostgres(platform: Platform) {\n if (platform.os === \"linux\") {\n await exec(\"sudo systemctl start postgresql\", { throws: false });\n } else if (platform.os === \"darwin\") {\n await exec(\"brew services start postgresql@16\", { throws: false });\n }\n}\n\nasync function installPostgres(platform: Platform): Promise<{ databaseUrl: string }> {\n console.log(`\\n Installing PostgreSQL 16 + pgvector...`);\n\n if (platform.packageManager === \"apt\") {\n // Check if PostgreSQL APT repo is available for PG16\n const hasRepo = await exec(\"apt-cache show postgresql-16 2>/dev/null\", { throws: false });\n if (hasRepo.exitCode !== 0) {\n console.log(` Adding PostgreSQL APT repository...`);\n await exec(`sudo sh -c 'echo \"deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main\" > /etc/apt/sources.list.d/pgdg.list'`);\n await exec(\"curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg\");\n }\n await exec(\"sudo apt-get update -qq\");\n await exec(\"sudo apt-get install -y postgresql-16 postgresql-16-pgvector\");\n await exec(\"sudo systemctl enable postgresql\");\n await exec(\"sudo systemctl start postgresql\");\n } else if (platform.packageManager === \"brew\") {\n await exec(\"brew install postgresql@16 pgvector\");\n await exec(\"brew services start postgresql@16\");\n // Wait for PG to start\n await new Promise((r) => setTimeout(r, 2000));\n } else if (platform.packageManager === \"dnf\") {\n await exec(\"sudo dnf install -y postgresql16-server postgresql16-pgvector\");\n await exec(\"sudo postgresql-setup --initdb 2>/dev/null || true\");\n await exec(\"sudo systemctl enable postgresql\");\n await exec(\"sudo systemctl start postgresql\");\n } else {\n console.log(` ${colors.yellow}Unsupported package manager. Please install PostgreSQL 16 + pgvector manually.${colors.reset}`);\n return { databaseUrl: \"\" };\n }\n\n console.log(` ${colors.green}PostgreSQL installed.${colors.reset}`);\n return await configureExistingPostgres(5432);\n}\n\n// ── Redis Setup ──────────────────────────────────────────────────────────────\n\nasync function setupRedis(platform: Platform): Promise<{ redisUrl: string }> {\n const redis = await checkRedis();\n\n if (redis.running) {\n console.log(` Redis: ${colors.green}running${colors.reset} (port ${redis.port})`);\n return { redisUrl: `redis://localhost:${redis.port}` };\n } else if (redis.installed) {\n console.log(` Redis: ${colors.yellow}installed but not running${colors.reset}`);\n const startIt = await confirm(\" Start Redis?\");\n if (startIt) {\n await startRedis(platform);\n return { redisUrl: \"redis://localhost:6379\" };\n }\n } else {\n console.log(` Redis: ${colors.red}not found${colors.reset}`);\n }\n\n const install = await confirm(\" Install Redis?\");\n if (!install) {\n console.log(`\\n${colors.yellow} Skipping Redis. Scheduled tasks and job queues will be unavailable.${colors.reset}`);\n return { redisUrl: \"redis://localhost:6379\" };\n }\n\n return await installRedis(platform);\n}\n\nasync function startRedis(platform: Platform) {\n if (platform.os === \"linux\") {\n await exec(\"sudo systemctl start redis-server 2>/dev/null || sudo systemctl start redis 2>/dev/null\", { throws: false });\n } else if (platform.os === \"darwin\") {\n await exec(\"brew services start redis\", { throws: false });\n }\n}\n\nasync function installRedis(platform: Platform): Promise<{ redisUrl: string }> {\n console.log(`\\n Installing Redis...`);\n\n if (platform.packageManager === \"apt\") {\n await exec(\"sudo apt-get install -y redis-server\");\n await exec(\"sudo systemctl enable redis-server\");\n await exec(\"sudo systemctl start redis-server\");\n } else if (platform.packageManager === \"brew\") {\n await exec(\"brew install redis\");\n await exec(\"brew services start redis\");\n } else if (platform.packageManager === \"dnf\") {\n await exec(\"sudo dnf install -y redis\");\n await exec(\"sudo systemctl enable redis\");\n await exec(\"sudo systemctl start redis\");\n } else {\n console.log(` ${colors.yellow}Unsupported package manager. Please install Redis manually.${colors.reset}`);\n return { redisUrl: \"redis://localhost:6379\" };\n }\n\n // Configure Redis for BullMQ (noeviction policy)\n await exec('redis-cli CONFIG SET maxmemory-policy noeviction 2>/dev/null', { throws: false });\n\n console.log(` ${colors.green}Redis installed.${colors.reset}`);\n return { redisUrl: \"redis://localhost:6379\" };\n}\n\n// ── Database Migrations ──────────────────────────────────────────────────────\n\nasync function runMigrations(databaseUrl: string) {\n console.log(` Running database migrations...`);\n\n try {\n const migrationsDir = getMigrationsDir();\n if (!existsSync(migrationsDir)) {\n console.log(` ${colors.yellow}Migrations folder not found at ${migrationsDir}. Skipping.${colors.reset}`);\n return;\n }\n\n // Use dynamic imports to load database modules\n const { default: postgres } = await import(\"postgres\");\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const { migrate } = await import(\"drizzle-orm/postgres-js/migrator\");\n\n const client = postgres(databaseUrl, { max: 1 });\n const db = drizzle(client);\n\n // Enable pgvector extension\n await client`CREATE EXTENSION IF NOT EXISTS vector`;\n\n await migrate(db, { migrationsFolder: migrationsDir });\n\n await client.end();\n console.log(` ${colors.green}Migrations complete.${colors.reset}`);\n } catch (err: any) {\n console.log(` ${colors.yellow}Migration warning: ${err.message}${colors.reset}`);\n console.log(` ${colors.dim}You can run migrations later with: opensentinel start${colors.reset}`);\n }\n}\n\n// ── Daemon Setup ─────────────────────────────────────────────────────────────\n\nasync function setupDaemon(platform: Platform, configDir: string) {\n const installDaemon = await confirm(\" Install as system service (auto-start on boot)?\");\n if (!installDaemon) {\n console.log(` ${colors.dim}Skipped. Run manually with: opensentinel start${colors.reset}`);\n return;\n }\n\n if (platform.os === \"linux\") {\n await setupSystemd(configDir);\n } else if (platform.os === \"darwin\") {\n await setupLaunchd(configDir);\n } else {\n console.log(` ${colors.yellow}Daemon setup not supported on this platform. Run manually with: opensentinel start${colors.reset}`);\n }\n}\n\nasync function setupSystemd(configDir: string) {\n const bunPath = await which(\"bun\") || \"/usr/local/bin/bun\";\n const opensentinelPath = await which(\"opensentinel\") || `${bunPath} ${join(getPackageRoot(), \"dist\", \"cli.js\")}`;\n const user = process.env.USER || \"root\";\n\n const unit = `[Unit]\nDescription=OpenSentinel AI Assistant\nAfter=network.target postgresql.service redis-server.service\nWants=postgresql.service redis-server.service\n\n[Service]\nType=simple\nUser=${user}\nWorkingDirectory=${configDir}\nEnvironmentFile=${configDir}/.env\nExecStart=${opensentinelPath} start\nRestart=on-failure\nRestartSec=5\nStandardOutput=journal\nStandardError=journal\nSyslogIdentifier=opensentinel\n\n[Install]\nWantedBy=multi-user.target\n`;\n\n const unitPath = \"/etc/systemd/system/opensentinel.service\";\n writeFileSync(\"/tmp/opensentinel.service\", unit);\n await exec(`sudo cp /tmp/opensentinel.service ${unitPath}`);\n await exec(\"sudo systemctl daemon-reload\");\n await exec(\"sudo systemctl enable opensentinel\");\n\n console.log(` ${colors.green}Systemd service installed.${colors.reset}`);\n console.log(` ${colors.dim}Unit file: ${unitPath}${colors.reset}`);\n\n const startNow = await confirm(\" Start OpenSentinel now?\");\n if (startNow) {\n await exec(\"sudo systemctl start opensentinel\");\n console.log(` ${colors.green}Service started!${colors.reset}`);\n console.log(` ${colors.dim}Logs: journalctl -u opensentinel -f${colors.reset}`);\n }\n}\n\nasync function setupLaunchd(configDir: string) {\n const opensentinelPath = await which(\"opensentinel\") || join(getPackageRoot(), \"dist\", \"cli.js\");\n\n const logsDir = join(configDir, \"logs\");\n if (!existsSync(logsDir)) {\n const { mkdirSync } = await import(\"node:fs\");\n mkdirSync(logsDir, { recursive: true });\n }\n\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>ai.opensentinel.daemon</string>\n <key>ProgramArguments</key>\n <array>\n <string>${opensentinelPath}</string>\n <string>start</string>\n </array>\n <key>WorkingDirectory</key>\n <string>${configDir}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logsDir}/opensentinel.log</string>\n <key>StandardErrorPath</key>\n <string>${logsDir}/opensentinel-error.log</string>\n</dict>\n</plist>`;\n\n const plistPath = join(homedir(), \"Library\", \"LaunchAgents\", \"ai.opensentinel.daemon.plist\");\n writeFileSync(plistPath, plist);\n\n console.log(` ${colors.green}LaunchAgent installed.${colors.reset}`);\n console.log(` ${colors.dim}Plist: ${plistPath}${colors.reset}`);\n\n const startNow = await confirm(\" Start OpenSentinel now?\");\n if (startNow) {\n await exec(`launchctl load ${plistPath}`);\n console.log(` ${colors.green}Service started!${colors.reset}`);\n console.log(` ${colors.dim}Logs: tail -f ${logsDir}/opensentinel.log${colors.reset}`);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  loadEnvFile
3
- } from "../chunk-GUBEEYDW.js";
4
- import "../chunk-NSBPE2FW.js";
3
+ } from "../chunk-XMCVRVTF.js";
4
+ import "../chunk-PLDDJCW6.js";
5
5
 
6
6
  // src/commands/start.ts
7
7
  async function start() {
@@ -10,7 +10,7 @@ async function start() {
10
10
  console.log(`[Config] Loaded ${envFile}`);
11
11
  }
12
12
  process.env.__OPENSENTINEL_CLI__ = "1";
13
- const { main } = await import("../src-K7GASHRH.js");
13
+ const { main } = await import("../src-VYUE6LRA.js");
14
14
  const shutdown = await main();
15
15
  process.on("SIGINT", async () => {
16
16
  await shutdown();
@@ -5,8 +5,8 @@ import {
5
5
  exec,
6
6
  getConfigDir,
7
7
  printBanner
8
- } from "../chunk-GUBEEYDW.js";
9
- import "../chunk-NSBPE2FW.js";
8
+ } from "../chunk-XMCVRVTF.js";
9
+ import "../chunk-PLDDJCW6.js";
10
10
 
11
11
  // src/commands/status.ts
12
12
  import { existsSync } from "fs";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  colors,
3
3
  exec
4
- } from "../chunk-GUBEEYDW.js";
5
- import "../chunk-NSBPE2FW.js";
4
+ } from "../chunk-XMCVRVTF.js";
5
+ import "../chunk-PLDDJCW6.js";
6
6
 
7
7
  // src/commands/stop.ts
8
8
  import { homedir } from "os";
@@ -14,8 +14,8 @@ import {
14
14
  prompt,
15
15
  promptSecret,
16
16
  which
17
- } from "../chunk-GUBEEYDW.js";
18
- import "../chunk-NSBPE2FW.js";
17
+ } from "../chunk-XMCVRVTF.js";
18
+ import "../chunk-PLDDJCW6.js";
19
19
  export {
20
20
  checkPort,
21
21
  checkPostgres,
@@ -0,0 +1,16 @@
1
+ import {
2
+ cronTool,
3
+ cron_explain_default,
4
+ explainCron,
5
+ getNextRuns,
6
+ validateCron
7
+ } from "./chunk-APHSRMBS.js";
8
+ import "./chunk-PLDDJCW6.js";
9
+ export {
10
+ cronTool,
11
+ cron_explain_default as default,
12
+ explainCron,
13
+ getNextRuns,
14
+ validateCron
15
+ };
16
+ //# sourceMappingURL=cron-explain-HHQKPD3M.js.map
@@ -0,0 +1,14 @@
1
+ import {
2
+ CryptoClient,
3
+ CryptoClientError,
4
+ createCryptoClient,
5
+ crypto_default
6
+ } from "./chunk-6KONMXQ6.js";
7
+ import "./chunk-PLDDJCW6.js";
8
+ export {
9
+ CryptoClient,
10
+ CryptoClientError,
11
+ createCryptoClient,
12
+ crypto_default as default
13
+ };
14
+ //# sourceMappingURL=crypto-4AP47IKC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,21 @@
1
+ import {
2
+ archiveDatabaseEntry,
3
+ createDatabase,
4
+ createDatabaseEntry,
5
+ getDatabase,
6
+ queryAllDatabaseEntries,
7
+ queryDatabase,
8
+ updateDatabaseEntry
9
+ } from "./chunk-BRBWNV65.js";
10
+ import "./chunk-VRD5CYRL.js";
11
+ import "./chunk-PLDDJCW6.js";
12
+ export {
13
+ archiveDatabaseEntry,
14
+ createDatabase,
15
+ createDatabaseEntry,
16
+ getDatabase,
17
+ queryAllDatabaseEntries,
18
+ queryDatabase,
19
+ updateDatabaseEntry
20
+ };
21
+ //# sourceMappingURL=databases-37X4CI2Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,70 @@
1
+ import {
2
+ DiscordBot,
3
+ addToSession,
4
+ askCommand,
5
+ chatCommand,
6
+ clearCommand,
7
+ clearSession,
8
+ createDiscordBot,
9
+ discord_default,
10
+ getCommand,
11
+ getCommandData,
12
+ getSession,
13
+ helpCommand,
14
+ remindCommand,
15
+ sessions,
16
+ slashCommands,
17
+ splitMessage,
18
+ statusCommand,
19
+ voiceCommand
20
+ } from "./chunk-TYAGMJNV.js";
21
+ import "./chunk-MXAPLSJ5.js";
22
+ import "./chunk-SJSUSJ47.js";
23
+ import "./chunk-AYUKPTSM.js";
24
+ import "./chunk-766ASQWE.js";
25
+ import "./chunk-IZJMVV7O.js";
26
+ import "./chunk-6PMVAAA7.js";
27
+ import "./chunk-MQJ2ECQT.js";
28
+ import "./chunk-TVEWKIK3.js";
29
+ import "./chunk-BRBWNV65.js";
30
+ import "./chunk-H5RQOFO2.js";
31
+ import "./chunk-VRD5CYRL.js";
32
+ import "./chunk-KM22GV7G.js";
33
+ import "./chunk-P6QINGFL.js";
34
+ import "./chunk-HN3F4WSW.js";
35
+ import "./chunk-SVAPX2XN.js";
36
+ import "./chunk-WRAKK6K6.js";
37
+ import "./chunk-7WQO5J2M.js";
38
+ import "./chunk-BXZ6EA52.js";
39
+ import "./chunk-4GLYY4NN.js";
40
+ import "./chunk-EVE7MIIY.js";
41
+ import "./chunk-RZ4YESBG.js";
42
+ import "./chunk-CQ4JURG7.js";
43
+ import "./chunk-OCVQGBJK.js";
44
+ import "./chunk-XKYRH4FM.js";
45
+ import "./chunk-ZLZKF2PM.js";
46
+ import "./chunk-6KONMXQ6.js";
47
+ import "./chunk-22VGGA7S.js";
48
+ import "./chunk-35WYTA3C.js";
49
+ import "./chunk-PLDDJCW6.js";
50
+ export {
51
+ DiscordBot,
52
+ addToSession,
53
+ askCommand,
54
+ chatCommand,
55
+ clearCommand,
56
+ clearSession,
57
+ createDiscordBot,
58
+ discord_default as default,
59
+ getCommand,
60
+ getCommandData,
61
+ getSession,
62
+ helpCommand,
63
+ remindCommand,
64
+ sessions,
65
+ slashCommands,
66
+ splitMessage,
67
+ statusCommand,
68
+ voiceCommand
69
+ };
70
+ //# sourceMappingURL=discord-B3HUPGQ6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}