opensentinel 2.1.1 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +354 -283
- package/dist/archiver-AVNBYCKQ.js +15340 -0
- package/dist/archiver-AVNBYCKQ.js.map +1 -0
- package/dist/audit-logger-OBPR7CRO.js +22 -0
- package/dist/auth-UOX5K2BE.js +18 -0
- package/dist/autonomy-ZXDBDQUJ.js +86 -0
- package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
- package/dist/aws-s3-Q4LLZZPD.js +146 -0
- package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
- package/dist/backup-restore-PZ7CYYB7.js +16 -0
- package/dist/blocks-R3PODY47.js +23 -0
- package/dist/bot-QRARP4UN.js +36 -0
- package/dist/brain-7XLLM3KC.js +56 -0
- package/dist/camera-monitor-M5CYKUU4.js +335 -0
- package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
- package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
- package/dist/chunk-22VGGA7S.js +330 -0
- package/dist/chunk-22VGGA7S.js.map +1 -0
- package/dist/chunk-35WYTA3C.js +382 -0
- package/dist/chunk-35WYTA3C.js.map +1 -0
- package/dist/chunk-3E2PSU2C.js +146 -0
- package/dist/chunk-3E2PSU2C.js.map +1 -0
- package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
- package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
- package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
- package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
- package/dist/chunk-6KONMXQ6.js +297 -0
- package/dist/chunk-6KONMXQ6.js.map +1 -0
- package/dist/chunk-6PMVAAA7.js +196 -0
- package/dist/chunk-6PMVAAA7.js.map +1 -0
- package/dist/chunk-766ASQWE.js +32620 -0
- package/dist/chunk-766ASQWE.js.map +1 -0
- package/dist/chunk-7WQO5J2M.js +29 -0
- package/dist/chunk-7WQO5J2M.js.map +1 -0
- package/dist/chunk-APHSRMBS.js +148 -0
- package/dist/chunk-APHSRMBS.js.map +1 -0
- package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
- package/dist/chunk-AYUKPTSM.js.map +1 -0
- package/dist/chunk-BIPYADGB.js +84 -0
- package/dist/chunk-BIPYADGB.js.map +1 -0
- package/dist/chunk-BRBWNV65.js +457 -0
- package/dist/chunk-BRBWNV65.js.map +1 -0
- package/dist/chunk-BXZ6EA52.js +382 -0
- package/dist/chunk-BXZ6EA52.js.map +1 -0
- package/dist/chunk-EVE7MIIY.js +290 -0
- package/dist/chunk-EVE7MIIY.js.map +1 -0
- package/dist/chunk-F3TTNID2.js +138 -0
- package/dist/chunk-F3TTNID2.js.map +1 -0
- package/dist/chunk-H5RQOFO2.js +190 -0
- package/dist/chunk-H5RQOFO2.js.map +1 -0
- package/dist/chunk-HN3F4WSW.js +145 -0
- package/dist/chunk-HN3F4WSW.js.map +1 -0
- package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
- package/dist/chunk-I6BDYQIG.js.map +1 -0
- package/dist/chunk-IZJMVV7O.js +347 -0
- package/dist/chunk-IZJMVV7O.js.map +1 -0
- package/dist/chunk-KM22GV7G.js +211 -0
- package/dist/chunk-KM22GV7G.js.map +1 -0
- package/dist/chunk-MGFBLVR7.js +103 -0
- package/dist/chunk-MGFBLVR7.js.map +1 -0
- package/dist/chunk-MQJ2ECQT.js +228 -0
- package/dist/chunk-MQJ2ECQT.js.map +1 -0
- package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
- package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
- package/dist/chunk-NPRTSZIF.js +131 -0
- package/dist/chunk-NPRTSZIF.js.map +1 -0
- package/dist/chunk-O7IH7JTI.js +1898 -0
- package/dist/chunk-O7IH7JTI.js.map +1 -0
- package/dist/chunk-OCVQGBJK.js +293 -0
- package/dist/chunk-OCVQGBJK.js.map +1 -0
- package/dist/chunk-P6QINGFL.js +332 -0
- package/dist/chunk-P6QINGFL.js.map +1 -0
- package/dist/chunk-PHDZKPNE.js +91 -0
- package/dist/chunk-PHDZKPNE.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PTGTGXV2.js +164 -0
- package/dist/chunk-PTGTGXV2.js.map +1 -0
- package/dist/chunk-REMIY4U2.js +171 -0
- package/dist/chunk-REMIY4U2.js.map +1 -0
- package/dist/chunk-RZ4YESBG.js +141 -0
- package/dist/chunk-RZ4YESBG.js.map +1 -0
- package/dist/chunk-SAX5MHK4.js +111 -0
- package/dist/chunk-SAX5MHK4.js.map +1 -0
- package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
- package/dist/chunk-SPPMCAKG.js +777 -0
- package/dist/chunk-SPPMCAKG.js.map +1 -0
- package/dist/chunk-SVAPX2XN.js +2441 -0
- package/dist/chunk-SVAPX2XN.js.map +1 -0
- package/dist/chunk-TVEWKIK3.js +452 -0
- package/dist/chunk-TVEWKIK3.js.map +1 -0
- package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
- package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
- package/dist/chunk-VNX5GMTN.js +128 -0
- package/dist/chunk-VNX5GMTN.js.map +1 -0
- package/dist/chunk-VRD5CYRL.js +1568 -0
- package/dist/chunk-VRD5CYRL.js.map +1 -0
- package/dist/chunk-WLUHNG6X.js +122 -0
- package/dist/chunk-WLUHNG6X.js.map +1 -0
- package/dist/chunk-WRAKK6K6.js +265 -0
- package/dist/chunk-WRAKK6K6.js.map +1 -0
- package/dist/chunk-XKYRH4FM.js +681 -0
- package/dist/chunk-XKYRH4FM.js.map +1 -0
- package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
- package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
- package/dist/chunk-ZLZKF2PM.js +310 -0
- package/dist/chunk-ZLZKF2PM.js.map +1 -0
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-ZQSFPMOB.js +21 -0
- package/dist/clipboard-manager-TEO2GEDN.js +24 -0
- package/dist/commands/setup.js +3 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.js +3 -3
- package/dist/commands/status.js +2 -2
- package/dist/commands/stop.js +2 -2
- package/dist/commands/utils.js +2 -2
- package/dist/cron-explain-HHQKPD3M.js +16 -0
- package/dist/crypto-4AP47IKC.js +14 -0
- package/dist/crypto-4AP47IKC.js.map +1 -0
- package/dist/databases-37X4CI2Y.js +21 -0
- package/dist/databases-37X4CI2Y.js.map +1 -0
- package/dist/discord-B3HUPGQ6.js +70 -0
- package/dist/discord-B3HUPGQ6.js.map +1 -0
- package/dist/dist-UISMLMFN.js +21847 -0
- package/dist/dist-UISMLMFN.js.map +1 -0
- package/dist/email-K7LO2IPB.js +268 -0
- package/dist/email-K7LO2IPB.js.map +1 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
- package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
- package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
- package/dist/entity-resolution-Y3IUWEAT.js +24 -0
- package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
- package/dist/env-IWXUVTCB.js +12 -0
- package/dist/env-IWXUVTCB.js.map +1 -0
- package/dist/google-workspace-DKWUVNGC.js +169 -0
- package/dist/google-workspace-DKWUVNGC.js.map +1 -0
- package/dist/hash-tool-ULQYD7B5.js +22 -0
- package/dist/hash-tool-ULQYD7B5.js.map +1 -0
- package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
- package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
- package/dist/image-generation-OSU7FP6F.js +486 -0
- package/dist/image-generation-OSU7FP6F.js.map +1 -0
- package/dist/imessage-NGA2XF2V.js +35 -0
- package/dist/imessage-NGA2XF2V.js.map +1 -0
- package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
- package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
- package/dist/incident-response-C5J7Q6DT.js +244 -0
- package/dist/incident-response-C5J7Q6DT.js.map +1 -0
- package/dist/inventory-manager-352OHXWD.js +24 -0
- package/dist/inventory-manager-352OHXWD.js.map +1 -0
- package/dist/jira-GSGDBMIG.js +199 -0
- package/dist/jira-GSGDBMIG.js.map +1 -0
- package/dist/json-tool-QE2SYHEG.js +26 -0
- package/dist/json-tool-QE2SYHEG.js.map +1 -0
- package/dist/key-rotation-DPHU4ZTB.js +18 -0
- package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
- package/dist/lib.d.ts +603 -11
- package/dist/lib.js +161 -35
- package/dist/lib.js.map +1 -1
- package/dist/mailchimp-KKNF6QJ7.js +152 -0
- package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
- package/dist/matrix-QVHG76I7.js +279 -0
- package/dist/matrix-QVHG76I7.js.map +1 -0
- package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
- package/dist/mcp-3JI6W7ZE.js.map +1 -0
- package/dist/microsoft365-UCBKJHNX.js +164 -0
- package/dist/microsoft365-UCBKJHNX.js.map +1 -0
- package/dist/ocr-AC7NPX33.js +22 -0
- package/dist/ocr-AC7NPX33.js.map +1 -0
- package/dist/ollama-BOAMSPLJ.js +8 -0
- package/dist/ollama-BOAMSPLJ.js.map +1 -0
- package/dist/pages-MI523RB7.js +26 -0
- package/dist/pages-MI523RB7.js.map +1 -0
- package/dist/pair-JDFTERIK.js +24 -0
- package/dist/pair-JDFTERIK.js.map +1 -0
- package/dist/pairing-IFQYCPNS.js +10 -0
- package/dist/pairing-IFQYCPNS.js.map +1 -0
- package/dist/pdf-ALQVOEJR.js +17 -0
- package/dist/pdf-ALQVOEJR.js.map +1 -0
- package/dist/presentations-DSV5IHG5.js +1002 -0
- package/dist/presentations-DSV5IHG5.js.map +1 -0
- package/dist/prometheus-JNT2BD4L.js +10 -0
- package/dist/prometheus-JNT2BD4L.js.map +1 -0
- package/dist/providers-J4LYPHDR.js +19 -0
- package/dist/providers-J4LYPHDR.js.map +1 -0
- package/dist/qr-code-WIX4PB4U.js +16 -0
- package/dist/qr-code-WIX4PB4U.js.map +1 -0
- package/dist/quickbooks-XB4NII2S.js +190 -0
- package/dist/quickbooks-XB4NII2S.js.map +1 -0
- package/dist/regex-tool-W4ABRKGK.js +24 -0
- package/dist/regex-tool-W4ABRKGK.js.map +1 -0
- package/dist/scheduler-VK4WFERV.js +63 -0
- package/dist/scheduler-VK4WFERV.js.map +1 -0
- package/dist/search-BCLBO5E3.js +25 -0
- package/dist/search-BCLBO5E3.js.map +1 -0
- package/dist/sendgrid-RNXCAFKM.js +152 -0
- package/dist/sendgrid-RNXCAFKM.js.map +1 -0
- package/dist/shopify-NCXYJB4R.js +171 -0
- package/dist/shopify-NCXYJB4R.js.map +1 -0
- package/dist/signal-6CGDFYL2.js +35 -0
- package/dist/signal-6CGDFYL2.js.map +1 -0
- package/dist/slack-IZQWIKOH.js +75 -0
- package/dist/slack-IZQWIKOH.js.map +1 -0
- package/dist/sms-M3JIOTCW.js +23 -0
- package/dist/sms-M3JIOTCW.js.map +1 -0
- package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
- package/dist/src-VYUE6LRA.js.map +1 -0
- package/dist/stocks-XXWBPOCU.js +14 -0
- package/dist/stocks-XXWBPOCU.js.map +1 -0
- package/dist/text-transform-6SGUA5Z4.js +22 -0
- package/dist/text-transform-6SGUA5Z4.js.map +1 -0
- package/dist/tools-2RLEI2N6.js +38 -0
- package/dist/tools-2RLEI2N6.js.map +1 -0
- package/dist/tunnel-IWMXUML4.js +301 -0
- package/dist/tunnel-IWMXUML4.js.map +1 -0
- package/dist/twilio-53GEW5JT.js +139 -0
- package/dist/twilio-53GEW5JT.js.map +1 -0
- package/dist/unit-converter-ZYXMEZOE.js +14 -0
- package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
- package/dist/whatsapp-LFX6YKCM.js +35 -0
- package/dist/whatsapp-LFX6YKCM.js.map +1 -0
- package/dist/word-document-7B6SJMAY.js +902 -0
- package/dist/word-document-7B6SJMAY.js.map +1 -0
- package/dist/xero-QYO66D45.js +162 -0
- package/dist/xero-QYO66D45.js.map +1 -0
- package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
- package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
- package/drizzle/0002_mushy_master_mold.sql +140 -0
- package/drizzle/meta/0002_snapshot.json +3637 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +100 -98
- package/dist/bot-KJ26BG56.js +0 -15
- package/dist/chunk-4LVWXUNC.js.map +0 -1
- package/dist/chunk-4TG2IG5K.js +0 -5249
- package/dist/chunk-4TG2IG5K.js.map +0 -1
- package/dist/chunk-6DRDKB45.js.map +0 -1
- package/dist/chunk-CI6Q63MM.js +0 -1613
- package/dist/chunk-CI6Q63MM.js.map +0 -1
- package/dist/chunk-KHNYJY2Z.js +0 -178
- package/dist/chunk-KHNYJY2Z.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -17
- package/dist/discord-ZOJFTVTB.js +0 -49
- package/dist/imessage-JFRB6EJ7.js +0 -14
- package/dist/scheduler-EZ7CZMCS.js +0 -42
- package/dist/signal-T3MCSULM.js +0 -14
- package/dist/slack-N2M4FHAJ.js +0 -54
- package/dist/src-K7GASHRH.js.map +0 -1
- package/dist/tools-24GZHYRF.js +0 -16
- package/dist/whatsapp-VCRUPAO5.js +0 -14
- /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
- /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
- /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
- /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
- /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
- /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
- /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
- /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
- /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
- /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
- /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
- /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
- /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
- /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
- /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
- /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
- /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
- /package/dist/{whatsapp-VCRUPAO5.js.map → cron-explain-HHQKPD3M.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AnthropicProvider,
|
|
3
|
+
initializeProviders,
|
|
4
|
+
providerRegistry
|
|
5
|
+
} from "./chunk-BXZ6EA52.js";
|
|
6
|
+
import "./chunk-ZLZKF2PM.js";
|
|
7
|
+
import {
|
|
8
|
+
OllamaProvider,
|
|
9
|
+
OpenAICompatibleProvider
|
|
10
|
+
} from "./chunk-35WYTA3C.js";
|
|
11
|
+
import "./chunk-PLDDJCW6.js";
|
|
12
|
+
export {
|
|
13
|
+
AnthropicProvider,
|
|
14
|
+
OllamaProvider,
|
|
15
|
+
OpenAICompatibleProvider,
|
|
16
|
+
initializeProviders,
|
|
17
|
+
providerRegistry
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=providers-J4LYPHDR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
generateQRSvg,
|
|
3
|
+
qrCodeTool,
|
|
4
|
+
qr_code_default,
|
|
5
|
+
vcardQRData,
|
|
6
|
+
wifiQRData
|
|
7
|
+
} from "./chunk-VNX5GMTN.js";
|
|
8
|
+
import "./chunk-PLDDJCW6.js";
|
|
9
|
+
export {
|
|
10
|
+
qr_code_default as default,
|
|
11
|
+
generateQRSvg,
|
|
12
|
+
qrCodeTool,
|
|
13
|
+
vcardQRData,
|
|
14
|
+
wifiQRData
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=qr-code-WIX4PB4U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseAdapter
|
|
3
|
+
} from "./chunk-7WQO5J2M.js";
|
|
4
|
+
import "./chunk-PLDDJCW6.js";
|
|
5
|
+
|
|
6
|
+
// src/core/adapters/adapters/quickbooks.ts
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
var QuickBooksAdapter = class extends BaseAdapter {
|
|
9
|
+
metadata = {
|
|
10
|
+
name: "QuickBooks",
|
|
11
|
+
slug: "quickbooks",
|
|
12
|
+
displayName: "QuickBooks",
|
|
13
|
+
description: "Create invoices, manage customers, and generate reports with QuickBooks Online",
|
|
14
|
+
category: "accounting",
|
|
15
|
+
authType: "oauth2"
|
|
16
|
+
};
|
|
17
|
+
async authenticate(credentials) {
|
|
18
|
+
return {
|
|
19
|
+
accessToken: credentials.accessToken || "",
|
|
20
|
+
refreshToken: credentials.refreshToken,
|
|
21
|
+
metadata: {
|
|
22
|
+
realmId: credentials.realmId,
|
|
23
|
+
environment: credentials.environment || "production"
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async refreshAuth(auth) {
|
|
28
|
+
return {
|
|
29
|
+
...auth,
|
|
30
|
+
accessToken: `refreshed_${auth.accessToken}`,
|
|
31
|
+
expiresAt: new Date(Date.now() + 3600 * 1e3)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
getBaseUrl(auth) {
|
|
35
|
+
const realmId = auth.metadata?.realmId || "";
|
|
36
|
+
const environment = auth.metadata?.environment || "production";
|
|
37
|
+
const baseHost = environment === "sandbox" ? "https://sandbox-quickbooks.api.intuit.com" : "https://quickbooks.api.intuit.com";
|
|
38
|
+
return `${baseHost}/v3/company/${realmId}`;
|
|
39
|
+
}
|
|
40
|
+
actions = {
|
|
41
|
+
createInvoice: {
|
|
42
|
+
name: "Create Invoice",
|
|
43
|
+
description: "Create a new invoice in QuickBooks",
|
|
44
|
+
inputSchema: z.object({
|
|
45
|
+
customerRef: z.string(),
|
|
46
|
+
lineItems: z.array(z.object({
|
|
47
|
+
description: z.string(),
|
|
48
|
+
amount: z.number(),
|
|
49
|
+
detailType: z.string().optional().default("SalesItemLineDetail"),
|
|
50
|
+
itemRef: z.string().optional(),
|
|
51
|
+
quantity: z.number().optional(),
|
|
52
|
+
unitPrice: z.number().optional()
|
|
53
|
+
})),
|
|
54
|
+
dueDate: z.string().optional(),
|
|
55
|
+
emailTo: z.string().email().optional(),
|
|
56
|
+
memo: z.string().optional()
|
|
57
|
+
}),
|
|
58
|
+
outputSchema: z.object({ Id: z.string(), DocNumber: z.string(), TotalAmt: z.number(), Balance: z.number() }),
|
|
59
|
+
execute: async (input, auth) => {
|
|
60
|
+
const { customerRef, lineItems, dueDate, emailTo, memo } = input;
|
|
61
|
+
const baseUrl = this.getBaseUrl(auth);
|
|
62
|
+
const invoice = {
|
|
63
|
+
CustomerRef: { value: customerRef },
|
|
64
|
+
Line: lineItems.map((item) => ({
|
|
65
|
+
Description: item.description,
|
|
66
|
+
Amount: item.amount,
|
|
67
|
+
DetailType: item.detailType,
|
|
68
|
+
SalesItemLineDetail: item.itemRef ? {
|
|
69
|
+
ItemRef: { value: item.itemRef },
|
|
70
|
+
Qty: item.quantity || 1,
|
|
71
|
+
UnitPrice: item.unitPrice || item.amount
|
|
72
|
+
} : void 0
|
|
73
|
+
}))
|
|
74
|
+
};
|
|
75
|
+
if (dueDate) invoice.DueDate = dueDate;
|
|
76
|
+
if (emailTo) invoice.BillEmail = { Address: emailTo };
|
|
77
|
+
if (memo) invoice.CustomerMemo = { value: memo };
|
|
78
|
+
const response = await this.makeRequest(
|
|
79
|
+
`${baseUrl}/invoice?minorversion=65`,
|
|
80
|
+
{
|
|
81
|
+
method: "POST",
|
|
82
|
+
body: JSON.stringify(invoice),
|
|
83
|
+
headers: { Accept: "application/json" },
|
|
84
|
+
auth
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
const result = await response.json();
|
|
88
|
+
return result.Invoice;
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
createCustomer: {
|
|
92
|
+
name: "Create Customer",
|
|
93
|
+
description: "Create a new customer in QuickBooks",
|
|
94
|
+
inputSchema: z.object({
|
|
95
|
+
displayName: z.string(),
|
|
96
|
+
givenName: z.string().optional(),
|
|
97
|
+
familyName: z.string().optional(),
|
|
98
|
+
companyName: z.string().optional(),
|
|
99
|
+
email: z.string().email().optional(),
|
|
100
|
+
phone: z.string().optional(),
|
|
101
|
+
billingAddress: z.object({
|
|
102
|
+
line1: z.string(),
|
|
103
|
+
city: z.string(),
|
|
104
|
+
countrySubDivisionCode: z.string(),
|
|
105
|
+
postalCode: z.string(),
|
|
106
|
+
country: z.string().optional()
|
|
107
|
+
}).optional()
|
|
108
|
+
}),
|
|
109
|
+
outputSchema: z.object({ Id: z.string(), DisplayName: z.string(), Active: z.boolean() }),
|
|
110
|
+
execute: async (input, auth) => {
|
|
111
|
+
const { displayName, givenName, familyName, companyName, email, phone, billingAddress } = input;
|
|
112
|
+
const baseUrl = this.getBaseUrl(auth);
|
|
113
|
+
const customer = { DisplayName: displayName };
|
|
114
|
+
if (givenName) customer.GivenName = givenName;
|
|
115
|
+
if (familyName) customer.FamilyName = familyName;
|
|
116
|
+
if (companyName) customer.CompanyName = companyName;
|
|
117
|
+
if (email) customer.PrimaryEmailAddr = { Address: email };
|
|
118
|
+
if (phone) customer.PrimaryPhone = { FreeFormNumber: phone };
|
|
119
|
+
if (billingAddress) {
|
|
120
|
+
customer.BillAddr = {
|
|
121
|
+
Line1: billingAddress.line1,
|
|
122
|
+
City: billingAddress.city,
|
|
123
|
+
CountrySubDivisionCode: billingAddress.countrySubDivisionCode,
|
|
124
|
+
PostalCode: billingAddress.postalCode,
|
|
125
|
+
Country: billingAddress.country
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const response = await this.makeRequest(
|
|
129
|
+
`${baseUrl}/customer?minorversion=65`,
|
|
130
|
+
{
|
|
131
|
+
method: "POST",
|
|
132
|
+
body: JSON.stringify(customer),
|
|
133
|
+
headers: { Accept: "application/json" },
|
|
134
|
+
auth
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
const result = await response.json();
|
|
138
|
+
return result.Customer;
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
getReport: {
|
|
142
|
+
name: "Get Report",
|
|
143
|
+
description: "Generate a financial report from QuickBooks",
|
|
144
|
+
inputSchema: z.object({
|
|
145
|
+
reportType: z.enum(["ProfitAndLoss", "BalanceSheet", "CashFlow", "GeneralLedger", "TrialBalance"]),
|
|
146
|
+
startDate: z.string().optional(),
|
|
147
|
+
endDate: z.string().optional(),
|
|
148
|
+
accountingMethod: z.enum(["Cash", "Accrual"]).optional()
|
|
149
|
+
}),
|
|
150
|
+
outputSchema: z.object({ Header: z.record(z.unknown()), Rows: z.record(z.unknown()), Columns: z.record(z.unknown()) }),
|
|
151
|
+
execute: async (input, auth) => {
|
|
152
|
+
const { reportType, startDate, endDate, accountingMethod } = input;
|
|
153
|
+
const baseUrl = this.getBaseUrl(auth);
|
|
154
|
+
const params = new URLSearchParams({ minorversion: "65" });
|
|
155
|
+
if (startDate) params.set("start_date", startDate);
|
|
156
|
+
if (endDate) params.set("end_date", endDate);
|
|
157
|
+
if (accountingMethod) params.set("accounting_method", accountingMethod);
|
|
158
|
+
const response = await this.makeRequest(
|
|
159
|
+
`${baseUrl}/reports/${reportType}?${params.toString()}`,
|
|
160
|
+
{ headers: { Accept: "application/json" }, auth }
|
|
161
|
+
);
|
|
162
|
+
return response.json();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
triggers = {
|
|
167
|
+
onNewInvoice: {
|
|
168
|
+
name: "New Invoice Created",
|
|
169
|
+
description: "Triggered when a new invoice is created in QuickBooks",
|
|
170
|
+
outputSchema: z.object({ invoiceId: z.string(), docNumber: z.string(), totalAmt: z.number(), customerName: z.string() }),
|
|
171
|
+
subscribe: async (_config, _auth) => {
|
|
172
|
+
},
|
|
173
|
+
unsubscribe: async (_config, _auth) => {
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
onPaymentReceived: {
|
|
177
|
+
name: "Payment Received",
|
|
178
|
+
description: "Triggered when a payment is received in QuickBooks",
|
|
179
|
+
outputSchema: z.object({ paymentId: z.string(), amount: z.number(), customerName: z.string(), paymentDate: z.string() }),
|
|
180
|
+
subscribe: async (_config, _auth) => {
|
|
181
|
+
},
|
|
182
|
+
unsubscribe: async (_config, _auth) => {
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
export {
|
|
188
|
+
QuickBooksAdapter
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=quickbooks-XB4NII2S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/adapters/adapters/quickbooks.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { BaseAdapter } from \"../base-adapter\";\nimport type { AuthResult, ActionDefinition, TriggerDefinition, TriggerConfig } from \"../types\";\n\nexport class QuickBooksAdapter extends BaseAdapter {\n metadata = {\n name: \"QuickBooks\",\n slug: \"quickbooks\",\n displayName: \"QuickBooks\",\n description: \"Create invoices, manage customers, and generate reports with QuickBooks Online\",\n category: \"accounting\",\n authType: \"oauth2\" as const,\n };\n\n async authenticate(credentials: Record<string, string>): Promise<AuthResult> {\n return {\n accessToken: credentials.accessToken || \"\",\n refreshToken: credentials.refreshToken,\n metadata: {\n realmId: credentials.realmId,\n environment: credentials.environment || \"production\",\n },\n };\n }\n\n async refreshAuth(auth: AuthResult): Promise<AuthResult> {\n return {\n ...auth,\n accessToken: `refreshed_${auth.accessToken}`,\n expiresAt: new Date(Date.now() + 3600 * 1000),\n };\n }\n\n private getBaseUrl(auth: AuthResult): string {\n const realmId = (auth.metadata?.realmId as string) || \"\";\n const environment = (auth.metadata?.environment as string) || \"production\";\n const baseHost = environment === \"sandbox\"\n ? \"https://sandbox-quickbooks.api.intuit.com\"\n : \"https://quickbooks.api.intuit.com\";\n return `${baseHost}/v3/company/${realmId}`;\n }\n\n actions: Record<string, ActionDefinition> = {\n createInvoice: {\n name: \"Create Invoice\",\n description: \"Create a new invoice in QuickBooks\",\n inputSchema: z.object({\n customerRef: z.string(),\n lineItems: z.array(z.object({\n description: z.string(),\n amount: z.number(),\n detailType: z.string().optional().default(\"SalesItemLineDetail\"),\n itemRef: z.string().optional(),\n quantity: z.number().optional(),\n unitPrice: z.number().optional(),\n })),\n dueDate: z.string().optional(),\n emailTo: z.string().email().optional(),\n memo: z.string().optional(),\n }),\n outputSchema: z.object({ Id: z.string(), DocNumber: z.string(), TotalAmt: z.number(), Balance: z.number() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { customerRef, lineItems, dueDate, emailTo, memo } = input as {\n customerRef: string;\n lineItems: { description: string; amount: number; detailType: string; itemRef?: string; quantity?: number; unitPrice?: number }[];\n dueDate?: string; emailTo?: string; memo?: string;\n };\n const baseUrl = this.getBaseUrl(auth);\n const invoice: Record<string, unknown> = {\n CustomerRef: { value: customerRef },\n Line: lineItems.map((item) => ({\n Description: item.description,\n Amount: item.amount,\n DetailType: item.detailType,\n SalesItemLineDetail: item.itemRef ? {\n ItemRef: { value: item.itemRef },\n Qty: item.quantity || 1,\n UnitPrice: item.unitPrice || item.amount,\n } : undefined,\n })),\n };\n if (dueDate) invoice.DueDate = dueDate;\n if (emailTo) invoice.BillEmail = { Address: emailTo };\n if (memo) invoice.CustomerMemo = { value: memo };\n const response = await this.makeRequest(\n `${baseUrl}/invoice?minorversion=65`,\n {\n method: \"POST\",\n body: JSON.stringify(invoice),\n headers: { Accept: \"application/json\" },\n auth,\n }\n );\n const result = await response.json() as { Invoice: Record<string, unknown> };\n return result.Invoice;\n },\n },\n createCustomer: {\n name: \"Create Customer\",\n description: \"Create a new customer in QuickBooks\",\n inputSchema: z.object({\n displayName: z.string(),\n givenName: z.string().optional(),\n familyName: z.string().optional(),\n companyName: z.string().optional(),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n billingAddress: z.object({\n line1: z.string(),\n city: z.string(),\n countrySubDivisionCode: z.string(),\n postalCode: z.string(),\n country: z.string().optional(),\n }).optional(),\n }),\n outputSchema: z.object({ Id: z.string(), DisplayName: z.string(), Active: z.boolean() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { displayName, givenName, familyName, companyName, email, phone, billingAddress } = input as {\n displayName: string; givenName?: string; familyName?: string; companyName?: string;\n email?: string; phone?: string; billingAddress?: Record<string, string>;\n };\n const baseUrl = this.getBaseUrl(auth);\n const customer: Record<string, unknown> = { DisplayName: displayName };\n if (givenName) customer.GivenName = givenName;\n if (familyName) customer.FamilyName = familyName;\n if (companyName) customer.CompanyName = companyName;\n if (email) customer.PrimaryEmailAddr = { Address: email };\n if (phone) customer.PrimaryPhone = { FreeFormNumber: phone };\n if (billingAddress) {\n customer.BillAddr = {\n Line1: billingAddress.line1,\n City: billingAddress.city,\n CountrySubDivisionCode: billingAddress.countrySubDivisionCode,\n PostalCode: billingAddress.postalCode,\n Country: billingAddress.country,\n };\n }\n const response = await this.makeRequest(\n `${baseUrl}/customer?minorversion=65`,\n {\n method: \"POST\",\n body: JSON.stringify(customer),\n headers: { Accept: \"application/json\" },\n auth,\n }\n );\n const result = await response.json() as { Customer: Record<string, unknown> };\n return result.Customer;\n },\n },\n getReport: {\n name: \"Get Report\",\n description: \"Generate a financial report from QuickBooks\",\n inputSchema: z.object({\n reportType: z.enum([\"ProfitAndLoss\", \"BalanceSheet\", \"CashFlow\", \"GeneralLedger\", \"TrialBalance\"]),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n accountingMethod: z.enum([\"Cash\", \"Accrual\"]).optional(),\n }),\n outputSchema: z.object({ Header: z.record(z.unknown()), Rows: z.record(z.unknown()), Columns: z.record(z.unknown()) }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { reportType, startDate, endDate, accountingMethod } = input as {\n reportType: string; startDate?: string; endDate?: string; accountingMethod?: string;\n };\n const baseUrl = this.getBaseUrl(auth);\n const params = new URLSearchParams({ minorversion: \"65\" });\n if (startDate) params.set(\"start_date\", startDate);\n if (endDate) params.set(\"end_date\", endDate);\n if (accountingMethod) params.set(\"accounting_method\", accountingMethod);\n const response = await this.makeRequest(\n `${baseUrl}/reports/${reportType}?${params.toString()}`,\n { headers: { Accept: \"application/json\" }, auth }\n );\n return response.json();\n },\n },\n };\n\n triggers: Record<string, TriggerDefinition> = {\n onNewInvoice: {\n name: \"New Invoice Created\",\n description: \"Triggered when a new invoice is created in QuickBooks\",\n outputSchema: z.object({ invoiceId: z.string(), docNumber: z.string(), totalAmt: z.number(), customerName: z.string() }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n onPaymentReceived: {\n name: \"Payment Received\",\n description: \"Triggered when a payment is received in QuickBooks\",\n outputSchema: z.object({ paymentId: z.string(), amount: z.number(), customerName: z.string(), paymentDate: z.string() }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
escapeRegex,
|
|
3
|
+
explainRegex,
|
|
4
|
+
extractCaptures,
|
|
5
|
+
regexTool,
|
|
6
|
+
regex_tool_default,
|
|
7
|
+
replaceWithRegex,
|
|
8
|
+
splitWithRegex,
|
|
9
|
+
testRegex,
|
|
10
|
+
validateRegex
|
|
11
|
+
} from "./chunk-WLUHNG6X.js";
|
|
12
|
+
import "./chunk-PLDDJCW6.js";
|
|
13
|
+
export {
|
|
14
|
+
regex_tool_default as default,
|
|
15
|
+
escapeRegex,
|
|
16
|
+
explainRegex,
|
|
17
|
+
extractCaptures,
|
|
18
|
+
regexTool,
|
|
19
|
+
replaceWithRegex,
|
|
20
|
+
splitWithRegex,
|
|
21
|
+
testRegex,
|
|
22
|
+
validateRegex
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=regex-tool-W4ABRKGK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
findDatabaseByTitle,
|
|
3
|
+
findPageByTitle,
|
|
4
|
+
fullTextSearch,
|
|
5
|
+
getRecentlyEditedDatabases,
|
|
6
|
+
getRecentlyEditedPages,
|
|
7
|
+
search,
|
|
8
|
+
searchAll,
|
|
9
|
+
searchDatabases,
|
|
10
|
+
searchPages
|
|
11
|
+
} from "./chunk-H5RQOFO2.js";
|
|
12
|
+
import "./chunk-VRD5CYRL.js";
|
|
13
|
+
import "./chunk-PLDDJCW6.js";
|
|
14
|
+
export {
|
|
15
|
+
findDatabaseByTitle,
|
|
16
|
+
findPageByTitle,
|
|
17
|
+
fullTextSearch,
|
|
18
|
+
getRecentlyEditedDatabases,
|
|
19
|
+
getRecentlyEditedPages,
|
|
20
|
+
search,
|
|
21
|
+
searchAll,
|
|
22
|
+
searchDatabases,
|
|
23
|
+
searchPages
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=search-BCLBO5E3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|