opensentinel 3.1.1 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +138 -83
  2. package/dist/agent-manager-JZ4IM7XI.js +39 -0
  3. package/dist/agent-processor-DDDHC2SO.js +281 -0
  4. package/dist/agent-processor-DDDHC2SO.js.map +1 -0
  5. package/dist/agent-types-2T4PXLFQ.js +12 -0
  6. package/dist/alerting-LK7VVYTX.js +699 -0
  7. package/dist/alerting-LK7VVYTX.js.map +1 -0
  8. package/dist/analysis-agent-JWN2GXYE.js +288 -0
  9. package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
  10. package/dist/analyzer-OTWE3ARE.js +22 -0
  11. package/dist/{archiver-AVNBYCKQ.js → archiver-FPGKRP6P.js} +2 -2
  12. package/dist/{audit-logger-OBPR7CRO.js → audit-logger-CI4WZQPD.js} +6 -5
  13. package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
  14. package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
  15. package/dist/autonomy-N7W5XPLX.js.map +1 -0
  16. package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
  17. package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
  18. package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
  19. package/dist/bot-VDHBGUVI.js +47 -0
  20. package/dist/brain-6QTXN4QP.js +66 -0
  21. package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
  22. package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
  23. package/dist/{chunk-WRAKK6K6.js → chunk-2I5QHYG6.js} +5 -3
  24. package/dist/chunk-2I5QHYG6.js.map +1 -0
  25. package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
  26. package/dist/chunk-3AWAWRWB.js +143 -0
  27. package/dist/chunk-3AWAWRWB.js.map +1 -0
  28. package/dist/{chunk-ZLZKF2PM.js → chunk-4KIHDIXZ.js} +43 -2
  29. package/dist/chunk-4KIHDIXZ.js.map +1 -0
  30. package/dist/{chunk-EVE7MIIY.js → chunk-4WH6MFEW.js} +15 -16
  31. package/dist/chunk-4WH6MFEW.js.map +1 -0
  32. package/dist/{chunk-I6BDYQIG.js → chunk-56UJS2LA.js} +6 -6
  33. package/dist/chunk-56UJS2LA.js.map +1 -0
  34. package/dist/chunk-5BTVJR7R.js +37 -0
  35. package/dist/chunk-5BTVJR7R.js.map +1 -0
  36. package/dist/chunk-5JJTLWOR.js +1021 -0
  37. package/dist/chunk-5JJTLWOR.js.map +1 -0
  38. package/dist/chunk-66SAOZPU.js +236 -0
  39. package/dist/chunk-66SAOZPU.js.map +1 -0
  40. package/dist/chunk-6HGMRR4J.js +113 -0
  41. package/dist/chunk-6HGMRR4J.js.map +1 -0
  42. package/dist/chunk-6W6PTJFT.js +181 -0
  43. package/dist/chunk-6W6PTJFT.js.map +1 -0
  44. package/dist/chunk-6ZNCY2GI.js +418 -0
  45. package/dist/chunk-6ZNCY2GI.js.map +1 -0
  46. package/dist/chunk-7BNFELEK.js +31 -0
  47. package/dist/chunk-7BNFELEK.js.map +1 -0
  48. package/dist/chunk-ADTDYJO7.js +265 -0
  49. package/dist/chunk-ADTDYJO7.js.map +1 -0
  50. package/dist/{chunk-OCVQGBJK.js → chunk-BBN4VCNK.js} +6 -4
  51. package/dist/chunk-BBN4VCNK.js.map +1 -0
  52. package/dist/{chunk-SJSUSJ47.js → chunk-BNZHWAZC.js} +2 -2
  53. package/dist/chunk-C6PELIHS.js +60 -0
  54. package/dist/chunk-C6PELIHS.js.map +1 -0
  55. package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
  56. package/dist/{chunk-NHMBTUMW.js → chunk-CWT6CAE5.js} +2 -2
  57. package/dist/{chunk-4GLYY4NN.js → chunk-CZTMGHUC.js} +8 -2
  58. package/dist/chunk-CZTMGHUC.js.map +1 -0
  59. package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
  60. package/dist/chunk-DOYGMNMK.js.map +1 -0
  61. package/dist/chunk-DTISLIMB.js +89 -0
  62. package/dist/chunk-DTISLIMB.js.map +1 -0
  63. package/dist/{chunk-SPPMCAKG.js → chunk-GBVJTRXS.js} +2 -2
  64. package/dist/chunk-GBVJTRXS.js.map +1 -0
  65. package/dist/{chunk-AYUKPTSM.js → chunk-GJETKBOY.js} +96 -218
  66. package/dist/chunk-GJETKBOY.js.map +1 -0
  67. package/dist/{chunk-BXZ6EA52.js → chunk-GW6V4D43.js} +57 -3
  68. package/dist/chunk-GW6V4D43.js.map +1 -0
  69. package/dist/{chunk-6PMVAAA7.js → chunk-HJSEEFO3.js} +3 -3
  70. package/dist/{chunk-TYAGMJNV.js → chunk-HQZQFEAX.js} +5 -5
  71. package/dist/{chunk-MXAPLSJ5.js → chunk-J4JW73TT.js} +2 -2
  72. package/dist/{chunk-VEHFVBLI.js → chunk-JHYYFPKX.js} +2 -2
  73. package/dist/chunk-LFDXEYYB.js +150 -0
  74. package/dist/chunk-LFDXEYYB.js.map +1 -0
  75. package/dist/chunk-MIC5IBQF.js +386 -0
  76. package/dist/chunk-MIC5IBQF.js.map +1 -0
  77. package/dist/chunk-ODCFS5WD.js +463 -0
  78. package/dist/chunk-ODCFS5WD.js.map +1 -0
  79. package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
  80. package/dist/chunk-P64EV4YY.js.map +1 -0
  81. package/dist/chunk-PBOCSGNL.js +84 -0
  82. package/dist/chunk-PBOCSGNL.js.map +1 -0
  83. package/dist/{chunk-66OJ3WB4.js → chunk-PD3CTDO6.js} +2 -2
  84. package/dist/chunk-QPY3WRVM.js +647 -0
  85. package/dist/chunk-QPY3WRVM.js.map +1 -0
  86. package/dist/chunk-S2EOIVF4.js +3907 -0
  87. package/dist/chunk-S2EOIVF4.js.map +1 -0
  88. package/dist/chunk-SDLOMKCW.js +213 -0
  89. package/dist/chunk-SDLOMKCW.js.map +1 -0
  90. package/dist/chunk-TKBVW7ZJ.js +162 -0
  91. package/dist/chunk-TKBVW7ZJ.js.map +1 -0
  92. package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
  93. package/dist/chunk-U2X2J3FI.js.map +1 -0
  94. package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
  95. package/dist/{chunk-SVAPX2XN.js → chunk-V3OKHQUX.js} +9 -7
  96. package/dist/{chunk-SVAPX2XN.js.map → chunk-V3OKHQUX.js.map} +1 -1
  97. package/dist/{chunk-4UOE5TUZ.js → chunk-WMDVOWN6.js} +4 -4
  98. package/dist/chunk-WMFYI7XC.js +564 -0
  99. package/dist/chunk-WMFYI7XC.js.map +1 -0
  100. package/dist/chunk-WZAH34TG.js +129 -0
  101. package/dist/chunk-WZAH34TG.js.map +1 -0
  102. package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
  103. package/dist/chunk-X6Q3K3L2.js.map +1 -0
  104. package/dist/chunk-XTX7EK43.js +134 -0
  105. package/dist/chunk-XTX7EK43.js.map +1 -0
  106. package/dist/chunk-YEDEAX6Y.js +194 -0
  107. package/dist/chunk-YEDEAX6Y.js.map +1 -0
  108. package/dist/{chunk-XKYRH4FM.js → chunk-ZIBRVA3Y.js} +70 -30
  109. package/dist/chunk-ZIBRVA3Y.js.map +1 -0
  110. package/dist/chunk-ZIYTHUM5.js +457 -0
  111. package/dist/chunk-ZIYTHUM5.js.map +1 -0
  112. package/dist/{chunk-766ASQWE.js → chunk-ZMML6T63.js} +2711 -2329
  113. package/dist/chunk-ZMML6T63.js.map +1 -0
  114. package/dist/chunk-ZVHG4KF2.js +380 -0
  115. package/dist/chunk-ZVHG4KF2.js.map +1 -0
  116. package/dist/chunker-K6WTR62A.js +12 -0
  117. package/dist/cli.js +1 -1
  118. package/dist/cli.js.map +1 -1
  119. package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
  120. package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
  121. package/dist/coding-agent-DESSU3AC.js +233 -0
  122. package/dist/coding-agent-DESSU3AC.js.map +1 -0
  123. package/dist/commands/setup.js +2 -2
  124. package/dist/commands/start.js +3 -3
  125. package/dist/commands/status.js +2 -2
  126. package/dist/commands/stop.js +2 -2
  127. package/dist/commands/utils.js +2 -2
  128. package/dist/cost-tracker-KZQSTSE2.js +11 -0
  129. package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
  130. package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
  131. package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
  132. package/dist/db-I7MNG6CL.js +83 -0
  133. package/dist/discord-6UQHCN27.js +81 -0
  134. package/dist/documents-PFHSK7SZ.js +184 -0
  135. package/dist/documents-PFHSK7SZ.js.map +1 -0
  136. package/dist/docx-parser-EXL4TN5E.js +16 -0
  137. package/dist/{email-K7LO2IPB.js → email-6OIN4SYL.js} +34 -25
  138. package/dist/email-6OIN4SYL.js.map +1 -0
  139. package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-JWX2HWU4.js} +12 -8
  140. package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
  141. package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
  142. package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-7Z6STVXX.js} +6 -5
  143. package/dist/env-GN5VHI43.js +12 -0
  144. package/dist/error-tracker-64DEH3D7.js +32 -0
  145. package/dist/finnhub-X7ZMQSXF.js +178 -0
  146. package/dist/finnhub-X7ZMQSXF.js.map +1 -0
  147. package/dist/fred-TMUF3J2V.js +203 -0
  148. package/dist/fred-TMUF3J2V.js.map +1 -0
  149. package/dist/github-DUWSXCNP.js +833 -0
  150. package/dist/github-DUWSXCNP.js.map +1 -0
  151. package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
  152. package/dist/graph-client-NB475AK5.js +17 -0
  153. package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
  154. package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
  155. package/dist/hooks-N4MIFBVM.js +14 -0
  156. package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
  157. package/dist/imessage-DSGSGUZS.js +44 -0
  158. package/dist/inbox-summarizer-F2KAU72V.js +56 -0
  159. package/dist/{incident-response-C5J7Q6DT.js → incident-response-E3UGMX5G.js} +8 -6
  160. package/dist/incident-response-E3UGMX5G.js.map +1 -0
  161. package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
  162. package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
  163. package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
  164. package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
  165. package/dist/knowledge-base-5SMMOGQJ.js +46 -0
  166. package/dist/lib.d.ts +94 -1
  167. package/dist/lib.js +83 -66
  168. package/dist/lib.js.map +1 -1
  169. package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
  170. package/dist/{matrix-QVHG76I7.js → matrix-WYGEOZL5.js} +30 -21
  171. package/dist/{matrix-QVHG76I7.js.map → matrix-WYGEOZL5.js.map} +1 -1
  172. package/dist/{mcp-3JI6W7ZE.js → mcp-DJ2QDA6A.js} +3 -3
  173. package/dist/metrics-BH3ZLGEV.js +25 -0
  174. package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
  175. package/dist/multi-user-XAEMB244.js +411 -0
  176. package/dist/multi-user-XAEMB244.js.map +1 -0
  177. package/dist/oauth-UPJYFOVU.js +34 -0
  178. package/dist/{ocr-AC7NPX33.js → ocr-UONKTQU7.js} +6 -4
  179. package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
  180. package/dist/osint-agent-RL5XPBRQ.js +189 -0
  181. package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
  182. package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
  183. package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
  184. package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
  185. package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
  186. package/dist/pdf-parser-YLMTTYHL.js +14 -0
  187. package/dist/{presentations-DSV5IHG5.js → presentations-UOET2FVZ.js} +3 -3
  188. package/dist/presentations-UOET2FVZ.js.map +1 -0
  189. package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
  190. package/dist/prometheus-YETCZO4I.js.map +1 -0
  191. package/dist/{providers-J4LYPHDR.js → providers-2YQ6E3IF.js} +6 -4
  192. package/dist/providers-2YQ6E3IF.js.map +1 -0
  193. package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
  194. package/dist/qr-code-6WZJHRKL.js.map +1 -0
  195. package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
  196. package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
  197. package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
  198. package/dist/research-agent-WCRSY3UZ.js +168 -0
  199. package/dist/research-agent-WCRSY3UZ.js.map +1 -0
  200. package/dist/risk-engine-YKCPT5D5.js +10 -0
  201. package/dist/risk-engine-YKCPT5D5.js.map +1 -0
  202. package/dist/scheduler-6PLLAQI7.js +74 -0
  203. package/dist/scheduler-6PLLAQI7.js.map +1 -0
  204. package/dist/schema-ETY7L2VA.js +78 -0
  205. package/dist/schema-ETY7L2VA.js.map +1 -0
  206. package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
  207. package/dist/search-GMLKBHSW.js.map +1 -0
  208. package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
  209. package/dist/sharepoint-V5P4Q62L.js +30 -0
  210. package/dist/sharepoint-V5P4Q62L.js.map +1 -0
  211. package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
  212. package/dist/signal-7D5EPGVL.js +44 -0
  213. package/dist/signal-7D5EPGVL.js.map +1 -0
  214. package/dist/slack-KSS6YK5Z.js +86 -0
  215. package/dist/slack-KSS6YK5Z.js.map +1 -0
  216. package/dist/{sms-M3JIOTCW.js → sms-CSUCC7HL.js} +4 -4
  217. package/dist/sms-CSUCC7HL.js.map +1 -0
  218. package/dist/{src-VYUE6LRA.js → src-GO7GGW7O.js} +190 -52
  219. package/dist/src-GO7GGW7O.js.map +1 -0
  220. package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
  221. package/dist/stocks-4M4HZWZS.js.map +1 -0
  222. package/dist/text-extractor-OAUBAW5P.js +12 -0
  223. package/dist/text-extractor-OAUBAW5P.js.map +1 -0
  224. package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
  225. package/dist/text-transform-HCLCUDFZ.js.map +1 -0
  226. package/dist/token-store-SEWRX6RE.js +20 -0
  227. package/dist/token-store-SEWRX6RE.js.map +1 -0
  228. package/dist/tools-PJZ6RI4P.js +47 -0
  229. package/dist/tools-PJZ6RI4P.js.map +1 -0
  230. package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
  231. package/dist/tunnel-XOUVVRAK.js.map +1 -0
  232. package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
  233. package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
  234. package/dist/unit-converter-LYPAHU64.js.map +1 -0
  235. package/dist/whatsapp-DWXK25V2.js +44 -0
  236. package/dist/whatsapp-DWXK25V2.js.map +1 -0
  237. package/dist/{word-document-7B6SJMAY.js → word-document-AV3YB4L2.js} +4 -4
  238. package/dist/word-document-AV3YB4L2.js.map +1 -0
  239. package/dist/workflow-store-5Y56GUP7.js +373 -0
  240. package/dist/workflow-store-5Y56GUP7.js.map +1 -0
  241. package/dist/writing-agent-VDGLNOGO.js +243 -0
  242. package/dist/writing-agent-VDGLNOGO.js.map +1 -0
  243. package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
  244. package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
  245. package/drizzle/0002_mushy_master_mold.sql +139 -139
  246. package/drizzle/0003_overjoyed_rhodey.sql +46 -0
  247. package/drizzle/meta/0002_snapshot.json +3636 -3636
  248. package/drizzle/meta/0003_snapshot.json +3946 -0
  249. package/drizzle/meta/_journal.json +7 -0
  250. package/package.json +110 -100
  251. package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
  252. package/dist/bot-QRARP4UN.js +0 -36
  253. package/dist/brain-7XLLM3KC.js +0 -56
  254. package/dist/chunk-4GLYY4NN.js.map +0 -1
  255. package/dist/chunk-766ASQWE.js.map +0 -1
  256. package/dist/chunk-AYUKPTSM.js.map +0 -1
  257. package/dist/chunk-BRBWNV65.js.map +0 -1
  258. package/dist/chunk-BXZ6EA52.js.map +0 -1
  259. package/dist/chunk-EVE7MIIY.js.map +0 -1
  260. package/dist/chunk-H5RQOFO2.js.map +0 -1
  261. package/dist/chunk-I6BDYQIG.js.map +0 -1
  262. package/dist/chunk-IZJMVV7O.js +0 -347
  263. package/dist/chunk-IZJMVV7O.js.map +0 -1
  264. package/dist/chunk-O7IH7JTI.js +0 -1898
  265. package/dist/chunk-O7IH7JTI.js.map +0 -1
  266. package/dist/chunk-OCVQGBJK.js.map +0 -1
  267. package/dist/chunk-RZ4YESBG.js.map +0 -1
  268. package/dist/chunk-SPPMCAKG.js.map +0 -1
  269. package/dist/chunk-VRD5CYRL.js +0 -1568
  270. package/dist/chunk-VRD5CYRL.js.map +0 -1
  271. package/dist/chunk-WRAKK6K6.js.map +0 -1
  272. package/dist/chunk-XKYRH4FM.js.map +0 -1
  273. package/dist/chunk-XMCVRVTF.js.map +0 -1
  274. package/dist/chunk-ZLZKF2PM.js.map +0 -1
  275. package/dist/discord-B3HUPGQ6.js +0 -70
  276. package/dist/dist-UISMLMFN.js +0 -21847
  277. package/dist/dist-UISMLMFN.js.map +0 -1
  278. package/dist/email-K7LO2IPB.js.map +0 -1
  279. package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
  280. package/dist/env-IWXUVTCB.js +0 -12
  281. package/dist/imessage-NGA2XF2V.js +0 -35
  282. package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
  283. package/dist/incident-response-C5J7Q6DT.js.map +0 -1
  284. package/dist/presentations-DSV5IHG5.js.map +0 -1
  285. package/dist/scheduler-VK4WFERV.js +0 -63
  286. package/dist/signal-6CGDFYL2.js +0 -35
  287. package/dist/slack-IZQWIKOH.js +0 -75
  288. package/dist/src-VYUE6LRA.js.map +0 -1
  289. package/dist/tools-2RLEI2N6.js +0 -38
  290. package/dist/tunnel-IWMXUML4.js.map +0 -1
  291. package/dist/whatsapp-LFX6YKCM.js +0 -35
  292. package/dist/word-document-7B6SJMAY.js.map +0 -1
  293. /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-JZ4IM7XI.js.map} +0 -0
  294. /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
  295. /package/dist/{backup-restore-PZ7CYYB7.js.map → analyzer-OTWE3ARE.js.map} +0 -0
  296. /package/dist/{archiver-AVNBYCKQ.js.map → archiver-FPGKRP6P.js.map} +0 -0
  297. /package/dist/{blocks-R3PODY47.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
  298. /package/dist/{bot-QRARP4UN.js.map → auth-PH5IHISW.js.map} +0 -0
  299. /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
  300. /package/dist/{brain-7XLLM3KC.js.map → backup-restore-72OQTZO3.js.map} +0 -0
  301. /package/dist/{chunk-PLDDJCW6.js.map → blocks-YOWOESDD.js.map} +0 -0
  302. /package/dist/{client-ZQSFPMOB.js.map → bot-VDHBGUVI.js.map} +0 -0
  303. /package/dist/{clipboard-manager-TEO2GEDN.js.map → brain-6QTXN4QP.js.map} +0 -0
  304. /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
  305. /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
  306. /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
  307. /package/dist/{chunk-SJSUSJ47.js.map → chunk-BNZHWAZC.js.map} +0 -0
  308. /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
  309. /package/dist/{chunk-NHMBTUMW.js.map → chunk-CWT6CAE5.js.map} +0 -0
  310. /package/dist/{chunk-6PMVAAA7.js.map → chunk-HJSEEFO3.js.map} +0 -0
  311. /package/dist/{chunk-TYAGMJNV.js.map → chunk-HQZQFEAX.js.map} +0 -0
  312. /package/dist/{chunk-MXAPLSJ5.js.map → chunk-J4JW73TT.js.map} +0 -0
  313. /package/dist/{chunk-VEHFVBLI.js.map → chunk-JHYYFPKX.js.map} +0 -0
  314. /package/dist/{chunk-66OJ3WB4.js.map → chunk-PD3CTDO6.js.map} +0 -0
  315. /package/dist/{cron-explain-HHQKPD3M.js.map → chunk-UP2VWCW5.js.map} +0 -0
  316. /package/dist/{chunk-4UOE5TUZ.js.map → chunk-WMDVOWN6.js.map} +0 -0
  317. /package/dist/{crypto-4AP47IKC.js.map → chunker-K6WTR62A.js.map} +0 -0
  318. /package/dist/{databases-37X4CI2Y.js.map → client-FOIYPOZQ.js.map} +0 -0
  319. /package/dist/{discord-B3HUPGQ6.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
  320. /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
  321. /package/dist/{entity-resolution-Y3IUWEAT.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
  322. /package/dist/{env-IWXUVTCB.js.map → crypto-2VG3RJR2.js.map} +0 -0
  323. /package/dist/{hash-tool-ULQYD7B5.js.map → databases-XDPMG5AV.js.map} +0 -0
  324. /package/dist/{heartbeat-monitor-GCISLXI3.js.map → db-I7MNG6CL.js.map} +0 -0
  325. /package/dist/{imessage-NGA2XF2V.js.map → discord-6UQHCN27.js.map} +0 -0
  326. /package/dist/{inbox-summarizer-NRI4S7IF.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
  327. /package/dist/{inventory-manager-352OHXWD.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
  328. /package/dist/{json-tool-QE2SYHEG.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
  329. /package/dist/{key-rotation-DPHU4ZTB.js.map → env-GN5VHI43.js.map} +0 -0
  330. /package/dist/{mcp-3JI6W7ZE.js.map → error-tracker-64DEH3D7.js.map} +0 -0
  331. /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
  332. /package/dist/{ocr-AC7NPX33.js.map → graph-client-NB475AK5.js.map} +0 -0
  333. /package/dist/{ollama-BOAMSPLJ.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
  334. /package/dist/{pages-MI523RB7.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
  335. /package/dist/{pairing-IFQYCPNS.js.map → hooks-N4MIFBVM.js.map} +0 -0
  336. /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
  337. /package/dist/{pdf-ALQVOEJR.js.map → imessage-DSGSGUZS.js.map} +0 -0
  338. /package/dist/{prometheus-JNT2BD4L.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
  339. /package/dist/{providers-J4LYPHDR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
  340. /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
  341. /package/dist/{qr-code-WIX4PB4U.js.map → json-tool-4FK5RNER.js.map} +0 -0
  342. /package/dist/{regex-tool-W4ABRKGK.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
  343. /package/dist/{scheduler-VK4WFERV.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
  344. /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
  345. /package/dist/{search-BCLBO5E3.js.map → mcp-DJ2QDA6A.js.map} +0 -0
  346. /package/dist/{signal-6CGDFYL2.js.map → metrics-BH3ZLGEV.js.map} +0 -0
  347. /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
  348. /package/dist/{slack-IZQWIKOH.js.map → oauth-UPJYFOVU.js.map} +0 -0
  349. /package/dist/{sms-M3JIOTCW.js.map → ocr-UONKTQU7.js.map} +0 -0
  350. /package/dist/{stocks-XXWBPOCU.js.map → ollama-J7CU45WT.js.map} +0 -0
  351. /package/dist/{text-transform-6SGUA5Z4.js.map → pages-XDE7JRCA.js.map} +0 -0
  352. /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
  353. /package/dist/{tools-2RLEI2N6.js.map → pairing-77N47RAT.js.map} +0 -0
  354. /package/dist/{unit-converter-ZYXMEZOE.js.map → pdf-67HGXCFJ.js.map} +0 -0
  355. /package/dist/{whatsapp-LFX6YKCM.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
  356. /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
  357. /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
  358. /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
  359. /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
  360. /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
  361. /package/dist/{zapier-webhook-TBZ5YF2A.js.map → zapier-webhook-NIELLTXR.js.map} +0 -0
@@ -0,0 +1,380 @@
1
+ import {
2
+ parsePDF
3
+ } from "./chunk-XTX7EK43.js";
4
+ import {
5
+ parseDOCX
6
+ } from "./chunk-6W6PTJFT.js";
7
+ import {
8
+ extractText,
9
+ isSupportedTextFormat
10
+ } from "./chunk-MIC5IBQF.js";
11
+ import {
12
+ chunkText
13
+ } from "./chunk-ZIYTHUM5.js";
14
+ import {
15
+ db
16
+ } from "./chunk-5BTVJR7R.js";
17
+ import {
18
+ env
19
+ } from "./chunk-4KIHDIXZ.js";
20
+ import {
21
+ documentChunks,
22
+ documents
23
+ } from "./chunk-ZIBRVA3Y.js";
24
+
25
+ // src/integrations/documents/knowledge-base.ts
26
+ import { sql, eq, and, desc, inArray } from "drizzle-orm";
27
+ import OpenAI from "openai";
28
+ import * as fs from "fs/promises";
29
+ import * as path from "path";
30
+ import { nanoid } from "nanoid";
31
+ var openai = new OpenAI({ apiKey: env.OPENAI_API_KEY });
32
+ async function generateEmbedding(text) {
33
+ const response = await openai.embeddings.create({
34
+ model: "text-embedding-3-small",
35
+ input: text
36
+ });
37
+ return response.data[0].embedding;
38
+ }
39
+ async function generateEmbeddings(texts) {
40
+ if (texts.length === 0) return [];
41
+ const batchSize = 2048;
42
+ const allEmbeddings = [];
43
+ for (let i = 0; i < texts.length; i += batchSize) {
44
+ const batch = texts.slice(i, i + batchSize);
45
+ const response = await openai.embeddings.create({
46
+ model: "text-embedding-3-small",
47
+ input: batch
48
+ });
49
+ allEmbeddings.push(...response.data.map((d) => d.embedding));
50
+ }
51
+ return allEmbeddings;
52
+ }
53
+ async function ingestDocument(input, options = {}) {
54
+ let buffer;
55
+ let filename;
56
+ let mimeType;
57
+ if (typeof input === "string") {
58
+ const absolutePath = path.isAbsolute(input) ? input : path.resolve(input);
59
+ buffer = await fs.readFile(absolutePath);
60
+ filename = path.basename(input);
61
+ mimeType = getMimeType(filename);
62
+ } else {
63
+ buffer = input;
64
+ filename = options.name;
65
+ mimeType = options.metadata?.customFields?.mimeType;
66
+ }
67
+ const documentName = options.name || filename || `document-${nanoid(8)}`;
68
+ const [doc] = await db.insert(documents).values({
69
+ name: documentName,
70
+ filename,
71
+ mimeType,
72
+ fileSize: buffer.length,
73
+ source: options.source || "upload",
74
+ sourceUrl: options.sourceUrl,
75
+ metadata: options.metadata,
76
+ status: "processing",
77
+ userId: options.userId
78
+ }).returning();
79
+ try {
80
+ let text;
81
+ let extractedMetadata = {};
82
+ const ext = filename ? path.extname(filename).toLowerCase().slice(1) : "";
83
+ if (mimeType === "application/pdf" || ext === "pdf") {
84
+ const result = await parsePDF(buffer);
85
+ text = result.text;
86
+ extractedMetadata = {
87
+ title: result.metadata.title,
88
+ author: result.metadata.author,
89
+ pageCount: result.pageCount
90
+ };
91
+ } else if (mimeType === "application/vnd.openxmlformats-officedocument.wordprocessingml.document" || ext === "docx") {
92
+ const result = await parseDOCX(buffer);
93
+ text = result.text;
94
+ extractedMetadata = {
95
+ wordCount: result.metadata.wordCount
96
+ };
97
+ } else if (isSupportedTextFormat(ext)) {
98
+ const result = await extractText(buffer, { format: ext });
99
+ text = result.text;
100
+ extractedMetadata = {
101
+ wordCount: result.metadata.wordCount
102
+ };
103
+ } else {
104
+ text = buffer.toString("utf-8");
105
+ extractedMetadata = {
106
+ wordCount: text.split(/\s+/).length
107
+ };
108
+ }
109
+ const chunks = chunkText(text, options.chunkOptions);
110
+ if (chunks.length === 0) {
111
+ throw new Error("Document produced no chunks - it may be empty");
112
+ }
113
+ let embeddings = [];
114
+ if (!options.skipEmbeddings) {
115
+ embeddings = await generateEmbeddings(chunks.map((c) => c.content));
116
+ }
117
+ const chunkRecords = chunks.map((chunk, idx) => ({
118
+ documentId: doc.id,
119
+ chunkIndex: chunk.index,
120
+ content: chunk.content,
121
+ embedding: options.skipEmbeddings ? void 0 : embeddings[idx],
122
+ tokenCount: chunk.tokenEstimate,
123
+ metadata: {
124
+ sectionHeader: chunk.metadata.sectionHeader,
125
+ paragraphNumber: chunk.metadata.paragraphNumber,
126
+ startOffset: chunk.startOffset,
127
+ endOffset: chunk.endOffset
128
+ }
129
+ }));
130
+ const batchSize = 100;
131
+ for (let i = 0; i < chunkRecords.length; i += batchSize) {
132
+ const batch = chunkRecords.slice(i, i + batchSize);
133
+ await db.insert(documentChunks).values(batch);
134
+ }
135
+ const totalTokens = chunks.reduce((sum, c) => sum + c.tokenEstimate, 0);
136
+ const [updated] = await db.update(documents).set({
137
+ status: "completed",
138
+ chunkCount: chunks.length,
139
+ totalTokens,
140
+ metadata: {
141
+ ...extractedMetadata,
142
+ ...options.metadata
143
+ },
144
+ processedAt: /* @__PURE__ */ new Date(),
145
+ updatedAt: /* @__PURE__ */ new Date()
146
+ }).where(eq(documents.id, doc.id)).returning();
147
+ return mapDocumentToInfo(updated);
148
+ } catch (error) {
149
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
150
+ await db.update(documents).set({
151
+ status: "failed",
152
+ errorMessage,
153
+ updatedAt: /* @__PURE__ */ new Date()
154
+ }).where(eq(documents.id, doc.id));
155
+ throw error;
156
+ }
157
+ }
158
+ async function ingestDocuments(inputs) {
159
+ const results = [];
160
+ for (const { input, options } of inputs) {
161
+ try {
162
+ const result = await ingestDocument(input, options);
163
+ results.push(result);
164
+ } catch (error) {
165
+ console.error(`Failed to ingest document:`, error);
166
+ }
167
+ }
168
+ return results;
169
+ }
170
+ async function queryKnowledgeBase(query, options = {}) {
171
+ const {
172
+ limit = 5,
173
+ minSimilarity = 0,
174
+ documentIds,
175
+ userId,
176
+ tags,
177
+ includeMetadata = false
178
+ } = options;
179
+ const queryEmbedding = await generateEmbedding(query);
180
+ let queryBuilder = sql`
181
+ SELECT
182
+ dc.id as chunk_id,
183
+ dc.document_id,
184
+ d.name as document_name,
185
+ dc.content,
186
+ dc.metadata as chunk_metadata,
187
+ ${includeMetadata ? sql`d.metadata as document_metadata,` : sql``}
188
+ 1 - (dc.embedding <=> ${JSON.stringify(queryEmbedding)}::vector) as similarity
189
+ FROM document_chunks dc
190
+ JOIN documents d ON dc.document_id = d.id
191
+ WHERE d.status = 'completed'
192
+ `;
193
+ if (documentIds && documentIds.length > 0) {
194
+ queryBuilder = sql`${queryBuilder} AND dc.document_id = ANY(${documentIds}::uuid[])`;
195
+ }
196
+ if (userId) {
197
+ queryBuilder = sql`${queryBuilder} AND d.user_id = ${userId}`;
198
+ }
199
+ if (tags && tags.length > 0) {
200
+ queryBuilder = sql`${queryBuilder} AND d.metadata->'tags' ?| ${tags}`;
201
+ }
202
+ queryBuilder = sql`
203
+ ${queryBuilder}
204
+ AND 1 - (dc.embedding <=> ${JSON.stringify(queryEmbedding)}::vector) >= ${minSimilarity}
205
+ ORDER BY dc.embedding <=> ${JSON.stringify(queryEmbedding)}::vector
206
+ LIMIT ${limit}
207
+ `;
208
+ const results = await db.execute(queryBuilder);
209
+ return (results.rows || results).map((row) => ({
210
+ chunkId: row.chunk_id,
211
+ documentId: row.document_id,
212
+ documentName: row.document_name,
213
+ content: row.content,
214
+ similarity: parseFloat(row.similarity),
215
+ metadata: row.chunk_metadata,
216
+ documentMetadata: includeMetadata ? row.document_metadata : void 0
217
+ }));
218
+ }
219
+ async function searchDocuments(query, options = {}) {
220
+ return queryKnowledgeBase(query, options);
221
+ }
222
+ async function getQueryContext(query, options = {}) {
223
+ const results = await queryKnowledgeBase(query, {
224
+ ...options,
225
+ includeMetadata: true
226
+ });
227
+ if (results.length === 0) {
228
+ return "";
229
+ }
230
+ const contextParts = results.map((result, idx) => {
231
+ const header = result.documentMetadata?.title || result.documentName;
232
+ const section = result.metadata.sectionHeader ? ` - ${result.metadata.sectionHeader}` : "";
233
+ const similarity = (result.similarity * 100).toFixed(0);
234
+ return `[Source ${idx + 1}: ${header}${section} (${similarity}% relevance)]
235
+ ${result.content}`;
236
+ });
237
+ return `Relevant knowledge from documents:
238
+
239
+ ${contextParts.join("\n\n---\n\n")}`;
240
+ }
241
+ async function listDocuments(options) {
242
+ const conditions = [];
243
+ if (options?.userId) {
244
+ conditions.push(eq(documents.userId, options.userId));
245
+ }
246
+ if (options?.status) {
247
+ conditions.push(eq(documents.status, options.status));
248
+ }
249
+ const whereClause = conditions.length > 0 ? and(...conditions) : void 0;
250
+ const countResult = await db.select({ count: sql`count(*)` }).from(documents).where(whereClause);
251
+ const total = Number(countResult[0].count);
252
+ let query = db.select().from(documents).where(whereClause).orderBy(desc(documents.createdAt));
253
+ if (options?.limit) {
254
+ query = query.limit(options.limit);
255
+ }
256
+ if (options?.offset) {
257
+ query = query.offset(options.offset);
258
+ }
259
+ const docs = await query;
260
+ return {
261
+ documents: docs.map(mapDocumentToInfo),
262
+ total
263
+ };
264
+ }
265
+ async function getDocument(documentId) {
266
+ const [doc] = await db.select().from(documents).where(eq(documents.id, documentId));
267
+ return doc ? mapDocumentToInfo(doc) : null;
268
+ }
269
+ async function deleteDocument(documentId) {
270
+ const result = await db.delete(documents).where(eq(documents.id, documentId)).returning();
271
+ return result.length > 0;
272
+ }
273
+ async function deleteDocuments(documentIds) {
274
+ const result = await db.delete(documents).where(inArray(documents.id, documentIds)).returning();
275
+ return result.length;
276
+ }
277
+ async function updateDocumentMetadata(documentId, metadata) {
278
+ const [doc] = await db.select().from(documents).where(eq(documents.id, documentId));
279
+ if (!doc) return null;
280
+ const [updated] = await db.update(documents).set({
281
+ metadata: {
282
+ ...doc.metadata,
283
+ ...metadata
284
+ },
285
+ updatedAt: /* @__PURE__ */ new Date()
286
+ }).where(eq(documents.id, documentId)).returning();
287
+ return mapDocumentToInfo(updated);
288
+ }
289
+ async function getDocumentChunks(documentId) {
290
+ const chunks = await db.select({
291
+ id: documentChunks.id,
292
+ index: documentChunks.chunkIndex,
293
+ content: documentChunks.content,
294
+ metadata: documentChunks.metadata
295
+ }).from(documentChunks).where(eq(documentChunks.documentId, documentId)).orderBy(documentChunks.chunkIndex);
296
+ return chunks.map((c) => ({
297
+ id: c.id,
298
+ index: c.index,
299
+ content: c.content,
300
+ metadata: c.metadata
301
+ }));
302
+ }
303
+ function getMimeType(filename) {
304
+ const ext = path.extname(filename).toLowerCase();
305
+ const mimeTypes = {
306
+ ".pdf": "application/pdf",
307
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
308
+ ".doc": "application/msword",
309
+ ".txt": "text/plain",
310
+ ".md": "text/markdown",
311
+ ".html": "text/html",
312
+ ".htm": "text/html",
313
+ ".csv": "text/csv",
314
+ ".json": "application/json",
315
+ ".xml": "application/xml",
316
+ ".yaml": "application/yaml",
317
+ ".yml": "application/yaml"
318
+ };
319
+ return mimeTypes[ext];
320
+ }
321
+ function mapDocumentToInfo(doc) {
322
+ return {
323
+ id: doc.id,
324
+ name: doc.name,
325
+ filename: doc.filename || void 0,
326
+ mimeType: doc.mimeType || void 0,
327
+ fileSize: doc.fileSize || void 0,
328
+ source: doc.source || void 0,
329
+ sourceUrl: doc.sourceUrl || void 0,
330
+ metadata: doc.metadata,
331
+ status: doc.status,
332
+ errorMessage: doc.errorMessage || void 0,
333
+ chunkCount: doc.chunkCount || 0,
334
+ totalTokens: doc.totalTokens || 0,
335
+ userId: doc.userId || void 0,
336
+ createdAt: doc.createdAt,
337
+ updatedAt: doc.updatedAt,
338
+ processedAt: doc.processedAt || void 0
339
+ };
340
+ }
341
+ async function getKnowledgeBaseStats(userId) {
342
+ const whereClause = userId ? eq(documents.userId, userId) : void 0;
343
+ const docStats = await db.select({
344
+ count: sql`count(*)`,
345
+ totalChunks: sql`coalesce(sum(chunk_count), 0)`,
346
+ totalTokens: sql`coalesce(sum(total_tokens), 0)`
347
+ }).from(documents).where(whereClause);
348
+ const statusStats = await db.select({
349
+ status: documents.status,
350
+ count: sql`count(*)`
351
+ }).from(documents).where(whereClause).groupBy(documents.status);
352
+ const statusBreakdown = {};
353
+ for (const stat of statusStats) {
354
+ statusBreakdown[stat.status] = Number(stat.count);
355
+ }
356
+ return {
357
+ documentCount: Number(docStats[0].count),
358
+ chunkCount: Number(docStats[0].totalChunks),
359
+ totalTokens: Number(docStats[0].totalTokens),
360
+ statusBreakdown
361
+ };
362
+ }
363
+
364
+ export {
365
+ generateEmbedding,
366
+ generateEmbeddings,
367
+ ingestDocument,
368
+ ingestDocuments,
369
+ queryKnowledgeBase,
370
+ searchDocuments,
371
+ getQueryContext,
372
+ listDocuments,
373
+ getDocument,
374
+ deleteDocument,
375
+ deleteDocuments,
376
+ updateDocumentMetadata,
377
+ getDocumentChunks,
378
+ getKnowledgeBaseStats
379
+ };
380
+ //# sourceMappingURL=chunk-ZVHG4KF2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integrations/documents/knowledge-base.ts"],"sourcesContent":["/**\r\n * Knowledge Base for OpenSentinel Document Ingestion\r\n *\r\n * Stores and queries document embeddings using pgvector for similarity search.\r\n */\r\n\r\nimport { db, documents, documentChunks } from \"../../db\";\r\nimport { sql, eq, and, desc, inArray } from \"drizzle-orm\";\r\nimport OpenAI from \"openai\";\r\nimport { env } from \"../../config/env\";\r\nimport { chunkText, type Chunk, type ChunkerOptions } from \"./chunker\";\r\nimport { parsePDF } from \"./pdf-parser\";\r\nimport { parseDOCX } from \"./docx-parser\";\r\nimport { extractText, isSupportedTextFormat } from \"./text-extractor\";\r\nimport * as fs from \"fs/promises\";\r\nimport * as path from \"path\";\r\nimport { nanoid } from \"nanoid\";\r\n\r\n// Initialize OpenAI client\r\nconst openai = new OpenAI({ apiKey: env.OPENAI_API_KEY });\r\n\r\n// Re-export the schema tables for convenience\r\nexport { documents, documentChunks };\r\n\r\n// ============================================\r\n// TYPES\r\n// ============================================\r\n\r\nexport interface DocumentMetadata {\r\n title?: string;\r\n author?: string;\r\n description?: string;\r\n tags?: string[];\r\n pageCount?: number;\r\n wordCount?: number;\r\n language?: string;\r\n customFields?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ChunkDBMetadata {\r\n sectionHeader?: string;\r\n pageNumber?: number;\r\n paragraphNumber?: number;\r\n startOffset: number;\r\n endOffset: number;\r\n}\r\n\r\nexport interface IngestOptions {\r\n /** Document name (defaults to filename) */\r\n name?: string;\r\n /** Source type */\r\n source?: \"upload\" | \"url\" | \"api\";\r\n /** Source URL if applicable */\r\n sourceUrl?: string;\r\n /** Additional metadata */\r\n metadata?: Partial<DocumentMetadata>;\r\n /** User ID for ownership */\r\n userId?: string;\r\n /** Chunking options */\r\n chunkOptions?: ChunkerOptions;\r\n /** Skip embedding generation (for testing) */\r\n skipEmbeddings?: boolean;\r\n}\r\n\r\nexport interface QueryOptions {\r\n /** Maximum number of results */\r\n limit?: number;\r\n /** Minimum similarity score (0-1) */\r\n minSimilarity?: number;\r\n /** Filter by document IDs */\r\n documentIds?: string[];\r\n /** Filter by user ID */\r\n userId?: string;\r\n /** Filter by tags */\r\n tags?: string[];\r\n /** Include document metadata in results */\r\n includeMetadata?: boolean;\r\n}\r\n\r\nexport interface QueryResult {\r\n /** Chunk ID */\r\n chunkId: string;\r\n /** Document ID */\r\n documentId: string;\r\n /** Document name */\r\n documentName: string;\r\n /** Chunk content */\r\n content: string;\r\n /** Similarity score (0-1) */\r\n similarity: number;\r\n /** Chunk metadata */\r\n metadata: ChunkDBMetadata;\r\n /** Document metadata (if requested) */\r\n documentMetadata?: DocumentMetadata;\r\n}\r\n\r\nexport interface DocumentInfo {\r\n id: string;\r\n name: string;\r\n filename?: string;\r\n mimeType?: string;\r\n fileSize?: number;\r\n source?: string;\r\n sourceUrl?: string;\r\n metadata?: DocumentMetadata;\r\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\";\r\n errorMessage?: string;\r\n chunkCount: number;\r\n totalTokens: number;\r\n userId?: string;\r\n createdAt: Date;\r\n updatedAt: Date;\r\n processedAt?: Date;\r\n}\r\n\r\n// ============================================\r\n// EMBEDDING FUNCTIONS\r\n// ============================================\r\n\r\n/**\r\n * Generate embedding for text using OpenAI\r\n */\r\nexport async function generateEmbedding(text: string): Promise<number[]> {\r\n const response = await openai.embeddings.create({\r\n model: \"text-embedding-3-small\",\r\n input: text,\r\n });\r\n return response.data[0].embedding;\r\n}\r\n\r\n/**\r\n * Generate embeddings for multiple texts (batched)\r\n */\r\nexport async function generateEmbeddings(\r\n texts: string[]\r\n): Promise<number[][]> {\r\n if (texts.length === 0) return [];\r\n\r\n // OpenAI supports up to 2048 inputs per request\r\n const batchSize = 2048;\r\n const allEmbeddings: number[][] = [];\r\n\r\n for (let i = 0; i < texts.length; i += batchSize) {\r\n const batch = texts.slice(i, i + batchSize);\r\n const response = await openai.embeddings.create({\r\n model: \"text-embedding-3-small\",\r\n input: batch,\r\n });\r\n\r\n allEmbeddings.push(...response.data.map((d) => d.embedding));\r\n }\r\n\r\n return allEmbeddings;\r\n}\r\n\r\n// ============================================\r\n// DOCUMENT INGESTION\r\n// ============================================\r\n\r\n/**\r\n * Ingest a document from file path or buffer\r\n */\r\nexport async function ingestDocument(\r\n input: string | Buffer,\r\n options: IngestOptions = {}\r\n): Promise<DocumentInfo> {\r\n let buffer: Buffer;\r\n let filename: string | undefined;\r\n let mimeType: string | undefined;\r\n\r\n // Read file if path is provided\r\n if (typeof input === \"string\") {\r\n const absolutePath = path.isAbsolute(input) ? input : path.resolve(input);\r\n buffer = await fs.readFile(absolutePath);\r\n filename = path.basename(input);\r\n mimeType = getMimeType(filename);\r\n } else {\r\n buffer = input;\r\n filename = options.name;\r\n mimeType = options.metadata?.customFields?.mimeType as string | undefined;\r\n }\r\n\r\n const documentName = options.name || filename || `document-${nanoid(8)}`;\r\n\r\n // Create document record\r\n const [doc] = await db\r\n .insert(documents)\r\n .values({\r\n name: documentName,\r\n filename,\r\n mimeType,\r\n fileSize: buffer.length,\r\n source: options.source || \"upload\",\r\n sourceUrl: options.sourceUrl,\r\n metadata: options.metadata as DocumentMetadata,\r\n status: \"processing\",\r\n userId: options.userId,\r\n })\r\n .returning();\r\n\r\n try {\r\n // Extract text based on file type\r\n let text: string;\r\n let extractedMetadata: Partial<DocumentMetadata> = {};\r\n\r\n const ext = filename ? path.extname(filename).toLowerCase().slice(1) : \"\";\r\n\r\n if (mimeType === \"application/pdf\" || ext === \"pdf\") {\r\n const result = await parsePDF(buffer);\r\n text = result.text;\r\n extractedMetadata = {\r\n title: result.metadata.title,\r\n author: result.metadata.author,\r\n pageCount: result.pageCount,\r\n };\r\n } else if (\r\n mimeType ===\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" ||\r\n ext === \"docx\"\r\n ) {\r\n const result = await parseDOCX(buffer);\r\n text = result.text;\r\n extractedMetadata = {\r\n wordCount: result.metadata.wordCount,\r\n };\r\n } else if (isSupportedTextFormat(ext)) {\r\n const result = await extractText(buffer, { format: ext as any });\r\n text = result.text;\r\n extractedMetadata = {\r\n wordCount: result.metadata.wordCount,\r\n };\r\n } else {\r\n // Try to extract as plain text\r\n text = buffer.toString(\"utf-8\");\r\n extractedMetadata = {\r\n wordCount: text.split(/\\s+/).length,\r\n };\r\n }\r\n\r\n // Chunk the text\r\n const chunks = chunkText(text, options.chunkOptions);\r\n\r\n if (chunks.length === 0) {\r\n throw new Error(\"Document produced no chunks - it may be empty\");\r\n }\r\n\r\n // Generate embeddings\r\n let embeddings: number[][] = [];\r\n if (!options.skipEmbeddings) {\r\n embeddings = await generateEmbeddings(chunks.map((c) => c.content));\r\n }\r\n\r\n // Store chunks\r\n const chunkRecords = chunks.map((chunk, idx) => ({\r\n documentId: doc.id,\r\n chunkIndex: chunk.index,\r\n content: chunk.content,\r\n embedding: options.skipEmbeddings ? undefined : embeddings[idx],\r\n tokenCount: chunk.tokenEstimate,\r\n metadata: {\r\n sectionHeader: chunk.metadata.sectionHeader,\r\n paragraphNumber: chunk.metadata.paragraphNumber,\r\n startOffset: chunk.startOffset,\r\n endOffset: chunk.endOffset,\r\n } as ChunkDBMetadata,\r\n }));\r\n\r\n // Insert chunks in batches\r\n const batchSize = 100;\r\n for (let i = 0; i < chunkRecords.length; i += batchSize) {\r\n const batch = chunkRecords.slice(i, i + batchSize);\r\n await db.insert(documentChunks).values(batch);\r\n }\r\n\r\n // Calculate total tokens\r\n const totalTokens = chunks.reduce((sum, c) => sum + c.tokenEstimate, 0);\r\n\r\n // Update document status\r\n const [updated] = await db\r\n .update(documents)\r\n .set({\r\n status: \"completed\",\r\n chunkCount: chunks.length,\r\n totalTokens,\r\n metadata: {\r\n ...extractedMetadata,\r\n ...options.metadata,\r\n },\r\n processedAt: new Date(),\r\n updatedAt: new Date(),\r\n })\r\n .where(eq(documents.id, doc.id))\r\n .returning();\r\n\r\n return mapDocumentToInfo(updated);\r\n } catch (error) {\r\n // Update document with error\r\n const errorMessage =\r\n error instanceof Error ? error.message : \"Unknown error\";\r\n await db\r\n .update(documents)\r\n .set({\r\n status: \"failed\",\r\n errorMessage,\r\n updatedAt: new Date(),\r\n })\r\n .where(eq(documents.id, doc.id));\r\n\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Ingest multiple documents\r\n */\r\nexport async function ingestDocuments(\r\n inputs: Array<{ input: string | Buffer; options?: IngestOptions }>\r\n): Promise<DocumentInfo[]> {\r\n const results: DocumentInfo[] = [];\r\n\r\n for (const { input, options } of inputs) {\r\n try {\r\n const result = await ingestDocument(input, options);\r\n results.push(result);\r\n } catch (error) {\r\n console.error(`Failed to ingest document:`, error);\r\n // Continue with other documents\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n// ============================================\r\n// QUERY FUNCTIONS\r\n// ============================================\r\n\r\n/**\r\n * Query the knowledge base with natural language\r\n */\r\nexport async function queryKnowledgeBase(\r\n query: string,\r\n options: QueryOptions = {}\r\n): Promise<QueryResult[]> {\r\n const {\r\n limit = 5,\r\n minSimilarity = 0.0,\r\n documentIds,\r\n userId,\r\n tags,\r\n includeMetadata = false,\r\n } = options;\r\n\r\n // Generate query embedding\r\n const queryEmbedding = await generateEmbedding(query);\r\n\r\n // Build the query\r\n let queryBuilder = sql`\r\n SELECT\r\n dc.id as chunk_id,\r\n dc.document_id,\r\n d.name as document_name,\r\n dc.content,\r\n dc.metadata as chunk_metadata,\r\n ${includeMetadata ? sql`d.metadata as document_metadata,` : sql``}\r\n 1 - (dc.embedding <=> ${JSON.stringify(queryEmbedding)}::vector) as similarity\r\n FROM document_chunks dc\r\n JOIN documents d ON dc.document_id = d.id\r\n WHERE d.status = 'completed'\r\n `;\r\n\r\n // Add filters\r\n if (documentIds && documentIds.length > 0) {\r\n queryBuilder = sql`${queryBuilder} AND dc.document_id = ANY(${documentIds}::uuid[])`;\r\n }\r\n\r\n if (userId) {\r\n queryBuilder = sql`${queryBuilder} AND d.user_id = ${userId}`;\r\n }\r\n\r\n if (tags && tags.length > 0) {\r\n queryBuilder = sql`${queryBuilder} AND d.metadata->'tags' ?| ${tags}`;\r\n }\r\n\r\n // Add similarity filter and ordering\r\n queryBuilder = sql`\r\n ${queryBuilder}\r\n AND 1 - (dc.embedding <=> ${JSON.stringify(queryEmbedding)}::vector) >= ${minSimilarity}\r\n ORDER BY dc.embedding <=> ${JSON.stringify(queryEmbedding)}::vector\r\n LIMIT ${limit}\r\n `;\r\n\r\n const results = await db.execute(queryBuilder) as any;\r\n\r\n return (results.rows || results).map((row: any) => ({\r\n chunkId: row.chunk_id,\r\n documentId: row.document_id,\r\n documentName: row.document_name,\r\n content: row.content,\r\n similarity: parseFloat(row.similarity),\r\n metadata: row.chunk_metadata,\r\n documentMetadata: includeMetadata ? row.document_metadata : undefined,\r\n }));\r\n}\r\n\r\n/**\r\n * Search documents by text similarity\r\n */\r\nexport async function searchDocuments(\r\n query: string,\r\n options: QueryOptions = {}\r\n): Promise<QueryResult[]> {\r\n return queryKnowledgeBase(query, options);\r\n}\r\n\r\n/**\r\n * Get context for a query (formatted for LLM)\r\n */\r\nexport async function getQueryContext(\r\n query: string,\r\n options: QueryOptions = {}\r\n): Promise<string> {\r\n const results = await queryKnowledgeBase(query, {\r\n ...options,\r\n includeMetadata: true,\r\n });\r\n\r\n if (results.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const contextParts = results.map((result, idx) => {\r\n const header = result.documentMetadata?.title || result.documentName;\r\n const section = result.metadata.sectionHeader\r\n ? ` - ${result.metadata.sectionHeader}`\r\n : \"\";\r\n const similarity = (result.similarity * 100).toFixed(0);\r\n\r\n return `[Source ${idx + 1}: ${header}${section} (${similarity}% relevance)]\r\n${result.content}`;\r\n });\r\n\r\n return `Relevant knowledge from documents:\r\n\r\n${contextParts.join(\"\\n\\n---\\n\\n\")}`;\r\n}\r\n\r\n// ============================================\r\n// DOCUMENT MANAGEMENT\r\n// ============================================\r\n\r\n/**\r\n * List all documents\r\n */\r\nexport async function listDocuments(options?: {\r\n userId?: string;\r\n status?: \"pending\" | \"processing\" | \"completed\" | \"failed\";\r\n limit?: number;\r\n offset?: number;\r\n}): Promise<{ documents: DocumentInfo[]; total: number }> {\r\n const conditions = [];\r\n\r\n if (options?.userId) {\r\n conditions.push(eq(documents.userId, options.userId));\r\n }\r\n\r\n if (options?.status) {\r\n conditions.push(eq(documents.status, options.status));\r\n }\r\n\r\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined;\r\n\r\n // Get total count\r\n const countResult = await db\r\n .select({ count: sql<number>`count(*)` })\r\n .from(documents)\r\n .where(whereClause);\r\n const total = Number(countResult[0].count);\r\n\r\n // Get documents\r\n let query = db\r\n .select()\r\n .from(documents)\r\n .where(whereClause)\r\n .orderBy(desc(documents.createdAt));\r\n\r\n if (options?.limit) {\r\n query = query.limit(options.limit) as typeof query;\r\n }\r\n\r\n if (options?.offset) {\r\n query = query.offset(options.offset) as typeof query;\r\n }\r\n\r\n const docs = await query;\r\n\r\n return {\r\n documents: docs.map(mapDocumentToInfo),\r\n total,\r\n };\r\n}\r\n\r\n/**\r\n * Get a specific document by ID\r\n */\r\nexport async function getDocument(documentId: string): Promise<DocumentInfo | null> {\r\n const [doc] = await db\r\n .select()\r\n .from(documents)\r\n .where(eq(documents.id, documentId));\r\n\r\n return doc ? mapDocumentToInfo(doc) : null;\r\n}\r\n\r\n/**\r\n * Delete a document and its chunks\r\n */\r\nexport async function deleteDocument(documentId: string): Promise<boolean> {\r\n // Chunks are deleted automatically due to cascade\r\n const result = await db\r\n .delete(documents)\r\n .where(eq(documents.id, documentId))\r\n .returning();\r\n\r\n return result.length > 0;\r\n}\r\n\r\n/**\r\n * Delete multiple documents\r\n */\r\nexport async function deleteDocuments(documentIds: string[]): Promise<number> {\r\n const result = await db\r\n .delete(documents)\r\n .where(inArray(documents.id, documentIds))\r\n .returning();\r\n\r\n return result.length;\r\n}\r\n\r\n/**\r\n * Update document metadata\r\n */\r\nexport async function updateDocumentMetadata(\r\n documentId: string,\r\n metadata: Partial<DocumentMetadata>\r\n): Promise<DocumentInfo | null> {\r\n const [doc] = await db\r\n .select()\r\n .from(documents)\r\n .where(eq(documents.id, documentId));\r\n\r\n if (!doc) return null;\r\n\r\n const [updated] = await db\r\n .update(documents)\r\n .set({\r\n metadata: {\r\n ...(doc.metadata as DocumentMetadata),\r\n ...metadata,\r\n },\r\n updatedAt: new Date(),\r\n })\r\n .where(eq(documents.id, documentId))\r\n .returning();\r\n\r\n return mapDocumentToInfo(updated);\r\n}\r\n\r\n/**\r\n * Get document chunks\r\n */\r\nexport async function getDocumentChunks(\r\n documentId: string\r\n): Promise<Array<{ id: string; index: number; content: string; metadata: ChunkDBMetadata }>> {\r\n const chunks = await db\r\n .select({\r\n id: documentChunks.id,\r\n index: documentChunks.chunkIndex,\r\n content: documentChunks.content,\r\n metadata: documentChunks.metadata,\r\n })\r\n .from(documentChunks)\r\n .where(eq(documentChunks.documentId, documentId))\r\n .orderBy(documentChunks.chunkIndex);\r\n\r\n return chunks.map((c) => ({\r\n id: c.id,\r\n index: c.index,\r\n content: c.content,\r\n metadata: c.metadata as ChunkDBMetadata,\r\n }));\r\n}\r\n\r\n// ============================================\r\n// UTILITY FUNCTIONS\r\n// ============================================\r\n\r\n/**\r\n * Get MIME type from filename\r\n */\r\nfunction getMimeType(filename: string): string | undefined {\r\n const ext = path.extname(filename).toLowerCase();\r\n const mimeTypes: Record<string, string> = {\r\n \".pdf\": \"application/pdf\",\r\n \".docx\":\r\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n \".doc\": \"application/msword\",\r\n \".txt\": \"text/plain\",\r\n \".md\": \"text/markdown\",\r\n \".html\": \"text/html\",\r\n \".htm\": \"text/html\",\r\n \".csv\": \"text/csv\",\r\n \".json\": \"application/json\",\r\n \".xml\": \"application/xml\",\r\n \".yaml\": \"application/yaml\",\r\n \".yml\": \"application/yaml\",\r\n };\r\n return mimeTypes[ext];\r\n}\r\n\r\n/**\r\n * Map database document to DocumentInfo\r\n */\r\nfunction mapDocumentToInfo(doc: typeof documents.$inferSelect): DocumentInfo {\r\n return {\r\n id: doc.id,\r\n name: doc.name,\r\n filename: doc.filename || undefined,\r\n mimeType: doc.mimeType || undefined,\r\n fileSize: doc.fileSize || undefined,\r\n source: doc.source || undefined,\r\n sourceUrl: doc.sourceUrl || undefined,\r\n metadata: doc.metadata as DocumentMetadata | undefined,\r\n status: doc.status as \"pending\" | \"processing\" | \"completed\" | \"failed\",\r\n errorMessage: doc.errorMessage || undefined,\r\n chunkCount: doc.chunkCount || 0,\r\n totalTokens: doc.totalTokens || 0,\r\n userId: doc.userId || undefined,\r\n createdAt: doc.createdAt,\r\n updatedAt: doc.updatedAt,\r\n processedAt: doc.processedAt || undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Get knowledge base statistics\r\n */\r\nexport async function getKnowledgeBaseStats(userId?: string): Promise<{\r\n documentCount: number;\r\n chunkCount: number;\r\n totalTokens: number;\r\n statusBreakdown: Record<string, number>;\r\n}> {\r\n const whereClause = userId ? eq(documents.userId, userId) : undefined;\r\n\r\n // Get document stats\r\n const docStats = await db\r\n .select({\r\n count: sql<number>`count(*)`,\r\n totalChunks: sql<number>`coalesce(sum(chunk_count), 0)`,\r\n totalTokens: sql<number>`coalesce(sum(total_tokens), 0)`,\r\n })\r\n .from(documents)\r\n .where(whereClause);\r\n\r\n // Get status breakdown\r\n const statusStats = await db\r\n .select({\r\n status: documents.status,\r\n count: sql<number>`count(*)`,\r\n })\r\n .from(documents)\r\n .where(whereClause)\r\n .groupBy(documents.status);\r\n\r\n const statusBreakdown: Record<string, number> = {};\r\n for (const stat of statusStats) {\r\n statusBreakdown[stat.status] = Number(stat.count);\r\n }\r\n\r\n return {\r\n documentCount: Number(docStats[0].count),\r\n chunkCount: Number(docStats[0].totalChunks),\r\n totalTokens: Number(docStats[0].totalTokens),\r\n statusBreakdown,\r\n };\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,12 @@
1
+ import {
2
+ chunkText,
3
+ estimateTokens,
4
+ mergeSmallChunks
5
+ } from "./chunk-ZIYTHUM5.js";
6
+ import "./chunk-UP2VWCW5.js";
7
+ export {
8
+ chunkText,
9
+ estimateTokens,
10
+ mergeSmallChunks
11
+ };
12
+ //# sourceMappingURL=chunker-K6WTR62A.js.map
package/dist/cli.js CHANGED
@@ -16,7 +16,7 @@ switch (command) {
16
16
  import("./commands/status.js").then((m) => m.default());
17
17
  break;
18
18
  case "pair":
19
- import("./pair-JDFTERIK.js").then((m) => m.showPairingInfo());
19
+ import("./pair-YZJFQUU5.js").then((m) => m.showPairingInfo());
20
20
  break;
21
21
  case "version":
22
22
  case "--version":
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\n\n/**\n * OpenSentinel CLI\n *\n * Usage:\n * opensentinel Start the server (default)\n * opensentinel start Start the server\n * opensentinel setup Interactive setup wizard\n * opensentinel stop Stop the system service\n * opensentinel status Show service status\n * opensentinel version Show version\n * opensentinel help Show this help\n */\n\nconst command = process.argv[2];\n\nswitch (command) {\n case \"setup\":\n import(\"./commands/setup\").then((m) => m.default());\n break;\n\n case \"start\":\n import(\"./commands/start\").then((m) => m.default());\n break;\n\n case \"stop\":\n import(\"./commands/stop\").then((m) => m.default());\n break;\n\n case \"status\":\n import(\"./commands/status\").then((m) => m.default());\n break;\n\n case \"pair\":\n import(\"./commands/pair\").then((m) => m.showPairingInfo());\n break;\n\n case \"version\":\n case \"--version\":\n case \"-v\":\n console.log(\"opensentinel v3.0.0\");\n break;\n\n case \"help\":\n case \"--help\":\n case \"-h\":\n console.log(`\nOpenSentinel - Your Personal AI Assistant\n\nUsage:\n opensentinel [command]\n\nCommands:\n start Start the server (default)\n setup Interactive setup wizard\n stop Stop the system service\n status Show service status\n pair Show device pairing info\n version Show version\n help Show this help\n\nExamples:\n opensentinel Start with default config\n opensentinel setup Run the setup wizard\n opensentinel status Check service health\n\nDocumentation: https://docs.opensentinel.ai\n`);\n break;\n\n default:\n // Default: start the server (backward compatibility)\n import(\"./commands/start\").then((m) => m.default());\n break;\n}\n"],"mappings":";;;AAeA,IAAM,UAAU,QAAQ,KAAK,CAAC;AAE9B,QAAQ,SAAS;AAAA,EACf,KAAK;AACH,WAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD;AAAA,EAEF,KAAK;AACH,WAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD;AAAA,EAEF,KAAK;AACH,WAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AACjD;AAAA,EAEF,KAAK;AACH,WAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AACnD;AAAA,EAEF,KAAK;AACH,WAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACzD;AAAA,EAEF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACH,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EAEF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACH,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAqBf;AACG;AAAA,EAEF;AAEE,WAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD;AACJ;","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\r\n\r\n/**\r\n * OpenSentinel CLI\r\n *\r\n * Usage:\r\n * opensentinel Start the server (default)\r\n * opensentinel start Start the server\r\n * opensentinel setup Interactive setup wizard\r\n * opensentinel stop Stop the system service\r\n * opensentinel status Show service status\r\n * opensentinel version Show version\r\n * opensentinel help Show this help\r\n */\r\n\r\nconst command = process.argv[2];\r\n\r\nswitch (command) {\r\n case \"setup\":\r\n import(\"./commands/setup\").then((m) => m.default());\r\n break;\r\n\r\n case \"start\":\r\n import(\"./commands/start\").then((m) => m.default());\r\n break;\r\n\r\n case \"stop\":\r\n import(\"./commands/stop\").then((m) => m.default());\r\n break;\r\n\r\n case \"status\":\r\n import(\"./commands/status\").then((m) => m.default());\r\n break;\r\n\r\n case \"pair\":\r\n import(\"./commands/pair\").then((m) => m.showPairingInfo());\r\n break;\r\n\r\n case \"version\":\r\n case \"--version\":\r\n case \"-v\":\r\n console.log(\"opensentinel v3.0.0\");\r\n break;\r\n\r\n case \"help\":\r\n case \"--help\":\r\n case \"-h\":\r\n console.log(`\r\nOpenSentinel - Your Personal AI Assistant\r\n\r\nUsage:\r\n opensentinel [command]\r\n\r\nCommands:\r\n start Start the server (default)\r\n setup Interactive setup wizard\r\n stop Stop the system service\r\n status Show service status\r\n pair Show device pairing info\r\n version Show version\r\n help Show this help\r\n\r\nExamples:\r\n opensentinel Start with default config\r\n opensentinel setup Run the setup wizard\r\n opensentinel status Check service health\r\n\r\nDocumentation: https://docs.opensentinel.ai\r\n`);\r\n break;\r\n\r\n default:\r\n // Default: start the server (backward compatibility)\r\n import(\"./commands/start\").then((m) => m.default());\r\n break;\r\n}\r\n"],"mappings":";;;AAeA,IAAM,UAAU,QAAQ,KAAK,CAAC;AAE9B,QAAQ,SAAS;AAAA,EACf,KAAK;AACH,WAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD;AAAA,EAEF,KAAK;AACH,WAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD;AAAA,EAEF,KAAK;AACH,WAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AACjD;AAAA,EAEF,KAAK;AACH,WAAO,sBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AACnD;AAAA,EAEF,KAAK;AACH,WAAO,oBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACzD;AAAA,EAEF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACH,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EAEF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACH,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAqBf;AACG;AAAA,EAEF;AAEE,WAAO,qBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;AAClD;AACJ;","names":[]}
@@ -1,21 +1,20 @@
1
1
  import {
2
+ Client,
2
3
  getNotionClient,
3
4
  getRootPageId,
4
- import_client,
5
5
  initNotionClient,
6
6
  init_client,
7
7
  isNotionInitialized,
8
8
  resetNotionClient
9
- } from "./chunk-VRD5CYRL.js";
10
- import "./chunk-PLDDJCW6.js";
9
+ } from "./chunk-C6PELIHS.js";
10
+ import "./chunk-UP2VWCW5.js";
11
11
  init_client();
12
- var export_Client = import_client.Client;
13
12
  export {
14
- export_Client as Client,
13
+ Client,
15
14
  getNotionClient,
16
15
  getRootPageId,
17
16
  initNotionClient,
18
17
  isNotionInitialized,
19
18
  resetNotionClient
20
19
  };
21
- //# sourceMappingURL=client-ZQSFPMOB.js.map
20
+ //# sourceMappingURL=client-FOIYPOZQ.js.map
@@ -9,7 +9,7 @@ import {
9
9
  save,
10
10
  search
11
11
  } from "./chunk-MGFBLVR7.js";
12
- import "./chunk-PLDDJCW6.js";
12
+ import "./chunk-UP2VWCW5.js";
13
13
  export {
14
14
  clearAll,
15
15
  clipboardTool,
@@ -21,4 +21,4 @@ export {
21
21
  save,
22
22
  search
23
23
  };
24
- //# sourceMappingURL=clipboard-manager-TEO2GEDN.js.map
24
+ //# sourceMappingURL=clipboard-manager-4SBNESGZ.js.map