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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/inputs/websocket/index.ts","../src/inputs/websocket/protocol.ts","../src/index.ts"],"sourcesContent":["/**\r\n * WebSocket Handler - Real-time streaming for OpenSentinel\r\n */\r\n\r\n// Generic WebSocket interface compatible with Bun's ServerWebSocket\r\ninterface ServerWebSocket<T = unknown> {\r\n send(data: string | Buffer): void;\r\n close(code?: number, reason?: string): void;\r\n data: T;\r\n}\r\nimport { nanoid } from \"nanoid\";\r\nimport { getGatewayToken, timingSafeEqual } from \"../../core/security/gateway-utils\";\r\nimport {\r\n type WSClientMessage,\r\n type ConnectionState,\r\n createServerMessage,\r\n parseClientMessage,\r\n isValidClientMessage,\r\n} from \"./protocol\";\r\nimport { chat, streamChat, chatWithTools, streamChatWithTools } from \"../../core/brain\";\r\nimport type { Message } from \"../../core/brain\";\r\n\r\n// ============================================\r\n// CONNECTION MANAGEMENT\r\n// ============================================\r\n\r\nconst connections = new Map<ServerWebSocket<ConnectionState>, ConnectionState>();\r\n\r\nfunction createConnectionState(): ConnectionState {\r\n return {\r\n id: nanoid(),\r\n connectedAt: new Date(),\r\n lastActivity: new Date(),\r\n activeRequests: new Map(),\r\n };\r\n}\r\n\r\n// ============================================\r\n// MESSAGE HANDLERS\r\n// ============================================\r\n\r\nasync function handleChat(\r\n ws: ServerWebSocket<ConnectionState>,\r\n msg: WSClientMessage\r\n): Promise<void> {\r\n const { id, payload } = msg;\r\n const messages = payload.messages || [];\r\n\r\n if (messages.length === 0) {\r\n ws.send(createServerMessage(\"error\", id, { error: \"No messages provided\" }));\r\n return;\r\n }\r\n\r\n try {\r\n // Use streaming for real-time response\r\n let fullContent = \"\";\r\n\r\n await streamChat(\r\n messages,\r\n payload.systemPrompt,\r\n (chunk) => {\r\n fullContent += chunk;\r\n ws.send(createServerMessage(\"chunk\", id, { text: chunk }));\r\n }\r\n );\r\n\r\n ws.send(createServerMessage(\"complete\", id, { content: fullContent }));\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\r\n ws.send(createServerMessage(\"error\", id, { error: errorMessage }));\r\n }\r\n}\r\n\r\nasync function handleChatWithTools(\r\n ws: ServerWebSocket<ConnectionState>,\r\n msg: WSClientMessage\r\n): Promise<void> {\r\n const { id, payload } = msg;\r\n const messages = payload.messages || [];\r\n\r\n if (messages.length === 0) {\r\n ws.send(createServerMessage(\"error\", id, { error: \"No messages provided\" }));\r\n return;\r\n }\r\n\r\n try {\r\n // Use streaming generator for real-time events\r\n const stream = streamChatWithTools(messages, payload.userId);\r\n\r\n for await (const event of stream) {\r\n switch (event.type) {\r\n case \"chunk\":\r\n ws.send(createServerMessage(\"chunk\", id, { text: event.data.text }));\r\n break;\r\n case \"tool_start\":\r\n ws.send(createServerMessage(\"tool_start\", id, {\r\n toolName: event.data.toolName,\r\n toolInput: event.data.toolInput,\r\n }));\r\n break;\r\n case \"tool_result\":\r\n ws.send(createServerMessage(\"tool_result\", id, {\r\n toolName: event.data.toolName,\r\n toolResult: event.data.toolResult,\r\n }));\r\n break;\r\n case \"complete\":\r\n ws.send(createServerMessage(\"complete\", id, {\r\n content: event.data.content,\r\n usage: {\r\n inputTokens: event.data.inputTokens || 0,\r\n outputTokens: event.data.outputTokens || 0,\r\n },\r\n toolsUsed: event.data.toolsUsed,\r\n }));\r\n break;\r\n case \"error\":\r\n ws.send(createServerMessage(\"error\", id, { error: event.data.error }));\r\n break;\r\n }\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\r\n ws.send(createServerMessage(\"error\", id, { error: errorMessage }));\r\n }\r\n}\r\n\r\nfunction handlePing(ws: ServerWebSocket<ConnectionState>, msg: WSClientMessage): void {\r\n ws.send(createServerMessage(\"pong\", msg.id, {}));\r\n}\r\n\r\nfunction handleCancel(ws: ServerWebSocket<ConnectionState>, msg: WSClientMessage): void {\r\n const state = connections.get(ws);\r\n if (state) {\r\n const controller = state.activeRequests.get(msg.id);\r\n if (controller) {\r\n controller.abort();\r\n state.activeRequests.delete(msg.id);\r\n ws.send(createServerMessage(\"complete\", msg.id, { content: \"Request cancelled\" }));\r\n }\r\n }\r\n}\r\n\r\n// ============================================\r\n// WEBSOCKET HANDLERS\r\n// ============================================\r\n\r\nexport const websocketHandlers = {\r\n open(ws: ServerWebSocket<ConnectionState>) {\r\n const state = createConnectionState();\r\n connections.set(ws, state);\r\n console.log(`[WebSocket] Client connected: ${state.id}`);\r\n ws.send(createServerMessage(\"connected\", \"system\", { message: \"Connected to OpenSentinel\" }));\r\n },\r\n\r\n close(ws: ServerWebSocket<ConnectionState>, code: number, reason: string) {\r\n const state = connections.get(ws);\r\n if (state) {\r\n // Cancel any active requests\r\n for (const controller of state.activeRequests.values()) {\r\n controller.abort();\r\n }\r\n console.log(`[WebSocket] Client disconnected: ${state.id} (${code}: ${reason})`);\r\n }\r\n connections.delete(ws);\r\n },\r\n\r\n async message(ws: ServerWebSocket<ConnectionState>, message: string | Buffer) {\r\n const state = connections.get(ws);\r\n if (state) {\r\n state.lastActivity = new Date();\r\n }\r\n\r\n const data = typeof message === \"string\" ? message : message.toString();\r\n const msg = parseClientMessage(data);\r\n\r\n if (!msg || !isValidClientMessage(msg)) {\r\n ws.send(createServerMessage(\"error\", \"unknown\", { error: \"Invalid message format\" }));\r\n return;\r\n }\r\n\r\n console.log(`[WebSocket] Received: ${msg.type} (${msg.id})`);\r\n\r\n switch (msg.type) {\r\n case \"chat\":\r\n await handleChat(ws, msg);\r\n break;\r\n case \"chat_with_tools\":\r\n await handleChatWithTools(ws, msg);\r\n break;\r\n case \"ping\":\r\n handlePing(ws, msg);\r\n break;\r\n case \"cancel\":\r\n handleCancel(ws, msg);\r\n break;\r\n default:\r\n ws.send(createServerMessage(\"error\", msg.id, { error: `Unknown message type: ${msg.type}` }));\r\n }\r\n },\r\n\r\n drain(ws: ServerWebSocket<ConnectionState>) {\r\n // Called when the socket is ready to receive more data after backpressure\r\n console.log(\"[WebSocket] Socket drained, ready for more data\");\r\n },\r\n};\r\n\r\n// ============================================\r\n// UPGRADE HANDLER\r\n// ============================================\r\n\r\nexport function handleUpgrade(\r\n req: Request,\r\n server: { upgrade: (req: Request, options?: { data?: ConnectionState }) => boolean }\r\n): Response | undefined {\r\n const url = new URL(req.url);\r\n\r\n // Only handle /ws path\r\n if (url.pathname !== \"/ws\") {\r\n return undefined;\r\n }\r\n\r\n // Gateway token auth for WebSocket connections\r\n const gwToken = getGatewayToken();\r\n if (gwToken) {\r\n const tokenParam = url.searchParams.get(\"token\");\r\n const authHeader = req.headers.get(\"Authorization\");\r\n const headerToken = authHeader?.startsWith(\"Bearer \") ? authHeader.slice(7) : null;\r\n const providedToken = tokenParam || headerToken;\r\n\r\n if (!providedToken || !timingSafeEqual(providedToken, gwToken)) {\r\n return new Response(\"Unauthorized\", { status: 401 });\r\n }\r\n }\r\n\r\n const state = createConnectionState();\r\n const success = server.upgrade(req, { data: state });\r\n\r\n if (success) {\r\n return undefined; // Upgrade successful, Bun handles the response\r\n }\r\n\r\n return new Response(\"WebSocket upgrade failed\", { status: 500 });\r\n}\r\n\r\n// ============================================\r\n// UTILITIES\r\n// ============================================\r\n\r\nexport function getConnectionCount(): number {\r\n return connections.size;\r\n}\r\n\r\nexport function broadcastMessage(message: string): void {\r\n for (const ws of connections.keys()) {\r\n ws.send(message);\r\n }\r\n}\r\n\r\nexport function closeAllConnections(): void {\r\n for (const ws of connections.keys()) {\r\n ws.close(1000, \"Server shutting down\");\r\n }\r\n connections.clear();\r\n}\r\n\r\nexport default {\r\n handlers: websocketHandlers,\r\n handleUpgrade,\r\n getConnectionCount,\r\n broadcastMessage,\r\n closeAllConnections,\r\n};\r\n","/**\r\n * WebSocket Protocol - Message types for real-time streaming\r\n * OpenSentinel WebSocket API\r\n */\r\n\r\nimport type { Message } from \"../../core/brain\";\r\n\r\n// ============================================\r\n// CLIENT → SERVER MESSAGES\r\n// ============================================\r\n\r\nexport type WSClientMessageType = \"chat\" | \"chat_with_tools\" | \"ping\" | \"cancel\";\r\n\r\nexport interface WSClientMessage {\r\n type: WSClientMessageType;\r\n id: string;\r\n payload: WSClientPayload;\r\n}\r\n\r\nexport interface WSClientPayload {\r\n messages?: Message[];\r\n userId?: string;\r\n systemPrompt?: string;\r\n}\r\n\r\n// ============================================\r\n// SERVER → CLIENT MESSAGES\r\n// ============================================\r\n\r\nexport type WSServerMessageType =\r\n | \"chunk\"\r\n | \"tool_start\"\r\n | \"tool_result\"\r\n | \"complete\"\r\n | \"error\"\r\n | \"pong\"\r\n | \"connected\";\r\n\r\nexport interface WSServerMessage {\r\n type: WSServerMessageType;\r\n id: string;\r\n payload: WSServerPayload;\r\n}\r\n\r\nexport interface WSServerPayload {\r\n // For chunk events\r\n text?: string;\r\n\r\n // For tool events\r\n toolName?: string;\r\n toolInput?: unknown;\r\n toolResult?: unknown;\r\n\r\n // For complete events\r\n content?: string;\r\n usage?: {\r\n inputTokens: number;\r\n outputTokens: number;\r\n };\r\n toolsUsed?: string[];\r\n\r\n // For error events\r\n error?: string;\r\n code?: string;\r\n\r\n // For connected events\r\n message?: string;\r\n}\r\n\r\n// ============================================\r\n// STREAM EVENTS (internal)\r\n// ============================================\r\n\r\nexport type StreamEventType = \"chunk\" | \"tool_start\" | \"tool_result\" | \"complete\" | \"error\";\r\n\r\nexport interface StreamEvent {\r\n type: StreamEventType;\r\n data: {\r\n text?: string;\r\n toolName?: string;\r\n toolInput?: unknown;\r\n toolResult?: unknown;\r\n content?: string;\r\n inputTokens?: number;\r\n outputTokens?: number;\r\n toolsUsed?: string[];\r\n error?: string;\r\n };\r\n}\r\n\r\n// ============================================\r\n// CONNECTION STATE\r\n// ============================================\r\n\r\nexport interface ConnectionState {\r\n id: string;\r\n userId?: string;\r\n connectedAt: Date;\r\n lastActivity: Date;\r\n activeRequests: Map<string, AbortController>;\r\n}\r\n\r\n// ============================================\r\n// HELPER FUNCTIONS\r\n// ============================================\r\n\r\nexport function createServerMessage(\r\n type: WSServerMessageType,\r\n id: string,\r\n payload: Partial<WSServerPayload> = {}\r\n): string {\r\n const message: WSServerMessage = { type, id, payload };\r\n return JSON.stringify(message);\r\n}\r\n\r\nexport function parseClientMessage(data: string): WSClientMessage | null {\r\n try {\r\n const parsed = JSON.parse(data);\r\n if (!parsed.type || !parsed.id) {\r\n return null;\r\n }\r\n return parsed as WSClientMessage;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function isValidClientMessage(msg: unknown): msg is WSClientMessage {\r\n if (!msg || typeof msg !== \"object\") return false;\r\n const m = msg as Record<string, unknown>;\r\n return (\r\n typeof m.type === \"string\" &&\r\n typeof m.id === \"string\" &&\r\n [\"chat\", \"chat_with_tools\", \"ping\", \"cancel\"].includes(m.type)\r\n );\r\n}\r\n","import { env } from \"./config/env\";\r\nimport { createBot } from \"./inputs/telegram/bot\";\r\nimport { app } from \"./inputs/api/server\";\r\nimport { startWorker, stopWorker } from \"./core/scheduler\";\r\nimport { DiscordBot } from \"./inputs/discord\";\r\nimport { SlackBot } from \"./inputs/slack\";\r\nimport { WhatsAppBot } from \"./inputs/whatsapp\";\r\nimport { SignalBot } from \"./inputs/signal\";\r\nimport { iMessageBot } from \"./inputs/imessage\";\r\nimport wsHandler from \"./inputs/websocket\";\r\nimport { initMCPRegistry, type MCPRegistry, getMCPToolSummary } from \"./core/mcp\";\r\nimport { setMCPRegistry } from \"./tools\";\r\nimport { initializeProviders } from \"./core/providers\";\r\n\r\nexport async function main() {\r\n console.log(`\r\n╔══════════════════════════════════════════╗\r\n║ OPENSENTINEL v3.0.0 ║\r\n║ Your Personal AI Assistant ║\r\n╚══════════════════════════════════════════╝\r\n`);\r\n\r\n // Initialize LLM providers (Anthropic, OpenRouter, Groq, Mistral, Ollama, etc.)\r\n await initializeProviders();\r\n\r\n // Start Telegram bot (only if token is configured)\r\n let bot: ReturnType<typeof createBot> | null = null;\r\n if (env.TELEGRAM_BOT_TOKEN) {\r\n console.log(\"[Telegram] Starting bot...\");\r\n bot = createBot();\r\n\r\n bot.start({\r\n onStart: (botInfo) => {\r\n console.log(`[Telegram] Bot started as @${botInfo.username}`);\r\n },\r\n });\r\n } else {\r\n console.log(\"[Telegram] No bot token configured, skipping\");\r\n }\r\n\r\n // Start scheduler worker\r\n try {\r\n startWorker(async (task) => {\r\n console.log(`[Scheduler] Executing task: ${task.type}`);\r\n if (task.chatId && task.message && bot) {\r\n try {\r\n await bot.api.sendMessage(task.chatId, `⏰ Reminder: ${task.message}`);\r\n } catch (err) {\r\n console.error(\"[Scheduler] Failed to send reminder:\", err);\r\n }\r\n }\r\n });\r\n } catch (err) {\r\n console.warn(\"[Scheduler] Could not start worker (Redis may be unavailable):\", err);\r\n }\r\n\r\n // Initialize MCP (Model Context Protocol) servers\r\n let mcpRegistry: MCPRegistry | null = null;\r\n if (env.MCP_ENABLED) {\r\n try {\r\n console.log(\"[MCP] Initializing MCP servers...\");\r\n mcpRegistry = await initMCPRegistry(env.MCP_CONFIG_PATH);\r\n setMCPRegistry(mcpRegistry);\r\n\r\n if (mcpRegistry.connectedCount > 0) {\r\n console.log(`[MCP] Connected to ${mcpRegistry.connectedCount} server(s), ${mcpRegistry.totalToolCount} tools available`);\r\n console.log(getMCPToolSummary(mcpRegistry));\r\n } else {\r\n console.log(\"[MCP] No servers configured (add servers to mcp.json)\");\r\n }\r\n } catch (err) {\r\n console.warn(\"[MCP] Failed to initialize:\", err);\r\n mcpRegistry = null;\r\n }\r\n }\r\n\r\n // Start Discord bot if configured\r\n let discordBot: DiscordBot | null = null;\r\n if (env.DISCORD_BOT_TOKEN) {\r\n console.log(\"[Discord] Starting bot...\");\r\n try {\r\n discordBot = new DiscordBot({\r\n token: env.DISCORD_BOT_TOKEN,\r\n clientId: env.DISCORD_CLIENT_ID || \"\",\r\n guildId: env.DISCORD_GUILD_ID,\r\n allowedUserIds: env.DISCORD_ALLOWED_USER_IDS?.split(\",\") || [],\r\n allowedRoleIds: env.DISCORD_ALLOWED_ROLE_IDS?.split(\",\") || [],\r\n });\r\n await discordBot.start();\r\n console.log(\"[Discord] Bot started\");\r\n } catch (err: any) {\r\n console.warn(\"[Discord] Failed to start bot:\", err.message);\r\n if (err.message?.includes(\"disallowed intents\") || err.message?.includes(\"Disallowed\")) {\r\n console.warn(\"[Discord] ⚠️ Enable Privileged Gateway Intents in Discord Developer Portal:\");\r\n console.warn(\"[Discord] 1. Go to https://discord.com/developers/applications\");\r\n console.warn(\"[Discord] 2. Select your bot application\");\r\n console.warn(\"[Discord] 3. Go to Bot → Privileged Gateway Intents\");\r\n console.warn(\"[Discord] 4. Enable: Presence Intent, Server Members Intent, Message Content Intent\");\r\n console.warn(\"[Discord] 5. Save and restart OpenSentinel\");\r\n }\r\n discordBot = null;\r\n }\r\n }\r\n\r\n // Start Slack bot if configured\r\n let slackBot: SlackBot | null = null;\r\n if (env.SLACK_BOT_TOKEN && env.SLACK_SIGNING_SECRET) {\r\n console.log(\"[Slack] Starting bot...\");\r\n slackBot = new SlackBot({\r\n token: env.SLACK_BOT_TOKEN,\r\n signingSecret: env.SLACK_SIGNING_SECRET,\r\n appToken: env.SLACK_APP_TOKEN,\r\n socketMode: env.SLACK_SOCKET_MODE === \"true\",\r\n port: parseInt(env.SLACK_PORT || \"3000\"),\r\n allowedUserIds: env.SLACK_ALLOWED_USER_IDS?.split(\",\") || [],\r\n allowedChannelIds: env.SLACK_ALLOWED_CHANNEL_IDS?.split(\",\") || [],\r\n });\r\n await slackBot.start();\r\n console.log(\"[Slack] Bot started\");\r\n }\r\n\r\n // Start WhatsApp bot if configured\r\n let whatsappBot: WhatsAppBot | null = null;\r\n if (env.WHATSAPP_ENABLED) {\r\n console.log(\"[WhatsApp] Starting bot...\");\r\n try {\r\n whatsappBot = new WhatsAppBot({\r\n authDir: env.WHATSAPP_AUTH_DIR,\r\n allowedNumbers: env.WHATSAPP_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\r\n printQR: true,\r\n });\r\n await whatsappBot.start();\r\n console.log(\"[WhatsApp] Bot started (scan QR code if prompted)\");\r\n } catch (err: any) {\r\n console.warn(\"[WhatsApp] Failed to start bot:\", err.message);\r\n whatsappBot = null;\r\n }\r\n }\r\n\r\n // Start Signal bot if configured\r\n let signalBot: SignalBot | null = null;\r\n if (env.SIGNAL_ENABLED && env.SIGNAL_PHONE_NUMBER) {\r\n console.log(\"[Signal] Starting bot...\");\r\n try {\r\n signalBot = new SignalBot({\r\n phoneNumber: env.SIGNAL_PHONE_NUMBER,\r\n signalCliPath: env.SIGNAL_CLI_PATH,\r\n allowedNumbers: env.SIGNAL_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\r\n });\r\n await signalBot.start();\r\n console.log(\"[Signal] Bot started\");\r\n } catch (err: any) {\r\n console.warn(\"[Signal] Failed to start bot:\", err.message);\r\n console.warn(\"[Signal] Make sure signal-cli is installed and configured\");\r\n signalBot = null;\r\n }\r\n }\r\n\r\n // Start iMessage bot if configured (macOS only)\r\n let imessageBot: iMessageBot | null = null;\r\n if (env.IMESSAGE_ENABLED) {\r\n console.log(\"[iMessage] Starting bot...\");\r\n try {\r\n imessageBot = new iMessageBot({\r\n mode: env.IMESSAGE_MODE as \"bluebubbles\" | \"applescript\",\r\n serverUrl: env.IMESSAGE_BLUEBUBBLES_URL,\r\n password: env.IMESSAGE_BLUEBUBBLES_PASSWORD,\r\n allowedNumbers: env.IMESSAGE_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\r\n });\r\n await imessageBot.start();\r\n console.log(\"[iMessage] Bot started\");\r\n } catch (err: any) {\r\n console.warn(\"[iMessage] Failed to start bot:\", err.message);\r\n if (process.platform !== \"darwin\") {\r\n console.warn(\"[iMessage] iMessage is only available on macOS\");\r\n }\r\n imessageBot = null;\r\n }\r\n }\r\n\r\n // Start API server with WebSocket support\r\n console.log(`[API] Starting server on port ${env.PORT}...`);\r\n const server = Bun.serve({\r\n port: env.PORT,\r\n fetch: (req, server) => {\r\n // Handle WebSocket upgrade requests\r\n if (req.headers.get(\"upgrade\") === \"websocket\") {\r\n const result = wsHandler.handleUpgrade(req, server);\r\n if (result) return result;\r\n // If handleUpgrade returns undefined, the upgrade was successful\r\n return undefined as unknown as Response;\r\n }\r\n // Handle regular HTTP requests\r\n return app.fetch(req);\r\n },\r\n websocket: wsHandler.handlers,\r\n });\r\n\r\n console.log(`[API] Server running at http://localhost:${server.port}`);\r\n console.log(`[WebSocket] Available at ws://localhost:${server.port}/ws`);\r\n console.log(`[Web] Dashboard available at http://localhost:${server.port}`);\r\n\r\n // Start tunnel if configured\r\n let tunnelUrl: string | null = null;\r\n if ((env as any).TUNNEL_ENABLED) {\r\n try {\r\n const { autoStartTunnel } = await import(\"./core/tunnel\");\r\n tunnelUrl = await autoStartTunnel(\r\n env.PORT,\r\n (env as any).TUNNEL_PROVIDER || \"cloudflare\",\r\n {\r\n authToken: (env as any).TUNNEL_AUTH_TOKEN,\r\n subdomain: (env as any).TUNNEL_SUBDOMAIN,\r\n }\r\n );\r\n } catch (err: any) {\r\n console.warn(\"[Tunnel] Failed to start:\", err.message);\r\n }\r\n }\r\n\r\n // Initialize autonomy manager\r\n if ((env as any).AUTONOMY_LEVEL) {\r\n try {\r\n const { autonomyManager } = await import(\"./core/security/autonomy\");\r\n autonomyManager.setDefaultLevel((env as any).AUTONOMY_LEVEL);\r\n console.log(`[Autonomy] Level: ${(env as any).AUTONOMY_LEVEL}`);\r\n } catch {\r\n // Autonomy system non-critical\r\n }\r\n }\r\n\r\n // Initialize device pairing\r\n if ((env as any).PAIRING_ENABLED) {\r\n try {\r\n const { pairingManager } = await import(\"./core/security/pairing\");\r\n if ((env as any).PAIRING_CODE_LIFETIME_MINUTES) {\r\n pairingManager.setCodeLifetime((env as any).PAIRING_CODE_LIFETIME_MINUTES);\r\n }\r\n const code = pairingManager.generateCode();\r\n console.log(`[Pairing] Device pairing enabled. Code: ${code}`);\r\n } catch {\r\n // Pairing system non-critical\r\n }\r\n }\r\n\r\n // Start Matrix bot if configured\r\n let matrixBot: any = null;\r\n if ((env as any).MATRIX_ENABLED && (env as any).MATRIX_HOMESERVER_URL && (env as any).MATRIX_ACCESS_TOKEN) {\r\n console.log(\"[Matrix] Starting bot...\");\r\n try {\r\n const { MatrixBot } = await import(\"./inputs/matrix\");\r\n matrixBot = new MatrixBot({\r\n homeserverUrl: (env as any).MATRIX_HOMESERVER_URL,\r\n accessToken: (env as any).MATRIX_ACCESS_TOKEN,\r\n userId: (env as any).MATRIX_USER_ID || \"\",\r\n allowedRoomIds: (env as any).MATRIX_ALLOWED_ROOM_IDS?.split(\",\").filter(Boolean),\r\n autoJoin: (env as any).MATRIX_AUTO_JOIN ?? true,\r\n e2eEnabled: (env as any).MATRIX_E2E_ENABLED ?? false,\r\n });\r\n await matrixBot.start();\r\n console.log(\"[Matrix] Bot started\");\r\n } catch (err: any) {\r\n console.warn(\"[Matrix] Failed to start bot:\", err.message);\r\n matrixBot = null;\r\n }\r\n }\r\n\r\n console.log(\"\");\r\n const channels = [\r\n bot ? \"Telegram\" : null,\r\n discordBot ? \"Discord\" : null,\r\n slackBot ? \"Slack\" : null,\r\n whatsappBot ? \"WhatsApp\" : null,\r\n signalBot ? \"Signal\" : null,\r\n imessageBot ? \"iMessage\" : null,\r\n matrixBot ? \"Matrix\" : null,\r\n \"API\",\r\n \"WebSocket\",\r\n ].filter(Boolean).join(\", \");\r\n console.log(`OpenSentinel is ready! Send a message via ${channels}.`);\r\n if (tunnelUrl) {\r\n console.log(`Public URL: ${tunnelUrl}`);\r\n }\r\n\r\n // Return shutdown function for CLI to wire up\r\n return async function shutdown() {\r\n console.log(\"\\nShutting down...\");\r\n stopWorker();\r\n wsHandler.closeAllConnections();\r\n if (mcpRegistry) await mcpRegistry.shutdown();\r\n if (bot) await bot.stop();\r\n if (discordBot) await discordBot.stop();\r\n if (slackBot) await slackBot.stop();\r\n if (whatsappBot) await whatsappBot.stop();\r\n if (signalBot) await signalBot.stop();\r\n if (imessageBot) await imessageBot.stop();\r\n if (matrixBot) await matrixBot.stop();\r\n // Stop tunnel\r\n try {\r\n const { stopTunnel } = await import(\"./core/tunnel\");\r\n await stopTunnel();\r\n } catch { /* tunnel not loaded */ }\r\n server.stop();\r\n };\r\n}\r\n"],"mappings":"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","names":["server"]}
@@ -1,38 +0,0 @@
1
- import {
2
- TOOLS,
3
- executeTool,
4
- getMCPRegistry,
5
- setMCPRegistry
6
- } from "./chunk-766ASQWE.js";
7
- import "./chunk-IZJMVV7O.js";
8
- import "./chunk-6PMVAAA7.js";
9
- import "./chunk-MQJ2ECQT.js";
10
- import "./chunk-TVEWKIK3.js";
11
- import "./chunk-BRBWNV65.js";
12
- import "./chunk-H5RQOFO2.js";
13
- import "./chunk-VRD5CYRL.js";
14
- import "./chunk-KM22GV7G.js";
15
- import "./chunk-P6QINGFL.js";
16
- import "./chunk-HN3F4WSW.js";
17
- import "./chunk-SVAPX2XN.js";
18
- import "./chunk-WRAKK6K6.js";
19
- import "./chunk-7WQO5J2M.js";
20
- import "./chunk-BXZ6EA52.js";
21
- import "./chunk-4GLYY4NN.js";
22
- import "./chunk-EVE7MIIY.js";
23
- import "./chunk-RZ4YESBG.js";
24
- import "./chunk-CQ4JURG7.js";
25
- import "./chunk-OCVQGBJK.js";
26
- import "./chunk-XKYRH4FM.js";
27
- import "./chunk-ZLZKF2PM.js";
28
- import "./chunk-6KONMXQ6.js";
29
- import "./chunk-22VGGA7S.js";
30
- import "./chunk-35WYTA3C.js";
31
- import "./chunk-PLDDJCW6.js";
32
- export {
33
- TOOLS,
34
- executeTool,
35
- getMCPRegistry,
36
- setMCPRegistry
37
- };
38
- //# sourceMappingURL=tools-2RLEI2N6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/tunnel/cloudflare.ts","../src/core/tunnel/ngrok.ts","../src/core/tunnel/localtunnel.ts","../src/core/tunnel/index.ts"],"sourcesContent":["import type { TunnelProvider } from \"./types\";\n\nexport class CloudflareTunnel implements TunnelProvider {\n readonly name = \"cloudflare\";\n\n private process: ReturnType<typeof Bun.spawn> | null = null;\n private publicUrl: string | null = null;\n private running = false;\n\n async start(port: number): Promise<string> {\n if (this.running) {\n throw new Error(\"Cloudflare tunnel is already running\");\n }\n\n const urlPattern = /https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/;\n\n return new Promise<string>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.stop().catch(() => {});\n reject(\n new Error(\n \"Timed out waiting for Cloudflare tunnel URL (15s). Is cloudflared installed?\"\n )\n );\n }, 15_000);\n\n try {\n this.process = Bun.spawn(\n [\"cloudflared\", \"tunnel\", \"--url\", `http://localhost:${port}`],\n {\n stdout: \"pipe\",\n stderr: \"pipe\",\n }\n );\n\n this.running = true;\n\n // cloudflared outputs the URL on stderr\n const readStderr = async () => {\n if (!this.process?.stderr) return;\n\n const reader = this.process.stderr.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const match = buffer.match(urlPattern);\n if (match) {\n this.publicUrl = match[0];\n clearTimeout(timeout);\n resolve(this.publicUrl);\n return;\n }\n }\n } catch {\n // Process may have been killed; ignore read errors\n }\n };\n\n // Also check stdout in case cloudflared version outputs there\n const readStdout = async () => {\n if (!this.process?.stdout) return;\n\n const reader = this.process.stdout.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const match = buffer.match(urlPattern);\n if (match && !this.publicUrl) {\n this.publicUrl = match[0];\n clearTimeout(timeout);\n resolve(this.publicUrl);\n return;\n }\n }\n } catch {\n // Process may have been killed; ignore read errors\n }\n };\n\n readStderr();\n readStdout();\n\n // Handle process exit before URL is found\n this.process.exited.then((code) => {\n if (!this.publicUrl) {\n this.running = false;\n clearTimeout(timeout);\n reject(\n new Error(`cloudflared exited with code ${code} before providing a URL`)\n );\n }\n });\n } catch (err: any) {\n clearTimeout(timeout);\n this.running = false;\n reject(new Error(`Failed to spawn cloudflared: ${err.message}`));\n }\n });\n }\n\n async stop(): Promise<void> {\n if (this.process) {\n try {\n this.process.kill();\n await this.process.exited;\n } catch {\n // Process may already be dead\n }\n this.process = null;\n }\n this.running = false;\n this.publicUrl = null;\n }\n\n getPublicUrl(): string | null {\n return this.publicUrl;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import type { TunnelProvider } from \"./types\";\n\ninterface NgrokApiTunnel {\n public_url: string;\n proto: string;\n config: { addr: string };\n}\n\ninterface NgrokApiResponse {\n tunnels: NgrokApiTunnel[];\n}\n\nexport class NgrokTunnel implements TunnelProvider {\n readonly name = \"ngrok\";\n\n private process: ReturnType<typeof Bun.spawn> | null = null;\n private publicUrl: string | null = null;\n private running = false;\n private authToken?: string;\n\n constructor(authToken?: string) {\n this.authToken = authToken;\n }\n\n async start(port: number): Promise<string> {\n if (this.running) {\n throw new Error(\"ngrok tunnel is already running\");\n }\n\n const args = [\"ngrok\", \"http\", String(port)];\n if (this.authToken) {\n args.push(\"--authtoken\", this.authToken);\n }\n\n try {\n this.process = Bun.spawn(args, {\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n this.running = true;\n } catch (err: any) {\n throw new Error(`Failed to spawn ngrok: ${err.message}`);\n }\n\n // Handle unexpected early exit\n this.process.exited.then((code) => {\n if (this.running) {\n this.running = false;\n console.warn(`[Tunnel] ngrok exited unexpectedly with code ${code}`);\n }\n });\n\n // Poll the ngrok local API to get the public URL\n const url = await this.pollForUrl(5, 1000);\n if (!url) {\n await this.stop();\n throw new Error(\n \"Failed to retrieve ngrok public URL after 5 retries. Is ngrok installed and working?\"\n );\n }\n\n this.publicUrl = url;\n return this.publicUrl;\n }\n\n private async pollForUrl(\n maxRetries: number,\n delayMs: number\n ): Promise<string | null> {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n await this.sleep(delayMs);\n\n try {\n const response = await fetch(\"http://localhost:4040/api/tunnels\");\n if (!response.ok) continue;\n\n const data = (await response.json()) as NgrokApiResponse;\n const httpsTunnel = data.tunnels.find((t) => t.proto === \"https\");\n const tunnel = httpsTunnel || data.tunnels[0];\n\n if (tunnel?.public_url) {\n return tunnel.public_url;\n }\n } catch {\n // ngrok API not ready yet; retry\n }\n }\n\n return null;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async stop(): Promise<void> {\n if (this.process) {\n try {\n this.process.kill();\n await this.process.exited;\n } catch {\n // Process may already be dead\n }\n this.process = null;\n }\n this.running = false;\n this.publicUrl = null;\n }\n\n getPublicUrl(): string | null {\n return this.publicUrl;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import type { TunnelProvider } from \"./types\";\n\ninterface LocalTunnelInstance {\n url: string;\n close(): void;\n on(event: string, callback: (...args: any[]) => void): void;\n}\n\ntype LocalTunnelFactory = (opts: {\n port: number;\n subdomain?: string;\n}) => Promise<LocalTunnelInstance>;\n\nexport class LocalTunnel implements TunnelProvider {\n readonly name = \"localtunnel\";\n\n private tunnel: LocalTunnelInstance | null = null;\n private publicUrl: string | null = null;\n private running = false;\n private subdomain?: string;\n\n constructor(subdomain?: string) {\n this.subdomain = subdomain;\n }\n\n async start(port: number): Promise<string> {\n if (this.running) {\n throw new Error(\"localtunnel is already running\");\n }\n\n let localtunnel: LocalTunnelFactory;\n\n try {\n // Dynamic import for lazy loading - localtunnel may not be installed\n const mod = await import(\"localtunnel\");\n localtunnel = (mod.default || mod) as LocalTunnelFactory;\n } catch {\n throw new Error(\n 'localtunnel is not installed. Run \"bun add localtunnel\" to install it.'\n );\n }\n\n const opts: { port: number; subdomain?: string } = { port };\n if (this.subdomain) {\n opts.subdomain = this.subdomain;\n }\n\n try {\n this.tunnel = await localtunnel(opts);\n } catch (err: any) {\n throw new Error(`Failed to create localtunnel: ${err.message}`);\n }\n\n this.publicUrl = this.tunnel.url;\n this.running = true;\n\n // Listen for tunnel close events\n this.tunnel.on(\"close\", () => {\n this.running = false;\n this.publicUrl = null;\n });\n\n // Listen for errors\n this.tunnel.on(\"error\", (err: Error) => {\n console.warn(`[Tunnel] localtunnel error: ${err.message}`);\n this.running = false;\n this.publicUrl = null;\n });\n\n return this.publicUrl;\n }\n\n async stop(): Promise<void> {\n if (this.tunnel) {\n try {\n this.tunnel.close();\n } catch {\n // Tunnel may already be closed\n }\n this.tunnel = null;\n }\n this.running = false;\n this.publicUrl = null;\n }\n\n getPublicUrl(): string | null {\n return this.publicUrl;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import type { TunnelProvider } from \"./types\";\nimport { CloudflareTunnel } from \"./cloudflare\";\nimport { NgrokTunnel } from \"./ngrok\";\nimport { LocalTunnel } from \"./localtunnel\";\n\nexport function createTunnel(\n provider: string,\n options?: { authToken?: string; subdomain?: string }\n): TunnelProvider {\n switch (provider) {\n case \"cloudflare\":\n return new CloudflareTunnel();\n case \"ngrok\":\n return new NgrokTunnel(options?.authToken);\n case \"localtunnel\":\n return new LocalTunnel(options?.subdomain);\n default:\n throw new Error(`Unknown tunnel provider: ${provider}`);\n }\n}\n\nlet activeTunnel: TunnelProvider | null = null;\n\nexport async function autoStartTunnel(\n port: number,\n provider: string,\n options?: { authToken?: string; subdomain?: string }\n): Promise<string | null> {\n try {\n activeTunnel = createTunnel(provider, options);\n const url = await activeTunnel.start(port);\n console.log(`[Tunnel] Public URL: ${url}`);\n return url;\n } catch (err: any) {\n console.warn(`[Tunnel] Failed to start ${provider}: ${err.message}`);\n activeTunnel = null;\n return null;\n }\n}\n\nexport async function stopTunnel(): Promise<void> {\n if (activeTunnel) {\n await activeTunnel.stop();\n activeTunnel = null;\n }\n}\n\nexport function getActiveTunnel(): TunnelProvider | null {\n return activeTunnel;\n}\n\nexport type { TunnelProvider } from \"./types\";\n"],"mappings":";;;AAEO,IAAM,mBAAN,MAAiD;AAAA,EAC7C,OAAO;AAAA,EAER,UAA+C;AAAA,EAC/C,YAA2B;AAAA,EAC3B,UAAU;AAAA,EAElB,MAAM,MAAM,MAA+B;AACzC,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,UAAM,aAAa;AAEnB,WAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,YAAM,UAAU,WAAW,MAAM;AAC/B,aAAK,KAAK,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC1B;AAAA,UACE,IAAI;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,GAAG,IAAM;AAET,UAAI;AACF,aAAK,UAAU,IAAI;AAAA,UACjB,CAAC,eAAe,UAAU,SAAS,oBAAoB,IAAI,EAAE;AAAA,UAC7D;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF;AAEA,aAAK,UAAU;AAGf,cAAM,aAAa,YAAY;AAC7B,cAAI,CAAC,KAAK,SAAS,OAAQ;AAE3B,gBAAM,SAAS,KAAK,QAAQ,OAAO,UAAU;AAC7C,gBAAM,UAAU,IAAI,YAAY;AAChC,cAAI,SAAS;AAEb,cAAI;AACF,mBAAO,MAAM;AACX,oBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,kBAAI,KAAM;AAEV,wBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,oBAAM,QAAQ,OAAO,MAAM,UAAU;AACrC,kBAAI,OAAO;AACT,qBAAK,YAAY,MAAM,CAAC;AACxB,6BAAa,OAAO;AACpB,wBAAQ,KAAK,SAAS;AACtB;AAAA,cACF;AAAA,YACF;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAGA,cAAM,aAAa,YAAY;AAC7B,cAAI,CAAC,KAAK,SAAS,OAAQ;AAE3B,gBAAM,SAAS,KAAK,QAAQ,OAAO,UAAU;AAC7C,gBAAM,UAAU,IAAI,YAAY;AAChC,cAAI,SAAS;AAEb,cAAI;AACF,mBAAO,MAAM;AACX,oBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,kBAAI,KAAM;AAEV,wBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,oBAAM,QAAQ,OAAO,MAAM,UAAU;AACrC,kBAAI,SAAS,CAAC,KAAK,WAAW;AAC5B,qBAAK,YAAY,MAAM,CAAC;AACxB,6BAAa,OAAO;AACpB,wBAAQ,KAAK,SAAS;AACtB;AAAA,cACF;AAAA,YACF;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAEA,mBAAW;AACX,mBAAW;AAGX,aAAK,QAAQ,OAAO,KAAK,CAAC,SAAS;AACjC,cAAI,CAAC,KAAK,WAAW;AACnB,iBAAK,UAAU;AACf,yBAAa,OAAO;AACpB;AAAA,cACE,IAAI,MAAM,gCAAgC,IAAI,yBAAyB;AAAA,YACzE;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAU;AACjB,qBAAa,OAAO;AACpB,aAAK,UAAU;AACf,eAAO,IAAI,MAAM,gCAAgC,IAAI,OAAO,EAAE,CAAC;AAAA,MACjE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,SAAS;AAChB,UAAI;AACF,aAAK,QAAQ,KAAK;AAClB,cAAM,KAAK,QAAQ;AAAA,MACrB,QAAQ;AAAA,MAER;AACA,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,UAAU;AACf,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,eAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;;;AC3HO,IAAM,cAAN,MAA4C;AAAA,EACxC,OAAO;AAAA,EAER,UAA+C;AAAA,EAC/C,YAA2B;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EAER,YAAY,WAAoB;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,MAAM,MAA+B;AACzC,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,UAAM,OAAO,CAAC,SAAS,QAAQ,OAAO,IAAI,CAAC;AAC3C,QAAI,KAAK,WAAW;AAClB,WAAK,KAAK,eAAe,KAAK,SAAS;AAAA,IACzC;AAEA,QAAI;AACF,WAAK,UAAU,IAAI,MAAM,MAAM;AAAA,QAC7B,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AACD,WAAK,UAAU;AAAA,IACjB,SAAS,KAAU;AACjB,YAAM,IAAI,MAAM,0BAA0B,IAAI,OAAO,EAAE;AAAA,IACzD;AAGA,SAAK,QAAQ,OAAO,KAAK,CAAC,SAAS;AACjC,UAAI,KAAK,SAAS;AAChB,aAAK,UAAU;AACf,gBAAQ,KAAK,gDAAgD,IAAI,EAAE;AAAA,MACrE;AAAA,IACF,CAAC;AAGD,UAAM,MAAM,MAAM,KAAK,WAAW,GAAG,GAAI;AACzC,QAAI,CAAC,KAAK;AACR,YAAM,KAAK,KAAK;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,YAAY;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,WACZ,YACA,SACwB;AACxB,aAAS,UAAU,GAAG,UAAU,YAAY,WAAW;AACrD,YAAM,KAAK,MAAM,OAAO;AAExB,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,mCAAmC;AAChE,YAAI,CAAC,SAAS,GAAI;AAElB,cAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,cAAM,cAAc,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO;AAChE,cAAM,SAAS,eAAe,KAAK,QAAQ,CAAC;AAE5C,YAAI,QAAQ,YAAY;AACtB,iBAAO,OAAO;AAAA,QAChB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,SAAS;AAChB,UAAI;AACF,aAAK,QAAQ,KAAK;AAClB,cAAM,KAAK,QAAQ;AAAA,MACrB,QAAQ;AAAA,MAER;AACA,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,UAAU;AACf,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,eAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;;;ACvGO,IAAM,cAAN,MAA4C;AAAA,EACxC,OAAO;AAAA,EAER,SAAqC;AAAA,EACrC,YAA2B;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EAER,YAAY,WAAoB;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,MAAM,MAA+B;AACzC,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,QAAI;AAEJ,QAAI;AAEF,YAAM,MAAM,MAAM,OAAO,aAAa;AACtC,oBAAe,IAAI,WAAW;AAAA,IAChC,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAA6C,EAAE,KAAK;AAC1D,QAAI,KAAK,WAAW;AAClB,WAAK,YAAY,KAAK;AAAA,IACxB;AAEA,QAAI;AACF,WAAK,SAAS,MAAM,YAAY,IAAI;AAAA,IACtC,SAAS,KAAU;AACjB,YAAM,IAAI,MAAM,iCAAiC,IAAI,OAAO,EAAE;AAAA,IAChE;AAEA,SAAK,YAAY,KAAK,OAAO;AAC7B,SAAK,UAAU;AAGf,SAAK,OAAO,GAAG,SAAS,MAAM;AAC5B,WAAK,UAAU;AACf,WAAK,YAAY;AAAA,IACnB,CAAC;AAGD,SAAK,OAAO,GAAG,SAAS,CAAC,QAAe;AACtC,cAAQ,KAAK,+BAA+B,IAAI,OAAO,EAAE;AACzD,WAAK,UAAU;AACf,WAAK,YAAY;AAAA,IACnB,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,QAAQ;AACf,UAAI;AACF,aAAK,OAAO,MAAM;AAAA,MACpB,QAAQ;AAAA,MAER;AACA,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,UAAU;AACf,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,eAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;;;ACvFO,SAAS,aACd,UACA,SACgB;AAChB,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,IAAI,iBAAiB;AAAA,IAC9B,KAAK;AACH,aAAO,IAAI,YAAY,SAAS,SAAS;AAAA,IAC3C,KAAK;AACH,aAAO,IAAI,YAAY,SAAS,SAAS;AAAA,IAC3C;AACE,YAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AAAA,EAC1D;AACF;AAEA,IAAI,eAAsC;AAE1C,eAAsB,gBACpB,MACA,UACA,SACwB;AACxB,MAAI;AACF,mBAAe,aAAa,UAAU,OAAO;AAC7C,UAAM,MAAM,MAAM,aAAa,MAAM,IAAI;AACzC,YAAQ,IAAI,wBAAwB,GAAG,EAAE;AACzC,WAAO;AAAA,EACT,SAAS,KAAU;AACjB,YAAQ,KAAK,4BAA4B,QAAQ,KAAK,IAAI,OAAO,EAAE;AACnE,mBAAe;AACf,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aAA4B;AAChD,MAAI,cAAc;AAChB,UAAM,aAAa,KAAK;AACxB,mBAAe;AAAA,EACjB;AACF;AAEO,SAAS,kBAAyC;AACvD,SAAO;AACT;","names":[]}
@@ -1,35 +0,0 @@
1
- import {
2
- WhatsAppBot,
3
- whatsapp_default
4
- } from "./chunk-66OJ3WB4.js";
5
- import "./chunk-766ASQWE.js";
6
- import "./chunk-IZJMVV7O.js";
7
- import "./chunk-6PMVAAA7.js";
8
- import "./chunk-MQJ2ECQT.js";
9
- import "./chunk-TVEWKIK3.js";
10
- import "./chunk-BRBWNV65.js";
11
- import "./chunk-H5RQOFO2.js";
12
- import "./chunk-VRD5CYRL.js";
13
- import "./chunk-KM22GV7G.js";
14
- import "./chunk-P6QINGFL.js";
15
- import "./chunk-HN3F4WSW.js";
16
- import "./chunk-SVAPX2XN.js";
17
- import "./chunk-WRAKK6K6.js";
18
- import "./chunk-7WQO5J2M.js";
19
- import "./chunk-BXZ6EA52.js";
20
- import "./chunk-4GLYY4NN.js";
21
- import "./chunk-EVE7MIIY.js";
22
- import "./chunk-RZ4YESBG.js";
23
- import "./chunk-CQ4JURG7.js";
24
- import "./chunk-OCVQGBJK.js";
25
- import "./chunk-XKYRH4FM.js";
26
- import "./chunk-ZLZKF2PM.js";
27
- import "./chunk-6KONMXQ6.js";
28
- import "./chunk-22VGGA7S.js";
29
- import "./chunk-35WYTA3C.js";
30
- import "./chunk-PLDDJCW6.js";
31
- export {
32
- WhatsAppBot,
33
- whatsapp_default as default
34
- };
35
- //# sourceMappingURL=whatsapp-LFX6YKCM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/file-generation/word-document.ts"],"sourcesContent":["import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { randomBytes } from \"crypto\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { isPathAllowed } from \"../../utils/paths\";\n\nexport interface WordDocumentOptions {\n title?: string;\n author?: string;\n subject?: string;\n description?: string;\n keywords?: string[];\n orientation?: \"portrait\" | \"landscape\";\n margins?: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n}\n\nexport interface WordDocumentResult {\n success: boolean;\n filePath?: string;\n error?: string;\n}\n\nexport type ParagraphAlignment = \"left\" | \"center\" | \"right\" | \"justify\";\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface TextRun {\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n color?: string;\n size?: number;\n font?: string;\n highlight?: string;\n}\n\nexport interface Paragraph {\n type: \"paragraph\";\n content: string | TextRun[];\n alignment?: ParagraphAlignment;\n spacing?: {\n before?: number;\n after?: number;\n line?: number;\n };\n indent?: {\n left?: number;\n right?: number;\n firstLine?: number;\n };\n}\n\nexport interface Heading {\n type: \"heading\";\n level: HeadingLevel;\n text: string;\n alignment?: ParagraphAlignment;\n}\n\nexport interface BulletList {\n type: \"bullet-list\";\n items: string[];\n level?: number;\n}\n\nexport interface NumberedList {\n type: \"numbered-list\";\n items: string[];\n start?: number;\n}\n\nexport interface TableCell {\n content: string;\n bold?: boolean;\n alignment?: ParagraphAlignment;\n backgroundColor?: string;\n colSpan?: number;\n rowSpan?: number;\n}\n\nexport interface Table {\n type: \"table\";\n headers?: TableCell[] | string[];\n rows: (TableCell[] | string[])[];\n widths?: number[];\n}\n\nexport interface Image {\n type: \"image\";\n path: string;\n width?: number;\n height?: number;\n alignment?: ParagraphAlignment;\n caption?: string;\n}\n\nexport interface PageBreak {\n type: \"page-break\";\n}\n\nexport interface HorizontalRule {\n type: \"horizontal-rule\";\n}\n\nexport interface TableOfContents {\n type: \"toc\";\n title?: string;\n maxLevel?: HeadingLevel;\n}\n\nexport type DocumentElement =\n | Paragraph\n | Heading\n | BulletList\n | NumberedList\n | Table\n | Image\n | PageBreak\n | HorizontalRule\n | TableOfContents;\n\n// Default options\nconst DEFAULT_OPTIONS: WordDocumentOptions = {\n orientation: \"portrait\",\n margins: { top: 1440, right: 1440, bottom: 1440, left: 1440 }, // 1 inch in twips\n};\n\n// Generate temp file path\nfunction getTempPath(): string {\n const id = randomBytes(8).toString(\"hex\");\n return join(tmpdir(), `sentinel-doc-${id}.docx`);\n}\n\n// Escape XML special characters\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\n// Convert twips to EMUs (English Metric Units)\nfunction twipsToEmu(twips: number): number {\n return twips * 635;\n}\n\n// Generate document.xml content\nfunction generateDocumentXml(\n elements: DocumentElement[],\n options: WordDocumentOptions\n): string {\n const orientation = options.orientation || \"portrait\";\n const margins = options.margins || DEFAULT_OPTIONS.margins!;\n\n let bodyContent = \"\";\n\n for (const element of elements) {\n bodyContent += generateElementXml(element);\n }\n\n // Section properties for page setup\n const sectionProps = `\n <w:sectPr>\n <w:pgSz w:w=\"${orientation === \"portrait\" ? \"12240\" : \"15840\"}\" w:h=\"${orientation === \"portrait\" ? \"15840\" : \"12240\"}\" ${orientation === \"landscape\" ? 'w:orient=\"landscape\"' : \"\"}/>\n <w:pgMar w:top=\"${margins.top}\" w:right=\"${margins.right}\" w:bottom=\"${margins.bottom}\" w:left=\"${margins.left}\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/>\n </w:sectPr>\n `;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"\n xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">\n <w:body>\n ${bodyContent}\n ${sectionProps}\n </w:body>\n</w:document>`;\n}\n\n// Generate XML for a single element\nfunction generateElementXml(element: DocumentElement): string {\n switch (element.type) {\n case \"paragraph\":\n return generateParagraphXml(element);\n case \"heading\":\n return generateHeadingXml(element);\n case \"bullet-list\":\n return generateBulletListXml(element);\n case \"numbered-list\":\n return generateNumberedListXml(element);\n case \"table\":\n return generateTableXml(element);\n case \"page-break\":\n return generatePageBreakXml();\n case \"horizontal-rule\":\n return generateHorizontalRuleXml();\n case \"toc\":\n return generateTocXml(element);\n case \"image\":\n return generateImagePlaceholderXml(element);\n default:\n return \"\";\n }\n}\n\n// Generate paragraph XML\nfunction generateParagraphXml(paragraph: Paragraph): string {\n const alignment = getAlignmentValue(paragraph.alignment);\n const spacing = paragraph.spacing;\n const indent = paragraph.indent;\n\n let pPr = \"<w:pPr>\";\n if (alignment) {\n pPr += `<w:jc w:val=\"${alignment}\"/>`;\n }\n if (spacing) {\n pPr += `<w:spacing ${spacing.before ? `w:before=\"${spacing.before}\"` : \"\"} ${spacing.after ? `w:after=\"${spacing.after}\"` : \"\"} ${spacing.line ? `w:line=\"${spacing.line}\"` : \"\"}/>`;\n }\n if (indent) {\n pPr += `<w:ind ${indent.left ? `w:left=\"${indent.left}\"` : \"\"} ${indent.right ? `w:right=\"${indent.right}\"` : \"\"} ${indent.firstLine ? `w:firstLine=\"${indent.firstLine}\"` : \"\"}/>`;\n }\n pPr += \"</w:pPr>\";\n\n let runs = \"\";\n if (typeof paragraph.content === \"string\") {\n runs = `<w:r><w:t xml:space=\"preserve\">${escapeXml(paragraph.content)}</w:t></w:r>`;\n } else {\n for (const run of paragraph.content) {\n runs += generateTextRunXml(run);\n }\n }\n\n return `<w:p>${pPr}${runs}</w:p>`;\n}\n\n// Generate text run XML\nfunction generateTextRunXml(run: TextRun): string {\n let rPr = \"<w:rPr>\";\n\n if (run.bold) rPr += \"<w:b/>\";\n if (run.italic) rPr += \"<w:i/>\";\n if (run.underline) rPr += '<w:u w:val=\"single\"/>';\n if (run.strike) rPr += \"<w:strike/>\";\n if (run.color) rPr += `<w:color w:val=\"${run.color.replace(\"#\", \"\")}\"/>`;\n if (run.size) rPr += `<w:sz w:val=\"${run.size * 2}\"/>`;\n if (run.font) rPr += `<w:rFonts w:ascii=\"${run.font}\" w:hAnsi=\"${run.font}\"/>`;\n if (run.highlight) rPr += `<w:highlight w:val=\"${run.highlight}\"/>`;\n\n rPr += \"</w:rPr>\";\n\n return `<w:r>${rPr}<w:t xml:space=\"preserve\">${escapeXml(run.text)}</w:t></w:r>`;\n}\n\n// Generate heading XML\nfunction generateHeadingXml(heading: Heading): string {\n const styleId = `Heading${heading.level}`;\n const alignment = getAlignmentValue(heading.alignment);\n\n let pPr = `<w:pPr><w:pStyle w:val=\"${styleId}\"/>`;\n if (alignment) {\n pPr += `<w:jc w:val=\"${alignment}\"/>`;\n }\n pPr += \"</w:pPr>\";\n\n return `<w:p>${pPr}<w:r><w:t>${escapeXml(heading.text)}</w:t></w:r></w:p>`;\n}\n\n// Generate bullet list XML\nfunction generateBulletListXml(list: BulletList): string {\n const level = list.level || 0;\n let xml = \"\";\n\n for (const item of list.items) {\n xml += `<w:p>\n <w:pPr>\n <w:pStyle w:val=\"ListParagraph\"/>\n <w:numPr>\n <w:ilvl w:val=\"${level}\"/>\n <w:numId w:val=\"1\"/>\n </w:numPr>\n </w:pPr>\n <w:r><w:t>${escapeXml(item)}</w:t></w:r>\n </w:p>`;\n }\n\n return xml;\n}\n\n// Generate numbered list XML\nfunction generateNumberedListXml(list: NumberedList): string {\n let xml = \"\";\n\n for (const item of list.items) {\n xml += `<w:p>\n <w:pPr>\n <w:pStyle w:val=\"ListParagraph\"/>\n <w:numPr>\n <w:ilvl w:val=\"0\"/>\n <w:numId w:val=\"2\"/>\n </w:numPr>\n </w:pPr>\n <w:r><w:t>${escapeXml(item)}</w:t></w:r>\n </w:p>`;\n }\n\n return xml;\n}\n\n// Generate table XML\nfunction generateTableXml(table: Table): string {\n const columnCount = table.headers?.length || table.rows[0]?.length || 1;\n const defaultWidth = Math.floor(9000 / columnCount);\n\n let xml = `<w:tbl>\n <w:tblPr>\n <w:tblStyle w:val=\"TableGrid\"/>\n <w:tblW w:w=\"0\" w:type=\"auto\"/>\n <w:tblBorders>\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n </w:tblBorders>\n </w:tblPr>\n <w:tblGrid>`;\n\n for (let i = 0; i < columnCount; i++) {\n const width = table.widths?.[i] || defaultWidth;\n xml += `<w:gridCol w:w=\"${width}\"/>`;\n }\n xml += \"</w:tblGrid>\";\n\n // Header row\n if (table.headers) {\n xml += \"<w:tr>\";\n for (const cell of table.headers) {\n xml += generateTableCellXml(cell, true);\n }\n xml += \"</w:tr>\";\n }\n\n // Data rows\n for (const row of table.rows) {\n xml += \"<w:tr>\";\n for (const cell of row) {\n xml += generateTableCellXml(cell, false);\n }\n xml += \"</w:tr>\";\n }\n\n xml += \"</w:tbl>\";\n return xml;\n}\n\n// Generate table cell XML\nfunction generateTableCellXml(\n cell: TableCell | string,\n isHeader: boolean\n): string {\n const cellData: TableCell =\n typeof cell === \"string\" ? { content: cell } : cell;\n\n let tcPr = \"<w:tcPr>\";\n if (cellData.backgroundColor) {\n tcPr += `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${cellData.backgroundColor.replace(\"#\", \"\")}\"/>`;\n }\n if (cellData.colSpan && cellData.colSpan > 1) {\n tcPr += `<w:gridSpan w:val=\"${cellData.colSpan}\"/>`;\n }\n tcPr += \"</w:tcPr>\";\n\n const bold = isHeader || cellData.bold;\n const alignment = getAlignmentValue(cellData.alignment || (isHeader ? \"center\" : \"left\"));\n\n return `<w:tc>\n ${tcPr}\n <w:p>\n <w:pPr>${alignment ? `<w:jc w:val=\"${alignment}\"/>` : \"\"}</w:pPr>\n <w:r>\n ${bold ? \"<w:rPr><w:b/></w:rPr>\" : \"\"}\n <w:t>${escapeXml(cellData.content)}</w:t>\n </w:r>\n </w:p>\n </w:tc>`;\n}\n\n// Generate page break XML\nfunction generatePageBreakXml(): string {\n return '<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>';\n}\n\n// Generate horizontal rule XML\nfunction generateHorizontalRuleXml(): string {\n return `<w:p>\n <w:pPr>\n <w:pBdr>\n <w:bottom w:val=\"single\" w:sz=\"12\" w:space=\"1\" w:color=\"auto\"/>\n </w:pBdr>\n </w:pPr>\n </w:p>`;\n}\n\n// Generate table of contents placeholder XML\nfunction generateTocXml(toc: TableOfContents): string {\n const title = toc.title || \"Table of Contents\";\n return `<w:p>\n <w:pPr><w:pStyle w:val=\"TOCHeading\"/></w:pPr>\n <w:r><w:t>${escapeXml(title)}</w:t></w:r>\n </w:p>\n <w:p>\n <w:r>\n <w:fldChar w:fldCharType=\"begin\"/>\n </w:r>\n <w:r>\n <w:instrText xml:space=\"preserve\"> TOC \\\\o \"1-${toc.maxLevel || 3}\" \\\\h \\\\z \\\\u </w:instrText>\n </w:r>\n <w:r>\n <w:fldChar w:fldCharType=\"separate\"/>\n </w:r>\n <w:r>\n <w:t>[Table of Contents - Update field to populate]</w:t>\n </w:r>\n <w:r>\n <w:fldChar w:fldCharType=\"end\"/>\n </w:r>\n </w:p>`;\n}\n\n// Generate image placeholder XML\nfunction generateImagePlaceholderXml(image: Image): string {\n const alignment = getAlignmentValue(image.alignment || \"center\");\n const caption = image.caption || `[Image: ${image.path}]`;\n\n return `<w:p>\n <w:pPr>${alignment ? `<w:jc w:val=\"${alignment}\"/>` : \"\"}</w:pPr>\n <w:r>\n <w:rPr><w:i/></w:rPr>\n <w:t>${escapeXml(caption)}</w:t>\n </w:r>\n </w:p>`;\n}\n\n// Get alignment value for XML\nfunction getAlignmentValue(\n alignment?: ParagraphAlignment\n): string | null {\n switch (alignment) {\n case \"left\":\n return \"left\";\n case \"center\":\n return \"center\";\n case \"right\":\n return \"right\";\n case \"justify\":\n return \"both\";\n default:\n return null;\n }\n}\n\n// Generate styles.xml\nfunction generateStylesXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault>\n <w:rPr>\n <w:rFonts w:ascii=\"Calibri\" w:hAnsi=\"Calibri\" w:eastAsia=\"Calibri\" w:cs=\"Calibri\"/>\n <w:sz w:val=\"22\"/>\n </w:rPr>\n </w:rPrDefault>\n <w:pPrDefault>\n <w:pPr>\n <w:spacing w:after=\"160\" w:line=\"259\" w:lineRule=\"auto\"/>\n </w:pPr>\n </w:pPrDefault>\n </w:docDefaults>\n <w:style w:type=\"paragraph\" w:styleId=\"Normal\" w:default=\"1\">\n <w:name w:val=\"Normal\"/>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\">\n <w:name w:val=\"heading 1\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"240\" w:after=\"0\"/><w:outlineLvl w:val=\"0\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"2F5496\"/><w:sz w:val=\"32\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\">\n <w:name w:val=\"heading 2\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"200\" w:after=\"0\"/><w:outlineLvl w:val=\"1\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"2F5496\"/><w:sz w:val=\"26\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\">\n <w:name w:val=\"heading 3\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"160\" w:after=\"0\"/><w:outlineLvl w:val=\"2\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"1F3763\"/><w:sz w:val=\"24\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading4\">\n <w:name w:val=\"heading 4\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"120\" w:after=\"0\"/><w:outlineLvl w:val=\"3\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:i/><w:color w:val=\"2F5496\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading5\">\n <w:name w:val=\"heading 5\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"80\" w:after=\"0\"/><w:outlineLvl w:val=\"4\"/></w:pPr>\n <w:rPr><w:color w:val=\"2F5496\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading6\">\n <w:name w:val=\"heading 6\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"40\" w:after=\"0\"/><w:outlineLvl w:val=\"5\"/></w:pPr>\n <w:rPr><w:color w:val=\"1F3763\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"ListParagraph\">\n <w:name w:val=\"List Paragraph\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:pPr><w:ind w:left=\"720\"/></w:pPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"TOCHeading\">\n <w:name w:val=\"TOC Heading\"/>\n <w:basedOn w:val=\"Heading1\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:outlineLvl w:val=\"9\"/></w:pPr>\n </w:style>\n <w:style w:type=\"table\" w:styleId=\"TableGrid\">\n <w:name w:val=\"Table Grid\"/>\n <w:tblPr>\n <w:tblBorders>\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n </w:tblBorders>\n </w:tblPr>\n </w:style>\n</w:styles>`;\n}\n\n// Generate numbering.xml for lists\nfunction generateNumberingXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <!-- Bullet list definition -->\n <w:abstractNum w:abstractNumId=\"0\">\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"o\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:hint=\"default\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <!-- Numbered list definition -->\n <w:abstractNum w:abstractNumId=\"1\">\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"lowerLetter\"/>\n <w:lvlText w:val=\"%2.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"lowerRoman\"/>\n <w:lvlText w:val=\"%3.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n </w:lvl>\n </w:abstractNum>\n <w:num w:numId=\"1\"><w:abstractNumId w:val=\"0\"/></w:num>\n <w:num w:numId=\"2\"><w:abstractNumId w:val=\"1\"/></w:num>\n</w:numbering>`;\n}\n\n// Generate [Content_Types].xml\nfunction generateContentTypesXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\n <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>\n <Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>\n <Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>\n <Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>\n</Types>`;\n}\n\n// Generate _rels/.rels\nfunction generateRootRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>\n</Relationships>`;\n}\n\n// Generate word/_rels/document.xml.rels\nfunction generateDocumentRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>\n</Relationships>`;\n}\n\n// Generate docProps/core.xml\nfunction generateCorePropsXml(options: WordDocumentOptions): string {\n const now = new Date().toISOString();\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n ${options.title ? `<dc:title>${escapeXml(options.title)}</dc:title>` : \"\"}\n ${options.author ? `<dc:creator>${escapeXml(options.author)}</dc:creator>` : \"<dc:creator>OpenSentinel</dc:creator>\"}\n ${options.subject ? `<dc:subject>${escapeXml(options.subject)}</dc:subject>` : \"\"}\n ${options.description ? `<dc:description>${escapeXml(options.description)}</dc:description>` : \"\"}\n ${options.keywords ? `<cp:keywords>${escapeXml(options.keywords.join(\", \"))}</cp:keywords>` : \"\"}\n <dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>\n <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>\n</cp:coreProperties>`;\n}\n\n// Generate docProps/app.xml\nfunction generateAppPropsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\">\n <Application>OpenSentinel Document Generator</Application>\n <AppVersion>1.0</AppVersion>\n</Properties>`;\n}\n\n// Generate Word document using docx library if available, otherwise create raw OOXML\nexport async function generateWordDocument(\n elements: DocumentElement[],\n filename?: string,\n options: WordDocumentOptions = {}\n): Promise<WordDocumentResult> {\n const filePath = filename\n ? isPathAllowed(filename)\n ? filename\n : join(tmpdir(), filename)\n : getTempPath();\n\n try {\n await mkdir(dirname(filePath), { recursive: true });\n\n // Try to use docx library if available\n try {\n const docx = await import(\"docx\");\n return await generateWithDocxLibrary(elements, filePath, options, docx);\n } catch {\n // Fallback: generate raw OOXML and create the ZIP manually\n console.log(\"[WordDocument] docx library not available, using raw OOXML generation\");\n return await generateRawDocx(elements, filePath, options);\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Generate using docx library\nasync function generateWithDocxLibrary(\n elements: DocumentElement[],\n filePath: string,\n options: WordDocumentOptions,\n docx: typeof import(\"docx\")\n): Promise<WordDocumentResult> {\n const { Document, Packer, Paragraph, TextRun, HeadingLevel, AlignmentType, Table, TableRow, TableCell, WidthType, BorderStyle, PageBreak } = docx;\n\n const children: (\n | InstanceType<typeof Paragraph>\n | InstanceType<typeof Table>\n )[] = [];\n\n for (const element of elements) {\n switch (element.type) {\n case \"paragraph\": {\n const runs: InstanceType<typeof TextRun>[] = [];\n if (typeof element.content === \"string\") {\n runs.push(new TextRun(element.content));\n } else {\n for (const run of element.content) {\n runs.push(\n new TextRun({\n text: run.text,\n bold: run.bold,\n italics: run.italic,\n underline: run.underline ? {} : undefined,\n strike: run.strike,\n color: run.color?.replace(\"#\", \"\"),\n size: run.size ? run.size * 2 : undefined,\n font: run.font,\n highlight: run.highlight as \"yellow\" | \"green\" | \"cyan\" | \"magenta\" | \"blue\" | \"red\" | \"darkBlue\" | \"darkCyan\" | \"darkGreen\" | \"darkMagenta\" | \"darkRed\" | \"darkYellow\" | \"darkGray\" | \"lightGray\" | \"black\" | undefined,\n })\n );\n }\n }\n children.push(\n new Paragraph({\n children: runs,\n alignment: getDocxAlignment(element.alignment, AlignmentType),\n spacing: element.spacing\n ? {\n before: element.spacing.before,\n after: element.spacing.after,\n line: element.spacing.line,\n }\n : undefined,\n indent: element.indent\n ? {\n left: element.indent.left,\n right: element.indent.right,\n firstLine: element.indent.firstLine,\n }\n : undefined,\n })\n );\n break;\n }\n case \"heading\": {\n const headingLevelMap: Record<HeadingLevel, (typeof HeadingLevel)[keyof typeof HeadingLevel]> = {\n 1: HeadingLevel.HEADING_1,\n 2: HeadingLevel.HEADING_2,\n 3: HeadingLevel.HEADING_3,\n 4: HeadingLevel.HEADING_4,\n 5: HeadingLevel.HEADING_5,\n 6: HeadingLevel.HEADING_6,\n };\n children.push(\n new Paragraph({\n text: element.text,\n heading: headingLevelMap[element.level],\n alignment: getDocxAlignment(element.alignment, AlignmentType),\n })\n );\n break;\n }\n case \"bullet-list\": {\n for (const item of element.items) {\n children.push(\n new Paragraph({\n text: item,\n bullet: { level: element.level || 0 },\n })\n );\n }\n break;\n }\n case \"numbered-list\": {\n for (let i = 0; i < element.items.length; i++) {\n children.push(\n new Paragraph({\n text: element.items[i],\n numbering: {\n reference: \"default-numbering\",\n level: 0,\n },\n })\n );\n }\n break;\n }\n case \"table\": {\n const rows: InstanceType<typeof TableRow>[] = [];\n\n if (element.headers) {\n rows.push(\n new TableRow({\n children: element.headers.map((cell) => {\n const cellData = typeof cell === \"string\" ? { content: cell } : cell;\n return new TableCell({\n children: [\n new Paragraph({\n children: [\n new TextRun({ text: cellData.content, bold: true }),\n ],\n alignment: AlignmentType.CENTER,\n }),\n ],\n shading: cellData.backgroundColor\n ? { fill: cellData.backgroundColor.replace(\"#\", \"\") }\n : { fill: \"E0E0E0\" },\n });\n }),\n tableHeader: true,\n })\n );\n }\n\n for (const row of element.rows) {\n rows.push(\n new TableRow({\n children: row.map((cell) => {\n const cellData = typeof cell === \"string\" ? { content: cell } : cell;\n return new TableCell({\n children: [\n new Paragraph({\n children: [\n new TextRun({\n text: cellData.content,\n bold: cellData.bold,\n }),\n ],\n alignment: getDocxAlignment(cellData.alignment, AlignmentType),\n }),\n ],\n shading: cellData.backgroundColor\n ? { fill: cellData.backgroundColor.replace(\"#\", \"\") }\n : undefined,\n columnSpan: cellData.colSpan,\n rowSpan: cellData.rowSpan,\n });\n }),\n })\n );\n }\n\n children.push(\n new Table({\n rows,\n width: { size: 100, type: WidthType.PERCENTAGE },\n })\n );\n break;\n }\n case \"page-break\": {\n children.push(\n new Paragraph({\n children: [new PageBreak()],\n })\n );\n break;\n }\n case \"horizontal-rule\": {\n children.push(\n new Paragraph({\n border: {\n bottom: {\n color: \"auto\",\n space: 1,\n style: BorderStyle.SINGLE,\n size: 12,\n },\n },\n })\n );\n break;\n }\n case \"toc\": {\n children.push(\n new Paragraph({\n text: element.title || \"Table of Contents\",\n heading: HeadingLevel.HEADING_1,\n })\n );\n children.push(\n new Paragraph({\n text: \"[Update field to generate Table of Contents]\",\n })\n );\n break;\n }\n case \"image\": {\n children.push(\n new Paragraph({\n text: element.caption || `[Image: ${element.path}]`,\n alignment: getDocxAlignment(element.alignment, AlignmentType),\n })\n );\n break;\n }\n }\n }\n\n const doc = new Document({\n title: options.title,\n creator: options.author || \"OpenSentinel\",\n subject: options.subject,\n description: options.description,\n keywords: options.keywords?.join(\", \"),\n sections: [\n {\n properties: {\n page: {\n size: {\n orientation:\n options.orientation === \"landscape\"\n ? docx.PageOrientation.LANDSCAPE\n : docx.PageOrientation.PORTRAIT,\n },\n margin: options.margins\n ? {\n top: options.margins.top,\n right: options.margins.right,\n bottom: options.margins.bottom,\n left: options.margins.left,\n }\n : undefined,\n },\n },\n children,\n },\n ],\n numbering: {\n config: [\n {\n reference: \"default-numbering\",\n levels: [\n {\n level: 0,\n format: docx.LevelFormat.DECIMAL,\n text: \"%1.\",\n alignment: AlignmentType.START,\n },\n ],\n },\n ],\n },\n });\n\n const buffer = await Packer.toBuffer(doc);\n await writeFile(filePath, buffer);\n\n return { success: true, filePath };\n}\n\n// Get docx AlignmentType from string\nfunction getDocxAlignment(\n alignment: ParagraphAlignment | undefined,\n AlignmentType: { LEFT: unknown; CENTER: unknown; RIGHT: unknown; JUSTIFIED: unknown }\n): unknown {\n switch (alignment) {\n case \"left\":\n return AlignmentType.LEFT;\n case \"center\":\n return AlignmentType.CENTER;\n case \"right\":\n return AlignmentType.RIGHT;\n case \"justify\":\n return AlignmentType.JUSTIFIED;\n default:\n return undefined;\n }\n}\n\n// Generate raw OOXML and create ZIP\nasync function generateRawDocx(\n elements: DocumentElement[],\n filePath: string,\n options: WordDocumentOptions\n): Promise<WordDocumentResult> {\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n\n try {\n // Try to use archiver for ZIP creation\n const archiver = await import(\"archiver\");\n const fs = await import(\"fs\");\n\n const output = fs.createWriteStream(filePath);\n const archive = archiver.default(\"zip\", { zlib: { level: 9 } });\n\n return new Promise((resolve) => {\n output.on(\"close\", () => {\n resolve({ success: true, filePath });\n });\n\n archive.on(\"error\", (err: Error) => {\n resolve({ success: false, error: err.message });\n });\n\n archive.pipe(output);\n\n // Add files to archive\n archive.append(generateContentTypesXml(), { name: \"[Content_Types].xml\" });\n archive.append(generateRootRelsXml(), { name: \"_rels/.rels\" });\n archive.append(generateDocumentXml(elements, finalOptions), { name: \"word/document.xml\" });\n archive.append(generateStylesXml(), { name: \"word/styles.xml\" });\n archive.append(generateNumberingXml(), { name: \"word/numbering.xml\" });\n archive.append(generateDocumentRelsXml(), { name: \"word/_rels/document.xml.rels\" });\n archive.append(generateCorePropsXml(finalOptions), { name: \"docProps/core.xml\" });\n archive.append(generateAppPropsXml(), { name: \"docProps/app.xml\" });\n\n archive.finalize();\n });\n } catch {\n // Ultimate fallback: save as XML for manual processing\n const xmlPath = filePath.replace(\".docx\", \".xml\");\n const documentXml = generateDocumentXml(elements, finalOptions);\n await writeFile(xmlPath, documentXml, \"utf-8\");\n\n return {\n success: true,\n filePath: xmlPath,\n };\n }\n}\n\n// Generate Word document from markdown\nexport async function generateWordFromMarkdown(\n markdown: string,\n filename?: string,\n options?: WordDocumentOptions\n): Promise<WordDocumentResult> {\n const elements = parseMarkdownToElements(markdown);\n return generateWordDocument(elements, filename, options);\n}\n\n// Simple markdown parser to document elements\nfunction parseMarkdownToElements(markdown: string): DocumentElement[] {\n const elements: DocumentElement[] = [];\n const lines = markdown.split(\"\\n\");\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Headers\n const headerMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headerMatch) {\n elements.push({\n type: \"heading\",\n level: headerMatch[1].length as HeadingLevel,\n text: headerMatch[2].trim(),\n });\n i++;\n continue;\n }\n\n // Horizontal rule\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line.trim())) {\n elements.push({ type: \"horizontal-rule\" });\n i++;\n continue;\n }\n\n // Bullet list\n if (/^[-*+]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^[-*+]\\s+/.test(lines[i])) {\n items.push(lines[i].replace(/^[-*+]\\s+/, \"\").trim());\n i++;\n }\n elements.push({ type: \"bullet-list\", items });\n continue;\n }\n\n // Numbered list\n if (/^\\d+\\.\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\d+\\.\\s+/.test(lines[i])) {\n items.push(lines[i].replace(/^\\d+\\.\\s+/, \"\").trim());\n i++;\n }\n elements.push({ type: \"numbered-list\", items });\n continue;\n }\n\n // Empty line\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n // Regular paragraph (collect consecutive non-empty lines)\n let paragraphText = \"\";\n while (i < lines.length && lines[i].trim() !== \"\" && !/^(#{1,6}|[-*+]|\\d+\\.)\\s+/.test(lines[i])) {\n paragraphText += (paragraphText ? \" \" : \"\") + lines[i].trim();\n i++;\n }\n\n if (paragraphText) {\n // Parse inline formatting\n const runs = parseInlineFormatting(paragraphText);\n elements.push({\n type: \"paragraph\",\n content: runs.length === 1 && !runs[0].bold && !runs[0].italic ? paragraphText : runs,\n });\n }\n }\n\n return elements;\n}\n\n// Parse inline markdown formatting\nfunction parseInlineFormatting(text: string): TextRun[] {\n const runs: TextRun[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n // Bold + Italic\n const boldItalicMatch = remaining.match(/^\\*\\*\\*(.+?)\\*\\*\\*/);\n if (boldItalicMatch) {\n runs.push({ text: boldItalicMatch[1], bold: true, italic: true });\n remaining = remaining.slice(boldItalicMatch[0].length);\n continue;\n }\n\n // Bold\n const boldMatch = remaining.match(/^\\*\\*(.+?)\\*\\*/);\n if (boldMatch) {\n runs.push({ text: boldMatch[1], bold: true });\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n // Italic\n const italicMatch = remaining.match(/^\\*(.+?)\\*/);\n if (italicMatch) {\n runs.push({ text: italicMatch[1], italic: true });\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n // Strikethrough\n const strikeMatch = remaining.match(/^~~(.+?)~~/);\n if (strikeMatch) {\n runs.push({ text: strikeMatch[1], strike: true });\n remaining = remaining.slice(strikeMatch[0].length);\n continue;\n }\n\n // Code (treated as monospace)\n const codeMatch = remaining.match(/^`(.+?)`/);\n if (codeMatch) {\n runs.push({ text: codeMatch[1], font: \"Courier New\" });\n remaining = remaining.slice(codeMatch[0].length);\n continue;\n }\n\n // Regular text until next formatting\n const nextFormat = remaining.search(/(\\*\\*\\*|\\*\\*|\\*|~~|`)/);\n if (nextFormat === -1) {\n runs.push({ text: remaining });\n break;\n } else if (nextFormat === 0) {\n // Unmatched formatting character, treat as regular text\n runs.push({ text: remaining[0] });\n remaining = remaining.slice(1);\n } else {\n runs.push({ text: remaining.slice(0, nextFormat) });\n remaining = remaining.slice(nextFormat);\n }\n }\n\n return runs;\n}\n\n// Main function for tool use\nexport async function generateWord(\n content: string | DocumentElement[],\n filename: string,\n options?: WordDocumentOptions & { contentType?: \"markdown\" | \"elements\" }\n): Promise<WordDocumentResult> {\n const contentType = options?.contentType || \"markdown\";\n\n if (contentType === \"elements\" || Array.isArray(content)) {\n return generateWordDocument(content as DocumentElement[], filename, options);\n }\n\n return generateWordFromMarkdown(content as string, filename, options);\n}\n\nexport default {\n generateWord,\n generateWordDocument,\n generateWordFromMarkdown,\n};\n"],"mappings":"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","names":[]}