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/integrations/email/index.ts"],"sourcesContent":["// IMAP Client - Reading emails\nexport {\n ImapClient,\n createImapClient,\n type EmailConfig,\n type EmailMessage,\n type EmailAddress,\n type EmailAttachment,\n type SearchOptions,\n type FolderInfo,\n} from \"./imap-client\";\n\n// SMTP Client - Sending emails\nexport {\n SmtpClient,\n createSmtpClient,\n type SmtpConfig,\n type EmailRecipient,\n type EmailAttachment as SmtpEmailAttachment,\n type SendEmailOptions,\n type ReplyOptions,\n type SendResult,\n} from \"./smtp-client\";\n\n// Email Parser - Content parsing and threading\nexport {\n parseEmail,\n parseAttachment,\n groupIntoThreads,\n cleanSubject,\n parseEmailBody,\n extractEmailAddresses,\n extractUrls,\n extractPhoneNumbers,\n getEmailSummary,\n calculateEmailSize,\n matchesFilter,\n type ParsedEmail,\n type ThreadInfo,\n type ParsedAttachment,\n type EmailMetadata,\n type EmailThread,\n type QuotedSection,\n type EmailBodyParts,\n} from \"./email-parser\";\n\n// Inbox Summarizer - AI-powered analysis\nexport {\n categorizeEmail,\n extractActionItems,\n summarizeThread,\n summarizeInbox,\n generateDailyDigest,\n suggestReplies,\n analyzeSentiment,\n type InboxSummary,\n type CategorySummary,\n type UrgentItem,\n type ActionItem,\n type EmailCategorization,\n type ThreadSummary,\n} from \"./inbox-summarizer\";\n\n/**\n * Email Integration for OpenSentinel\n *\n * This module provides comprehensive email functionality:\n *\n * ## Reading Emails (IMAP)\n * ```typescript\n * import { createImapClient } from './integrations/email';\n *\n * const imap = createImapClient('gmail', {\n * user: 'your@gmail.com',\n * password: 'your-app-password'\n * });\n *\n * await imap.connect();\n * const emails = await imap.fetchEmails('INBOX', { limit: 20 });\n * const unread = await imap.getUnreadCount();\n * await imap.disconnect();\n * ```\n *\n * ## Sending Emails (SMTP)\n * ```typescript\n * import { createSmtpClient } from './integrations/email';\n *\n * const smtp = createSmtpClient('gmail', {\n * user: 'your@gmail.com',\n * password: 'your-app-password'\n * });\n *\n * await smtp.send({\n * to: 'recipient@example.com',\n * subject: 'Hello',\n * text: 'This is a test email'\n * });\n * ```\n *\n * ## Parsing Emails\n * ```typescript\n * import { parseEmail, groupIntoThreads } from './integrations/email';\n *\n * const parsed = parseEmail(rawEmail);\n * const threads = groupIntoThreads(emails);\n * ```\n *\n * ## AI-Powered Features\n * ```typescript\n * import { summarizeInbox, extractActionItems } from './integrations/email';\n *\n * const summary = await summarizeInbox(emails);\n * const actions = await extractActionItems(email);\n * ```\n */\n\n// Convenience class that combines IMAP and SMTP\nexport class EmailClient {\n private imapClient: InstanceType<typeof import(\"./imap-client\").ImapClient>;\n private smtpClient: InstanceType<typeof import(\"./smtp-client\").SmtpClient>;\n\n constructor(config: {\n imap: import(\"./imap-client\").EmailConfig;\n smtp: import(\"./smtp-client\").SmtpConfig;\n }) {\n const { ImapClient } = require(\"./imap-client\");\n const { SmtpClient } = require(\"./smtp-client\");\n\n this.imapClient = new ImapClient(config.imap);\n this.smtpClient = new SmtpClient(config.smtp);\n }\n\n /**\n * Connect to the email server\n */\n async connect(): Promise<void> {\n await this.imapClient.connect();\n await this.smtpClient.verify();\n }\n\n /**\n * Disconnect from the email server\n */\n async disconnect(): Promise<void> {\n await this.imapClient.disconnect();\n await this.smtpClient.close();\n }\n\n /**\n * Get the IMAP client for reading emails\n */\n get imap() {\n return this.imapClient;\n }\n\n /**\n * Get the SMTP client for sending emails\n */\n get smtp() {\n return this.smtpClient;\n }\n\n /**\n * Fetch recent emails\n */\n async fetchRecent(limit: number = 20): Promise<import(\"./imap-client\").EmailMessage[]> {\n return this.imapClient.fetchEmails(\"INBOX\", { limit });\n }\n\n /**\n * Get unread count\n */\n async getUnreadCount(): Promise<number> {\n return this.imapClient.getUnreadCount();\n }\n\n /**\n * Send a simple text email\n */\n async sendText(\n to: string | string[],\n subject: string,\n text: string\n ): Promise<import(\"./smtp-client\").SendResult> {\n return this.smtpClient.sendText(to, subject, text);\n }\n\n /**\n * Send an HTML email\n */\n async sendHtml(\n to: string | string[],\n subject: string,\n html: string,\n text?: string\n ): Promise<import(\"./smtp-client\").SendResult> {\n return this.smtpClient.sendHtml(to, subject, html, text);\n }\n\n /**\n * Reply to an email\n */\n async reply(\n originalEmail: import(\"./imap-client\").EmailMessage,\n options: import(\"./smtp-client\").ReplyOptions\n ): Promise<import(\"./smtp-client\").SendResult> {\n return this.smtpClient.reply(originalEmail, options);\n }\n\n /**\n * Search for emails\n */\n async search(\n options: import(\"./imap-client\").SearchOptions\n ): Promise<import(\"./imap-client\").EmailMessage[]> {\n return this.imapClient.searchEmails(options);\n }\n\n /**\n * Get inbox summary using AI\n */\n async getInboxSummary(): Promise<import(\"./inbox-summarizer\").InboxSummary> {\n const { summarizeInbox } = await import(\"./inbox-summarizer\");\n const emails = await this.fetchRecent(100);\n return summarizeInbox(emails);\n }\n\n /**\n * Get action items from recent emails\n */\n async getActionItems(): Promise<import(\"./inbox-summarizer\").ActionItem[]> {\n const { extractActionItems, categorizeEmail } = await import(\"./inbox-summarizer\");\n const emails = await this.fetchRecent(50);\n\n const allActions: import(\"./inbox-summarizer\").ActionItem[] = [];\n\n for (const email of emails) {\n const category = await categorizeEmail(email);\n if (category.category === \"action_required\" || category.category === \"urgent\") {\n const actions = await extractActionItems(email);\n allActions.push(...actions);\n }\n }\n\n return allActions;\n }\n\n /**\n * Generate daily digest\n */\n async generateDigest(): Promise<string> {\n const { generateDailyDigest } = await import(\"./inbox-summarizer\");\n const emails = await this.fetchRecent(100);\n return generateDailyDigest(emails);\n }\n}\n\n/**\n * Create an email client with common provider presets\n */\nexport function createEmailClient(\n provider: \"gmail\" | \"outlook\" | \"yahoo\" | \"custom\",\n credentials: { user: string; password: string },\n customConfig?: {\n imap?: Partial<import(\"./imap-client\").EmailConfig>;\n smtp?: Partial<import(\"./smtp-client\").SmtpConfig>;\n }\n): EmailClient {\n const configs: Record<string, { imap: import(\"./imap-client\").EmailConfig; smtp: import(\"./smtp-client\").SmtpConfig }> = {\n gmail: {\n imap: {\n host: \"imap.gmail.com\",\n port: 993,\n secure: true,\n user: credentials.user,\n password: credentials.password,\n },\n smtp: {\n host: \"smtp.gmail.com\",\n port: 465,\n secure: true,\n auth: { user: credentials.user, pass: credentials.password },\n },\n },\n outlook: {\n imap: {\n host: \"outlook.office365.com\",\n port: 993,\n secure: true,\n user: credentials.user,\n password: credentials.password,\n },\n smtp: {\n host: \"smtp-mail.outlook.com\",\n port: 587,\n secure: false,\n auth: { user: credentials.user, pass: credentials.password },\n },\n },\n yahoo: {\n imap: {\n host: \"imap.mail.yahoo.com\",\n port: 993,\n secure: true,\n user: credentials.user,\n password: credentials.password,\n },\n smtp: {\n host: \"smtp.mail.yahoo.com\",\n port: 465,\n secure: true,\n auth: { user: credentials.user, pass: credentials.password },\n },\n },\n custom: {\n imap: {\n host: customConfig?.imap?.host || \"localhost\",\n port: customConfig?.imap?.port || 993,\n secure: customConfig?.imap?.secure ?? true,\n user: credentials.user,\n password: credentials.password,\n ...customConfig?.imap,\n },\n smtp: {\n host: customConfig?.smtp?.host || \"localhost\",\n port: customConfig?.smtp?.port || 587,\n secure: customConfig?.smtp?.secure ?? false,\n auth: { user: credentials.user, pass: credentials.password },\n ...customConfig?.smtp,\n },\n },\n };\n\n return new EmailClient(configs[provider]);\n}\n\n// Import factory functions for default export\nimport { createImapClient as _createImapClient } from \"./imap-client\";\nimport { createSmtpClient as _createSmtpClient } from \"./smtp-client\";\n\nexport default {\n EmailClient,\n createEmailClient,\n createImapClient: _createImapClient,\n createSmtpClient: _createSmtpClient,\n};\n"],"mappings":"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","names":["ImapClient","SmtpClient","summarizeInbox","extractActionItems","categorizeEmail","generateDailyDigest"]}
@@ -1,13 +0,0 @@
1
- import {
2
- batchEnrich,
3
- enrichEntity
4
- } from "./chunk-SVAPX2XN.js";
5
- import "./chunk-WRAKK6K6.js";
6
- import "./chunk-XKYRH4FM.js";
7
- import "./chunk-ZLZKF2PM.js";
8
- import "./chunk-PLDDJCW6.js";
9
- export {
10
- batchEnrich,
11
- enrichEntity
12
- };
13
- //# sourceMappingURL=enrichment-pipeline-MNHNW65K.js.map
@@ -1,12 +0,0 @@
1
- import {
2
- configure,
3
- env,
4
- ready
5
- } from "./chunk-ZLZKF2PM.js";
6
- import "./chunk-PLDDJCW6.js";
7
- export {
8
- configure,
9
- env,
10
- ready
11
- };
12
- //# sourceMappingURL=env-IWXUVTCB.js.map
@@ -1,35 +0,0 @@
1
- import {
2
- iMessageBot,
3
- imessage_default
4
- } from "./chunk-NHMBTUMW.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
- imessage_default as default,
33
- iMessageBot
34
- };
35
- //# sourceMappingURL=imessage-NGA2XF2V.js.map
@@ -1,47 +0,0 @@
1
- import {
2
- analyzeSentiment,
3
- categorizeEmail,
4
- extractActionItems,
5
- generateDailyDigest,
6
- inbox_summarizer_default,
7
- suggestReplies,
8
- summarizeInbox,
9
- summarizeThread
10
- } from "./chunk-SPPMCAKG.js";
11
- import "./chunk-766ASQWE.js";
12
- import "./chunk-IZJMVV7O.js";
13
- import "./chunk-6PMVAAA7.js";
14
- import "./chunk-MQJ2ECQT.js";
15
- import "./chunk-TVEWKIK3.js";
16
- import "./chunk-BRBWNV65.js";
17
- import "./chunk-H5RQOFO2.js";
18
- import "./chunk-VRD5CYRL.js";
19
- import "./chunk-KM22GV7G.js";
20
- import "./chunk-P6QINGFL.js";
21
- import "./chunk-HN3F4WSW.js";
22
- import "./chunk-SVAPX2XN.js";
23
- import "./chunk-WRAKK6K6.js";
24
- import "./chunk-7WQO5J2M.js";
25
- import "./chunk-BXZ6EA52.js";
26
- import "./chunk-4GLYY4NN.js";
27
- import "./chunk-EVE7MIIY.js";
28
- import "./chunk-RZ4YESBG.js";
29
- import "./chunk-CQ4JURG7.js";
30
- import "./chunk-OCVQGBJK.js";
31
- import "./chunk-XKYRH4FM.js";
32
- import "./chunk-ZLZKF2PM.js";
33
- import "./chunk-6KONMXQ6.js";
34
- import "./chunk-22VGGA7S.js";
35
- import "./chunk-35WYTA3C.js";
36
- import "./chunk-PLDDJCW6.js";
37
- export {
38
- analyzeSentiment,
39
- categorizeEmail,
40
- inbox_summarizer_default as default,
41
- extractActionItems,
42
- generateDailyDigest,
43
- suggestReplies,
44
- summarizeInbox,
45
- summarizeThread
46
- };
47
- //# sourceMappingURL=inbox-summarizer-NRI4S7IF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/security/incident-response.ts"],"sourcesContent":["// SOC 2 Incident Response System\n// Manages security incident lifecycle: creation, investigation, containment, resolution\n\nimport { db } from \"../../db\";\nimport { securityIncidents, incidentTimeline, users } from \"../../db/schema\";\nimport { eq, or, desc } from \"drizzle-orm\";\nimport { logAudit } from \"./audit-logger\";\n\n// ---------------------------------------------------------------------------\n// Type aliases (matching the schema column types)\n// ---------------------------------------------------------------------------\n\ntype IncidentType =\n | \"brute_force\"\n | \"unauthorized_access\"\n | \"data_breach\"\n | \"suspicious_activity\"\n | \"system_compromise\"\n | \"policy_violation\";\n\ntype IncidentSeverity = \"low\" | \"medium\" | \"high\" | \"critical\";\n\ntype IncidentStatus =\n | \"open\"\n | \"investigating\"\n | \"contained\"\n | \"resolved\"\n | \"closed\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a unique incident number in the format INC-YYYYMMDD-XXXX\n * where XXXX is 4 random uppercase alphanumeric characters.\n */\nexport function generateIncidentNumber(): string {\n const now = new Date();\n const yyyy = now.getFullYear().toString();\n const mm = (now.getMonth() + 1).toString().padStart(2, \"0\");\n const dd = now.getDate().toString().padStart(2, \"0\");\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 4; i++) {\n suffix += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return `INC-${yyyy}${mm}${dd}-${suffix}`;\n}\n\n/**\n * Map an anomaly type string (from AuthMonitor) to the corresponding\n * incident type and severity.\n */\nexport function mapAnomalyToIncident(anomalyType: string): {\n type: IncidentType;\n severity: IncidentSeverity;\n} {\n switch (anomalyType) {\n case \"brute_force\":\n return { type: \"brute_force\", severity: \"critical\" };\n case \"impossible_travel\":\n return { type: \"unauthorized_access\", severity: \"high\" };\n case \"new_device\":\n return { type: \"suspicious_activity\", severity: \"medium\" };\n case \"new_ip\":\n return { type: \"suspicious_activity\", severity: \"low\" };\n case \"rapid_session_switching\":\n return { type: \"suspicious_activity\", severity: \"medium\" };\n case \"unusual_time\":\n return { type: \"suspicious_activity\", severity: \"low\" };\n default:\n return { type: \"suspicious_activity\", severity: \"medium\" };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Core CRUD\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new security incident, add the initial \"created\" timeline event,\n * and emit an audit log entry.\n */\nexport async function createIncident(params: {\n title: string;\n description: string;\n type: IncidentType;\n severity: IncidentSeverity;\n userId?: string;\n source: string;\n sourceData?: unknown;\n assignedTo?: string;\n}) {\n const incidentNumber = generateIncidentNumber();\n\n const [incident] = await db\n .insert(securityIncidents)\n .values({\n incidentNumber,\n title: params.title,\n description: params.description,\n type: params.type,\n severity: params.severity,\n status: \"open\",\n userId: params.userId,\n assignedTo: params.assignedTo,\n source: params.source,\n sourceData: params.sourceData as any,\n })\n .returning();\n\n // Add \"created\" timeline event\n await addTimelineEvent({\n incidentId: incident.id,\n eventType: \"created\",\n description: `Incident ${incidentNumber} created: ${params.title}`,\n performedBy: params.userId,\n metadata: {\n type: params.type,\n severity: params.severity,\n source: params.source,\n },\n });\n\n // Audit log\n try {\n await logAudit({\n userId: params.userId,\n action: \"tool_use\" as any,\n resource: \"tool\" as any,\n resourceId: incident.id,\n details: {\n event: \"incident_created\",\n incidentNumber,\n type: params.type,\n severity: params.severity,\n source: params.source,\n },\n });\n } catch {\n // Audit logging should not block incident creation\n }\n\n return incident;\n}\n\n/**\n * Create an incident automatically from an AuthMonitor anomaly.\n */\nexport async function createIncidentFromAnomaly(\n userId: string,\n anomaly: {\n type: string;\n level: string;\n message: string;\n details?: unknown;\n timestamp: Date;\n }\n) {\n const { type, severity } = mapAnomalyToIncident(anomaly.type);\n\n return createIncident({\n title: `[Auto] ${anomaly.message}`,\n description: `Automatically created from ${anomaly.type} anomaly detected at ${anomaly.timestamp.toISOString()}.\\n\\nLevel: ${anomaly.level}\\nMessage: ${anomaly.message}`,\n type,\n severity,\n userId,\n source: \"auth_monitor\",\n sourceData: {\n anomalyType: anomaly.type,\n anomalyLevel: anomaly.level,\n details: anomaly.details,\n detectedAt: anomaly.timestamp.toISOString(),\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Status management\n// ---------------------------------------------------------------------------\n\n/**\n * Transition an incident to a new status, updating the appropriate timestamp\n * field and recording a timeline event.\n */\nexport async function updateIncidentStatus(\n incidentId: string,\n newStatus: IncidentStatus,\n performedBy?: string,\n notes?: string\n) {\n const updateData: Record<string, unknown> = {\n status: newStatus,\n updatedAt: new Date(),\n };\n\n switch (newStatus) {\n case \"investigating\":\n updateData.investigatedAt = new Date();\n break;\n case \"contained\":\n updateData.containedAt = new Date();\n break;\n case \"resolved\":\n updateData.resolvedAt = new Date();\n if (notes) {\n updateData.resolutionNotes = notes;\n }\n break;\n case \"closed\":\n updateData.closedAt = new Date();\n break;\n }\n\n const [updated] = await db\n .update(securityIncidents)\n .set(updateData)\n .where(eq(securityIncidents.id, incidentId))\n .returning();\n\n // Timeline event\n await addTimelineEvent({\n incidentId,\n eventType: \"status_change\",\n description: `Status changed to ${newStatus}${notes ? `: ${notes}` : \"\"}`,\n performedBy,\n metadata: { newStatus, notes },\n });\n\n return updated;\n}\n\n/**\n * Assign an incident to a user and record the assignment in the timeline.\n */\nexport async function assignIncident(\n incidentId: string,\n assignedTo: string,\n performedBy?: string\n) {\n const [updated] = await db\n .update(securityIncidents)\n .set({ assignedTo, updatedAt: new Date() })\n .where(eq(securityIncidents.id, incidentId))\n .returning();\n\n await addTimelineEvent({\n incidentId,\n eventType: \"assignment\",\n description: `Incident assigned to ${assignedTo}`,\n performedBy,\n metadata: { assignedTo },\n });\n\n return updated;\n}\n\n/**\n * Add a timeline event to an incident.\n */\nexport async function addTimelineEvent(params: {\n incidentId: string;\n eventType: string;\n description: string;\n performedBy?: string;\n metadata?: unknown;\n}) {\n const [event] = await db\n .insert(incidentTimeline)\n .values({\n incidentId: params.incidentId,\n eventType: params.eventType as any,\n description: params.description,\n performedBy: params.performedBy,\n metadata: params.metadata as any,\n })\n .returning();\n\n return event;\n}\n\n/**\n * Convenience wrapper to resolve an incident with notes.\n */\nexport async function resolveIncident(\n incidentId: string,\n notes: string,\n performedBy?: string\n) {\n return updateIncidentStatus(incidentId, \"resolved\", performedBy, notes);\n}\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\n/**\n * Retrieve open incidents (status = open | investigating | contained),\n * optionally filtered by severity, type, userId, and limited.\n */\nexport async function getOpenIncidents(\n options: {\n severity?: IncidentSeverity;\n type?: IncidentType;\n userId?: string;\n limit?: number;\n } = {}\n) {\n const { severity, type, userId, limit = 50 } = options;\n\n let results = await db\n .select()\n .from(securityIncidents)\n .where(\n or(\n eq(securityIncidents.status, \"open\"),\n eq(securityIncidents.status, \"investigating\"),\n eq(securityIncidents.status, \"contained\")\n )\n )\n .orderBy(desc(securityIncidents.createdAt))\n .limit(limit);\n\n // Post-filter by optional criteria\n if (severity) {\n results = results.filter((inc) => inc.severity === severity);\n }\n if (type) {\n results = results.filter((inc) => inc.type === type);\n }\n if (userId) {\n results = results.filter((inc) => inc.userId === userId);\n }\n\n return results;\n}\n\n/**\n * Retrieve the full timeline for a specific incident, ordered chronologically.\n */\nexport async function getIncidentTimeline(incidentId: string) {\n return db\n .select()\n .from(incidentTimeline)\n .where(eq(incidentTimeline.incidentId, incidentId))\n .orderBy(desc(incidentTimeline.createdAt));\n}\n\n// ---------------------------------------------------------------------------\n// Reporting\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a structured incident report with a markdown-formatted summary.\n */\nexport async function generateIncidentReport(incidentId: string) {\n const [incident] = await db\n .select()\n .from(securityIncidents)\n .where(eq(securityIncidents.id, incidentId))\n .limit(1);\n\n if (!incident) {\n throw new Error(`Incident not found: ${incidentId}`);\n }\n\n const timeline = await getIncidentTimeline(incidentId);\n\n const timelineEntries = timeline\n .map(\n (e) =>\n `- **${e.createdAt.toISOString()}** [${e.eventType}] ${e.description}`\n )\n .join(\"\\n\");\n\n const summary = `# Incident Report: ${incident.incidentNumber}\n\n## Overview\n- **Title**: ${incident.title}\n- **Type**: ${incident.type}\n- **Severity**: ${incident.severity}\n- **Status**: ${incident.status}\n- **Source**: ${incident.source}\n- **Created**: ${incident.createdAt.toISOString()}\n- **Updated**: ${incident.updatedAt.toISOString()}\n\n## Description\n${incident.description}\n\n## Impact Assessment\n${incident.impactAssessment ?? \"Not yet assessed.\"}\n\n## Resolution\n${incident.resolutionNotes ?? \"Not yet resolved.\"}\n\n## Timeline\n${timelineEntries || \"No timeline events recorded.\"}\n`;\n\n return { incident, timeline, summary };\n}\n\n// ---------------------------------------------------------------------------\n// Integration with AuthMonitor\n// ---------------------------------------------------------------------------\n\n/**\n * Wire the incident response system into an AuthMonitor instance so that\n * warning-level and critical-level anomalies automatically create incidents.\n */\nexport function wireIncidentResponseToAuthMonitor(authMonitor: {\n onAlert: (\n cb: (userId: string, anomaly: any) => void | Promise<void>\n ) => void;\n}) {\n authMonitor.onAlert(async (userId: string, anomaly: any) => {\n // Only create incidents for warning and critical anomalies\n if (anomaly.level === \"warning\" || anomaly.level === \"critical\") {\n try {\n await createIncidentFromAnomaly(userId, anomaly);\n } catch {\n // Incident creation failure should not crash the auth flow\n }\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/file-generation/presentations.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 PresentationOptions {\n title?: string;\n author?: string;\n subject?: string;\n company?: string;\n layout?: \"LAYOUT_16x9\" | \"LAYOUT_4x3\" | \"LAYOUT_WIDE\";\n theme?: PresentationTheme;\n}\n\nexport interface PresentationTheme {\n backgroundColor?: string;\n titleColor?: string;\n textColor?: string;\n accentColor?: string;\n titleFont?: string;\n bodyFont?: string;\n}\n\nexport interface PresentationResult {\n success: boolean;\n filePath?: string;\n error?: string;\n}\n\nexport type SlideLayout =\n | \"title\"\n | \"title-content\"\n | \"title-two-columns\"\n | \"section\"\n | \"comparison\"\n | \"blank\"\n | \"title-only\"\n | \"content-only\";\n\nexport interface SlideElement {\n type: \"text\" | \"bullet-list\" | \"numbered-list\" | \"image\" | \"shape\" | \"table\" | \"chart\";\n x?: number; // Percentage from left (0-100)\n y?: number; // Percentage from top (0-100)\n width?: number; // Percentage of slide width\n height?: number; // Percentage of slide height\n}\n\nexport interface TextElement extends SlideElement {\n type: \"text\";\n text: string;\n fontSize?: number;\n fontFace?: string;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n valign?: \"top\" | \"middle\" | \"bottom\";\n}\n\nexport interface BulletListElement extends SlideElement {\n type: \"bullet-list\";\n items: string[];\n fontSize?: number;\n color?: string;\n bulletColor?: string;\n}\n\nexport interface NumberedListElement extends SlideElement {\n type: \"numbered-list\";\n items: string[];\n fontSize?: number;\n color?: string;\n startNumber?: number;\n}\n\nexport interface ImageElement extends SlideElement {\n type: \"image\";\n path: string;\n sizing?: \"contain\" | \"cover\" | \"stretch\";\n}\n\nexport interface ShapeElement extends SlideElement {\n type: \"shape\";\n shapeType: \"rectangle\" | \"ellipse\" | \"triangle\" | \"arrow\" | \"line\";\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n text?: string;\n textColor?: string;\n}\n\nexport interface TableElement extends SlideElement {\n type: \"table\";\n headers?: string[];\n rows: string[][];\n headerColor?: string;\n headerTextColor?: string;\n borderColor?: string;\n alternateRowColor?: string;\n}\n\nexport interface ChartElement extends SlideElement {\n type: \"chart\";\n chartType: \"bar\" | \"line\" | \"pie\" | \"doughnut\" | \"area\";\n title?: string;\n labels: string[];\n data: number[] | { name: string; values: number[] }[];\n colors?: string[];\n}\n\nexport type SlideContent =\n | TextElement\n | BulletListElement\n | NumberedListElement\n | ImageElement\n | ShapeElement\n | TableElement\n | ChartElement;\n\nexport interface Slide {\n layout?: SlideLayout;\n title?: string;\n subtitle?: string;\n content?: SlideContent[];\n notes?: string;\n backgroundColor?: string;\n backgroundImage?: string;\n transition?: \"none\" | \"fade\" | \"slide\" | \"zoom\";\n}\n\n// Default theme\nconst DEFAULT_THEME: PresentationTheme = {\n backgroundColor: \"FFFFFF\",\n titleColor: \"2F5496\",\n textColor: \"333333\",\n accentColor: \"4472C4\",\n titleFont: \"Calibri Light\",\n bodyFont: \"Calibri\",\n};\n\n// Default options\nconst DEFAULT_OPTIONS: PresentationOptions = {\n layout: \"LAYOUT_16x9\",\n theme: DEFAULT_THEME,\n};\n\n// Generate temp file path\nfunction getTempPath(): string {\n const id = randomBytes(8).toString(\"hex\");\n return join(tmpdir(), `sentinel-presentation-${id}.pptx`);\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 percentage to EMUs (English Metric Units)\n// Slide dimensions in EMUs: 16:9 is 9144000 x 5143500\nfunction percentToEmuX(percent: number, layout: string = \"LAYOUT_16x9\"): number {\n const slideWidth = layout === \"LAYOUT_4x3\" ? 9144000 : 12192000;\n return Math.round((percent / 100) * slideWidth);\n}\n\nfunction percentToEmuY(percent: number, layout: string = \"LAYOUT_16x9\"): number {\n const slideHeight = layout === \"LAYOUT_4x3\" ? 6858000 : 6858000;\n return Math.round((percent / 100) * slideHeight);\n}\n\n// Convert points to EMUs (1 point = 12700 EMUs)\nfunction pointsToEmu(points: number): number {\n return points * 12700;\n}\n\n// Convert color to OOXML format (remove # if present)\nfunction normalizeColor(color: string): string {\n return color.replace(\"#\", \"\").toUpperCase();\n}\n\n// Generate [Content_Types].xml\nfunction generateContentTypesXml(slideCount: number): string {\n let overrides = \"\";\n for (let i = 1; i <= slideCount; i++) {\n overrides += `<Override PartName=\"/ppt/slides/slide${i}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>`;\n }\n\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 <Default Extension=\"jpeg\" ContentType=\"image/jpeg\"/>\n <Default Extension=\"jpg\" ContentType=\"image/jpeg\"/>\n <Default Extension=\"png\" ContentType=\"image/png\"/>\n <Override PartName=\"/ppt/presentation.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\"/>\n <Override PartName=\"/ppt/slideMasters/slideMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml\"/>\n <Override PartName=\"/ppt/slideLayouts/slideLayout1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\"/>\n <Override PartName=\"/ppt/slideLayouts/slideLayout2.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\"/>\n <Override PartName=\"/ppt/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>\n ${overrides}\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=\"ppt/presentation.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 ppt/presentation.xml\nfunction generatePresentationXml(slideCount: number, options: PresentationOptions): string {\n let slideIdList = \"\";\n let slideRelIds = \"\";\n\n for (let i = 1; i <= slideCount; i++) {\n slideIdList += `<p:sldId id=\"${255 + i}\" r:id=\"rId${i + 2}\"/>`;\n }\n\n const layout = options.layout || \"LAYOUT_16x9\";\n const slideWidth = layout === \"LAYOUT_4x3\" ? \"9144000\" : \"12192000\";\n const slideHeight = \"6858000\";\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:presentation xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"\n saveSubsetFonts=\"1\">\n <p:sldMasterIdLst>\n <p:sldMasterId id=\"2147483648\" r:id=\"rId1\"/>\n </p:sldMasterIdLst>\n <p:sldIdLst>\n ${slideIdList}\n </p:sldIdLst>\n <p:sldSz cx=\"${slideWidth}\" cy=\"${slideHeight}\"/>\n <p:notesSz cx=\"${slideHeight}\" cy=\"${slideWidth}\"/>\n</p:presentation>`;\n}\n\n// Generate ppt/_rels/presentation.xml.rels\nfunction generatePresentationRelsXml(slideCount: number): string {\n let slideRels = \"\";\n for (let i = 1; i <= slideCount; i++) {\n slideRels += `<Relationship Id=\"rId${i + 2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide\" Target=\"slides/slide${i}.xml\"/>`;\n }\n\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/slideMaster\" Target=\"slideMasters/slideMaster1.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>\n ${slideRels}\n</Relationships>`;\n}\n\n// Generate ppt/theme/theme1.xml\nfunction generateThemeXml(theme: PresentationTheme): string {\n const t = { ...DEFAULT_THEME, ...theme };\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"OpenSentinel Theme\">\n <a:themeElements>\n <a:clrScheme name=\"OpenSentinel\">\n <a:dk1><a:srgbClr val=\"000000\"/></a:dk1>\n <a:lt1><a:srgbClr val=\"${normalizeColor(t.backgroundColor!)}\"/></a:lt1>\n <a:dk2><a:srgbClr val=\"${normalizeColor(t.titleColor!)}\"/></a:dk2>\n <a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2>\n <a:accent1><a:srgbClr val=\"${normalizeColor(t.accentColor!)}\"/></a:accent1>\n <a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2>\n <a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3>\n <a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4>\n <a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5>\n <a:accent6><a:srgbClr val=\"F79646\"/></a:accent6>\n <a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink>\n <a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink>\n </a:clrScheme>\n <a:fontScheme name=\"OpenSentinel\">\n <a:majorFont>\n <a:latin typeface=\"${t.titleFont}\"/>\n <a:ea typeface=\"\"/>\n <a:cs typeface=\"\"/>\n </a:majorFont>\n <a:minorFont>\n <a:latin typeface=\"${t.bodyFont}\"/>\n <a:ea typeface=\"\"/>\n <a:cs typeface=\"\"/>\n </a:minorFont>\n </a:fontScheme>\n <a:fmtScheme name=\"OpenSentinel\">\n <a:fillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n </a:fillStyleLst>\n <a:lnStyleLst>\n <a:ln w=\"9525\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>\n <a:ln w=\"25400\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>\n <a:ln w=\"38100\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>\n </a:lnStyleLst>\n <a:effectStyleLst>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n </a:effectStyleLst>\n <a:bgFillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n </a:bgFillStyleLst>\n </a:fmtScheme>\n </a:themeElements>\n</a:theme>`;\n}\n\n// Generate ppt/slideMasters/slideMaster1.xml\nfunction generateSlideMasterXml(theme: PresentationTheme, layout: string): string {\n const t = { ...DEFAULT_THEME, ...theme };\n const slideWidth = layout === \"LAYOUT_4x3\" ? 9144000 : 12192000;\n const slideHeight = 6858000;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n <p:cSld>\n <p:bg>\n <p:bgPr>\n <a:solidFill>\n <a:srgbClr val=\"${normalizeColor(t.backgroundColor!)}\"/>\n </a:solidFill>\n <a:effectLst/>\n </p:bgPr>\n </p:bg>\n <p:spTree>\n <p:nvGrpSpPr>\n <p:cNvPr id=\"1\" name=\"\"/>\n <p:cNvGrpSpPr/>\n <p:nvPr/>\n </p:nvGrpSpPr>\n <p:grpSpPr>\n <a:xfrm>\n <a:off x=\"0\" y=\"0\"/>\n <a:ext cx=\"0\" cy=\"0\"/>\n <a:chOff x=\"0\" y=\"0\"/>\n <a:chExt cx=\"0\" cy=\"0\"/>\n </a:xfrm>\n </p:grpSpPr>\n </p:spTree>\n </p:cSld>\n <p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>\n <p:sldLayoutIdLst>\n <p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/>\n <p:sldLayoutId id=\"2147483650\" r:id=\"rId2\"/>\n </p:sldLayoutIdLst>\n</p:sldMaster>`;\n}\n\n// Generate ppt/slideMasters/_rels/slideMaster1.xml.rels\nfunction generateSlideMasterRelsXml(): 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/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout2.xml\"/>\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"../theme/theme1.xml\"/>\n</Relationships>`;\n}\n\n// Generate slide layout XML\nfunction generateSlideLayoutXml(layoutType: \"title\" | \"content\"): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"\n type=\"${layoutType === \"title\" ? \"title\" : \"obj\"}\">\n <p:cSld name=\"${layoutType === \"title\" ? \"Title Slide\" : \"Title and Content\"}\">\n <p:spTree>\n <p:nvGrpSpPr>\n <p:cNvPr id=\"1\" name=\"\"/>\n <p:cNvGrpSpPr/>\n <p:nvPr/>\n </p:nvGrpSpPr>\n <p:grpSpPr/>\n </p:spTree>\n </p:cSld>\n <p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>\n</p:sldLayout>`;\n}\n\n// Generate slide layout rels\nfunction generateSlideLayoutRelsXml(): 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/slideMaster\" Target=\"../slideMasters/slideMaster1.xml\"/>\n</Relationships>`;\n}\n\n// Generate slide XML\nfunction generateSlideXml(\n slide: Slide,\n slideIndex: number,\n options: PresentationOptions\n): string {\n const theme = { ...DEFAULT_THEME, ...options.theme };\n const layout = options.layout || \"LAYOUT_16x9\";\n const slideWidth = layout === \"LAYOUT_4x3\" ? 9144000 : 12192000;\n const slideHeight = 6858000;\n\n let shapesXml = \"\";\n let shapeId = 2;\n\n // Background\n let bgXml = \"\";\n if (slide.backgroundColor) {\n bgXml = `<p:bg>\n <p:bgPr>\n <a:solidFill><a:srgbClr val=\"${normalizeColor(slide.backgroundColor)}\"/></a:solidFill>\n <a:effectLst/>\n </p:bgPr>\n </p:bg>`;\n }\n\n // Title\n if (slide.title) {\n const titleY = slide.layout === \"title\" ? 30 : 5;\n const titleFontSize = slide.layout === \"title\" ? 4400 : 3200;\n\n shapesXml += `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId++}\" name=\"Title\"/>\n <p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr>\n <p:nvPr><p:ph type=\"title\"/></p:nvPr>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm>\n <a:off x=\"${Math.round(slideWidth * 0.05)}\" y=\"${Math.round(slideHeight * titleY / 100)}\"/>\n <a:ext cx=\"${Math.round(slideWidth * 0.9)}\" cy=\"${Math.round(slideHeight * 0.15)}\"/>\n </a:xfrm>\n </p:spPr>\n <p:txBody>\n <a:bodyPr anchor=\"ctr\"/>\n <a:lstStyle/>\n <a:p>\n <a:pPr algn=\"ctr\"/>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"${titleFontSize}\" b=\"1\">\n <a:solidFill><a:srgbClr val=\"${normalizeColor(theme.titleColor!)}\"/></a:solidFill>\n <a:latin typeface=\"${theme.titleFont}\"/>\n </a:rPr>\n <a:t>${escapeXml(slide.title)}</a:t>\n </a:r>\n </a:p>\n </p:txBody>\n </p:sp>`;\n }\n\n // Subtitle (for title slides)\n if (slide.subtitle && slide.layout === \"title\") {\n shapesXml += `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId++}\" name=\"Subtitle\"/>\n <p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr>\n <p:nvPr><p:ph type=\"subTitle\"/></p:nvPr>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm>\n <a:off x=\"${Math.round(slideWidth * 0.1)}\" y=\"${Math.round(slideHeight * 0.55)}\"/>\n <a:ext cx=\"${Math.round(slideWidth * 0.8)}\" cy=\"${Math.round(slideHeight * 0.15)}\"/>\n </a:xfrm>\n </p:spPr>\n <p:txBody>\n <a:bodyPr anchor=\"t\"/>\n <a:lstStyle/>\n <a:p>\n <a:pPr algn=\"ctr\"/>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"2400\">\n <a:solidFill><a:srgbClr val=\"${normalizeColor(theme.textColor!)}\"/></a:solidFill>\n <a:latin typeface=\"${theme.bodyFont}\"/>\n </a:rPr>\n <a:t>${escapeXml(slide.subtitle)}</a:t>\n </a:r>\n </a:p>\n </p:txBody>\n </p:sp>`;\n }\n\n // Content elements\n if (slide.content) {\n for (const element of slide.content) {\n shapesXml += generateContentElementXml(element, shapeId++, options, theme);\n }\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sld xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n <p:cSld>\n ${bgXml}\n <p:spTree>\n <p:nvGrpSpPr>\n <p:cNvPr id=\"1\" name=\"\"/>\n <p:cNvGrpSpPr/>\n <p:nvPr/>\n </p:nvGrpSpPr>\n <p:grpSpPr>\n <a:xfrm>\n <a:off x=\"0\" y=\"0\"/>\n <a:ext cx=\"0\" cy=\"0\"/>\n <a:chOff x=\"0\" y=\"0\"/>\n <a:chExt cx=\"0\" cy=\"0\"/>\n </a:xfrm>\n </p:grpSpPr>\n ${shapesXml}\n </p:spTree>\n </p:cSld>\n <p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>\n</p:sld>`;\n}\n\n// Generate content element XML\nfunction generateContentElementXml(\n element: SlideContent,\n shapeId: number,\n options: PresentationOptions,\n theme: PresentationTheme\n): string {\n const layout = options.layout || \"LAYOUT_16x9\";\n const slideWidth = layout === \"LAYOUT_4x3\" ? 9144000 : 12192000;\n const slideHeight = 6858000;\n\n // Default positions based on content type\n const x = element.x !== undefined ? percentToEmuX(element.x, layout) : Math.round(slideWidth * 0.05);\n const y = element.y !== undefined ? percentToEmuY(element.y, layout) : Math.round(slideHeight * 0.25);\n const width = element.width !== undefined ? percentToEmuX(element.width, layout) : Math.round(slideWidth * 0.9);\n const height = element.height !== undefined ? percentToEmuY(element.height, layout) : Math.round(slideHeight * 0.65);\n\n switch (element.type) {\n case \"text\":\n return generateTextElementXml(element, shapeId, x, y, width, height, theme);\n case \"bullet-list\":\n return generateBulletListElementXml(element, shapeId, x, y, width, height, theme);\n case \"numbered-list\":\n return generateNumberedListElementXml(element, shapeId, x, y, width, height, theme);\n case \"table\":\n return generateTableElementXml(element, shapeId, x, y, width, height, theme);\n case \"shape\":\n return generateShapeElementXml(element, shapeId, x, y, width, height);\n case \"image\":\n return generateImagePlaceholderXml(element, shapeId, x, y, width, height);\n case \"chart\":\n return generateChartPlaceholderXml(element, shapeId, x, y, width, height, theme);\n default:\n return \"\";\n }\n}\n\n// Generate text element XML\nfunction generateTextElementXml(\n element: TextElement,\n shapeId: number,\n x: number,\n y: number,\n width: number,\n height: number,\n theme: PresentationTheme\n): string {\n const fontSize = (element.fontSize || 18) * 100;\n const color = element.color ? normalizeColor(element.color) : normalizeColor(theme.textColor!);\n const font = element.fontFace || theme.bodyFont;\n const align = element.align || \"left\";\n const valign = element.valign || \"top\";\n\n let rPr = `<a:rPr lang=\"en-US\" sz=\"${fontSize}\"`;\n if (element.bold) rPr += ' b=\"1\"';\n if (element.italic) rPr += ' i=\"1\"';\n if (element.underline) rPr += ' u=\"sng\"';\n rPr += `><a:solidFill><a:srgbClr val=\"${color}\"/></a:solidFill><a:latin typeface=\"${font}\"/></a:rPr>`;\n\n return `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId}\" name=\"TextBox ${shapeId}\"/>\n <p:cNvSpPr txBox=\"1\"/>\n <p:nvPr/>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${width}\" cy=\"${height}\"/></a:xfrm>\n <a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>\n <a:noFill/>\n </p:spPr>\n <p:txBody>\n <a:bodyPr anchor=\"${valign === \"middle\" ? \"ctr\" : valign === \"bottom\" ? \"b\" : \"t\"}\"/>\n <a:lstStyle/>\n <a:p>\n <a:pPr algn=\"${align === \"center\" ? \"ctr\" : align === \"right\" ? \"r\" : \"l\"}\"/>\n <a:r>${rPr}<a:t>${escapeXml(element.text)}</a:t></a:r>\n </a:p>\n </p:txBody>\n </p:sp>`;\n}\n\n// Generate bullet list element XML\nfunction generateBulletListElementXml(\n element: BulletListElement,\n shapeId: number,\n x: number,\n y: number,\n width: number,\n height: number,\n theme: PresentationTheme\n): string {\n const fontSize = (element.fontSize || 18) * 100;\n const color = element.color ? normalizeColor(element.color) : normalizeColor(theme.textColor!);\n const bulletColor = element.bulletColor ? normalizeColor(element.bulletColor) : normalizeColor(theme.accentColor!);\n\n let paragraphs = \"\";\n for (const item of element.items) {\n paragraphs += `<a:p>\n <a:pPr marL=\"457200\" indent=\"-457200\">\n <a:buFont typeface=\"Arial\"/>\n <a:buChar char=\"\\u2022\"/>\n <a:buClr><a:srgbClr val=\"${bulletColor}\"/></a:buClr>\n </a:pPr>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"${fontSize}\">\n <a:solidFill><a:srgbClr val=\"${color}\"/></a:solidFill>\n <a:latin typeface=\"${theme.bodyFont}\"/>\n </a:rPr>\n <a:t>${escapeXml(item)}</a:t>\n </a:r>\n </a:p>`;\n }\n\n return `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId}\" name=\"Content ${shapeId}\"/>\n <p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr>\n <p:nvPr><p:ph idx=\"1\"/></p:nvPr>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${width}\" cy=\"${height}\"/></a:xfrm>\n </p:spPr>\n <p:txBody>\n <a:bodyPr/>\n <a:lstStyle/>\n ${paragraphs}\n </p:txBody>\n </p:sp>`;\n}\n\n// Generate numbered list element XML\nfunction generateNumberedListElementXml(\n element: NumberedListElement,\n shapeId: number,\n x: number,\n y: number,\n width: number,\n height: number,\n theme: PresentationTheme\n): string {\n const fontSize = (element.fontSize || 18) * 100;\n const color = element.color ? normalizeColor(element.color) : normalizeColor(theme.textColor!);\n const startNum = element.startNumber || 1;\n\n let paragraphs = \"\";\n for (let i = 0; i < element.items.length; i++) {\n paragraphs += `<a:p>\n <a:pPr marL=\"457200\" indent=\"-457200\">\n <a:buFont typeface=\"Arial\"/>\n <a:buAutoNum type=\"arabicPeriod\" startAt=\"${startNum}\"/>\n </a:pPr>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"${fontSize}\">\n <a:solidFill><a:srgbClr val=\"${color}\"/></a:solidFill>\n <a:latin typeface=\"${theme.bodyFont}\"/>\n </a:rPr>\n <a:t>${escapeXml(element.items[i])}</a:t>\n </a:r>\n </a:p>`;\n }\n\n return `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId}\" name=\"Content ${shapeId}\"/>\n <p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr>\n <p:nvPr><p:ph idx=\"1\"/></p:nvPr>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${width}\" cy=\"${height}\"/></a:xfrm>\n </p:spPr>\n <p:txBody>\n <a:bodyPr/>\n <a:lstStyle/>\n ${paragraphs}\n </p:txBody>\n </p:sp>`;\n}\n\n// Generate table element XML\nfunction generateTableElementXml(\n element: TableElement,\n shapeId: number,\n x: number,\n y: number,\n width: number,\n height: number,\n theme: PresentationTheme\n): string {\n const colCount = element.headers?.length || element.rows[0]?.length || 1;\n const rowCount = (element.headers ? 1 : 0) + element.rows.length;\n const colWidth = Math.round(width / colCount);\n const rowHeight = Math.round(height / rowCount);\n\n const headerColor = element.headerColor ? normalizeColor(element.headerColor) : normalizeColor(theme.accentColor!);\n const headerTextColor = element.headerTextColor ? normalizeColor(element.headerTextColor) : \"FFFFFF\";\n const borderColor = element.borderColor ? normalizeColor(element.borderColor) : \"CCCCCC\";\n const altRowColor = element.alternateRowColor ? normalizeColor(element.alternateRowColor) : \"F5F5F5\";\n\n let gridCols = \"\";\n for (let i = 0; i < colCount; i++) {\n gridCols += `<a:gridCol w=\"${colWidth}\"/>`;\n }\n\n let rowsXml = \"\";\n\n // Header row\n if (element.headers) {\n let cells = \"\";\n for (const header of element.headers) {\n cells += `<a:tc>\n <a:txBody>\n <a:bodyPr/>\n <a:lstStyle/>\n <a:p>\n <a:pPr algn=\"ctr\"/>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"1400\" b=\"1\">\n <a:solidFill><a:srgbClr val=\"${headerTextColor}\"/></a:solidFill>\n </a:rPr>\n <a:t>${escapeXml(header)}</a:t>\n </a:r>\n </a:p>\n </a:txBody>\n <a:tcPr>\n <a:solidFill><a:srgbClr val=\"${headerColor}\"/></a:solidFill>\n </a:tcPr>\n </a:tc>`;\n }\n rowsXml += `<a:tr h=\"${rowHeight}\">${cells}</a:tr>`;\n }\n\n // Data rows\n for (let rowIdx = 0; rowIdx < element.rows.length; rowIdx++) {\n const row = element.rows[rowIdx];\n const rowBg = rowIdx % 2 === 1 ? altRowColor : \"FFFFFF\";\n let cells = \"\";\n\n for (const cell of row) {\n cells += `<a:tc>\n <a:txBody>\n <a:bodyPr/>\n <a:lstStyle/>\n <a:p>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"1200\">\n <a:solidFill><a:srgbClr val=\"${normalizeColor(theme.textColor!)}\"/></a:solidFill>\n </a:rPr>\n <a:t>${escapeXml(cell)}</a:t>\n </a:r>\n </a:p>\n </a:txBody>\n <a:tcPr>\n <a:solidFill><a:srgbClr val=\"${rowBg}\"/></a:solidFill>\n </a:tcPr>\n </a:tc>`;\n }\n rowsXml += `<a:tr h=\"${rowHeight}\">${cells}</a:tr>`;\n }\n\n return `<p:graphicFrame>\n <p:nvGraphicFramePr>\n <p:cNvPr id=\"${shapeId}\" name=\"Table ${shapeId}\"/>\n <p:cNvGraphicFramePr><a:graphicFrameLocks noGrp=\"1\"/></p:cNvGraphicFramePr>\n <p:nvPr/>\n </p:nvGraphicFramePr>\n <p:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${width}\" cy=\"${height}\"/></p:xfrm>\n <a:graphic>\n <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/table\">\n <a:tbl>\n <a:tblPr firstRow=\"1\" bandRow=\"1\">\n <a:tableStyleId>{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}</a:tableStyleId>\n </a:tblPr>\n <a:tblGrid>${gridCols}</a:tblGrid>\n ${rowsXml}\n </a:tbl>\n </a:graphicData>\n </a:graphic>\n </p:graphicFrame>`;\n}\n\n// Generate shape element XML\nfunction generateShapeElementXml(\n element: ShapeElement,\n shapeId: number,\n x: number,\n y: number,\n width: number,\n height: number\n): string {\n const shapeTypeMap: Record<string, string> = {\n rectangle: \"rect\",\n ellipse: \"ellipse\",\n triangle: \"triangle\",\n arrow: \"rightArrow\",\n line: \"line\",\n };\n\n const prstGeom = shapeTypeMap[element.shapeType] || \"rect\";\n const fill = element.fill ? normalizeColor(element.fill) : \"4472C4\";\n const stroke = element.stroke ? normalizeColor(element.stroke) : fill;\n const strokeWidth = (element.strokeWidth || 1) * 12700;\n\n let textXml = \"\";\n if (element.text) {\n const textColor = element.textColor ? normalizeColor(element.textColor) : \"FFFFFF\";\n textXml = `<p:txBody>\n <a:bodyPr anchor=\"ctr\"/>\n <a:lstStyle/>\n <a:p>\n <a:pPr algn=\"ctr\"/>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"1400\">\n <a:solidFill><a:srgbClr val=\"${textColor}\"/></a:solidFill>\n </a:rPr>\n <a:t>${escapeXml(element.text)}</a:t>\n </a:r>\n </a:p>\n </p:txBody>`;\n }\n\n return `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId}\" name=\"Shape ${shapeId}\"/>\n <p:cNvSpPr/>\n <p:nvPr/>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${width}\" cy=\"${height}\"/></a:xfrm>\n <a:prstGeom prst=\"${prstGeom}\"><a:avLst/></a:prstGeom>\n <a:solidFill><a:srgbClr val=\"${fill}\"/></a:solidFill>\n <a:ln w=\"${strokeWidth}\"><a:solidFill><a:srgbClr val=\"${stroke}\"/></a:solidFill></a:ln>\n </p:spPr>\n ${textXml}\n </p:sp>`;\n}\n\n// Generate image placeholder XML\nfunction generateImagePlaceholderXml(\n element: ImageElement,\n shapeId: number,\n x: number,\n y: number,\n width: number,\n height: number\n): string {\n return `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId}\" name=\"Image Placeholder ${shapeId}\"/>\n <p:cNvSpPr/>\n <p:nvPr/>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${width}\" cy=\"${height}\"/></a:xfrm>\n <a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>\n <a:solidFill><a:srgbClr val=\"E0E0E0\"/></a:solidFill>\n <a:ln><a:solidFill><a:srgbClr val=\"CCCCCC\"/></a:solidFill></a:ln>\n </p:spPr>\n <p:txBody>\n <a:bodyPr anchor=\"ctr\"/>\n <a:lstStyle/>\n <a:p>\n <a:pPr algn=\"ctr\"/>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"1200\" i=\"1\">\n <a:solidFill><a:srgbClr val=\"666666\"/></a:solidFill>\n </a:rPr>\n <a:t>[Image: ${escapeXml(element.path)}]</a:t>\n </a:r>\n </a:p>\n </p:txBody>\n </p:sp>`;\n}\n\n// Generate chart placeholder XML\nfunction generateChartPlaceholderXml(\n element: ChartElement,\n shapeId: number,\n x: number,\n y: number,\n width: number,\n height: number,\n theme: PresentationTheme\n): string {\n const title = element.title || `${element.chartType.charAt(0).toUpperCase() + element.chartType.slice(1)} Chart`;\n\n return `<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${shapeId}\" name=\"Chart Placeholder ${shapeId}\"/>\n <p:cNvSpPr/>\n <p:nvPr/>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${width}\" cy=\"${height}\"/></a:xfrm>\n <a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>\n <a:solidFill><a:srgbClr val=\"F5F5F5\"/></a:solidFill>\n <a:ln><a:solidFill><a:srgbClr val=\"${normalizeColor(theme.accentColor!)}\"/></a:solidFill></a:ln>\n </p:spPr>\n <p:txBody>\n <a:bodyPr anchor=\"ctr\"/>\n <a:lstStyle/>\n <a:p>\n <a:pPr algn=\"ctr\"/>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"1400\" b=\"1\">\n <a:solidFill><a:srgbClr val=\"${normalizeColor(theme.textColor!)}\"/></a:solidFill>\n </a:rPr>\n <a:t>${escapeXml(title)}</a:t>\n </a:r>\n </a:p>\n <a:p>\n <a:pPr algn=\"ctr\"/>\n <a:r>\n <a:rPr lang=\"en-US\" sz=\"1000\" i=\"1\">\n <a:solidFill><a:srgbClr val=\"666666\"/></a:solidFill>\n </a:rPr>\n <a:t>[Chart placeholder - Labels: ${element.labels.join(\", \")}]</a:t>\n </a:r>\n </a:p>\n </p:txBody>\n </p:sp>`;\n}\n\n// Generate slide rels XML\nfunction generateSlideRelsXml(slideIndex: number): 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/slideLayout\" Target=\"../slideLayouts/slideLayout2.xml\"/>\n</Relationships>`;\n}\n\n// Generate docProps/core.xml\nfunction generateCorePropsXml(options: PresentationOptions): 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 <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(options: PresentationOptions, slideCount: number): 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 Presentation Generator</Application>\n <AppVersion>1.0</AppVersion>\n ${options.company ? `<Company>${escapeXml(options.company)}</Company>` : \"\"}\n <Slides>${slideCount}</Slides>\n <HiddenSlides>0</HiddenSlides>\n</Properties>`;\n}\n\n// Generate presentation using pptxgenjs library if available, otherwise create raw OOXML\nexport async function generatePresentation(\n slides: Slide[],\n filename?: string,\n options: PresentationOptions = {}\n): Promise<PresentationResult> {\n const filePath = filename\n ? isPathAllowed(filename)\n ? filename\n : join(tmpdir(), filename)\n : getTempPath();\n\n if (slides.length === 0) {\n return { success: false, error: \"No slides provided\" };\n }\n\n try {\n await mkdir(dirname(filePath), { recursive: true });\n\n // Try to use pptxgenjs library if available\n try {\n const PptxGenJS = await import(\"pptxgenjs\");\n return await generateWithPptxGenJs(slides, filePath, options, PptxGenJS.default);\n } catch {\n // Fallback: generate raw OOXML and create the ZIP manually\n console.log(\"[Presentations] pptxgenjs library not available, using raw OOXML generation\");\n return await generateRawPptx(slides, 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 pptxgenjs library\nasync function generateWithPptxGenJs(\n slides: Slide[],\n filePath: string,\n options: PresentationOptions,\n PptxGenJS: typeof import(\"pptxgenjs\").default\n): Promise<PresentationResult> {\n const pptx = new PptxGenJS();\n\n // Set presentation properties\n if (options.title) pptx.title = options.title;\n if (options.author) pptx.author = options.author;\n if (options.subject) pptx.subject = options.subject;\n if (options.company) pptx.company = options.company;\n\n // Set layout\n if (options.layout === \"LAYOUT_4x3\") {\n pptx.layout = \"LAYOUT_4x3\";\n } else {\n pptx.layout = \"LAYOUT_16x9\";\n }\n\n const theme = { ...DEFAULT_THEME, ...options.theme };\n\n for (const slideData of slides) {\n const slide = pptx.addSlide();\n\n // Background\n if (slideData.backgroundColor) {\n slide.background = { color: slideData.backgroundColor.replace(\"#\", \"\") };\n }\n\n // Title\n if (slideData.title) {\n const titleY = slideData.layout === \"title\" ? \"40%\" : \"5%\";\n const fontSize = slideData.layout === \"title\" ? 44 : 32;\n\n slide.addText(slideData.title, {\n x: \"5%\",\n y: titleY,\n w: \"90%\",\n h: \"15%\",\n fontSize,\n bold: true,\n color: theme.titleColor?.replace(\"#\", \"\"),\n fontFace: theme.titleFont,\n align: \"center\",\n valign: \"middle\",\n });\n }\n\n // Subtitle\n if (slideData.subtitle && slideData.layout === \"title\") {\n slide.addText(slideData.subtitle, {\n x: \"10%\",\n y: \"55%\",\n w: \"80%\",\n h: \"15%\",\n fontSize: 24,\n color: theme.textColor?.replace(\"#\", \"\"),\n fontFace: theme.bodyFont,\n align: \"center\",\n valign: \"top\",\n });\n }\n\n // Content elements\n if (slideData.content) {\n for (const element of slideData.content) {\n addContentElementToPptx(slide, element, theme);\n }\n }\n\n // Speaker notes\n if (slideData.notes) {\n slide.addNotes(slideData.notes);\n }\n }\n\n await pptx.writeFile({ fileName: filePath });\n return { success: true, filePath };\n}\n\n// Add content element to pptx slide\nfunction addContentElementToPptx(\n slide: ReturnType<import(\"pptxgenjs\").default[\"addSlide\"]>,\n element: SlideContent,\n theme: PresentationTheme\n): void {\n const x = element.x !== undefined ? `${element.x}%` : \"5%\";\n const y = element.y !== undefined ? `${element.y}%` : \"25%\";\n const w = element.width !== undefined ? `${element.width}%` : \"90%\";\n const h = element.height !== undefined ? `${element.height}%` : \"65%\";\n\n switch (element.type) {\n case \"text\":\n slide.addText(element.text, {\n x,\n y,\n w,\n h,\n fontSize: element.fontSize || 18,\n fontFace: element.fontFace || theme.bodyFont,\n color: element.color?.replace(\"#\", \"\") || theme.textColor?.replace(\"#\", \"\"),\n bold: element.bold,\n italic: element.italic,\n underline: element.underline ? { style: \"sng\" } : undefined,\n align: element.align,\n valign: element.valign,\n });\n break;\n\n case \"bullet-list\":\n slide.addText(\n element.items.map((item) => ({\n text: item,\n options: { bullet: { type: \"bullet\" } },\n })),\n {\n x,\n y,\n w,\n h,\n fontSize: element.fontSize || 18,\n color: element.color?.replace(\"#\", \"\") || theme.textColor?.replace(\"#\", \"\"),\n }\n );\n break;\n\n case \"numbered-list\":\n slide.addText(\n element.items.map((item, idx) => ({\n text: item,\n options: { bullet: { type: \"number\", numberStartAt: element.startNumber || 1 } },\n })),\n {\n x,\n y,\n w,\n h,\n fontSize: element.fontSize || 18,\n color: element.color?.replace(\"#\", \"\") || theme.textColor?.replace(\"#\", \"\"),\n }\n );\n break;\n\n case \"table\":\n const tableData: string[][] = [];\n if (element.headers) {\n tableData.push(element.headers);\n }\n tableData.push(...element.rows);\n\n slide.addTable(tableData, {\n x,\n y,\n w,\n h,\n border: { color: element.borderColor?.replace(\"#\", \"\") || \"CCCCCC\" },\n fill: { color: \"FFFFFF\" },\n fontFace: theme.bodyFont,\n fontSize: 12,\n });\n break;\n\n case \"shape\":\n const shapeTypeMap: Record<string, \"rect\" | \"ellipse\" | \"triangle\" | \"rightArrow\" | \"line\"> = {\n rectangle: \"rect\",\n ellipse: \"ellipse\",\n triangle: \"triangle\",\n arrow: \"rightArrow\",\n line: \"line\",\n };\n\n slide.addShape(shapeTypeMap[element.shapeType] || \"rect\", {\n x,\n y,\n w,\n h,\n fill: { color: element.fill?.replace(\"#\", \"\") || theme.accentColor?.replace(\"#\", \"\") },\n line: {\n color: element.stroke?.replace(\"#\", \"\") || element.fill?.replace(\"#\", \"\") || theme.accentColor?.replace(\"#\", \"\"),\n width: element.strokeWidth || 1,\n },\n });\n\n if (element.text) {\n slide.addText(element.text, {\n x,\n y,\n w,\n h,\n align: \"center\",\n valign: \"middle\",\n color: element.textColor?.replace(\"#\", \"\") || \"FFFFFF\",\n });\n }\n break;\n\n case \"image\":\n // For actual implementation, would need to read the image file\n slide.addText(`[Image: ${element.path}]`, {\n x,\n y,\n w,\n h,\n align: \"center\",\n valign: \"middle\",\n italic: true,\n color: \"666666\",\n fill: { color: \"E0E0E0\" },\n });\n break;\n\n case \"chart\":\n // For actual implementation, would need to create chart objects\n slide.addText(`[${element.chartType} Chart: ${element.title || \"Data\"}]`, {\n x,\n y,\n w,\n h,\n align: \"center\",\n valign: \"middle\",\n italic: true,\n color: \"666666\",\n fill: { color: \"F5F5F5\" },\n });\n break;\n }\n}\n\n// Generate raw OOXML and create ZIP\nasync function generateRawPptx(\n slides: Slide[],\n filePath: string,\n options: PresentationOptions\n): Promise<PresentationResult> {\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n const theme = { ...DEFAULT_THEME, ...finalOptions.theme };\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(slides.length), { name: \"[Content_Types].xml\" });\n archive.append(generateRootRelsXml(), { name: \"_rels/.rels\" });\n archive.append(generatePresentationXml(slides.length, finalOptions), { name: \"ppt/presentation.xml\" });\n archive.append(generatePresentationRelsXml(slides.length), { name: \"ppt/_rels/presentation.xml.rels\" });\n archive.append(generateThemeXml(theme), { name: \"ppt/theme/theme1.xml\" });\n archive.append(generateSlideMasterXml(theme, finalOptions.layout || \"LAYOUT_16x9\"), { name: \"ppt/slideMasters/slideMaster1.xml\" });\n archive.append(generateSlideMasterRelsXml(), { name: \"ppt/slideMasters/_rels/slideMaster1.xml.rels\" });\n archive.append(generateSlideLayoutXml(\"title\"), { name: \"ppt/slideLayouts/slideLayout1.xml\" });\n archive.append(generateSlideLayoutXml(\"content\"), { name: \"ppt/slideLayouts/slideLayout2.xml\" });\n archive.append(generateSlideLayoutRelsXml(), { name: \"ppt/slideLayouts/_rels/slideLayout1.xml.rels\" });\n archive.append(generateSlideLayoutRelsXml(), { name: \"ppt/slideLayouts/_rels/slideLayout2.xml.rels\" });\n\n // Add slides\n for (let i = 0; i < slides.length; i++) {\n archive.append(generateSlideXml(slides[i], i + 1, finalOptions), { name: `ppt/slides/slide${i + 1}.xml` });\n archive.append(generateSlideRelsXml(i + 1), { name: `ppt/slides/_rels/slide${i + 1}.xml.rels` });\n }\n\n // Add document properties\n archive.append(generateCorePropsXml(finalOptions), { name: \"docProps/core.xml\" });\n archive.append(generateAppPropsXml(finalOptions, slides.length), { name: \"docProps/app.xml\" });\n\n archive.finalize();\n });\n } catch {\n // Ultimate fallback: save slide content as text\n const txtPath = filePath.replace(\".pptx\", \".txt\");\n let content = `Presentation: ${options.title || \"Untitled\"}\\n${\"=\".repeat(50)}\\n\\n`;\n\n for (let i = 0; i < slides.length; i++) {\n const slide = slides[i];\n content += `--- Slide ${i + 1} ---\\n`;\n if (slide.title) content += `Title: ${slide.title}\\n`;\n if (slide.subtitle) content += `Subtitle: ${slide.subtitle}\\n`;\n if (slide.content) {\n content += \"Content:\\n\";\n for (const element of slide.content) {\n if (\"text\" in element && element.type === \"text\") content += ` ${element.text}\\n`;\n if (\"items\" in element) content += element.items.map((item: string) => ` - ${item}`).join(\"\\n\") + \"\\n\";\n }\n }\n content += \"\\n\";\n }\n\n await writeFile(txtPath, content, \"utf-8\");\n return { success: true, filePath: txtPath };\n }\n}\n\n// Quick presentation from outline\nexport async function quickPresentation(\n title: string,\n outline: Array<{ title: string; bullets?: string[] }>,\n filename?: string,\n options?: PresentationOptions\n): Promise<PresentationResult> {\n const slides: Slide[] = [\n {\n layout: \"title\",\n title,\n subtitle: options?.author ? `By ${options.author}` : undefined,\n },\n ];\n\n for (const section of outline) {\n slides.push({\n layout: \"title-content\",\n title: section.title,\n content: section.bullets\n ? [{ type: \"bullet-list\", items: section.bullets }]\n : undefined,\n });\n }\n\n return generatePresentation(slides, filename, options);\n}\n\n// Main function for tool use\nexport async function generatePPTX(\n slides: Slide[],\n filename: string,\n options?: PresentationOptions\n): Promise<PresentationResult> {\n return generatePresentation(slides, filename, options);\n}\n\nexport default {\n generatePresentation,\n generatePPTX,\n quickPresentation,\n};\n"],"mappings":";;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,WAAW,aAAa;AACjC,SAAS,eAAe;AAkIxB,IAAM,gBAAmC;AAAA,EACvC,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AACZ;AAGA,IAAM,kBAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,OAAO;AACT;AAGA,SAAS,cAAsB;AAC7B,QAAM,KAAK,YAAY,CAAC,EAAE,SAAS,KAAK;AACxC,SAAO,KAAK,OAAO,GAAG,yBAAyB,EAAE,OAAO;AAC1D;AAGA,SAAS,UAAU,KAAqB;AACtC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAIA,SAAS,cAAc,SAAiB,SAAiB,eAAuB;AAC9E,QAAM,aAAa,WAAW,eAAe,SAAU;AACvD,SAAO,KAAK,MAAO,UAAU,MAAO,UAAU;AAChD;AAEA,SAAS,cAAc,SAAiB,SAAiB,eAAuB;AAC9E,QAAM,cAAc,WAAW,eAAe,SAAU;AACxD,SAAO,KAAK,MAAO,UAAU,MAAO,WAAW;AACjD;AAQA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,QAAQ,KAAK,EAAE,EAAE,YAAY;AAC5C;AAGA,SAAS,wBAAwB,YAA4B;AAC3D,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACpC,iBAAa,wCAAwC,CAAC;AAAA,EACxD;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYL,SAAS;AAAA;AAAA;AAAA;AAIb;AAGA,SAAS,sBAA8B;AACrC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMT;AAGA,SAAS,wBAAwB,YAAoB,SAAsC;AACzF,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,WAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACpC,mBAAe,gBAAgB,MAAM,CAAC,cAAc,IAAI,CAAC;AAAA,EAC3D;AAEA,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAAa,WAAW,eAAe,YAAY;AACzD,QAAM,cAAc;AAEpB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASH,WAAW;AAAA;AAAA,iBAEA,UAAU,SAAS,WAAW;AAAA,mBAC5B,WAAW,SAAS,UAAU;AAAA;AAEjD;AAGA,SAAS,4BAA4B,YAA4B;AAC/D,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AACpC,iBAAa,wBAAwB,IAAI,CAAC,0GAA0G,CAAC;AAAA,EACvJ;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,SAAS;AAAA;AAEb;AAGA,SAAS,iBAAiB,OAAkC;AAC1D,QAAM,IAAI,EAAE,GAAG,eAAe,GAAG,MAAM;AAEvC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKsB,eAAe,EAAE,eAAgB,CAAC;AAAA,+BAClC,eAAe,EAAE,UAAW,CAAC;AAAA;AAAA,mCAEzB,eAAe,EAAE,WAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAWpC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKX,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BvC;AAGA,SAAS,uBAAuB,OAA0B,QAAwB;AAChF,QAAM,IAAI,EAAE,GAAG,eAAe,GAAG,MAAM;AACvC,QAAM,aAAa,WAAW,eAAe,SAAU;AACvD,QAAM,cAAc;AAEpB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAQmB,eAAe,EAAE,eAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2B9D;AAGA,SAAS,6BAAqC;AAC5C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMT;AAGA,SAAS,uBAAuB,YAAyC;AACvE,SAAO;AAAA;AAAA;AAAA;AAAA,qBAIY,eAAe,UAAU,UAAU,KAAK;AAAA,kBAC3C,eAAe,UAAU,gBAAgB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY9E;AAGA,SAAS,6BAAqC;AAC5C,SAAO;AAAA;AAAA;AAAA;AAIT;AAGA,SAAS,iBACP,OACA,YACA,SACQ;AACR,QAAM,QAAQ,EAAE,GAAG,eAAe,GAAG,QAAQ,MAAM;AACnD,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAAa,WAAW,eAAe,SAAU;AACvD,QAAM,cAAc;AAEpB,MAAI,YAAY;AAChB,MAAI,UAAU;AAGd,MAAI,QAAQ;AACZ,MAAI,MAAM,iBAAiB;AACzB,YAAQ;AAAA;AAAA,uCAE2B,eAAe,MAAM,eAAe,CAAC;AAAA;AAAA;AAAA;AAAA,EAI1E;AAGA,MAAI,MAAM,OAAO;AACf,UAAM,SAAS,MAAM,WAAW,UAAU,KAAK;AAC/C,UAAM,gBAAgB,MAAM,WAAW,UAAU,OAAO;AAExD,iBAAa;AAAA;AAAA,uBAEM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMV,KAAK,MAAM,aAAa,IAAI,CAAC,QAAQ,KAAK,MAAM,cAAc,SAAS,GAAG,CAAC;AAAA,uBAC1E,KAAK,MAAM,aAAa,GAAG,CAAC,SAAS,KAAK,MAAM,cAAc,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCASpD,aAAa;AAAA,6CACN,eAAe,MAAM,UAAW,CAAC;AAAA,mCAC3C,MAAM,SAAS;AAAA;AAAA,mBAE/B,UAAU,MAAM,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC;AAGA,MAAI,MAAM,YAAY,MAAM,WAAW,SAAS;AAC9C,iBAAa;AAAA;AAAA,uBAEM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMV,KAAK,MAAM,aAAa,GAAG,CAAC,QAAQ,KAAK,MAAM,cAAc,IAAI,CAAC;AAAA,uBACjE,KAAK,MAAM,aAAa,GAAG,CAAC,SAAS,KAAK,MAAM,cAAc,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAU7C,eAAe,MAAM,SAAU,CAAC;AAAA,mCAC1C,MAAM,QAAQ;AAAA;AAAA,mBAE9B,UAAU,MAAM,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1C;AAGA,MAAI,MAAM,SAAS;AACjB,eAAW,WAAW,MAAM,SAAS;AACnC,mBAAa,0BAA0B,SAAS,WAAW,SAAS,KAAK;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKH,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAeH,SAAS;AAAA;AAAA;AAAA;AAAA;AAKjB;AAGA,SAAS,0BACP,SACA,SACA,SACA,OACQ;AACR,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAAa,WAAW,eAAe,SAAU;AACvD,QAAM,cAAc;AAGpB,QAAM,IAAI,QAAQ,MAAM,SAAY,cAAc,QAAQ,GAAG,MAAM,IAAI,KAAK,MAAM,aAAa,IAAI;AACnG,QAAM,IAAI,QAAQ,MAAM,SAAY,cAAc,QAAQ,GAAG,MAAM,IAAI,KAAK,MAAM,cAAc,IAAI;AACpG,QAAM,QAAQ,QAAQ,UAAU,SAAY,cAAc,QAAQ,OAAO,MAAM,IAAI,KAAK,MAAM,aAAa,GAAG;AAC9G,QAAM,SAAS,QAAQ,WAAW,SAAY,cAAc,QAAQ,QAAQ,MAAM,IAAI,KAAK,MAAM,cAAc,IAAI;AAEnH,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,uBAAuB,SAAS,SAAS,GAAG,GAAG,OAAO,QAAQ,KAAK;AAAA,IAC5E,KAAK;AACH,aAAO,6BAA6B,SAAS,SAAS,GAAG,GAAG,OAAO,QAAQ,KAAK;AAAA,IAClF,KAAK;AACH,aAAO,+BAA+B,SAAS,SAAS,GAAG,GAAG,OAAO,QAAQ,KAAK;AAAA,IACpF,KAAK;AACH,aAAO,wBAAwB,SAAS,SAAS,GAAG,GAAG,OAAO,QAAQ,KAAK;AAAA,IAC7E,KAAK;AACH,aAAO,wBAAwB,SAAS,SAAS,GAAG,GAAG,OAAO,MAAM;AAAA,IACtE,KAAK;AACH,aAAO,4BAA4B,SAAS,SAAS,GAAG,GAAG,OAAO,MAAM;AAAA,IAC1E,KAAK;AACH,aAAO,4BAA4B,SAAS,SAAS,GAAG,GAAG,OAAO,QAAQ,KAAK;AAAA,IACjF;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,uBACP,SACA,SACA,GACA,GACA,OACA,QACA,OACQ;AACR,QAAM,YAAY,QAAQ,YAAY,MAAM;AAC5C,QAAM,QAAQ,QAAQ,QAAQ,eAAe,QAAQ,KAAK,IAAI,eAAe,MAAM,SAAU;AAC7F,QAAM,OAAO,QAAQ,YAAY,MAAM;AACvC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AAEjC,MAAI,MAAM,2BAA2B,QAAQ;AAC7C,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,UAAW,QAAO;AAC9B,SAAO,iCAAiC,KAAK,uCAAuC,IAAI;AAExF,SAAO;AAAA;AAAA,qBAEY,OAAO,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAK5B,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,0BAK/C,WAAW,WAAW,QAAQ,WAAW,WAAW,MAAM,GAAG;AAAA;AAAA;AAAA,uBAGhE,UAAU,WAAW,QAAQ,UAAU,UAAU,MAAM,GAAG;AAAA,eAClE,GAAG,QAAQ,UAAU,QAAQ,IAAI,CAAC;AAAA;AAAA;AAAA;AAIjD;AAGA,SAAS,6BACP,SACA,SACA,GACA,GACA,OACA,QACA,OACQ;AACR,QAAM,YAAY,QAAQ,YAAY,MAAM;AAC5C,QAAM,QAAQ,QAAQ,QAAQ,eAAe,QAAQ,KAAK,IAAI,eAAe,MAAM,SAAU;AAC7F,QAAM,cAAc,QAAQ,cAAc,eAAe,QAAQ,WAAW,IAAI,eAAe,MAAM,WAAY;AAEjH,MAAI,aAAa;AACjB,aAAW,QAAQ,QAAQ,OAAO;AAChC,kBAAc;AAAA;AAAA;AAAA;AAAA,mCAIiB,WAAW;AAAA;AAAA;AAAA,kCAGZ,QAAQ;AAAA,yCACD,KAAK;AAAA,+BACf,MAAM,QAAQ;AAAA;AAAA,eAE9B,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA,EAG5B;AAEA,SAAO;AAAA;AAAA,qBAEY,OAAO,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAK5B,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,QAKjE,UAAU;AAAA;AAAA;AAGlB;AAGA,SAAS,+BACP,SACA,SACA,GACA,GACA,OACA,QACA,OACQ;AACR,QAAM,YAAY,QAAQ,YAAY,MAAM;AAC5C,QAAM,QAAQ,QAAQ,QAAQ,eAAe,QAAQ,KAAK,IAAI,eAAe,MAAM,SAAU;AAC7F,QAAM,WAAW,QAAQ,eAAe;AAExC,MAAI,aAAa;AACjB,WAAS,IAAI,GAAG,IAAI,QAAQ,MAAM,QAAQ,KAAK;AAC7C,kBAAc;AAAA;AAAA;AAAA,oDAGkC,QAAQ;AAAA;AAAA;AAAA,kCAG1B,QAAQ;AAAA,yCACD,KAAK;AAAA,+BACf,MAAM,QAAQ;AAAA;AAAA,eAE9B,UAAU,QAAQ,MAAM,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA,EAGxC;AAEA,SAAO;AAAA;AAAA,qBAEY,OAAO,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAK5B,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,QAKjE,UAAU;AAAA;AAAA;AAGlB;AAGA,SAAS,wBACP,SACA,SACA,GACA,GACA,OACA,QACA,OACQ;AACR,QAAM,WAAW,QAAQ,SAAS,UAAU,QAAQ,KAAK,CAAC,GAAG,UAAU;AACvE,QAAM,YAAY,QAAQ,UAAU,IAAI,KAAK,QAAQ,KAAK;AAC1D,QAAM,WAAW,KAAK,MAAM,QAAQ,QAAQ;AAC5C,QAAM,YAAY,KAAK,MAAM,SAAS,QAAQ;AAE9C,QAAM,cAAc,QAAQ,cAAc,eAAe,QAAQ,WAAW,IAAI,eAAe,MAAM,WAAY;AACjH,QAAM,kBAAkB,QAAQ,kBAAkB,eAAe,QAAQ,eAAe,IAAI;AAC5F,QAAM,cAAc,QAAQ,cAAc,eAAe,QAAQ,WAAW,IAAI;AAChF,QAAM,cAAc,QAAQ,oBAAoB,eAAe,QAAQ,iBAAiB,IAAI;AAE5F,MAAI,WAAW;AACf,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,gBAAY,iBAAiB,QAAQ;AAAA,EACvC;AAEA,MAAI,UAAU;AAGd,MAAI,QAAQ,SAAS;AACnB,QAAI,QAAQ;AACZ,eAAW,UAAU,QAAQ,SAAS;AACpC,eAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAQgC,eAAe;AAAA;AAAA,qBAEzC,UAAU,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,yCAKG,WAAW;AAAA;AAAA;AAAA,IAGhD;AACA,eAAW,YAAY,SAAS,KAAK,KAAK;AAAA,EAC5C;AAGA,WAAS,SAAS,GAAG,SAAS,QAAQ,KAAK,QAAQ,UAAU;AAC3D,UAAM,MAAM,QAAQ,KAAK,MAAM;AAC/B,UAAM,QAAQ,SAAS,MAAM,IAAI,cAAc;AAC/C,QAAI,QAAQ;AAEZ,eAAW,QAAQ,KAAK;AACtB,eAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAOgC,eAAe,MAAM,SAAU,CAAC;AAAA;AAAA,qBAE1D,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,yCAKK,KAAK;AAAA;AAAA;AAAA,IAG1C;AACA,eAAW,YAAY,SAAS,KAAK,KAAK;AAAA,EAC5C;AAEA,SAAO;AAAA;AAAA,qBAEY,OAAO,iBAAiB,OAAO;AAAA;AAAA;AAAA;AAAA,wBAI5B,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOhD,QAAQ;AAAA,YACnB,OAAO;AAAA;AAAA;AAAA;AAAA;AAKnB;AAGA,SAAS,wBACP,SACA,SACA,GACA,GACA,OACA,QACQ;AACR,QAAM,eAAuC;AAAA,IAC3C,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAEA,QAAM,WAAW,aAAa,QAAQ,SAAS,KAAK;AACpD,QAAM,OAAO,QAAQ,OAAO,eAAe,QAAQ,IAAI,IAAI;AAC3D,QAAM,SAAS,QAAQ,SAAS,eAAe,QAAQ,MAAM,IAAI;AACjE,QAAM,eAAe,QAAQ,eAAe,KAAK;AAEjD,MAAI,UAAU;AACd,MAAI,QAAQ,MAAM;AAChB,UAAM,YAAY,QAAQ,YAAY,eAAe,QAAQ,SAAS,IAAI;AAC1E,cAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAO6B,SAAS;AAAA;AAAA,iBAEnC,UAAU,QAAQ,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAItC;AAEA,SAAO;AAAA;AAAA,qBAEY,OAAO,iBAAiB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAK1B,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,MAAM;AAAA,0BAC/C,QAAQ;AAAA,qCACG,IAAI;AAAA,iBACxB,WAAW,kCAAkC,MAAM;AAAA;AAAA,MAE9D,OAAO;AAAA;AAEb;AAGA,SAAS,4BACP,SACA,SACA,GACA,GACA,OACA,QACQ;AACR,SAAO;AAAA;AAAA,qBAEY,OAAO,6BAA6B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKtC,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAchD,UAAU,QAAQ,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAKhD;AAGA,SAAS,4BACP,SACA,SACA,GACA,GACA,OACA,QACA,OACQ;AACR,QAAM,QAAQ,QAAQ,SAAS,GAAG,QAAQ,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,UAAU,MAAM,CAAC,CAAC;AAExG,SAAO;AAAA;AAAA,qBAEY,OAAO,6BAA6B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKtC,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS,MAAM;AAAA;AAAA;AAAA,2CAG9B,eAAe,MAAM,WAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CASlC,eAAe,MAAM,SAAU,CAAC;AAAA;AAAA,iBAE1D,UAAU,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CASa,QAAQ,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAKvE;AAGA,SAAS,qBAAqB,YAA4B;AACxD,SAAO;AAAA;AAAA;AAAA;AAIT;AAGA,SAAS,qBAAqB,SAAsC;AAClE,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,QAAQ,QAAQ,aAAa,UAAU,QAAQ,KAAK,CAAC,gBAAgB,EAAE;AAAA,IACvE,QAAQ,SAAS,eAAe,UAAU,QAAQ,MAAM,CAAC,kBAAkB,uCAAuC;AAAA,IAClH,QAAQ,UAAU,eAAe,UAAU,QAAQ,OAAO,CAAC,kBAAkB,EAAE;AAAA,+CACpC,GAAG;AAAA,gDACF,GAAG;AAAA;AAEnD;AAGA,SAAS,oBAAoB,SAA8B,YAA4B;AACrF,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,QAAQ,UAAU,YAAY,UAAU,QAAQ,OAAO,CAAC,eAAe,EAAE;AAAA,YACjE,UAAU;AAAA;AAAA;AAGtB;AAGA,eAAsB,qBACpB,QACA,UACA,UAA+B,CAAC,GACH;AAC7B,QAAM,WAAW,WACb,cAAc,QAAQ,IACpB,WACA,KAAK,OAAO,GAAG,QAAQ,IACzB,YAAY;AAEhB,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,SAAS,OAAO,OAAO,qBAAqB;AAAA,EACvD;AAEA,MAAI;AACF,UAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAGlD,QAAI;AACF,YAAM,YAAY,MAAM,OAAO,WAAW;AAC1C,aAAO,MAAM,sBAAsB,QAAQ,UAAU,SAAS,UAAU,OAAO;AAAA,IACjF,QAAQ;AAEN,cAAQ,IAAI,6EAA6E;AACzF,aAAO,MAAM,gBAAgB,QAAQ,UAAU,OAAO;AAAA,IACxD;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAGA,eAAe,sBACb,QACA,UACA,SACA,WAC6B;AAC7B,QAAM,OAAO,IAAI,UAAU;AAG3B,MAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AACxC,MAAI,QAAQ,OAAQ,MAAK,SAAS,QAAQ;AAC1C,MAAI,QAAQ,QAAS,MAAK,UAAU,QAAQ;AAC5C,MAAI,QAAQ,QAAS,MAAK,UAAU,QAAQ;AAG5C,MAAI,QAAQ,WAAW,cAAc;AACnC,SAAK,SAAS;AAAA,EAChB,OAAO;AACL,SAAK,SAAS;AAAA,EAChB;AAEA,QAAM,QAAQ,EAAE,GAAG,eAAe,GAAG,QAAQ,MAAM;AAEnD,aAAW,aAAa,QAAQ;AAC9B,UAAM,QAAQ,KAAK,SAAS;AAG5B,QAAI,UAAU,iBAAiB;AAC7B,YAAM,aAAa,EAAE,OAAO,UAAU,gBAAgB,QAAQ,KAAK,EAAE,EAAE;AAAA,IACzE;AAGA,QAAI,UAAU,OAAO;AACnB,YAAM,SAAS,UAAU,WAAW,UAAU,QAAQ;AACtD,YAAM,WAAW,UAAU,WAAW,UAAU,KAAK;AAErD,YAAM,QAAQ,UAAU,OAAO;AAAA,QAC7B,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,QACA,MAAM;AAAA,QACN,OAAO,MAAM,YAAY,QAAQ,KAAK,EAAE;AAAA,QACxC,UAAU,MAAM;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,UAAU,YAAY,UAAU,WAAW,SAAS;AACtD,YAAM,QAAQ,UAAU,UAAU;AAAA,QAChC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,UAAU;AAAA,QACV,OAAO,MAAM,WAAW,QAAQ,KAAK,EAAE;AAAA,QACvC,UAAU,MAAM;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,UAAU,SAAS;AACrB,iBAAW,WAAW,UAAU,SAAS;AACvC,gCAAwB,OAAO,SAAS,KAAK;AAAA,MAC/C;AAAA,IACF;AAGA,QAAI,UAAU,OAAO;AACnB,YAAM,SAAS,UAAU,KAAK;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,KAAK,UAAU,EAAE,UAAU,SAAS,CAAC;AAC3C,SAAO,EAAE,SAAS,MAAM,SAAS;AACnC;AAGA,SAAS,wBACP,OACA,SACA,OACM;AACN,QAAM,IAAI,QAAQ,MAAM,SAAY,GAAG,QAAQ,CAAC,MAAM;AACtD,QAAM,IAAI,QAAQ,MAAM,SAAY,GAAG,QAAQ,CAAC,MAAM;AACtD,QAAM,IAAI,QAAQ,UAAU,SAAY,GAAG,QAAQ,KAAK,MAAM;AAC9D,QAAM,IAAI,QAAQ,WAAW,SAAY,GAAG,QAAQ,MAAM,MAAM;AAEhE,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,YAAM,QAAQ,QAAQ,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,QAAQ,YAAY;AAAA,QAC9B,UAAU,QAAQ,YAAY,MAAM;AAAA,QACpC,OAAO,QAAQ,OAAO,QAAQ,KAAK,EAAE,KAAK,MAAM,WAAW,QAAQ,KAAK,EAAE;AAAA,QAC1E,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ,YAAY,EAAE,OAAO,MAAM,IAAI;AAAA,QAClD,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD;AAAA,IAEF,KAAK;AACH,YAAM;AAAA,QACJ,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,UAC3B,MAAM;AAAA,UACN,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE;AAAA,QACxC,EAAE;AAAA,QACF;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,QAAQ,YAAY;AAAA,UAC9B,OAAO,QAAQ,OAAO,QAAQ,KAAK,EAAE,KAAK,MAAM,WAAW,QAAQ,KAAK,EAAE;AAAA,QAC5E;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,YAAM;AAAA,QACJ,QAAQ,MAAM,IAAI,CAAC,MAAM,SAAS;AAAA,UAChC,MAAM;AAAA,UACN,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,eAAe,QAAQ,eAAe,EAAE,EAAE;AAAA,QACjF,EAAE;AAAA,QACF;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,QAAQ,YAAY;AAAA,UAC9B,OAAO,QAAQ,OAAO,QAAQ,KAAK,EAAE,KAAK,MAAM,WAAW,QAAQ,KAAK,EAAE;AAAA,QAC5E;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,YAAM,YAAwB,CAAC;AAC/B,UAAI,QAAQ,SAAS;AACnB,kBAAU,KAAK,QAAQ,OAAO;AAAA,MAChC;AACA,gBAAU,KAAK,GAAG,QAAQ,IAAI;AAE9B,YAAM,SAAS,WAAW;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,EAAE,OAAO,QAAQ,aAAa,QAAQ,KAAK,EAAE,KAAK,SAAS;AAAA,QACnE,MAAM,EAAE,OAAO,SAAS;AAAA,QACxB,UAAU,MAAM;AAAA,QAChB,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IAEF,KAAK;AACH,YAAM,eAAwF;AAAA,QAC5F,WAAW;AAAA,QACX,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAEA,YAAM,SAAS,aAAa,QAAQ,SAAS,KAAK,QAAQ;AAAA,QACxD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,EAAE,OAAO,QAAQ,MAAM,QAAQ,KAAK,EAAE,KAAK,MAAM,aAAa,QAAQ,KAAK,EAAE,EAAE;AAAA,QACrF,MAAM;AAAA,UACJ,OAAO,QAAQ,QAAQ,QAAQ,KAAK,EAAE,KAAK,QAAQ,MAAM,QAAQ,KAAK,EAAE,KAAK,MAAM,aAAa,QAAQ,KAAK,EAAE;AAAA,UAC/G,OAAO,QAAQ,eAAe;AAAA,QAChC;AAAA,MACF,CAAC;AAED,UAAI,QAAQ,MAAM;AAChB,cAAM,QAAQ,QAAQ,MAAM;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO,QAAQ,WAAW,QAAQ,KAAK,EAAE,KAAK;AAAA,QAChD,CAAC;AAAA,MACH;AACA;AAAA,IAEF,KAAK;AAEH,YAAM,QAAQ,WAAW,QAAQ,IAAI,KAAK;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,OAAO,SAAS;AAAA,MAC1B,CAAC;AACD;AAAA,IAEF,KAAK;AAEH,YAAM,QAAQ,IAAI,QAAQ,SAAS,WAAW,QAAQ,SAAS,MAAM,KAAK;AAAA,QACxE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,OAAO,SAAS;AAAA,MAC1B,CAAC;AACD;AAAA,EACJ;AACF;AAGA,eAAe,gBACb,QACA,UACA,SAC6B;AAC7B,QAAM,eAAe,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AACtD,QAAM,QAAQ,EAAE,GAAG,eAAe,GAAG,aAAa,MAAM;AAExD,MAAI;AAEF,UAAM,WAAW,MAAM,OAAO,wBAAU;AACxC,UAAM,KAAK,MAAM,OAAO,IAAI;AAE5B,UAAM,SAAS,GAAG,kBAAkB,QAAQ;AAC5C,UAAM,UAAU,SAAS,QAAQ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;AAE9D,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,aAAO,GAAG,SAAS,MAAM;AACvB,gBAAQ,EAAE,SAAS,MAAM,SAAS,CAAC;AAAA,MACrC,CAAC;AAED,cAAQ,GAAG,SAAS,CAAC,QAAe;AAClC,gBAAQ,EAAE,SAAS,OAAO,OAAO,IAAI,QAAQ,CAAC;AAAA,MAChD,CAAC;AAED,cAAQ,KAAK,MAAM;AAGnB,cAAQ,OAAO,wBAAwB,OAAO,MAAM,GAAG,EAAE,MAAM,sBAAsB,CAAC;AACtF,cAAQ,OAAO,oBAAoB,GAAG,EAAE,MAAM,cAAc,CAAC;AAC7D,cAAQ,OAAO,wBAAwB,OAAO,QAAQ,YAAY,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACrG,cAAQ,OAAO,4BAA4B,OAAO,MAAM,GAAG,EAAE,MAAM,kCAAkC,CAAC;AACtG,cAAQ,OAAO,iBAAiB,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACxE,cAAQ,OAAO,uBAAuB,OAAO,aAAa,UAAU,aAAa,GAAG,EAAE,MAAM,oCAAoC,CAAC;AACjI,cAAQ,OAAO,2BAA2B,GAAG,EAAE,MAAM,+CAA+C,CAAC;AACrG,cAAQ,OAAO,uBAAuB,OAAO,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAC7F,cAAQ,OAAO,uBAAuB,SAAS,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAC/F,cAAQ,OAAO,2BAA2B,GAAG,EAAE,MAAM,+CAA+C,CAAC;AACrG,cAAQ,OAAO,2BAA2B,GAAG,EAAE,MAAM,+CAA+C,CAAC;AAGrG,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,gBAAQ,OAAO,iBAAiB,OAAO,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG,EAAE,MAAM,mBAAmB,IAAI,CAAC,OAAO,CAAC;AACzG,gBAAQ,OAAO,qBAAqB,IAAI,CAAC,GAAG,EAAE,MAAM,yBAAyB,IAAI,CAAC,YAAY,CAAC;AAAA,MACjG;AAGA,cAAQ,OAAO,qBAAqB,YAAY,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAChF,cAAQ,OAAO,oBAAoB,cAAc,OAAO,MAAM,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7F,cAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH,QAAQ;AAEN,UAAM,UAAU,SAAS,QAAQ,SAAS,MAAM;AAChD,QAAI,UAAU,iBAAiB,QAAQ,SAAS,UAAU;AAAA,EAAK,IAAI,OAAO,EAAE,CAAC;AAAA;AAAA;AAE7E,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,QAAQ,OAAO,CAAC;AACtB,iBAAW,aAAa,IAAI,CAAC;AAAA;AAC7B,UAAI,MAAM,MAAO,YAAW,UAAU,MAAM,KAAK;AAAA;AACjD,UAAI,MAAM,SAAU,YAAW,aAAa,MAAM,QAAQ;AAAA;AAC1D,UAAI,MAAM,SAAS;AACjB,mBAAW;AACX,mBAAW,WAAW,MAAM,SAAS;AACnC,cAAI,UAAU,WAAW,QAAQ,SAAS,OAAQ,YAAW,KAAK,QAAQ,IAAI;AAAA;AAC9E,cAAI,WAAW,QAAS,YAAW,QAAQ,MAAM,IAAI,CAAC,SAAiB,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,QACrG;AAAA,MACF;AACA,iBAAW;AAAA,IACb;AAEA,UAAM,UAAU,SAAS,SAAS,OAAO;AACzC,WAAO,EAAE,SAAS,MAAM,UAAU,QAAQ;AAAA,EAC5C;AACF;AAGA,eAAsB,kBACpB,OACA,SACA,UACA,SAC6B;AAC7B,QAAM,SAAkB;AAAA,IACtB;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,SAAS,SAAS,MAAM,QAAQ,MAAM,KAAK;AAAA,IACvD;AAAA,EACF;AAEA,aAAW,WAAW,SAAS;AAC7B,WAAO,KAAK;AAAA,MACV,QAAQ;AAAA,MACR,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ,UACb,CAAC,EAAE,MAAM,eAAe,OAAO,QAAQ,QAAQ,CAAC,IAChD;AAAA,IACN,CAAC;AAAA,EACH;AAEA,SAAO,qBAAqB,QAAQ,UAAU,OAAO;AACvD;AAGA,eAAsB,aACpB,QACA,UACA,SAC6B;AAC7B,SAAO,qBAAqB,QAAQ,UAAU,OAAO;AACvD;AAEA,IAAO,wBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -1,63 +0,0 @@
1
- import {
2
- cancelTask,
3
- connection,
4
- generateBriefing,
5
- getQueueStats,
6
- initializeScheduler,
7
- maintenanceQueue,
8
- scheduleRecurring,
9
- scheduleReminder,
10
- scheduleTask,
11
- scheduleUserMaintenance,
12
- shutdownScheduler,
13
- startMaintenanceWorker,
14
- startWorker,
15
- stopMaintenanceWorker,
16
- stopWorker,
17
- taskQueue
18
- } from "./chunk-AYUKPTSM.js";
19
- import "./chunk-766ASQWE.js";
20
- import "./chunk-IZJMVV7O.js";
21
- import "./chunk-6PMVAAA7.js";
22
- import "./chunk-MQJ2ECQT.js";
23
- import "./chunk-TVEWKIK3.js";
24
- import "./chunk-BRBWNV65.js";
25
- import "./chunk-H5RQOFO2.js";
26
- import "./chunk-VRD5CYRL.js";
27
- import "./chunk-KM22GV7G.js";
28
- import "./chunk-P6QINGFL.js";
29
- import "./chunk-HN3F4WSW.js";
30
- import "./chunk-SVAPX2XN.js";
31
- import "./chunk-WRAKK6K6.js";
32
- import "./chunk-7WQO5J2M.js";
33
- import "./chunk-BXZ6EA52.js";
34
- import "./chunk-4GLYY4NN.js";
35
- import "./chunk-EVE7MIIY.js";
36
- import "./chunk-RZ4YESBG.js";
37
- import "./chunk-CQ4JURG7.js";
38
- import "./chunk-OCVQGBJK.js";
39
- import "./chunk-XKYRH4FM.js";
40
- import "./chunk-ZLZKF2PM.js";
41
- import "./chunk-6KONMXQ6.js";
42
- import "./chunk-22VGGA7S.js";
43
- import "./chunk-35WYTA3C.js";
44
- import "./chunk-PLDDJCW6.js";
45
- export {
46
- cancelTask,
47
- connection,
48
- generateBriefing,
49
- getQueueStats,
50
- initializeScheduler,
51
- maintenanceQueue,
52
- scheduleRecurring,
53
- scheduleReminder,
54
- scheduleTask,
55
- scheduleUserMaintenance,
56
- shutdownScheduler,
57
- startMaintenanceWorker,
58
- startWorker,
59
- stopMaintenanceWorker,
60
- stopWorker,
61
- taskQueue
62
- };
63
- //# sourceMappingURL=scheduler-VK4WFERV.js.map
@@ -1,35 +0,0 @@
1
- import {
2
- SignalBot,
3
- signal_default
4
- } from "./chunk-VEHFVBLI.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
- SignalBot,
33
- signal_default as default
34
- };
35
- //# sourceMappingURL=signal-6CGDFYL2.js.map
@@ -1,75 +0,0 @@
1
- import {
2
- SlackBot,
3
- addToSession,
4
- askCommand,
5
- chatCommand,
6
- clearCommand,
7
- clearSession,
8
- createErrorBlocks,
9
- createSlackBot,
10
- createSuccessBlocks,
11
- formatAsBlocks,
12
- getCommand,
13
- getCommandNames,
14
- getSession,
15
- helpCommand,
16
- mainCommand,
17
- remindCommand,
18
- sessions,
19
- slack_default,
20
- slashCommands,
21
- splitMessage,
22
- statusCommand
23
- } from "./chunk-4UOE5TUZ.js";
24
- import "./chunk-SJSUSJ47.js";
25
- import "./chunk-AYUKPTSM.js";
26
- import "./chunk-766ASQWE.js";
27
- import "./chunk-IZJMVV7O.js";
28
- import "./chunk-6PMVAAA7.js";
29
- import "./chunk-MQJ2ECQT.js";
30
- import "./chunk-TVEWKIK3.js";
31
- import "./chunk-BRBWNV65.js";
32
- import "./chunk-H5RQOFO2.js";
33
- import "./chunk-VRD5CYRL.js";
34
- import "./chunk-KM22GV7G.js";
35
- import "./chunk-P6QINGFL.js";
36
- import "./chunk-HN3F4WSW.js";
37
- import "./chunk-SVAPX2XN.js";
38
- import "./chunk-WRAKK6K6.js";
39
- import "./chunk-7WQO5J2M.js";
40
- import "./chunk-BXZ6EA52.js";
41
- import "./chunk-4GLYY4NN.js";
42
- import "./chunk-EVE7MIIY.js";
43
- import "./chunk-RZ4YESBG.js";
44
- import "./chunk-CQ4JURG7.js";
45
- import "./chunk-OCVQGBJK.js";
46
- import "./chunk-XKYRH4FM.js";
47
- import "./chunk-ZLZKF2PM.js";
48
- import "./chunk-6KONMXQ6.js";
49
- import "./chunk-22VGGA7S.js";
50
- import "./chunk-35WYTA3C.js";
51
- import "./chunk-PLDDJCW6.js";
52
- export {
53
- SlackBot,
54
- addToSession,
55
- askCommand,
56
- chatCommand,
57
- clearCommand,
58
- clearSession,
59
- createErrorBlocks,
60
- createSlackBot,
61
- createSuccessBlocks,
62
- slack_default as default,
63
- formatAsBlocks,
64
- getCommand,
65
- getCommandNames,
66
- getSession,
67
- helpCommand,
68
- mainCommand,
69
- remindCommand,
70
- sessions,
71
- slashCommands,
72
- splitMessage,
73
- statusCommand
74
- };
75
- //# sourceMappingURL=slack-IZQWIKOH.js.map