opensentinel 3.1.1 → 3.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -83
- package/dist/agent-manager-7N7REQZQ.js +39 -0
- package/dist/agent-processor-I23VWQY3.js +280 -0
- package/dist/agent-processor-I23VWQY3.js.map +1 -0
- package/dist/agent-types-2T4PXLFQ.js +12 -0
- package/dist/alerting-4I37GG4U.js +699 -0
- package/dist/alerting-4I37GG4U.js.map +1 -0
- package/dist/analysis-agent-JWN2GXYE.js +288 -0
- package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
- package/dist/{archiver-AVNBYCKQ.js → archiver-XLRIIXPY.js} +86 -17
- package/dist/archiver-XLRIIXPY.js.map +1 -0
- package/dist/{audit-logger-OBPR7CRO.js → audit-logger-AU3TMWKI.js} +6 -5
- package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
- package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
- package/dist/autonomy-N7W5XPLX.js.map +1 -0
- package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
- package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
- package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
- package/dist/bot-MU2TJQ3Y.js +46 -0
- package/dist/brain-SLA474EU.js +65 -0
- package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
- package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
- package/dist/{chunk-6PMVAAA7.js → chunk-2RGPWU77.js} +3 -3
- package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
- package/dist/{chunk-MXAPLSJ5.js → chunk-45YXODSB.js} +2 -2
- package/dist/{chunk-SJSUSJ47.js → chunk-4YJRBMMA.js} +2 -2
- package/dist/chunk-643M3AP5.js +564 -0
- package/dist/chunk-643M3AP5.js.map +1 -0
- package/dist/{chunk-766ASQWE.js → chunk-6JY4HNUH.js} +2413 -2368
- package/dist/chunk-6JY4HNUH.js.map +1 -0
- package/dist/chunk-6LTLIYAQ.js +194 -0
- package/dist/chunk-6LTLIYAQ.js.map +1 -0
- package/dist/chunk-6UZPE35A.js +724 -0
- package/dist/chunk-6UZPE35A.js.map +1 -0
- package/dist/chunk-6W6PTJFT.js +181 -0
- package/dist/chunk-6W6PTJFT.js.map +1 -0
- package/dist/chunk-7MZN73J2.js +162 -0
- package/dist/chunk-7MZN73J2.js.map +1 -0
- package/dist/{chunk-SVAPX2XN.js → chunk-A24GPVLY.js} +9 -7
- package/dist/{chunk-SVAPX2XN.js.map → chunk-A24GPVLY.js.map} +1 -1
- package/dist/chunk-AD6YEH6U.js +3408 -0
- package/dist/chunk-AD6YEH6U.js.map +1 -0
- package/dist/chunk-ADTDYJO7.js +265 -0
- package/dist/chunk-ADTDYJO7.js.map +1 -0
- package/dist/{chunk-WRAKK6K6.js → chunk-AR34B6XR.js} +5 -3
- package/dist/{chunk-WRAKK6K6.js.map → chunk-AR34B6XR.js.map} +1 -1
- package/dist/chunk-BMOUYXLX.js +418 -0
- package/dist/chunk-BMOUYXLX.js.map +1 -0
- package/dist/chunk-C6PELIHS.js +60 -0
- package/dist/chunk-C6PELIHS.js.map +1 -0
- package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
- package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
- package/dist/chunk-DOYGMNMK.js.map +1 -0
- package/dist/chunk-FFV2SXFD.js +380 -0
- package/dist/chunk-FFV2SXFD.js.map +1 -0
- package/dist/{chunk-EVE7MIIY.js → chunk-GUKKW7JI.js} +15 -16
- package/dist/chunk-GUKKW7JI.js.map +1 -0
- package/dist/{chunk-66OJ3WB4.js → chunk-H3BOLSTS.js} +2 -2
- package/dist/chunk-HKOPRRDJ.js +1021 -0
- package/dist/chunk-HKOPRRDJ.js.map +1 -0
- package/dist/{chunk-BXZ6EA52.js → chunk-HTF2GIQC.js} +57 -3
- package/dist/chunk-HTF2GIQC.js.map +1 -0
- package/dist/{chunk-TYAGMJNV.js → chunk-JOA5A3G3.js} +5 -5
- package/dist/{chunk-OCVQGBJK.js → chunk-KABG5PG3.js} +6 -4
- package/dist/{chunk-OCVQGBJK.js.map → chunk-KABG5PG3.js.map} +1 -1
- package/dist/{chunk-VEHFVBLI.js → chunk-KT7NLIXP.js} +2 -2
- package/dist/chunk-LFDXEYYB.js +150 -0
- package/dist/chunk-LFDXEYYB.js.map +1 -0
- package/dist/{chunk-I6BDYQIG.js → chunk-M7YLQHFP.js} +6 -6
- package/dist/chunk-M7YLQHFP.js.map +1 -0
- package/dist/{chunk-AYUKPTSM.js → chunk-MFK34XSY.js} +96 -218
- package/dist/chunk-MFK34XSY.js.map +1 -0
- package/dist/chunk-MIC5IBQF.js +386 -0
- package/dist/chunk-MIC5IBQF.js.map +1 -0
- package/dist/{chunk-4UOE5TUZ.js → chunk-NMSHVO5O.js} +4 -4
- package/dist/{chunk-XKYRH4FM.js → chunk-NYVBXUGD.js} +13 -32
- package/dist/chunk-NYVBXUGD.js.map +1 -0
- package/dist/chunk-ODCFS5WD.js +463 -0
- package/dist/chunk-ODCFS5WD.js.map +1 -0
- package/dist/{chunk-ZLZKF2PM.js → chunk-PUNIMPMY.js} +32 -2
- package/dist/chunk-PUNIMPMY.js.map +1 -0
- package/dist/chunk-S4NJJS5C.js +37 -0
- package/dist/chunk-S4NJJS5C.js.map +1 -0
- package/dist/{chunk-NHMBTUMW.js → chunk-TAAZB5KN.js} +2 -2
- package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
- package/dist/chunk-U2X2J3FI.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
- package/dist/{chunk-4GLYY4NN.js → chunk-UWUIJTT4.js} +8 -2
- package/dist/chunk-UWUIJTT4.js.map +1 -0
- package/dist/{chunk-SPPMCAKG.js → chunk-VKMFUIVA.js} +2 -2
- package/dist/chunk-VKMFUIVA.js.map +1 -0
- package/dist/chunk-WZAH34TG.js +129 -0
- package/dist/chunk-WZAH34TG.js.map +1 -0
- package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
- package/dist/chunk-X6Q3K3L2.js.map +1 -0
- package/dist/chunk-XTX7EK43.js +134 -0
- package/dist/chunk-XTX7EK43.js.map +1 -0
- package/dist/chunk-ZIYTHUM5.js +457 -0
- package/dist/chunk-ZIYTHUM5.js.map +1 -0
- package/dist/chunker-K6WTR62A.js +12 -0
- package/dist/cli.js +1 -1
- package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
- package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
- package/dist/coding-agent-DESSU3AC.js +233 -0
- package/dist/coding-agent-DESSU3AC.js.map +1 -0
- package/dist/commands/setup.js +1 -1
- package/dist/commands/start.js +2 -2
- package/dist/commands/status.js +1 -1
- package/dist/commands/stop.js +1 -1
- package/dist/commands/utils.js +1 -1
- package/dist/cost-tracker-EMOIOYH7.js +11 -0
- package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
- package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
- package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
- package/dist/db-LRIOKQBO.js +77 -0
- package/dist/discord-NKR3X4AV.js +80 -0
- package/dist/documents-EYIYLZK2.js +184 -0
- package/dist/documents-EYIYLZK2.js.map +1 -0
- package/dist/docx-parser-EXL4TN5E.js +16 -0
- package/dist/{email-K7LO2IPB.js → email-EAQNULVD.js} +33 -25
- package/dist/{email-K7LO2IPB.js.map → email-EAQNULVD.js.map} +1 -1
- package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-OGHT6TS5.js} +11 -8
- package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-OGHT6TS5.js.map} +1 -1
- package/dist/enrichment-pipeline-CMUVBDC7.js +14 -0
- package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-4X4JU43O.js} +6 -5
- package/dist/env-CHOFICED.js +12 -0
- package/dist/error-tracker-SVQSDQDW.js +32 -0
- package/dist/finnhub-X7ZMQSXF.js +178 -0
- package/dist/finnhub-X7ZMQSXF.js.map +1 -0
- package/dist/fred-TMUF3J2V.js +203 -0
- package/dist/fred-TMUF3J2V.js.map +1 -0
- package/dist/github-KGNILDWJ.js +833 -0
- package/dist/github-KGNILDWJ.js.map +1 -0
- package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
- package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
- package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
- package/dist/hooks-N4MIFBVM.js +14 -0
- package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
- package/dist/imessage-V2XNDDHT.js +43 -0
- package/dist/inbox-summarizer-DKKRYXDR.js +55 -0
- package/dist/{incident-response-C5J7Q6DT.js → incident-response-ZTIKUWEO.js} +8 -6
- package/dist/{incident-response-C5J7Q6DT.js.map → incident-response-ZTIKUWEO.js.map} +1 -1
- package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
- package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
- package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
- package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
- package/dist/knowledge-base-J7PJ7MZ3.js +46 -0
- package/dist/lib.d.ts +73 -1
- package/dist/lib.js +86 -76
- package/dist/lib.js.map +1 -1
- package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
- package/dist/{matrix-QVHG76I7.js → matrix-XHTR53VQ.js} +29 -21
- package/dist/{matrix-QVHG76I7.js.map → matrix-XHTR53VQ.js.map} +1 -1
- package/dist/{mcp-3JI6W7ZE.js → mcp-3C2TN67D.js} +3 -3
- package/dist/metrics-VJDWQWU7.js +25 -0
- package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
- package/dist/multi-user-S56GUD6L.js +411 -0
- package/dist/multi-user-S56GUD6L.js.map +1 -0
- package/dist/{ocr-AC7NPX33.js → ocr-LGUIPKVZ.js} +6 -4
- package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
- package/dist/osint-agent-RL5XPBRQ.js +189 -0
- package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
- package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
- package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
- package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
- package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
- package/dist/pdf-parser-YLMTTYHL.js +14 -0
- package/dist/{presentations-DSV5IHG5.js → presentations-HXTAMGHT.js} +3 -3
- package/dist/presentations-HXTAMGHT.js.map +1 -0
- package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
- package/dist/{providers-J4LYPHDR.js → providers-H6YIC3MG.js} +6 -4
- package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
- package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
- package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
- package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
- package/dist/research-agent-WCRSY3UZ.js +168 -0
- package/dist/research-agent-WCRSY3UZ.js.map +1 -0
- package/dist/risk-engine-YKCPT5D5.js +10 -0
- package/dist/risk-engine-YKCPT5D5.js.map +1 -0
- package/dist/scheduler-CA5UNHZV.js +73 -0
- package/dist/scheduler-CA5UNHZV.js.map +1 -0
- package/dist/schema-ALJ67YVG.js +72 -0
- package/dist/schema-ALJ67YVG.js.map +1 -0
- package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
- package/dist/search-GMLKBHSW.js.map +1 -0
- package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
- package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
- package/dist/signal-X7IQJGRQ.js +43 -0
- package/dist/signal-X7IQJGRQ.js.map +1 -0
- package/dist/slack-P2LFUJUQ.js +85 -0
- package/dist/slack-P2LFUJUQ.js.map +1 -0
- package/dist/{sms-M3JIOTCW.js → sms-4VME2HUL.js} +4 -4
- package/dist/sms-4VME2HUL.js.map +1 -0
- package/dist/{src-VYUE6LRA.js → src-S5KX4YEV.js} +179 -48
- package/dist/src-S5KX4YEV.js.map +1 -0
- package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
- package/dist/stocks-4M4HZWZS.js.map +1 -0
- package/dist/text-extractor-OAUBAW5P.js +12 -0
- package/dist/text-extractor-OAUBAW5P.js.map +1 -0
- package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
- package/dist/text-transform-HCLCUDFZ.js.map +1 -0
- package/dist/tools-FGPN522P.js +46 -0
- package/dist/tools-FGPN522P.js.map +1 -0
- package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
- package/dist/tunnel-XOUVVRAK.js.map +1 -0
- package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
- package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
- package/dist/unit-converter-LYPAHU64.js.map +1 -0
- package/dist/whatsapp-KRPQ4YUX.js +43 -0
- package/dist/whatsapp-KRPQ4YUX.js.map +1 -0
- package/dist/{word-document-7B6SJMAY.js → word-document-D6N2C47N.js} +4 -4
- package/dist/word-document-D6N2C47N.js.map +1 -0
- package/dist/workflow-store-ZYAYE5P6.js +373 -0
- package/dist/workflow-store-ZYAYE5P6.js.map +1 -0
- package/dist/writing-agent-VDGLNOGO.js +243 -0
- package/dist/writing-agent-VDGLNOGO.js.map +1 -0
- package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
- package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
- package/package.json +11 -1
- package/dist/archiver-AVNBYCKQ.js.map +0 -1
- package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
- package/dist/bot-QRARP4UN.js +0 -36
- package/dist/brain-7XLLM3KC.js +0 -56
- package/dist/chunk-4GLYY4NN.js.map +0 -1
- package/dist/chunk-766ASQWE.js.map +0 -1
- package/dist/chunk-AYUKPTSM.js.map +0 -1
- package/dist/chunk-BRBWNV65.js.map +0 -1
- package/dist/chunk-BXZ6EA52.js.map +0 -1
- package/dist/chunk-EVE7MIIY.js.map +0 -1
- package/dist/chunk-H5RQOFO2.js.map +0 -1
- package/dist/chunk-I6BDYQIG.js.map +0 -1
- package/dist/chunk-IZJMVV7O.js +0 -347
- package/dist/chunk-IZJMVV7O.js.map +0 -1
- package/dist/chunk-O7IH7JTI.js +0 -1898
- package/dist/chunk-O7IH7JTI.js.map +0 -1
- package/dist/chunk-RZ4YESBG.js.map +0 -1
- package/dist/chunk-SPPMCAKG.js.map +0 -1
- package/dist/chunk-VRD5CYRL.js +0 -1568
- package/dist/chunk-VRD5CYRL.js.map +0 -1
- package/dist/chunk-XKYRH4FM.js.map +0 -1
- package/dist/chunk-ZLZKF2PM.js.map +0 -1
- package/dist/discord-B3HUPGQ6.js +0 -70
- package/dist/dist-UISMLMFN.js +0 -21847
- package/dist/dist-UISMLMFN.js.map +0 -1
- package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
- package/dist/env-IWXUVTCB.js +0 -12
- package/dist/imessage-NGA2XF2V.js +0 -35
- package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
- package/dist/presentations-DSV5IHG5.js.map +0 -1
- package/dist/scheduler-VK4WFERV.js +0 -63
- package/dist/signal-6CGDFYL2.js +0 -35
- package/dist/slack-IZQWIKOH.js +0 -75
- package/dist/src-VYUE6LRA.js.map +0 -1
- package/dist/tools-2RLEI2N6.js +0 -38
- package/dist/tunnel-IWMXUML4.js.map +0 -1
- package/dist/whatsapp-LFX6YKCM.js +0 -35
- package/dist/word-document-7B6SJMAY.js.map +0 -1
- /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-7N7REQZQ.js.map} +0 -0
- /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
- /package/dist/{backup-restore-PZ7CYYB7.js.map → audit-logger-AU3TMWKI.js.map} +0 -0
- /package/dist/{blocks-R3PODY47.js.map → auth-PH5IHISW.js.map} +0 -0
- /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
- /package/dist/{bot-QRARP4UN.js.map → backup-restore-72OQTZO3.js.map} +0 -0
- /package/dist/{brain-7XLLM3KC.js.map → blocks-YOWOESDD.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → bot-MU2TJQ3Y.js.map} +0 -0
- /package/dist/{client-ZQSFPMOB.js.map → brain-SLA474EU.js.map} +0 -0
- /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
- /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
- /package/dist/{chunk-6PMVAAA7.js.map → chunk-2RGPWU77.js.map} +0 -0
- /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
- /package/dist/{chunk-MXAPLSJ5.js.map → chunk-45YXODSB.js.map} +0 -0
- /package/dist/{chunk-SJSUSJ47.js.map → chunk-4YJRBMMA.js.map} +0 -0
- /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
- /package/dist/{chunk-66OJ3WB4.js.map → chunk-H3BOLSTS.js.map} +0 -0
- /package/dist/{chunk-TYAGMJNV.js.map → chunk-JOA5A3G3.js.map} +0 -0
- /package/dist/{chunk-VEHFVBLI.js.map → chunk-KT7NLIXP.js.map} +0 -0
- /package/dist/{chunk-4UOE5TUZ.js.map → chunk-NMSHVO5O.js.map} +0 -0
- /package/dist/{chunk-NHMBTUMW.js.map → chunk-TAAZB5KN.js.map} +0 -0
- /package/dist/{clipboard-manager-TEO2GEDN.js.map → chunk-UP2VWCW5.js.map} +0 -0
- /package/dist/{cron-explain-HHQKPD3M.js.map → chunker-K6WTR62A.js.map} +0 -0
- /package/dist/{crypto-4AP47IKC.js.map → client-FOIYPOZQ.js.map} +0 -0
- /package/dist/{databases-37X4CI2Y.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
- /package/dist/{discord-B3HUPGQ6.js.map → cost-tracker-EMOIOYH7.js.map} +0 -0
- /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
- /package/dist/{entity-resolution-Y3IUWEAT.js.map → crypto-2VG3RJR2.js.map} +0 -0
- /package/dist/{env-IWXUVTCB.js.map → databases-XDPMG5AV.js.map} +0 -0
- /package/dist/{hash-tool-ULQYD7B5.js.map → db-LRIOKQBO.js.map} +0 -0
- /package/dist/{heartbeat-monitor-GCISLXI3.js.map → discord-NKR3X4AV.js.map} +0 -0
- /package/dist/{imessage-NGA2XF2V.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
- /package/dist/{inbox-summarizer-NRI4S7IF.js.map → enrichment-pipeline-CMUVBDC7.js.map} +0 -0
- /package/dist/{inventory-manager-352OHXWD.js.map → entity-resolution-4X4JU43O.js.map} +0 -0
- /package/dist/{json-tool-QE2SYHEG.js.map → env-CHOFICED.js.map} +0 -0
- /package/dist/{key-rotation-DPHU4ZTB.js.map → error-tracker-SVQSDQDW.js.map} +0 -0
- /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
- /package/dist/{mcp-3JI6W7ZE.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
- /package/dist/{ocr-AC7NPX33.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
- /package/dist/{ollama-BOAMSPLJ.js.map → hooks-N4MIFBVM.js.map} +0 -0
- /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
- /package/dist/{pages-MI523RB7.js.map → imessage-V2XNDDHT.js.map} +0 -0
- /package/dist/{pairing-IFQYCPNS.js.map → inbox-summarizer-DKKRYXDR.js.map} +0 -0
- /package/dist/{pdf-ALQVOEJR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
- /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
- /package/dist/{prometheus-JNT2BD4L.js.map → json-tool-4FK5RNER.js.map} +0 -0
- /package/dist/{providers-J4LYPHDR.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
- /package/dist/{qr-code-WIX4PB4U.js.map → knowledge-base-J7PJ7MZ3.js.map} +0 -0
- /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
- /package/dist/{regex-tool-W4ABRKGK.js.map → mcp-3C2TN67D.js.map} +0 -0
- /package/dist/{scheduler-VK4WFERV.js.map → metrics-VJDWQWU7.js.map} +0 -0
- /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
- /package/dist/{search-BCLBO5E3.js.map → ocr-LGUIPKVZ.js.map} +0 -0
- /package/dist/{signal-6CGDFYL2.js.map → ollama-J7CU45WT.js.map} +0 -0
- /package/dist/{slack-IZQWIKOH.js.map → pages-XDE7JRCA.js.map} +0 -0
- /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
- /package/dist/{sms-M3JIOTCW.js.map → pairing-77N47RAT.js.map} +0 -0
- /package/dist/{stocks-XXWBPOCU.js.map → pdf-67HGXCFJ.js.map} +0 -0
- /package/dist/{text-transform-6SGUA5Z4.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
- /package/dist/{tools-2RLEI2N6.js.map → prometheus-YETCZO4I.js.map} +0 -0
- /package/dist/{unit-converter-ZYXMEZOE.js.map → providers-H6YIC3MG.js.map} +0 -0
- /package/dist/{whatsapp-LFX6YKCM.js.map → qr-code-6WZJHRKL.js.map} +0 -0
- /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
- /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
- /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
- /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
- /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
- /package/dist/{zapier-webhook-TBZ5YF2A.js.map → zapier-webhook-NIELLTXR.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/tunnel/cloudflare.ts","../src/core/tunnel/ngrok.ts","../src/core/tunnel/localtunnel.ts","../src/core/tunnel/index.ts"],"sourcesContent":["import type { TunnelProvider } from \"./types\";\r\n\r\nexport class CloudflareTunnel implements TunnelProvider {\r\n readonly name = \"cloudflare\";\r\n\r\n private process: ReturnType<typeof Bun.spawn> | null = null;\r\n private publicUrl: string | null = null;\r\n private running = false;\r\n\r\n async start(port: number): Promise<string> {\r\n if (this.running) {\r\n throw new Error(\"Cloudflare tunnel is already running\");\r\n }\r\n\r\n const urlPattern = /https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/;\r\n\r\n return new Promise<string>((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n this.stop().catch(() => {});\r\n reject(\r\n new Error(\r\n \"Timed out waiting for Cloudflare tunnel URL (15s). Is cloudflared installed?\"\r\n )\r\n );\r\n }, 15_000);\r\n\r\n try {\r\n this.process = Bun.spawn(\r\n [\"cloudflared\", \"tunnel\", \"--url\", `http://localhost:${port}`],\r\n {\r\n stdout: \"pipe\",\r\n stderr: \"pipe\",\r\n }\r\n );\r\n\r\n this.running = true;\r\n\r\n // cloudflared outputs the URL on stderr\r\n const readStderr = async () => {\r\n if (!this.process?.stderr) return;\r\n if (typeof this.process.stderr === \"number\") return;\r\n\r\n const reader = this.process.stderr.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n const match = buffer.match(urlPattern);\r\n if (match) {\r\n this.publicUrl = match[0];\r\n clearTimeout(timeout);\r\n resolve(this.publicUrl);\r\n return;\r\n }\r\n }\r\n } catch {\r\n // Process may have been killed; ignore read errors\r\n }\r\n };\r\n\r\n // Also check stdout in case cloudflared version outputs there\r\n const readStdout = async () => {\r\n if (!this.process?.stdout) return;\r\n if (typeof this.process.stdout === \"number\") return;\r\n\r\n const reader = this.process.stdout.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n const match = buffer.match(urlPattern);\r\n if (match && !this.publicUrl) {\r\n this.publicUrl = match[0];\r\n clearTimeout(timeout);\r\n resolve(this.publicUrl);\r\n return;\r\n }\r\n }\r\n } catch {\r\n // Process may have been killed; ignore read errors\r\n }\r\n };\r\n\r\n readStderr();\r\n readStdout();\r\n\r\n // Handle process exit before URL is found\r\n this.process.exited.then((code) => {\r\n if (!this.publicUrl) {\r\n this.running = false;\r\n clearTimeout(timeout);\r\n reject(\r\n new Error(`cloudflared exited with code ${code} before providing a URL`)\r\n );\r\n }\r\n });\r\n } catch (err: any) {\r\n clearTimeout(timeout);\r\n this.running = false;\r\n reject(new Error(`Failed to spawn cloudflared: ${err.message}`));\r\n }\r\n });\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.process) {\r\n try {\r\n this.process.kill();\r\n await this.process.exited;\r\n } catch {\r\n // Process may already be dead\r\n }\r\n this.process = null;\r\n }\r\n this.running = false;\r\n this.publicUrl = null;\r\n }\r\n\r\n getPublicUrl(): string | null {\r\n return this.publicUrl;\r\n }\r\n\r\n isRunning(): boolean {\r\n return this.running;\r\n }\r\n}\r\n","import type { TunnelProvider } from \"./types\";\n\ninterface NgrokApiTunnel {\n public_url: string;\n proto: string;\n config: { addr: string };\n}\n\ninterface NgrokApiResponse {\n tunnels: NgrokApiTunnel[];\n}\n\nexport class NgrokTunnel implements TunnelProvider {\n readonly name = \"ngrok\";\n\n private process: ReturnType<typeof Bun.spawn> | null = null;\n private publicUrl: string | null = null;\n private running = false;\n private authToken?: string;\n\n constructor(authToken?: string) {\n this.authToken = authToken;\n }\n\n async start(port: number): Promise<string> {\n if (this.running) {\n throw new Error(\"ngrok tunnel is already running\");\n }\n\n const args = [\"ngrok\", \"http\", String(port)];\n if (this.authToken) {\n args.push(\"--authtoken\", this.authToken);\n }\n\n try {\n this.process = Bun.spawn(args, {\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n this.running = true;\n } catch (err: any) {\n throw new Error(`Failed to spawn ngrok: ${err.message}`);\n }\n\n // Handle unexpected early exit\n this.process.exited.then((code) => {\n if (this.running) {\n this.running = false;\n console.warn(`[Tunnel] ngrok exited unexpectedly with code ${code}`);\n }\n });\n\n // Poll the ngrok local API to get the public URL\n const url = await this.pollForUrl(5, 1000);\n if (!url) {\n await this.stop();\n throw new Error(\n \"Failed to retrieve ngrok public URL after 5 retries. Is ngrok installed and working?\"\n );\n }\n\n this.publicUrl = url;\n return this.publicUrl;\n }\n\n private async pollForUrl(\n maxRetries: number,\n delayMs: number\n ): Promise<string | null> {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n await this.sleep(delayMs);\n\n try {\n const response = await fetch(\"http://localhost:4040/api/tunnels\");\n if (!response.ok) continue;\n\n const data = (await response.json()) as NgrokApiResponse;\n const httpsTunnel = data.tunnels.find((t) => t.proto === \"https\");\n const tunnel = httpsTunnel || data.tunnels[0];\n\n if (tunnel?.public_url) {\n return tunnel.public_url;\n }\n } catch {\n // ngrok API not ready yet; retry\n }\n }\n\n return null;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async stop(): Promise<void> {\n if (this.process) {\n try {\n this.process.kill();\n await this.process.exited;\n } catch {\n // Process may already be dead\n }\n this.process = null;\n }\n this.running = false;\n this.publicUrl = null;\n }\n\n getPublicUrl(): string | null {\n return this.publicUrl;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import type { TunnelProvider } from \"./types\";\r\n\r\ninterface LocalTunnelInstance {\r\n url: string;\r\n close(): void;\r\n on(event: string, callback: (...args: any[]) => void): void;\r\n}\r\n\r\ntype LocalTunnelFactory = (opts: {\r\n port: number;\r\n subdomain?: string;\r\n}) => Promise<LocalTunnelInstance>;\r\n\r\nexport class LocalTunnel implements TunnelProvider {\r\n readonly name = \"localtunnel\";\r\n\r\n private tunnel: LocalTunnelInstance | null = null;\r\n private publicUrl: string | null = null;\r\n private running = false;\r\n private subdomain?: string;\r\n\r\n constructor(subdomain?: string) {\r\n this.subdomain = subdomain;\r\n }\r\n\r\n async start(port: number): Promise<string> {\r\n if (this.running) {\r\n throw new Error(\"localtunnel is already running\");\r\n }\r\n\r\n let localtunnel: LocalTunnelFactory;\r\n\r\n try {\r\n // Dynamic import for lazy loading - localtunnel may not be installed\r\n // @ts-expect-error localtunnel has no type declarations\r\n const mod = await import(\"localtunnel\");\r\n localtunnel = (mod.default || mod) as LocalTunnelFactory;\r\n } catch {\r\n throw new Error(\r\n 'localtunnel is not installed. Run \"bun add localtunnel\" to install it.'\r\n );\r\n }\r\n\r\n const opts: { port: number; subdomain?: string } = { port };\r\n if (this.subdomain) {\r\n opts.subdomain = this.subdomain;\r\n }\r\n\r\n try {\r\n this.tunnel = await localtunnel(opts);\r\n } catch (err: any) {\r\n throw new Error(`Failed to create localtunnel: ${err.message}`);\r\n }\r\n\r\n this.publicUrl = this.tunnel.url;\r\n this.running = true;\r\n\r\n // Listen for tunnel close events\r\n this.tunnel.on(\"close\", () => {\r\n this.running = false;\r\n this.publicUrl = null;\r\n });\r\n\r\n // Listen for errors\r\n this.tunnel.on(\"error\", (err: Error) => {\r\n console.warn(`[Tunnel] localtunnel error: ${err.message}`);\r\n this.running = false;\r\n this.publicUrl = null;\r\n });\r\n\r\n return this.publicUrl;\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.tunnel) {\r\n try {\r\n this.tunnel.close();\r\n } catch {\r\n // Tunnel may already be closed\r\n }\r\n this.tunnel = null;\r\n }\r\n this.running = false;\r\n this.publicUrl = null;\r\n }\r\n\r\n getPublicUrl(): string | null {\r\n return this.publicUrl;\r\n }\r\n\r\n isRunning(): boolean {\r\n return this.running;\r\n }\r\n}\r\n","import type { TunnelProvider } from \"./types\";\nimport { CloudflareTunnel } from \"./cloudflare\";\nimport { NgrokTunnel } from \"./ngrok\";\nimport { LocalTunnel } from \"./localtunnel\";\n\nexport function createTunnel(\n provider: string,\n options?: { authToken?: string; subdomain?: string }\n): TunnelProvider {\n switch (provider) {\n case \"cloudflare\":\n return new CloudflareTunnel();\n case \"ngrok\":\n return new NgrokTunnel(options?.authToken);\n case \"localtunnel\":\n return new LocalTunnel(options?.subdomain);\n default:\n throw new Error(`Unknown tunnel provider: ${provider}`);\n }\n}\n\nlet activeTunnel: TunnelProvider | null = null;\n\nexport async function autoStartTunnel(\n port: number,\n provider: string,\n options?: { authToken?: string; subdomain?: string }\n): Promise<string | null> {\n try {\n activeTunnel = createTunnel(provider, options);\n const url = await activeTunnel.start(port);\n console.log(`[Tunnel] Public URL: ${url}`);\n return url;\n } catch (err: any) {\n console.warn(`[Tunnel] Failed to start ${provider}: ${err.message}`);\n activeTunnel = null;\n return null;\n }\n}\n\nexport async function stopTunnel(): Promise<void> {\n if (activeTunnel) {\n await activeTunnel.stop();\n activeTunnel = null;\n }\n}\n\nexport function getActiveTunnel(): TunnelProvider | null {\n return activeTunnel;\n}\n\nexport type { TunnelProvider } from \"./types\";\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseAdapter
|
|
3
3
|
} from "./chunk-7WQO5J2M.js";
|
|
4
|
-
import "./chunk-
|
|
4
|
+
import "./chunk-UP2VWCW5.js";
|
|
5
5
|
|
|
6
6
|
// src/core/adapters/adapters/twilio.ts
|
|
7
7
|
import { z } from "zod";
|
|
@@ -136,4 +136,4 @@ var TwilioAdapter = class extends BaseAdapter {
|
|
|
136
136
|
export {
|
|
137
137
|
TwilioAdapter
|
|
138
138
|
};
|
|
139
|
-
//# sourceMappingURL=twilio-
|
|
139
|
+
//# sourceMappingURL=twilio-3L7DUNYQ.js.map
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
unitConverter,
|
|
5
5
|
unit_converter_default
|
|
6
6
|
} from "./chunk-REMIY4U2.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-UP2VWCW5.js";
|
|
8
8
|
export {
|
|
9
9
|
convert,
|
|
10
10
|
unit_converter_default as default,
|
|
11
11
|
listUnits,
|
|
12
12
|
unitConverter
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=unit-converter-
|
|
14
|
+
//# sourceMappingURL=unit-converter-LYPAHU64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WhatsAppBot,
|
|
3
|
+
whatsapp_default
|
|
4
|
+
} from "./chunk-H3BOLSTS.js";
|
|
5
|
+
import "./chunk-6JY4HNUH.js";
|
|
6
|
+
import "./chunk-HKOPRRDJ.js";
|
|
7
|
+
import "./chunk-6UZPE35A.js";
|
|
8
|
+
import "./chunk-ADTDYJO7.js";
|
|
9
|
+
import "./chunk-CUPEENUY.js";
|
|
10
|
+
import "./chunk-2WTKTG2C.js";
|
|
11
|
+
import "./chunk-U2X2J3FI.js";
|
|
12
|
+
import "./chunk-X6Q3K3L2.js";
|
|
13
|
+
import "./chunk-ODCFS5WD.js";
|
|
14
|
+
import "./chunk-KM22GV7G.js";
|
|
15
|
+
import "./chunk-P6QINGFL.js";
|
|
16
|
+
import "./chunk-2RGPWU77.js";
|
|
17
|
+
import "./chunk-C6PELIHS.js";
|
|
18
|
+
import "./chunk-7WQO5J2M.js";
|
|
19
|
+
import "./chunk-643M3AP5.js";
|
|
20
|
+
import "./chunk-6LTLIYAQ.js";
|
|
21
|
+
import "./chunk-BMOUYXLX.js";
|
|
22
|
+
import "./chunk-WZAH34TG.js";
|
|
23
|
+
import "./chunk-6KONMXQ6.js";
|
|
24
|
+
import "./chunk-22VGGA7S.js";
|
|
25
|
+
import "./chunk-HN3F4WSW.js";
|
|
26
|
+
import "./chunk-A24GPVLY.js";
|
|
27
|
+
import "./chunk-AR34B6XR.js";
|
|
28
|
+
import "./chunk-UWUIJTT4.js";
|
|
29
|
+
import "./chunk-GUKKW7JI.js";
|
|
30
|
+
import "./chunk-HTF2GIQC.js";
|
|
31
|
+
import "./chunk-DOYGMNMK.js";
|
|
32
|
+
import "./chunk-CQ4JURG7.js";
|
|
33
|
+
import "./chunk-KABG5PG3.js";
|
|
34
|
+
import "./chunk-S4NJJS5C.js";
|
|
35
|
+
import "./chunk-PUNIMPMY.js";
|
|
36
|
+
import "./chunk-NYVBXUGD.js";
|
|
37
|
+
import "./chunk-35WYTA3C.js";
|
|
38
|
+
import "./chunk-UP2VWCW5.js";
|
|
39
|
+
export {
|
|
40
|
+
WhatsAppBot,
|
|
41
|
+
whatsapp_default as default
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=whatsapp-KRPQ4YUX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isPathAllowed
|
|
3
3
|
} from "./chunk-CQ4JURG7.js";
|
|
4
|
-
import "./chunk-
|
|
4
|
+
import "./chunk-UP2VWCW5.js";
|
|
5
5
|
|
|
6
6
|
// src/tools/file-generation/word-document.ts
|
|
7
7
|
import { join } from "path";
|
|
@@ -474,7 +474,7 @@ async function generateWordDocument(elements, filename, options = {}) {
|
|
|
474
474
|
try {
|
|
475
475
|
await mkdir(dirname(filePath), { recursive: true });
|
|
476
476
|
try {
|
|
477
|
-
const docx = await import("
|
|
477
|
+
const docx = await import("docx");
|
|
478
478
|
return await generateWithDocxLibrary(elements, filePath, options, docx);
|
|
479
479
|
} catch {
|
|
480
480
|
console.log("[WordDocument] docx library not available, using raw OOXML generation");
|
|
@@ -739,7 +739,7 @@ function getDocxAlignment(alignment, AlignmentType) {
|
|
|
739
739
|
async function generateRawDocx(elements, filePath, options) {
|
|
740
740
|
const finalOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
741
741
|
try {
|
|
742
|
-
const archiver = await import("./archiver-
|
|
742
|
+
const archiver = await import("./archiver-XLRIIXPY.js");
|
|
743
743
|
const fs = await import("fs");
|
|
744
744
|
const output = fs.createWriteStream(filePath);
|
|
745
745
|
const archive = archiver.default("zip", { zlib: { level: 9 } });
|
|
@@ -899,4 +899,4 @@ export {
|
|
|
899
899
|
generateWordDocument,
|
|
900
900
|
generateWordFromMarkdown
|
|
901
901
|
};
|
|
902
|
-
//# sourceMappingURL=word-document-
|
|
902
|
+
//# sourceMappingURL=word-document-D6N2C47N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/file-generation/word-document.ts"],"sourcesContent":["import { join } from \"path\";\r\nimport { tmpdir } from \"os\";\r\nimport { randomBytes } from \"crypto\";\r\nimport { writeFile, mkdir } from \"fs/promises\";\r\nimport { dirname } from \"path\";\r\nimport { isPathAllowed } from \"../../utils/paths\";\r\n\r\nexport interface WordDocumentOptions {\r\n title?: string;\r\n author?: string;\r\n subject?: string;\r\n description?: string;\r\n keywords?: string[];\r\n orientation?: \"portrait\" | \"landscape\";\r\n margins?: {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n };\r\n}\r\n\r\nexport interface WordDocumentResult {\r\n success: boolean;\r\n filePath?: string;\r\n error?: string;\r\n}\r\n\r\nexport type ParagraphAlignment = \"left\" | \"center\" | \"right\" | \"justify\";\r\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\r\n\r\nexport interface TextRun {\r\n text: string;\r\n bold?: boolean;\r\n italic?: boolean;\r\n underline?: boolean;\r\n strike?: boolean;\r\n color?: string;\r\n size?: number;\r\n font?: string;\r\n highlight?: string;\r\n}\r\n\r\nexport interface Paragraph {\r\n type: \"paragraph\";\r\n content: string | TextRun[];\r\n alignment?: ParagraphAlignment;\r\n spacing?: {\r\n before?: number;\r\n after?: number;\r\n line?: number;\r\n };\r\n indent?: {\r\n left?: number;\r\n right?: number;\r\n firstLine?: number;\r\n };\r\n}\r\n\r\nexport interface Heading {\r\n type: \"heading\";\r\n level: HeadingLevel;\r\n text: string;\r\n alignment?: ParagraphAlignment;\r\n}\r\n\r\nexport interface BulletList {\r\n type: \"bullet-list\";\r\n items: string[];\r\n level?: number;\r\n}\r\n\r\nexport interface NumberedList {\r\n type: \"numbered-list\";\r\n items: string[];\r\n start?: number;\r\n}\r\n\r\nexport interface TableCell {\r\n content: string;\r\n bold?: boolean;\r\n alignment?: ParagraphAlignment;\r\n backgroundColor?: string;\r\n colSpan?: number;\r\n rowSpan?: number;\r\n}\r\n\r\nexport interface Table {\r\n type: \"table\";\r\n headers?: TableCell[] | string[];\r\n rows: (TableCell[] | string[])[];\r\n widths?: number[];\r\n}\r\n\r\nexport interface Image {\r\n type: \"image\";\r\n path: string;\r\n width?: number;\r\n height?: number;\r\n alignment?: ParagraphAlignment;\r\n caption?: string;\r\n}\r\n\r\nexport interface PageBreak {\r\n type: \"page-break\";\r\n}\r\n\r\nexport interface HorizontalRule {\r\n type: \"horizontal-rule\";\r\n}\r\n\r\nexport interface TableOfContents {\r\n type: \"toc\";\r\n title?: string;\r\n maxLevel?: HeadingLevel;\r\n}\r\n\r\nexport type DocumentElement =\r\n | Paragraph\r\n | Heading\r\n | BulletList\r\n | NumberedList\r\n | Table\r\n | Image\r\n | PageBreak\r\n | HorizontalRule\r\n | TableOfContents;\r\n\r\n// Default options\r\nconst DEFAULT_OPTIONS: WordDocumentOptions = {\r\n orientation: \"portrait\",\r\n margins: { top: 1440, right: 1440, bottom: 1440, left: 1440 }, // 1 inch in twips\r\n};\r\n\r\n// Generate temp file path\r\nfunction getTempPath(): string {\r\n const id = randomBytes(8).toString(\"hex\");\r\n return join(tmpdir(), `sentinel-doc-${id}.docx`);\r\n}\r\n\r\n// Escape XML special characters\r\nfunction escapeXml(str: string): string {\r\n return str\r\n .replace(/&/g, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\");\r\n}\r\n\r\n// Convert twips to EMUs (English Metric Units)\r\nfunction twipsToEmu(twips: number): number {\r\n return twips * 635;\r\n}\r\n\r\n// Generate document.xml content\r\nfunction generateDocumentXml(\r\n elements: DocumentElement[],\r\n options: WordDocumentOptions\r\n): string {\r\n const orientation = options.orientation || \"portrait\";\r\n const margins = options.margins || DEFAULT_OPTIONS.margins!;\r\n\r\n let bodyContent = \"\";\r\n\r\n for (const element of elements) {\r\n bodyContent += generateElementXml(element);\r\n }\r\n\r\n // Section properties for page setup\r\n const sectionProps = `\r\n <w:sectPr>\r\n <w:pgSz w:w=\"${orientation === \"portrait\" ? \"12240\" : \"15840\"}\" w:h=\"${orientation === \"portrait\" ? \"15840\" : \"12240\"}\" ${orientation === \"landscape\" ? 'w:orient=\"landscape\"' : \"\"}/>\r\n <w:pgMar w:top=\"${margins.top}\" w:right=\"${margins.right}\" w:bottom=\"${margins.bottom}\" w:left=\"${margins.left}\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/>\r\n </w:sectPr>\r\n `;\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"\r\n xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\r\n xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">\r\n <w:body>\r\n ${bodyContent}\r\n ${sectionProps}\r\n </w:body>\r\n</w:document>`;\r\n}\r\n\r\n// Generate XML for a single element\r\nfunction generateElementXml(element: DocumentElement): string {\r\n switch (element.type) {\r\n case \"paragraph\":\r\n return generateParagraphXml(element);\r\n case \"heading\":\r\n return generateHeadingXml(element);\r\n case \"bullet-list\":\r\n return generateBulletListXml(element);\r\n case \"numbered-list\":\r\n return generateNumberedListXml(element);\r\n case \"table\":\r\n return generateTableXml(element);\r\n case \"page-break\":\r\n return generatePageBreakXml();\r\n case \"horizontal-rule\":\r\n return generateHorizontalRuleXml();\r\n case \"toc\":\r\n return generateTocXml(element);\r\n case \"image\":\r\n return generateImagePlaceholderXml(element);\r\n default:\r\n return \"\";\r\n }\r\n}\r\n\r\n// Generate paragraph XML\r\nfunction generateParagraphXml(paragraph: Paragraph): string {\r\n const alignment = getAlignmentValue(paragraph.alignment);\r\n const spacing = paragraph.spacing;\r\n const indent = paragraph.indent;\r\n\r\n let pPr = \"<w:pPr>\";\r\n if (alignment) {\r\n pPr += `<w:jc w:val=\"${alignment}\"/>`;\r\n }\r\n if (spacing) {\r\n pPr += `<w:spacing ${spacing.before ? `w:before=\"${spacing.before}\"` : \"\"} ${spacing.after ? `w:after=\"${spacing.after}\"` : \"\"} ${spacing.line ? `w:line=\"${spacing.line}\"` : \"\"}/>`;\r\n }\r\n if (indent) {\r\n pPr += `<w:ind ${indent.left ? `w:left=\"${indent.left}\"` : \"\"} ${indent.right ? `w:right=\"${indent.right}\"` : \"\"} ${indent.firstLine ? `w:firstLine=\"${indent.firstLine}\"` : \"\"}/>`;\r\n }\r\n pPr += \"</w:pPr>\";\r\n\r\n let runs = \"\";\r\n if (typeof paragraph.content === \"string\") {\r\n runs = `<w:r><w:t xml:space=\"preserve\">${escapeXml(paragraph.content)}</w:t></w:r>`;\r\n } else {\r\n for (const run of paragraph.content) {\r\n runs += generateTextRunXml(run);\r\n }\r\n }\r\n\r\n return `<w:p>${pPr}${runs}</w:p>`;\r\n}\r\n\r\n// Generate text run XML\r\nfunction generateTextRunXml(run: TextRun): string {\r\n let rPr = \"<w:rPr>\";\r\n\r\n if (run.bold) rPr += \"<w:b/>\";\r\n if (run.italic) rPr += \"<w:i/>\";\r\n if (run.underline) rPr += '<w:u w:val=\"single\"/>';\r\n if (run.strike) rPr += \"<w:strike/>\";\r\n if (run.color) rPr += `<w:color w:val=\"${run.color.replace(\"#\", \"\")}\"/>`;\r\n if (run.size) rPr += `<w:sz w:val=\"${run.size * 2}\"/>`;\r\n if (run.font) rPr += `<w:rFonts w:ascii=\"${run.font}\" w:hAnsi=\"${run.font}\"/>`;\r\n if (run.highlight) rPr += `<w:highlight w:val=\"${run.highlight}\"/>`;\r\n\r\n rPr += \"</w:rPr>\";\r\n\r\n return `<w:r>${rPr}<w:t xml:space=\"preserve\">${escapeXml(run.text)}</w:t></w:r>`;\r\n}\r\n\r\n// Generate heading XML\r\nfunction generateHeadingXml(heading: Heading): string {\r\n const styleId = `Heading${heading.level}`;\r\n const alignment = getAlignmentValue(heading.alignment);\r\n\r\n let pPr = `<w:pPr><w:pStyle w:val=\"${styleId}\"/>`;\r\n if (alignment) {\r\n pPr += `<w:jc w:val=\"${alignment}\"/>`;\r\n }\r\n pPr += \"</w:pPr>\";\r\n\r\n return `<w:p>${pPr}<w:r><w:t>${escapeXml(heading.text)}</w:t></w:r></w:p>`;\r\n}\r\n\r\n// Generate bullet list XML\r\nfunction generateBulletListXml(list: BulletList): string {\r\n const level = list.level || 0;\r\n let xml = \"\";\r\n\r\n for (const item of list.items) {\r\n xml += `<w:p>\r\n <w:pPr>\r\n <w:pStyle w:val=\"ListParagraph\"/>\r\n <w:numPr>\r\n <w:ilvl w:val=\"${level}\"/>\r\n <w:numId w:val=\"1\"/>\r\n </w:numPr>\r\n </w:pPr>\r\n <w:r><w:t>${escapeXml(item)}</w:t></w:r>\r\n </w:p>`;\r\n }\r\n\r\n return xml;\r\n}\r\n\r\n// Generate numbered list XML\r\nfunction generateNumberedListXml(list: NumberedList): string {\r\n let xml = \"\";\r\n\r\n for (const item of list.items) {\r\n xml += `<w:p>\r\n <w:pPr>\r\n <w:pStyle w:val=\"ListParagraph\"/>\r\n <w:numPr>\r\n <w:ilvl w:val=\"0\"/>\r\n <w:numId w:val=\"2\"/>\r\n </w:numPr>\r\n </w:pPr>\r\n <w:r><w:t>${escapeXml(item)}</w:t></w:r>\r\n </w:p>`;\r\n }\r\n\r\n return xml;\r\n}\r\n\r\n// Generate table XML\r\nfunction generateTableXml(table: Table): string {\r\n const columnCount = table.headers?.length || table.rows[0]?.length || 1;\r\n const defaultWidth = Math.floor(9000 / columnCount);\r\n\r\n let xml = `<w:tbl>\r\n <w:tblPr>\r\n <w:tblStyle w:val=\"TableGrid\"/>\r\n <w:tblW w:w=\"0\" w:type=\"auto\"/>\r\n <w:tblBorders>\r\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n </w:tblBorders>\r\n </w:tblPr>\r\n <w:tblGrid>`;\r\n\r\n for (let i = 0; i < columnCount; i++) {\r\n const width = table.widths?.[i] || defaultWidth;\r\n xml += `<w:gridCol w:w=\"${width}\"/>`;\r\n }\r\n xml += \"</w:tblGrid>\";\r\n\r\n // Header row\r\n if (table.headers) {\r\n xml += \"<w:tr>\";\r\n for (const cell of table.headers) {\r\n xml += generateTableCellXml(cell, true);\r\n }\r\n xml += \"</w:tr>\";\r\n }\r\n\r\n // Data rows\r\n for (const row of table.rows) {\r\n xml += \"<w:tr>\";\r\n for (const cell of row) {\r\n xml += generateTableCellXml(cell, false);\r\n }\r\n xml += \"</w:tr>\";\r\n }\r\n\r\n xml += \"</w:tbl>\";\r\n return xml;\r\n}\r\n\r\n// Generate table cell XML\r\nfunction generateTableCellXml(\r\n cell: TableCell | string,\r\n isHeader: boolean\r\n): string {\r\n const cellData: TableCell =\r\n typeof cell === \"string\" ? { content: cell } : cell;\r\n\r\n let tcPr = \"<w:tcPr>\";\r\n if (cellData.backgroundColor) {\r\n tcPr += `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${cellData.backgroundColor.replace(\"#\", \"\")}\"/>`;\r\n }\r\n if (cellData.colSpan && cellData.colSpan > 1) {\r\n tcPr += `<w:gridSpan w:val=\"${cellData.colSpan}\"/>`;\r\n }\r\n tcPr += \"</w:tcPr>\";\r\n\r\n const bold = isHeader || cellData.bold;\r\n const alignment = getAlignmentValue(cellData.alignment || (isHeader ? \"center\" : \"left\"));\r\n\r\n return `<w:tc>\r\n ${tcPr}\r\n <w:p>\r\n <w:pPr>${alignment ? `<w:jc w:val=\"${alignment}\"/>` : \"\"}</w:pPr>\r\n <w:r>\r\n ${bold ? \"<w:rPr><w:b/></w:rPr>\" : \"\"}\r\n <w:t>${escapeXml(cellData.content)}</w:t>\r\n </w:r>\r\n </w:p>\r\n </w:tc>`;\r\n}\r\n\r\n// Generate page break XML\r\nfunction generatePageBreakXml(): string {\r\n return '<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>';\r\n}\r\n\r\n// Generate horizontal rule XML\r\nfunction generateHorizontalRuleXml(): string {\r\n return `<w:p>\r\n <w:pPr>\r\n <w:pBdr>\r\n <w:bottom w:val=\"single\" w:sz=\"12\" w:space=\"1\" w:color=\"auto\"/>\r\n </w:pBdr>\r\n </w:pPr>\r\n </w:p>`;\r\n}\r\n\r\n// Generate table of contents placeholder XML\r\nfunction generateTocXml(toc: TableOfContents): string {\r\n const title = toc.title || \"Table of Contents\";\r\n return `<w:p>\r\n <w:pPr><w:pStyle w:val=\"TOCHeading\"/></w:pPr>\r\n <w:r><w:t>${escapeXml(title)}</w:t></w:r>\r\n </w:p>\r\n <w:p>\r\n <w:r>\r\n <w:fldChar w:fldCharType=\"begin\"/>\r\n </w:r>\r\n <w:r>\r\n <w:instrText xml:space=\"preserve\"> TOC \\\\o \"1-${toc.maxLevel || 3}\" \\\\h \\\\z \\\\u </w:instrText>\r\n </w:r>\r\n <w:r>\r\n <w:fldChar w:fldCharType=\"separate\"/>\r\n </w:r>\r\n <w:r>\r\n <w:t>[Table of Contents - Update field to populate]</w:t>\r\n </w:r>\r\n <w:r>\r\n <w:fldChar w:fldCharType=\"end\"/>\r\n </w:r>\r\n </w:p>`;\r\n}\r\n\r\n// Generate image placeholder XML\r\nfunction generateImagePlaceholderXml(image: Image): string {\r\n const alignment = getAlignmentValue(image.alignment || \"center\");\r\n const caption = image.caption || `[Image: ${image.path}]`;\r\n\r\n return `<w:p>\r\n <w:pPr>${alignment ? `<w:jc w:val=\"${alignment}\"/>` : \"\"}</w:pPr>\r\n <w:r>\r\n <w:rPr><w:i/></w:rPr>\r\n <w:t>${escapeXml(caption)}</w:t>\r\n </w:r>\r\n </w:p>`;\r\n}\r\n\r\n// Get alignment value for XML\r\nfunction getAlignmentValue(\r\n alignment?: ParagraphAlignment\r\n): string | null {\r\n switch (alignment) {\r\n case \"left\":\r\n return \"left\";\r\n case \"center\":\r\n return \"center\";\r\n case \"right\":\r\n return \"right\";\r\n case \"justify\":\r\n return \"both\";\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n// Generate styles.xml\r\nfunction generateStylesXml(): string {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\r\n <w:docDefaults>\r\n <w:rPrDefault>\r\n <w:rPr>\r\n <w:rFonts w:ascii=\"Calibri\" w:hAnsi=\"Calibri\" w:eastAsia=\"Calibri\" w:cs=\"Calibri\"/>\r\n <w:sz w:val=\"22\"/>\r\n </w:rPr>\r\n </w:rPrDefault>\r\n <w:pPrDefault>\r\n <w:pPr>\r\n <w:spacing w:after=\"160\" w:line=\"259\" w:lineRule=\"auto\"/>\r\n </w:pPr>\r\n </w:pPrDefault>\r\n </w:docDefaults>\r\n <w:style w:type=\"paragraph\" w:styleId=\"Normal\" w:default=\"1\">\r\n <w:name w:val=\"Normal\"/>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\">\r\n <w:name w:val=\"heading 1\"/>\r\n <w:basedOn w:val=\"Normal\"/>\r\n <w:next w:val=\"Normal\"/>\r\n <w:pPr><w:spacing w:before=\"240\" w:after=\"0\"/><w:outlineLvl w:val=\"0\"/></w:pPr>\r\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"2F5496\"/><w:sz w:val=\"32\"/></w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\">\r\n <w:name w:val=\"heading 2\"/>\r\n <w:basedOn w:val=\"Normal\"/>\r\n <w:next w:val=\"Normal\"/>\r\n <w:pPr><w:spacing w:before=\"200\" w:after=\"0\"/><w:outlineLvl w:val=\"1\"/></w:pPr>\r\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"2F5496\"/><w:sz w:val=\"26\"/></w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\">\r\n <w:name w:val=\"heading 3\"/>\r\n <w:basedOn w:val=\"Normal\"/>\r\n <w:next w:val=\"Normal\"/>\r\n <w:pPr><w:spacing w:before=\"160\" w:after=\"0\"/><w:outlineLvl w:val=\"2\"/></w:pPr>\r\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"1F3763\"/><w:sz w:val=\"24\"/></w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"Heading4\">\r\n <w:name w:val=\"heading 4\"/>\r\n <w:basedOn w:val=\"Normal\"/>\r\n <w:next w:val=\"Normal\"/>\r\n <w:pPr><w:spacing w:before=\"120\" w:after=\"0\"/><w:outlineLvl w:val=\"3\"/></w:pPr>\r\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:i/><w:color w:val=\"2F5496\"/></w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"Heading5\">\r\n <w:name w:val=\"heading 5\"/>\r\n <w:basedOn w:val=\"Normal\"/>\r\n <w:next w:val=\"Normal\"/>\r\n <w:pPr><w:spacing w:before=\"80\" w:after=\"0\"/><w:outlineLvl w:val=\"4\"/></w:pPr>\r\n <w:rPr><w:color w:val=\"2F5496\"/></w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"Heading6\">\r\n <w:name w:val=\"heading 6\"/>\r\n <w:basedOn w:val=\"Normal\"/>\r\n <w:next w:val=\"Normal\"/>\r\n <w:pPr><w:spacing w:before=\"40\" w:after=\"0\"/><w:outlineLvl w:val=\"5\"/></w:pPr>\r\n <w:rPr><w:color w:val=\"1F3763\"/></w:rPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"ListParagraph\">\r\n <w:name w:val=\"List Paragraph\"/>\r\n <w:basedOn w:val=\"Normal\"/>\r\n <w:pPr><w:ind w:left=\"720\"/></w:pPr>\r\n </w:style>\r\n <w:style w:type=\"paragraph\" w:styleId=\"TOCHeading\">\r\n <w:name w:val=\"TOC Heading\"/>\r\n <w:basedOn w:val=\"Heading1\"/>\r\n <w:next w:val=\"Normal\"/>\r\n <w:pPr><w:outlineLvl w:val=\"9\"/></w:pPr>\r\n </w:style>\r\n <w:style w:type=\"table\" w:styleId=\"TableGrid\">\r\n <w:name w:val=\"Table Grid\"/>\r\n <w:tblPr>\r\n <w:tblBorders>\r\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\r\n </w:tblBorders>\r\n </w:tblPr>\r\n </w:style>\r\n</w:styles>`;\r\n}\r\n\r\n// Generate numbering.xml for lists\r\nfunction generateNumberingXml(): string {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\r\n <!-- Bullet list definition -->\r\n <w:abstractNum w:abstractNumId=\"0\">\r\n <w:lvl w:ilvl=\"0\">\r\n <w:start w:val=\"1\"/>\r\n <w:numFmt w:val=\"bullet\"/>\r\n <w:lvlText w:val=\"\"/>\r\n <w:lvlJc w:val=\"left\"/>\r\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\r\n <w:rPr><w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/></w:rPr>\r\n </w:lvl>\r\n <w:lvl w:ilvl=\"1\">\r\n <w:start w:val=\"1\"/>\r\n <w:numFmt w:val=\"bullet\"/>\r\n <w:lvlText w:val=\"o\"/>\r\n <w:lvlJc w:val=\"left\"/>\r\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\r\n <w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:hint=\"default\"/></w:rPr>\r\n </w:lvl>\r\n <w:lvl w:ilvl=\"2\">\r\n <w:start w:val=\"1\"/>\r\n <w:numFmt w:val=\"bullet\"/>\r\n <w:lvlText w:val=\"\"/>\r\n <w:lvlJc w:val=\"left\"/>\r\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\r\n <w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr>\r\n </w:lvl>\r\n </w:abstractNum>\r\n <!-- Numbered list definition -->\r\n <w:abstractNum w:abstractNumId=\"1\">\r\n <w:lvl w:ilvl=\"0\">\r\n <w:start w:val=\"1\"/>\r\n <w:numFmt w:val=\"decimal\"/>\r\n <w:lvlText w:val=\"%1.\"/>\r\n <w:lvlJc w:val=\"left\"/>\r\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\r\n </w:lvl>\r\n <w:lvl w:ilvl=\"1\">\r\n <w:start w:val=\"1\"/>\r\n <w:numFmt w:val=\"lowerLetter\"/>\r\n <w:lvlText w:val=\"%2.\"/>\r\n <w:lvlJc w:val=\"left\"/>\r\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\r\n </w:lvl>\r\n <w:lvl w:ilvl=\"2\">\r\n <w:start w:val=\"1\"/>\r\n <w:numFmt w:val=\"lowerRoman\"/>\r\n <w:lvlText w:val=\"%3.\"/>\r\n <w:lvlJc w:val=\"left\"/>\r\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\r\n </w:lvl>\r\n </w:abstractNum>\r\n <w:num w:numId=\"1\"><w:abstractNumId w:val=\"0\"/></w:num>\r\n <w:num w:numId=\"2\"><w:abstractNumId w:val=\"1\"/></w:num>\r\n</w:numbering>`;\r\n}\r\n\r\n// Generate [Content_Types].xml\r\nfunction generateContentTypesXml(): string {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\r\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\r\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\r\n <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\r\n <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>\r\n <Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>\r\n <Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>\r\n <Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>\r\n</Types>`;\r\n}\r\n\r\n// Generate _rels/.rels\r\nfunction generateRootRelsXml(): string {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\r\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>\r\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>\r\n</Relationships>`;\r\n}\r\n\r\n// Generate word/_rels/document.xml.rels\r\nfunction generateDocumentRelsXml(): string {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\r\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>\r\n</Relationships>`;\r\n}\r\n\r\n// Generate docProps/core.xml\r\nfunction generateCorePropsXml(options: WordDocumentOptions): string {\r\n const now = new Date().toISOString();\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"\r\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\r\n xmlns:dcterms=\"http://purl.org/dc/terms/\"\r\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n ${options.title ? `<dc:title>${escapeXml(options.title)}</dc:title>` : \"\"}\r\n ${options.author ? `<dc:creator>${escapeXml(options.author)}</dc:creator>` : \"<dc:creator>OpenSentinel</dc:creator>\"}\r\n ${options.subject ? `<dc:subject>${escapeXml(options.subject)}</dc:subject>` : \"\"}\r\n ${options.description ? `<dc:description>${escapeXml(options.description)}</dc:description>` : \"\"}\r\n ${options.keywords ? `<cp:keywords>${escapeXml(options.keywords.join(\", \"))}</cp:keywords>` : \"\"}\r\n <dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>\r\n <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>\r\n</cp:coreProperties>`;\r\n}\r\n\r\n// Generate docProps/app.xml\r\nfunction generateAppPropsXml(): string {\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\">\r\n <Application>OpenSentinel Document Generator</Application>\r\n <AppVersion>1.0</AppVersion>\r\n</Properties>`;\r\n}\r\n\r\n// Generate Word document using docx library if available, otherwise create raw OOXML\r\nexport async function generateWordDocument(\r\n elements: DocumentElement[],\r\n filename?: string,\r\n options: WordDocumentOptions = {}\r\n): Promise<WordDocumentResult> {\r\n const filePath = filename\r\n ? isPathAllowed(filename)\r\n ? filename\r\n : join(tmpdir(), filename)\r\n : getTempPath();\r\n\r\n try {\r\n await mkdir(dirname(filePath), { recursive: true });\r\n\r\n // Try to use docx library if available\r\n try {\r\n const docx = await import(\"docx\");\r\n return await generateWithDocxLibrary(elements, filePath, options, docx);\r\n } catch {\r\n // Fallback: generate raw OOXML and create the ZIP manually\r\n console.log(\"[WordDocument] docx library not available, using raw OOXML generation\");\r\n return await generateRawDocx(elements, filePath, options);\r\n }\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\n// Generate using docx library\r\nasync function generateWithDocxLibrary(\r\n elements: DocumentElement[],\r\n filePath: string,\r\n options: WordDocumentOptions,\r\n docx: typeof import(\"docx\")\r\n): Promise<WordDocumentResult> {\r\n const { Document, Packer, Paragraph, TextRun, HeadingLevel, AlignmentType, Table, TableRow, TableCell, WidthType, BorderStyle, PageBreak } = docx;\r\n\r\n const children: (\r\n | InstanceType<typeof Paragraph>\r\n | InstanceType<typeof Table>\r\n )[] = [];\r\n\r\n for (const element of elements) {\r\n switch (element.type) {\r\n case \"paragraph\": {\r\n const runs: InstanceType<typeof TextRun>[] = [];\r\n if (typeof element.content === \"string\") {\r\n runs.push(new TextRun(element.content));\r\n } else {\r\n for (const run of element.content) {\r\n runs.push(\r\n new TextRun({\r\n text: run.text,\r\n bold: run.bold,\r\n italics: run.italic,\r\n underline: run.underline ? {} : undefined,\r\n strike: run.strike,\r\n color: run.color?.replace(\"#\", \"\"),\r\n size: run.size ? run.size * 2 : undefined,\r\n font: run.font,\r\n highlight: run.highlight as \"yellow\" | \"green\" | \"cyan\" | \"magenta\" | \"blue\" | \"red\" | \"darkBlue\" | \"darkCyan\" | \"darkGreen\" | \"darkMagenta\" | \"darkRed\" | \"darkYellow\" | \"darkGray\" | \"lightGray\" | \"black\" | undefined,\r\n })\r\n );\r\n }\r\n }\r\n children.push(\r\n new Paragraph({\r\n children: runs,\r\n alignment: getDocxAlignment(element.alignment, AlignmentType),\r\n spacing: element.spacing\r\n ? {\r\n before: element.spacing.before,\r\n after: element.spacing.after,\r\n line: element.spacing.line,\r\n }\r\n : undefined,\r\n indent: element.indent\r\n ? {\r\n left: element.indent.left,\r\n right: element.indent.right,\r\n firstLine: element.indent.firstLine,\r\n }\r\n : undefined,\r\n })\r\n );\r\n break;\r\n }\r\n case \"heading\": {\r\n const headingLevelMap: Record<HeadingLevel, (typeof HeadingLevel)[keyof typeof HeadingLevel]> = {\r\n 1: HeadingLevel.HEADING_1,\r\n 2: HeadingLevel.HEADING_2,\r\n 3: HeadingLevel.HEADING_3,\r\n 4: HeadingLevel.HEADING_4,\r\n 5: HeadingLevel.HEADING_5,\r\n 6: HeadingLevel.HEADING_6,\r\n };\r\n children.push(\r\n new Paragraph({\r\n text: element.text,\r\n heading: headingLevelMap[element.level],\r\n alignment: getDocxAlignment(element.alignment, AlignmentType),\r\n })\r\n );\r\n break;\r\n }\r\n case \"bullet-list\": {\r\n for (const item of element.items) {\r\n children.push(\r\n new Paragraph({\r\n text: item,\r\n bullet: { level: element.level || 0 },\r\n })\r\n );\r\n }\r\n break;\r\n }\r\n case \"numbered-list\": {\r\n for (let i = 0; i < element.items.length; i++) {\r\n children.push(\r\n new Paragraph({\r\n text: element.items[i],\r\n numbering: {\r\n reference: \"default-numbering\",\r\n level: 0,\r\n },\r\n })\r\n );\r\n }\r\n break;\r\n }\r\n case \"table\": {\r\n const rows: InstanceType<typeof TableRow>[] = [];\r\n\r\n if (element.headers) {\r\n rows.push(\r\n new TableRow({\r\n children: element.headers.map((cell) => {\r\n const cellData = typeof cell === \"string\" ? { content: cell } : cell;\r\n return new TableCell({\r\n children: [\r\n new Paragraph({\r\n children: [\r\n new TextRun({ text: cellData.content, bold: true }),\r\n ],\r\n alignment: AlignmentType.CENTER,\r\n }),\r\n ],\r\n shading: cellData.backgroundColor\r\n ? { fill: cellData.backgroundColor.replace(\"#\", \"\") }\r\n : { fill: \"E0E0E0\" },\r\n });\r\n }),\r\n tableHeader: true,\r\n })\r\n );\r\n }\r\n\r\n for (const row of element.rows) {\r\n rows.push(\r\n new TableRow({\r\n children: row.map((cell) => {\r\n const cellData = typeof cell === \"string\" ? { content: cell } : cell;\r\n return new TableCell({\r\n children: [\r\n new Paragraph({\r\n children: [\r\n new TextRun({\r\n text: cellData.content,\r\n bold: cellData.bold,\r\n }),\r\n ],\r\n alignment: getDocxAlignment(cellData.alignment, AlignmentType),\r\n }),\r\n ],\r\n shading: cellData.backgroundColor\r\n ? { fill: cellData.backgroundColor.replace(\"#\", \"\") }\r\n : undefined,\r\n columnSpan: cellData.colSpan,\r\n rowSpan: cellData.rowSpan,\r\n });\r\n }),\r\n })\r\n );\r\n }\r\n\r\n children.push(\r\n new Table({\r\n rows,\r\n width: { size: 100, type: WidthType.PERCENTAGE },\r\n })\r\n );\r\n break;\r\n }\r\n case \"page-break\": {\r\n children.push(\r\n new Paragraph({\r\n children: [new PageBreak()],\r\n })\r\n );\r\n break;\r\n }\r\n case \"horizontal-rule\": {\r\n children.push(\r\n new Paragraph({\r\n border: {\r\n bottom: {\r\n color: \"auto\",\r\n space: 1,\r\n style: BorderStyle.SINGLE,\r\n size: 12,\r\n },\r\n },\r\n })\r\n );\r\n break;\r\n }\r\n case \"toc\": {\r\n children.push(\r\n new Paragraph({\r\n text: element.title || \"Table of Contents\",\r\n heading: HeadingLevel.HEADING_1,\r\n })\r\n );\r\n children.push(\r\n new Paragraph({\r\n text: \"[Update field to generate Table of Contents]\",\r\n })\r\n );\r\n break;\r\n }\r\n case \"image\": {\r\n children.push(\r\n new Paragraph({\r\n text: element.caption || `[Image: ${element.path}]`,\r\n alignment: getDocxAlignment(element.alignment, AlignmentType),\r\n })\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const doc = new Document({\r\n title: options.title,\r\n creator: options.author || \"OpenSentinel\",\r\n subject: options.subject,\r\n description: options.description,\r\n keywords: options.keywords?.join(\", \"),\r\n sections: [\r\n {\r\n properties: {\r\n page: {\r\n size: {\r\n orientation:\r\n options.orientation === \"landscape\"\r\n ? docx.PageOrientation.LANDSCAPE\r\n : docx.PageOrientation.PORTRAIT,\r\n },\r\n margin: options.margins\r\n ? {\r\n top: options.margins.top,\r\n right: options.margins.right,\r\n bottom: options.margins.bottom,\r\n left: options.margins.left,\r\n }\r\n : undefined,\r\n },\r\n },\r\n children,\r\n },\r\n ],\r\n numbering: {\r\n config: [\r\n {\r\n reference: \"default-numbering\",\r\n levels: [\r\n {\r\n level: 0,\r\n format: docx.LevelFormat.DECIMAL,\r\n text: \"%1.\",\r\n alignment: AlignmentType.START,\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n });\r\n\r\n const buffer = await Packer.toBuffer(doc);\r\n await writeFile(filePath, buffer);\r\n\r\n return { success: true, filePath };\r\n}\r\n\r\n// Get docx AlignmentType from string\r\nfunction getDocxAlignment(\r\n alignment: ParagraphAlignment | undefined,\r\n AlignmentType: { LEFT: unknown; CENTER: unknown; RIGHT: unknown; JUSTIFIED: unknown }\r\n): any {\r\n switch (alignment) {\r\n case \"left\":\r\n return AlignmentType.LEFT;\r\n case \"center\":\r\n return AlignmentType.CENTER;\r\n case \"right\":\r\n return AlignmentType.RIGHT;\r\n case \"justify\":\r\n return AlignmentType.JUSTIFIED;\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\n// Generate raw OOXML and create ZIP\r\nasync function generateRawDocx(\r\n elements: DocumentElement[],\r\n filePath: string,\r\n options: WordDocumentOptions\r\n): Promise<WordDocumentResult> {\r\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\r\n\r\n try {\r\n // Try to use archiver for ZIP creation\r\n // @ts-expect-error archiver has no type declarations\r\n const archiver = await import(\"archiver\");\r\n const fs = await import(\"fs\");\r\n\r\n const output = fs.createWriteStream(filePath);\r\n const archive = archiver.default(\"zip\", { zlib: { level: 9 } });\r\n\r\n return new Promise((resolve) => {\r\n output.on(\"close\", () => {\r\n resolve({ success: true, filePath });\r\n });\r\n\r\n archive.on(\"error\", (err: Error) => {\r\n resolve({ success: false, error: err.message });\r\n });\r\n\r\n archive.pipe(output);\r\n\r\n // Add files to archive\r\n archive.append(generateContentTypesXml(), { name: \"[Content_Types].xml\" });\r\n archive.append(generateRootRelsXml(), { name: \"_rels/.rels\" });\r\n archive.append(generateDocumentXml(elements, finalOptions), { name: \"word/document.xml\" });\r\n archive.append(generateStylesXml(), { name: \"word/styles.xml\" });\r\n archive.append(generateNumberingXml(), { name: \"word/numbering.xml\" });\r\n archive.append(generateDocumentRelsXml(), { name: \"word/_rels/document.xml.rels\" });\r\n archive.append(generateCorePropsXml(finalOptions), { name: \"docProps/core.xml\" });\r\n archive.append(generateAppPropsXml(), { name: \"docProps/app.xml\" });\r\n\r\n archive.finalize();\r\n });\r\n } catch {\r\n // Ultimate fallback: save as XML for manual processing\r\n const xmlPath = filePath.replace(\".docx\", \".xml\");\r\n const documentXml = generateDocumentXml(elements, finalOptions);\r\n await writeFile(xmlPath, documentXml, \"utf-8\");\r\n\r\n return {\r\n success: true,\r\n filePath: xmlPath,\r\n };\r\n }\r\n}\r\n\r\n// Generate Word document from markdown\r\nexport async function generateWordFromMarkdown(\r\n markdown: string,\r\n filename?: string,\r\n options?: WordDocumentOptions\r\n): Promise<WordDocumentResult> {\r\n const elements = parseMarkdownToElements(markdown);\r\n return generateWordDocument(elements, filename, options);\r\n}\r\n\r\n// Simple markdown parser to document elements\r\nfunction parseMarkdownToElements(markdown: string): DocumentElement[] {\r\n const elements: DocumentElement[] = [];\r\n const lines = markdown.split(\"\\n\");\r\n let i = 0;\r\n\r\n while (i < lines.length) {\r\n const line = lines[i];\r\n\r\n // Headers\r\n const headerMatch = line.match(/^(#{1,6})\\s+(.+)$/);\r\n if (headerMatch) {\r\n elements.push({\r\n type: \"heading\",\r\n level: headerMatch[1].length as HeadingLevel,\r\n text: headerMatch[2].trim(),\r\n });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Horizontal rule\r\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line.trim())) {\r\n elements.push({ type: \"horizontal-rule\" });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Bullet list\r\n if (/^[-*+]\\s+/.test(line)) {\r\n const items: string[] = [];\r\n while (i < lines.length && /^[-*+]\\s+/.test(lines[i])) {\r\n items.push(lines[i].replace(/^[-*+]\\s+/, \"\").trim());\r\n i++;\r\n }\r\n elements.push({ type: \"bullet-list\", items });\r\n continue;\r\n }\r\n\r\n // Numbered list\r\n if (/^\\d+\\.\\s+/.test(line)) {\r\n const items: string[] = [];\r\n while (i < lines.length && /^\\d+\\.\\s+/.test(lines[i])) {\r\n items.push(lines[i].replace(/^\\d+\\.\\s+/, \"\").trim());\r\n i++;\r\n }\r\n elements.push({ type: \"numbered-list\", items });\r\n continue;\r\n }\r\n\r\n // Empty line\r\n if (line.trim() === \"\") {\r\n i++;\r\n continue;\r\n }\r\n\r\n // Regular paragraph (collect consecutive non-empty lines)\r\n let paragraphText = \"\";\r\n while (i < lines.length && lines[i].trim() !== \"\" && !/^(#{1,6}|[-*+]|\\d+\\.)\\s+/.test(lines[i])) {\r\n paragraphText += (paragraphText ? \" \" : \"\") + lines[i].trim();\r\n i++;\r\n }\r\n\r\n if (paragraphText) {\r\n // Parse inline formatting\r\n const runs = parseInlineFormatting(paragraphText);\r\n elements.push({\r\n type: \"paragraph\",\r\n content: runs.length === 1 && !runs[0].bold && !runs[0].italic ? paragraphText : runs,\r\n });\r\n }\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n// Parse inline markdown formatting\r\nfunction parseInlineFormatting(text: string): TextRun[] {\r\n const runs: TextRun[] = [];\r\n let remaining = text;\r\n\r\n while (remaining.length > 0) {\r\n // Bold + Italic\r\n const boldItalicMatch = remaining.match(/^\\*\\*\\*(.+?)\\*\\*\\*/);\r\n if (boldItalicMatch) {\r\n runs.push({ text: boldItalicMatch[1], bold: true, italic: true });\r\n remaining = remaining.slice(boldItalicMatch[0].length);\r\n continue;\r\n }\r\n\r\n // Bold\r\n const boldMatch = remaining.match(/^\\*\\*(.+?)\\*\\*/);\r\n if (boldMatch) {\r\n runs.push({ text: boldMatch[1], bold: true });\r\n remaining = remaining.slice(boldMatch[0].length);\r\n continue;\r\n }\r\n\r\n // Italic\r\n const italicMatch = remaining.match(/^\\*(.+?)\\*/);\r\n if (italicMatch) {\r\n runs.push({ text: italicMatch[1], italic: true });\r\n remaining = remaining.slice(italicMatch[0].length);\r\n continue;\r\n }\r\n\r\n // Strikethrough\r\n const strikeMatch = remaining.match(/^~~(.+?)~~/);\r\n if (strikeMatch) {\r\n runs.push({ text: strikeMatch[1], strike: true });\r\n remaining = remaining.slice(strikeMatch[0].length);\r\n continue;\r\n }\r\n\r\n // Code (treated as monospace)\r\n const codeMatch = remaining.match(/^`(.+?)`/);\r\n if (codeMatch) {\r\n runs.push({ text: codeMatch[1], font: \"Courier New\" });\r\n remaining = remaining.slice(codeMatch[0].length);\r\n continue;\r\n }\r\n\r\n // Regular text until next formatting\r\n const nextFormat = remaining.search(/(\\*\\*\\*|\\*\\*|\\*|~~|`)/);\r\n if (nextFormat === -1) {\r\n runs.push({ text: remaining });\r\n break;\r\n } else if (nextFormat === 0) {\r\n // Unmatched formatting character, treat as regular text\r\n runs.push({ text: remaining[0] });\r\n remaining = remaining.slice(1);\r\n } else {\r\n runs.push({ text: remaining.slice(0, nextFormat) });\r\n remaining = remaining.slice(nextFormat);\r\n }\r\n }\r\n\r\n return runs;\r\n}\r\n\r\n// Main function for tool use\r\nexport async function generateWord(\r\n content: string | DocumentElement[],\r\n filename: string,\r\n options?: WordDocumentOptions & { contentType?: \"markdown\" | \"elements\" }\r\n): Promise<WordDocumentResult> {\r\n const contentType = options?.contentType || \"markdown\";\r\n\r\n if (contentType === \"elements\" || Array.isArray(content)) {\r\n return generateWordDocument(content as DocumentElement[], filename, options);\r\n }\r\n\r\n return generateWordFromMarkdown(content as string, filename, options);\r\n}\r\n\r\nexport default {\r\n generateWord,\r\n generateWordDocument,\r\n generateWordFromMarkdown,\r\n};\r\n"],"mappings":"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","names":[]}
|