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/word-document.ts"],"sourcesContent":["import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { randomBytes } from \"crypto\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { isPathAllowed } from \"../../utils/paths\";\n\nexport interface WordDocumentOptions {\n title?: string;\n author?: string;\n subject?: string;\n description?: string;\n keywords?: string[];\n orientation?: \"portrait\" | \"landscape\";\n margins?: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n}\n\nexport interface WordDocumentResult {\n success: boolean;\n filePath?: string;\n error?: string;\n}\n\nexport type ParagraphAlignment = \"left\" | \"center\" | \"right\" | \"justify\";\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface TextRun {\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n color?: string;\n size?: number;\n font?: string;\n highlight?: string;\n}\n\nexport interface Paragraph {\n type: \"paragraph\";\n content: string | TextRun[];\n alignment?: ParagraphAlignment;\n spacing?: {\n before?: number;\n after?: number;\n line?: number;\n };\n indent?: {\n left?: number;\n right?: number;\n firstLine?: number;\n };\n}\n\nexport interface Heading {\n type: \"heading\";\n level: HeadingLevel;\n text: string;\n alignment?: ParagraphAlignment;\n}\n\nexport interface BulletList {\n type: \"bullet-list\";\n items: string[];\n level?: number;\n}\n\nexport interface NumberedList {\n type: \"numbered-list\";\n items: string[];\n start?: number;\n}\n\nexport interface TableCell {\n content: string;\n bold?: boolean;\n alignment?: ParagraphAlignment;\n backgroundColor?: string;\n colSpan?: number;\n rowSpan?: number;\n}\n\nexport interface Table {\n type: \"table\";\n headers?: TableCell[] | string[];\n rows: (TableCell[] | string[])[];\n widths?: number[];\n}\n\nexport interface Image {\n type: \"image\";\n path: string;\n width?: number;\n height?: number;\n alignment?: ParagraphAlignment;\n caption?: string;\n}\n\nexport interface PageBreak {\n type: \"page-break\";\n}\n\nexport interface HorizontalRule {\n type: \"horizontal-rule\";\n}\n\nexport interface TableOfContents {\n type: \"toc\";\n title?: string;\n maxLevel?: HeadingLevel;\n}\n\nexport type DocumentElement =\n | Paragraph\n | Heading\n | BulletList\n | NumberedList\n | Table\n | Image\n | PageBreak\n | HorizontalRule\n | TableOfContents;\n\n// Default options\nconst DEFAULT_OPTIONS: WordDocumentOptions = {\n orientation: \"portrait\",\n margins: { top: 1440, right: 1440, bottom: 1440, left: 1440 }, // 1 inch in twips\n};\n\n// Generate temp file path\nfunction getTempPath(): string {\n const id = randomBytes(8).toString(\"hex\");\n return join(tmpdir(), `sentinel-doc-${id}.docx`);\n}\n\n// Escape XML special characters\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n// Convert twips to EMUs (English Metric Units)\nfunction twipsToEmu(twips: number): number {\n return twips * 635;\n}\n\n// Generate document.xml content\nfunction generateDocumentXml(\n elements: DocumentElement[],\n options: WordDocumentOptions\n): string {\n const orientation = options.orientation || \"portrait\";\n const margins = options.margins || DEFAULT_OPTIONS.margins!;\n\n let bodyContent = \"\";\n\n for (const element of elements) {\n bodyContent += generateElementXml(element);\n }\n\n // Section properties for page setup\n const sectionProps = `\n <w:sectPr>\n <w:pgSz w:w=\"${orientation === \"portrait\" ? \"12240\" : \"15840\"}\" w:h=\"${orientation === \"portrait\" ? \"15840\" : \"12240\"}\" ${orientation === \"landscape\" ? 'w:orient=\"landscape\"' : \"\"}/>\n <w:pgMar w:top=\"${margins.top}\" w:right=\"${margins.right}\" w:bottom=\"${margins.bottom}\" w:left=\"${margins.left}\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/>\n </w:sectPr>\n `;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"\n xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">\n <w:body>\n ${bodyContent}\n ${sectionProps}\n </w:body>\n</w:document>`;\n}\n\n// Generate XML for a single element\nfunction generateElementXml(element: DocumentElement): string {\n switch (element.type) {\n case \"paragraph\":\n return generateParagraphXml(element);\n case \"heading\":\n return generateHeadingXml(element);\n case \"bullet-list\":\n return generateBulletListXml(element);\n case \"numbered-list\":\n return generateNumberedListXml(element);\n case \"table\":\n return generateTableXml(element);\n case \"page-break\":\n return generatePageBreakXml();\n case \"horizontal-rule\":\n return generateHorizontalRuleXml();\n case \"toc\":\n return generateTocXml(element);\n case \"image\":\n return generateImagePlaceholderXml(element);\n default:\n return \"\";\n }\n}\n\n// Generate paragraph XML\nfunction generateParagraphXml(paragraph: Paragraph): string {\n const alignment = getAlignmentValue(paragraph.alignment);\n const spacing = paragraph.spacing;\n const indent = paragraph.indent;\n\n let pPr = \"<w:pPr>\";\n if (alignment) {\n pPr += `<w:jc w:val=\"${alignment}\"/>`;\n }\n if (spacing) {\n pPr += `<w:spacing ${spacing.before ? `w:before=\"${spacing.before}\"` : \"\"} ${spacing.after ? `w:after=\"${spacing.after}\"` : \"\"} ${spacing.line ? `w:line=\"${spacing.line}\"` : \"\"}/>`;\n }\n if (indent) {\n pPr += `<w:ind ${indent.left ? `w:left=\"${indent.left}\"` : \"\"} ${indent.right ? `w:right=\"${indent.right}\"` : \"\"} ${indent.firstLine ? `w:firstLine=\"${indent.firstLine}\"` : \"\"}/>`;\n }\n pPr += \"</w:pPr>\";\n\n let runs = \"\";\n if (typeof paragraph.content === \"string\") {\n runs = `<w:r><w:t xml:space=\"preserve\">${escapeXml(paragraph.content)}</w:t></w:r>`;\n } else {\n for (const run of paragraph.content) {\n runs += generateTextRunXml(run);\n }\n }\n\n return `<w:p>${pPr}${runs}</w:p>`;\n}\n\n// Generate text run XML\nfunction generateTextRunXml(run: TextRun): string {\n let rPr = \"<w:rPr>\";\n\n if (run.bold) rPr += \"<w:b/>\";\n if (run.italic) rPr += \"<w:i/>\";\n if (run.underline) rPr += '<w:u w:val=\"single\"/>';\n if (run.strike) rPr += \"<w:strike/>\";\n if (run.color) rPr += `<w:color w:val=\"${run.color.replace(\"#\", \"\")}\"/>`;\n if (run.size) rPr += `<w:sz w:val=\"${run.size * 2}\"/>`;\n if (run.font) rPr += `<w:rFonts w:ascii=\"${run.font}\" w:hAnsi=\"${run.font}\"/>`;\n if (run.highlight) rPr += `<w:highlight w:val=\"${run.highlight}\"/>`;\n\n rPr += \"</w:rPr>\";\n\n return `<w:r>${rPr}<w:t xml:space=\"preserve\">${escapeXml(run.text)}</w:t></w:r>`;\n}\n\n// Generate heading XML\nfunction generateHeadingXml(heading: Heading): string {\n const styleId = `Heading${heading.level}`;\n const alignment = getAlignmentValue(heading.alignment);\n\n let pPr = `<w:pPr><w:pStyle w:val=\"${styleId}\"/>`;\n if (alignment) {\n pPr += `<w:jc w:val=\"${alignment}\"/>`;\n }\n pPr += \"</w:pPr>\";\n\n return `<w:p>${pPr}<w:r><w:t>${escapeXml(heading.text)}</w:t></w:r></w:p>`;\n}\n\n// Generate bullet list XML\nfunction generateBulletListXml(list: BulletList): string {\n const level = list.level || 0;\n let xml = \"\";\n\n for (const item of list.items) {\n xml += `<w:p>\n <w:pPr>\n <w:pStyle w:val=\"ListParagraph\"/>\n <w:numPr>\n <w:ilvl w:val=\"${level}\"/>\n <w:numId w:val=\"1\"/>\n </w:numPr>\n </w:pPr>\n <w:r><w:t>${escapeXml(item)}</w:t></w:r>\n </w:p>`;\n }\n\n return xml;\n}\n\n// Generate numbered list XML\nfunction generateNumberedListXml(list: NumberedList): string {\n let xml = \"\";\n\n for (const item of list.items) {\n xml += `<w:p>\n <w:pPr>\n <w:pStyle w:val=\"ListParagraph\"/>\n <w:numPr>\n <w:ilvl w:val=\"0\"/>\n <w:numId w:val=\"2\"/>\n </w:numPr>\n </w:pPr>\n <w:r><w:t>${escapeXml(item)}</w:t></w:r>\n </w:p>`;\n }\n\n return xml;\n}\n\n// Generate table XML\nfunction generateTableXml(table: Table): string {\n const columnCount = table.headers?.length || table.rows[0]?.length || 1;\n const defaultWidth = Math.floor(9000 / columnCount);\n\n let xml = `<w:tbl>\n <w:tblPr>\n <w:tblStyle w:val=\"TableGrid\"/>\n <w:tblW w:w=\"0\" w:type=\"auto\"/>\n <w:tblBorders>\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n </w:tblBorders>\n </w:tblPr>\n <w:tblGrid>`;\n\n for (let i = 0; i < columnCount; i++) {\n const width = table.widths?.[i] || defaultWidth;\n xml += `<w:gridCol w:w=\"${width}\"/>`;\n }\n xml += \"</w:tblGrid>\";\n\n // Header row\n if (table.headers) {\n xml += \"<w:tr>\";\n for (const cell of table.headers) {\n xml += generateTableCellXml(cell, true);\n }\n xml += \"</w:tr>\";\n }\n\n // Data rows\n for (const row of table.rows) {\n xml += \"<w:tr>\";\n for (const cell of row) {\n xml += generateTableCellXml(cell, false);\n }\n xml += \"</w:tr>\";\n }\n\n xml += \"</w:tbl>\";\n return xml;\n}\n\n// Generate table cell XML\nfunction generateTableCellXml(\n cell: TableCell | string,\n isHeader: boolean\n): string {\n const cellData: TableCell =\n typeof cell === \"string\" ? { content: cell } : cell;\n\n let tcPr = \"<w:tcPr>\";\n if (cellData.backgroundColor) {\n tcPr += `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${cellData.backgroundColor.replace(\"#\", \"\")}\"/>`;\n }\n if (cellData.colSpan && cellData.colSpan > 1) {\n tcPr += `<w:gridSpan w:val=\"${cellData.colSpan}\"/>`;\n }\n tcPr += \"</w:tcPr>\";\n\n const bold = isHeader || cellData.bold;\n const alignment = getAlignmentValue(cellData.alignment || (isHeader ? \"center\" : \"left\"));\n\n return `<w:tc>\n ${tcPr}\n <w:p>\n <w:pPr>${alignment ? `<w:jc w:val=\"${alignment}\"/>` : \"\"}</w:pPr>\n <w:r>\n ${bold ? \"<w:rPr><w:b/></w:rPr>\" : \"\"}\n <w:t>${escapeXml(cellData.content)}</w:t>\n </w:r>\n </w:p>\n </w:tc>`;\n}\n\n// Generate page break XML\nfunction generatePageBreakXml(): string {\n return '<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>';\n}\n\n// Generate horizontal rule XML\nfunction generateHorizontalRuleXml(): string {\n return `<w:p>\n <w:pPr>\n <w:pBdr>\n <w:bottom w:val=\"single\" w:sz=\"12\" w:space=\"1\" w:color=\"auto\"/>\n </w:pBdr>\n </w:pPr>\n </w:p>`;\n}\n\n// Generate table of contents placeholder XML\nfunction generateTocXml(toc: TableOfContents): string {\n const title = toc.title || \"Table of Contents\";\n return `<w:p>\n <w:pPr><w:pStyle w:val=\"TOCHeading\"/></w:pPr>\n <w:r><w:t>${escapeXml(title)}</w:t></w:r>\n </w:p>\n <w:p>\n <w:r>\n <w:fldChar w:fldCharType=\"begin\"/>\n </w:r>\n <w:r>\n <w:instrText xml:space=\"preserve\"> TOC \\\\o \"1-${toc.maxLevel || 3}\" \\\\h \\\\z \\\\u </w:instrText>\n </w:r>\n <w:r>\n <w:fldChar w:fldCharType=\"separate\"/>\n </w:r>\n <w:r>\n <w:t>[Table of Contents - Update field to populate]</w:t>\n </w:r>\n <w:r>\n <w:fldChar w:fldCharType=\"end\"/>\n </w:r>\n </w:p>`;\n}\n\n// Generate image placeholder XML\nfunction generateImagePlaceholderXml(image: Image): string {\n const alignment = getAlignmentValue(image.alignment || \"center\");\n const caption = image.caption || `[Image: ${image.path}]`;\n\n return `<w:p>\n <w:pPr>${alignment ? `<w:jc w:val=\"${alignment}\"/>` : \"\"}</w:pPr>\n <w:r>\n <w:rPr><w:i/></w:rPr>\n <w:t>${escapeXml(caption)}</w:t>\n </w:r>\n </w:p>`;\n}\n\n// Get alignment value for XML\nfunction getAlignmentValue(\n alignment?: ParagraphAlignment\n): string | null {\n switch (alignment) {\n case \"left\":\n return \"left\";\n case \"center\":\n return \"center\";\n case \"right\":\n return \"right\";\n case \"justify\":\n return \"both\";\n default:\n return null;\n }\n}\n\n// Generate styles.xml\nfunction generateStylesXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault>\n <w:rPr>\n <w:rFonts w:ascii=\"Calibri\" w:hAnsi=\"Calibri\" w:eastAsia=\"Calibri\" w:cs=\"Calibri\"/>\n <w:sz w:val=\"22\"/>\n </w:rPr>\n </w:rPrDefault>\n <w:pPrDefault>\n <w:pPr>\n <w:spacing w:after=\"160\" w:line=\"259\" w:lineRule=\"auto\"/>\n </w:pPr>\n </w:pPrDefault>\n </w:docDefaults>\n <w:style w:type=\"paragraph\" w:styleId=\"Normal\" w:default=\"1\">\n <w:name w:val=\"Normal\"/>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\">\n <w:name w:val=\"heading 1\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"240\" w:after=\"0\"/><w:outlineLvl w:val=\"0\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"2F5496\"/><w:sz w:val=\"32\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\">\n <w:name w:val=\"heading 2\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"200\" w:after=\"0\"/><w:outlineLvl w:val=\"1\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"2F5496\"/><w:sz w:val=\"26\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\">\n <w:name w:val=\"heading 3\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"160\" w:after=\"0\"/><w:outlineLvl w:val=\"2\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:b/><w:color w:val=\"1F3763\"/><w:sz w:val=\"24\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading4\">\n <w:name w:val=\"heading 4\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"120\" w:after=\"0\"/><w:outlineLvl w:val=\"3\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Calibri Light\" w:hAnsi=\"Calibri Light\"/><w:i/><w:color w:val=\"2F5496\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading5\">\n <w:name w:val=\"heading 5\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"80\" w:after=\"0\"/><w:outlineLvl w:val=\"4\"/></w:pPr>\n <w:rPr><w:color w:val=\"2F5496\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading6\">\n <w:name w:val=\"heading 6\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:spacing w:before=\"40\" w:after=\"0\"/><w:outlineLvl w:val=\"5\"/></w:pPr>\n <w:rPr><w:color w:val=\"1F3763\"/></w:rPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"ListParagraph\">\n <w:name w:val=\"List Paragraph\"/>\n <w:basedOn w:val=\"Normal\"/>\n <w:pPr><w:ind w:left=\"720\"/></w:pPr>\n </w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"TOCHeading\">\n <w:name w:val=\"TOC Heading\"/>\n <w:basedOn w:val=\"Heading1\"/>\n <w:next w:val=\"Normal\"/>\n <w:pPr><w:outlineLvl w:val=\"9\"/></w:pPr>\n </w:style>\n <w:style w:type=\"table\" w:styleId=\"TableGrid\">\n <w:name w:val=\"Table Grid\"/>\n <w:tblPr>\n <w:tblBorders>\n <w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n <w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>\n </w:tblBorders>\n </w:tblPr>\n </w:style>\n</w:styles>`;\n}\n\n// Generate numbering.xml for lists\nfunction generateNumberingXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <!-- Bullet list definition -->\n <w:abstractNum w:abstractNumId=\"0\">\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"o\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:hint=\"default\"/></w:rPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"bullet\"/>\n <w:lvlText w:val=\"\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n <w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr>\n </w:lvl>\n </w:abstractNum>\n <!-- Numbered list definition -->\n <w:abstractNum w:abstractNumId=\"1\">\n <w:lvl w:ilvl=\"0\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"decimal\"/>\n <w:lvlText w:val=\"%1.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr>\n </w:lvl>\n <w:lvl w:ilvl=\"1\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"lowerLetter\"/>\n <w:lvlText w:val=\"%2.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr>\n </w:lvl>\n <w:lvl w:ilvl=\"2\">\n <w:start w:val=\"1\"/>\n <w:numFmt w:val=\"lowerRoman\"/>\n <w:lvlText w:val=\"%3.\"/>\n <w:lvlJc w:val=\"left\"/>\n <w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr>\n </w:lvl>\n </w:abstractNum>\n <w:num w:numId=\"1\"><w:abstractNumId w:val=\"0\"/></w:num>\n <w:num w:numId=\"2\"><w:abstractNumId w:val=\"1\"/></w:num>\n</w:numbering>`;\n}\n\n// Generate [Content_Types].xml\nfunction generateContentTypesXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n <Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\n <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>\n <Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/>\n <Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>\n <Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>\n</Types>`;\n}\n\n// Generate _rels/.rels\nfunction generateRootRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>\n</Relationships>`;\n}\n\n// Generate word/_rels/document.xml.rels\nfunction generateDocumentRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>\n</Relationships>`;\n}\n\n// Generate docProps/core.xml\nfunction generateCorePropsXml(options: WordDocumentOptions): string {\n const now = new Date().toISOString();\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n ${options.title ? `<dc:title>${escapeXml(options.title)}</dc:title>` : \"\"}\n ${options.author ? `<dc:creator>${escapeXml(options.author)}</dc:creator>` : \"<dc:creator>OpenSentinel</dc:creator>\"}\n ${options.subject ? `<dc:subject>${escapeXml(options.subject)}</dc:subject>` : \"\"}\n ${options.description ? `<dc:description>${escapeXml(options.description)}</dc:description>` : \"\"}\n ${options.keywords ? `<cp:keywords>${escapeXml(options.keywords.join(\", \"))}</cp:keywords>` : \"\"}\n <dcterms:created xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:created>\n <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>\n</cp:coreProperties>`;\n}\n\n// Generate docProps/app.xml\nfunction generateAppPropsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\">\n <Application>OpenSentinel Document Generator</Application>\n <AppVersion>1.0</AppVersion>\n</Properties>`;\n}\n\n// Generate Word document using docx library if available, otherwise create raw OOXML\nexport async function generateWordDocument(\n elements: DocumentElement[],\n filename?: string,\n options: WordDocumentOptions = {}\n): Promise<WordDocumentResult> {\n const filePath = filename\n ? isPathAllowed(filename)\n ? filename\n : join(tmpdir(), filename)\n : getTempPath();\n\n try {\n await mkdir(dirname(filePath), { recursive: true });\n\n // Try to use docx library if available\n try {\n const docx = await import(\"docx\");\n return await generateWithDocxLibrary(elements, filePath, options, docx);\n } catch {\n // Fallback: generate raw OOXML and create the ZIP manually\n console.log(\"[WordDocument] docx library not available, using raw OOXML generation\");\n return await generateRawDocx(elements, filePath, options);\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Generate using docx library\nasync function generateWithDocxLibrary(\n elements: DocumentElement[],\n filePath: string,\n options: WordDocumentOptions,\n docx: typeof import(\"docx\")\n): Promise<WordDocumentResult> {\n const { Document, Packer, Paragraph, TextRun, HeadingLevel, AlignmentType, Table, TableRow, TableCell, WidthType, BorderStyle, PageBreak } = docx;\n\n const children: (\n | InstanceType<typeof Paragraph>\n | InstanceType<typeof Table>\n )[] = [];\n\n for (const element of elements) {\n switch (element.type) {\n case \"paragraph\": {\n const runs: InstanceType<typeof TextRun>[] = [];\n if (typeof element.content === \"string\") {\n runs.push(new TextRun(element.content));\n } else {\n for (const run of element.content) {\n runs.push(\n new TextRun({\n text: run.text,\n bold: run.bold,\n italics: run.italic,\n underline: run.underline ? {} : undefined,\n strike: run.strike,\n color: run.color?.replace(\"#\", \"\"),\n size: run.size ? run.size * 2 : undefined,\n font: run.font,\n highlight: run.highlight as \"yellow\" | \"green\" | \"cyan\" | \"magenta\" | \"blue\" | \"red\" | \"darkBlue\" | \"darkCyan\" | \"darkGreen\" | \"darkMagenta\" | \"darkRed\" | \"darkYellow\" | \"darkGray\" | \"lightGray\" | \"black\" | undefined,\n })\n );\n }\n }\n children.push(\n new Paragraph({\n children: runs,\n alignment: getDocxAlignment(element.alignment, AlignmentType),\n spacing: element.spacing\n ? {\n before: element.spacing.before,\n after: element.spacing.after,\n line: element.spacing.line,\n }\n : undefined,\n indent: element.indent\n ? {\n left: element.indent.left,\n right: element.indent.right,\n firstLine: element.indent.firstLine,\n }\n : undefined,\n })\n );\n break;\n }\n case \"heading\": {\n const headingLevelMap: Record<HeadingLevel, (typeof HeadingLevel)[keyof typeof HeadingLevel]> = {\n 1: HeadingLevel.HEADING_1,\n 2: HeadingLevel.HEADING_2,\n 3: HeadingLevel.HEADING_3,\n 4: HeadingLevel.HEADING_4,\n 5: HeadingLevel.HEADING_5,\n 6: HeadingLevel.HEADING_6,\n };\n children.push(\n new Paragraph({\n text: element.text,\n heading: headingLevelMap[element.level],\n alignment: getDocxAlignment(element.alignment, AlignmentType),\n })\n );\n break;\n }\n case \"bullet-list\": {\n for (const item of element.items) {\n children.push(\n new Paragraph({\n text: item,\n bullet: { level: element.level || 0 },\n })\n );\n }\n break;\n }\n case \"numbered-list\": {\n for (let i = 0; i < element.items.length; i++) {\n children.push(\n new Paragraph({\n text: element.items[i],\n numbering: {\n reference: \"default-numbering\",\n level: 0,\n },\n })\n );\n }\n break;\n }\n case \"table\": {\n const rows: InstanceType<typeof TableRow>[] = [];\n\n if (element.headers) {\n rows.push(\n new TableRow({\n children: element.headers.map((cell) => {\n const cellData = typeof cell === \"string\" ? { content: cell } : cell;\n return new TableCell({\n children: [\n new Paragraph({\n children: [\n new TextRun({ text: cellData.content, bold: true }),\n ],\n alignment: AlignmentType.CENTER,\n }),\n ],\n shading: cellData.backgroundColor\n ? { fill: cellData.backgroundColor.replace(\"#\", \"\") }\n : { fill: \"E0E0E0\" },\n });\n }),\n tableHeader: true,\n })\n );\n }\n\n for (const row of element.rows) {\n rows.push(\n new TableRow({\n children: row.map((cell) => {\n const cellData = typeof cell === \"string\" ? { content: cell } : cell;\n return new TableCell({\n children: [\n new Paragraph({\n children: [\n new TextRun({\n text: cellData.content,\n bold: cellData.bold,\n }),\n ],\n alignment: getDocxAlignment(cellData.alignment, AlignmentType),\n }),\n ],\n shading: cellData.backgroundColor\n ? { fill: cellData.backgroundColor.replace(\"#\", \"\") }\n : undefined,\n columnSpan: cellData.colSpan,\n rowSpan: cellData.rowSpan,\n });\n }),\n })\n );\n }\n\n children.push(\n new Table({\n rows,\n width: { size: 100, type: WidthType.PERCENTAGE },\n })\n );\n break;\n }\n case \"page-break\": {\n children.push(\n new Paragraph({\n children: [new PageBreak()],\n })\n );\n break;\n }\n case \"horizontal-rule\": {\n children.push(\n new Paragraph({\n border: {\n bottom: {\n color: \"auto\",\n space: 1,\n style: BorderStyle.SINGLE,\n size: 12,\n },\n },\n })\n );\n break;\n }\n case \"toc\": {\n children.push(\n new Paragraph({\n text: element.title || \"Table of Contents\",\n heading: HeadingLevel.HEADING_1,\n })\n );\n children.push(\n new Paragraph({\n text: \"[Update field to generate Table of Contents]\",\n })\n );\n break;\n }\n case \"image\": {\n children.push(\n new Paragraph({\n text: element.caption || `[Image: ${element.path}]`,\n alignment: getDocxAlignment(element.alignment, AlignmentType),\n })\n );\n break;\n }\n }\n }\n\n const doc = new Document({\n title: options.title,\n creator: options.author || \"OpenSentinel\",\n subject: options.subject,\n description: options.description,\n keywords: options.keywords?.join(\", \"),\n sections: [\n {\n properties: {\n page: {\n size: {\n orientation:\n options.orientation === \"landscape\"\n ? docx.PageOrientation.LANDSCAPE\n : docx.PageOrientation.PORTRAIT,\n },\n margin: options.margins\n ? {\n top: options.margins.top,\n right: options.margins.right,\n bottom: options.margins.bottom,\n left: options.margins.left,\n }\n : undefined,\n },\n },\n children,\n },\n ],\n numbering: {\n config: [\n {\n reference: \"default-numbering\",\n levels: [\n {\n level: 0,\n format: docx.LevelFormat.DECIMAL,\n text: \"%1.\",\n alignment: AlignmentType.START,\n },\n ],\n },\n ],\n },\n });\n\n const buffer = await Packer.toBuffer(doc);\n await writeFile(filePath, buffer);\n\n return { success: true, filePath };\n}\n\n// Get docx AlignmentType from string\nfunction getDocxAlignment(\n alignment: ParagraphAlignment | undefined,\n AlignmentType: { LEFT: unknown; CENTER: unknown; RIGHT: unknown; JUSTIFIED: unknown }\n): unknown {\n switch (alignment) {\n case \"left\":\n return AlignmentType.LEFT;\n case \"center\":\n return AlignmentType.CENTER;\n case \"right\":\n return AlignmentType.RIGHT;\n case \"justify\":\n return AlignmentType.JUSTIFIED;\n default:\n return undefined;\n }\n}\n\n// Generate raw OOXML and create ZIP\nasync function generateRawDocx(\n elements: DocumentElement[],\n filePath: string,\n options: WordDocumentOptions\n): Promise<WordDocumentResult> {\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n\n try {\n // Try to use archiver for ZIP creation\n const archiver = await import(\"archiver\");\n const fs = await import(\"fs\");\n\n const output = fs.createWriteStream(filePath);\n const archive = archiver.default(\"zip\", { zlib: { level: 9 } });\n\n return new Promise((resolve) => {\n output.on(\"close\", () => {\n resolve({ success: true, filePath });\n });\n\n archive.on(\"error\", (err: Error) => {\n resolve({ success: false, error: err.message });\n });\n\n archive.pipe(output);\n\n // Add files to archive\n archive.append(generateContentTypesXml(), { name: \"[Content_Types].xml\" });\n archive.append(generateRootRelsXml(), { name: \"_rels/.rels\" });\n archive.append(generateDocumentXml(elements, finalOptions), { name: \"word/document.xml\" });\n archive.append(generateStylesXml(), { name: \"word/styles.xml\" });\n archive.append(generateNumberingXml(), { name: \"word/numbering.xml\" });\n archive.append(generateDocumentRelsXml(), { name: \"word/_rels/document.xml.rels\" });\n archive.append(generateCorePropsXml(finalOptions), { name: \"docProps/core.xml\" });\n archive.append(generateAppPropsXml(), { name: \"docProps/app.xml\" });\n\n archive.finalize();\n });\n } catch {\n // Ultimate fallback: save as XML for manual processing\n const xmlPath = filePath.replace(\".docx\", \".xml\");\n const documentXml = generateDocumentXml(elements, finalOptions);\n await writeFile(xmlPath, documentXml, \"utf-8\");\n\n return {\n success: true,\n filePath: xmlPath,\n };\n }\n}\n\n// Generate Word document from markdown\nexport async function generateWordFromMarkdown(\n markdown: string,\n filename?: string,\n options?: WordDocumentOptions\n): Promise<WordDocumentResult> {\n const elements = parseMarkdownToElements(markdown);\n return generateWordDocument(elements, filename, options);\n}\n\n// Simple markdown parser to document elements\nfunction parseMarkdownToElements(markdown: string): DocumentElement[] {\n const elements: DocumentElement[] = [];\n const lines = markdown.split(\"\\n\");\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Headers\n const headerMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headerMatch) {\n elements.push({\n type: \"heading\",\n level: headerMatch[1].length as HeadingLevel,\n text: headerMatch[2].trim(),\n });\n i++;\n continue;\n }\n\n // Horizontal rule\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line.trim())) {\n elements.push({ type: \"horizontal-rule\" });\n i++;\n continue;\n }\n\n // Bullet list\n if (/^[-*+]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^[-*+]\\s+/.test(lines[i])) {\n items.push(lines[i].replace(/^[-*+]\\s+/, \"\").trim());\n i++;\n }\n elements.push({ type: \"bullet-list\", items });\n continue;\n }\n\n // Numbered list\n if (/^\\d+\\.\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\d+\\.\\s+/.test(lines[i])) {\n items.push(lines[i].replace(/^\\d+\\.\\s+/, \"\").trim());\n i++;\n }\n elements.push({ type: \"numbered-list\", items });\n continue;\n }\n\n // Empty line\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n // Regular paragraph (collect consecutive non-empty lines)\n let paragraphText = \"\";\n while (i < lines.length && lines[i].trim() !== \"\" && !/^(#{1,6}|[-*+]|\\d+\\.)\\s+/.test(lines[i])) {\n paragraphText += (paragraphText ? \" \" : \"\") + lines[i].trim();\n i++;\n }\n\n if (paragraphText) {\n // Parse inline formatting\n const runs = parseInlineFormatting(paragraphText);\n elements.push({\n type: \"paragraph\",\n content: runs.length === 1 && !runs[0].bold && !runs[0].italic ? paragraphText : runs,\n });\n }\n }\n\n return elements;\n}\n\n// Parse inline markdown formatting\nfunction parseInlineFormatting(text: string): TextRun[] {\n const runs: TextRun[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n // Bold + Italic\n const boldItalicMatch = remaining.match(/^\\*\\*\\*(.+?)\\*\\*\\*/);\n if (boldItalicMatch) {\n runs.push({ text: boldItalicMatch[1], bold: true, italic: true });\n remaining = remaining.slice(boldItalicMatch[0].length);\n continue;\n }\n\n // Bold\n const boldMatch = remaining.match(/^\\*\\*(.+?)\\*\\*/);\n if (boldMatch) {\n runs.push({ text: boldMatch[1], bold: true });\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n // Italic\n const italicMatch = remaining.match(/^\\*(.+?)\\*/);\n if (italicMatch) {\n runs.push({ text: italicMatch[1], italic: true });\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n // Strikethrough\n const strikeMatch = remaining.match(/^~~(.+?)~~/);\n if (strikeMatch) {\n runs.push({ text: strikeMatch[1], strike: true });\n remaining = remaining.slice(strikeMatch[0].length);\n continue;\n }\n\n // Code (treated as monospace)\n const codeMatch = remaining.match(/^`(.+?)`/);\n if (codeMatch) {\n runs.push({ text: codeMatch[1], font: \"Courier New\" });\n remaining = remaining.slice(codeMatch[0].length);\n continue;\n }\n\n // Regular text until next formatting\n const nextFormat = remaining.search(/(\\*\\*\\*|\\*\\*|\\*|~~|`)/);\n if (nextFormat === -1) {\n runs.push({ text: remaining });\n break;\n } else if (nextFormat === 0) {\n // Unmatched formatting character, treat as regular text\n runs.push({ text: remaining[0] });\n remaining = remaining.slice(1);\n } else {\n runs.push({ text: remaining.slice(0, nextFormat) });\n remaining = remaining.slice(nextFormat);\n }\n }\n\n return runs;\n}\n\n// Main function for tool use\nexport async function generateWord(\n content: string | DocumentElement[],\n filename: string,\n options?: WordDocumentOptions & { contentType?: \"markdown\" | \"elements\" }\n): Promise<WordDocumentResult> {\n const contentType = options?.contentType || \"markdown\";\n\n if (contentType === \"elements\" || Array.isArray(content)) {\n return generateWordDocument(content as DocumentElement[], filename, options);\n }\n\n return generateWordFromMarkdown(content as string, filename, options);\n}\n\nexport default {\n generateWord,\n generateWordDocument,\n generateWordFromMarkdown,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseAdapter
|
|
3
|
+
} from "./chunk-7WQO5J2M.js";
|
|
4
|
+
import "./chunk-PLDDJCW6.js";
|
|
5
|
+
|
|
6
|
+
// src/core/adapters/adapters/xero.ts
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
var XeroAdapter = class extends BaseAdapter {
|
|
9
|
+
metadata = {
|
|
10
|
+
name: "Xero",
|
|
11
|
+
slug: "xero",
|
|
12
|
+
displayName: "Xero",
|
|
13
|
+
description: "Create invoices, manage contacts, and generate financial reports with Xero",
|
|
14
|
+
category: "accounting",
|
|
15
|
+
authType: "oauth2"
|
|
16
|
+
};
|
|
17
|
+
async authenticate(credentials) {
|
|
18
|
+
return {
|
|
19
|
+
accessToken: credentials.accessToken || "",
|
|
20
|
+
refreshToken: credentials.refreshToken,
|
|
21
|
+
metadata: {
|
|
22
|
+
tenantId: credentials.tenantId
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async refreshAuth(auth) {
|
|
27
|
+
return {
|
|
28
|
+
...auth,
|
|
29
|
+
accessToken: `refreshed_${auth.accessToken}`,
|
|
30
|
+
expiresAt: new Date(Date.now() + 1800 * 1e3)
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
getHeaders(auth) {
|
|
34
|
+
const tenantId = auth.metadata?.tenantId || "";
|
|
35
|
+
return {
|
|
36
|
+
Authorization: `Bearer ${auth.accessToken}`,
|
|
37
|
+
"Xero-Tenant-Id": tenantId,
|
|
38
|
+
"Content-Type": "application/json",
|
|
39
|
+
Accept: "application/json"
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
actions = {
|
|
43
|
+
createInvoice: {
|
|
44
|
+
name: "Create Invoice",
|
|
45
|
+
description: "Create a new invoice in Xero",
|
|
46
|
+
inputSchema: z.object({
|
|
47
|
+
contactId: z.string(),
|
|
48
|
+
lineItems: z.array(z.object({
|
|
49
|
+
description: z.string(),
|
|
50
|
+
quantity: z.number(),
|
|
51
|
+
unitAmount: z.number(),
|
|
52
|
+
accountCode: z.string().optional(),
|
|
53
|
+
taxType: z.string().optional()
|
|
54
|
+
})),
|
|
55
|
+
type: z.enum(["ACCREC", "ACCPAY"]).default("ACCREC"),
|
|
56
|
+
dueDate: z.string().optional(),
|
|
57
|
+
reference: z.string().optional(),
|
|
58
|
+
currencyCode: z.string().optional().default("USD")
|
|
59
|
+
}),
|
|
60
|
+
outputSchema: z.object({ InvoiceID: z.string(), InvoiceNumber: z.string(), Total: z.number(), Status: z.string() }),
|
|
61
|
+
execute: async (input, auth) => {
|
|
62
|
+
const { contactId, lineItems, type, dueDate, reference, currencyCode } = input;
|
|
63
|
+
const invoice = {
|
|
64
|
+
Type: type,
|
|
65
|
+
Contact: { ContactID: contactId },
|
|
66
|
+
LineItems: lineItems.map((item) => ({
|
|
67
|
+
Description: item.description,
|
|
68
|
+
Quantity: item.quantity,
|
|
69
|
+
UnitAmount: item.unitAmount,
|
|
70
|
+
AccountCode: item.accountCode,
|
|
71
|
+
TaxType: item.taxType
|
|
72
|
+
})),
|
|
73
|
+
CurrencyCode: currencyCode
|
|
74
|
+
};
|
|
75
|
+
if (dueDate) invoice.DueDate = dueDate;
|
|
76
|
+
if (reference) invoice.Reference = reference;
|
|
77
|
+
const response = await this.makeRequest(
|
|
78
|
+
"https://api.xero.com/api.xro/2.0/Invoices",
|
|
79
|
+
{ method: "POST", body: JSON.stringify({ Invoices: [invoice] }), headers: this.getHeaders(auth) }
|
|
80
|
+
);
|
|
81
|
+
const result = await response.json();
|
|
82
|
+
return result.Invoices[0];
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
createContact: {
|
|
86
|
+
name: "Create Contact",
|
|
87
|
+
description: "Create a new contact in Xero",
|
|
88
|
+
inputSchema: z.object({
|
|
89
|
+
name: z.string(),
|
|
90
|
+
firstName: z.string().optional(),
|
|
91
|
+
lastName: z.string().optional(),
|
|
92
|
+
emailAddress: z.string().email().optional(),
|
|
93
|
+
phone: z.string().optional(),
|
|
94
|
+
accountNumber: z.string().optional(),
|
|
95
|
+
taxNumber: z.string().optional(),
|
|
96
|
+
isCustomer: z.boolean().optional().default(true),
|
|
97
|
+
isSupplier: z.boolean().optional().default(false)
|
|
98
|
+
}),
|
|
99
|
+
outputSchema: z.object({ ContactID: z.string(), Name: z.string(), ContactStatus: z.string() }),
|
|
100
|
+
execute: async (input, auth) => {
|
|
101
|
+
const { name, firstName, lastName, emailAddress, phone, accountNumber, taxNumber, isCustomer, isSupplier } = input;
|
|
102
|
+
const contact = { Name: name };
|
|
103
|
+
if (firstName) contact.FirstName = firstName;
|
|
104
|
+
if (lastName) contact.LastName = lastName;
|
|
105
|
+
if (emailAddress) contact.EmailAddress = emailAddress;
|
|
106
|
+
if (phone) contact.Phones = [{ PhoneType: "DEFAULT", PhoneNumber: phone }];
|
|
107
|
+
if (accountNumber) contact.AccountNumber = accountNumber;
|
|
108
|
+
if (taxNumber) contact.TaxNumber = taxNumber;
|
|
109
|
+
contact.IsCustomer = isCustomer;
|
|
110
|
+
contact.IsSupplier = isSupplier;
|
|
111
|
+
const response = await this.makeRequest(
|
|
112
|
+
"https://api.xero.com/api.xro/2.0/Contacts",
|
|
113
|
+
{ method: "POST", body: JSON.stringify({ Contacts: [contact] }), headers: this.getHeaders(auth) }
|
|
114
|
+
);
|
|
115
|
+
const result = await response.json();
|
|
116
|
+
return result.Contacts[0];
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
getReport: {
|
|
120
|
+
name: "Get Report",
|
|
121
|
+
description: "Generate a financial report from Xero",
|
|
122
|
+
inputSchema: z.object({
|
|
123
|
+
reportType: z.enum(["ProfitAndLoss", "BalanceSheet", "TrialBalance", "BankSummary", "AgedPayablesByContact", "AgedReceivablesByContact"]),
|
|
124
|
+
fromDate: z.string().optional(),
|
|
125
|
+
toDate: z.string().optional(),
|
|
126
|
+
periods: z.number().optional(),
|
|
127
|
+
timeframe: z.enum(["MONTH", "QUARTER", "YEAR"]).optional()
|
|
128
|
+
}),
|
|
129
|
+
outputSchema: z.object({ ReportID: z.string(), ReportName: z.string(), ReportDate: z.string(), Rows: z.array(z.record(z.unknown())) }),
|
|
130
|
+
execute: async (input, auth) => {
|
|
131
|
+
const { reportType, fromDate, toDate, periods, timeframe } = input;
|
|
132
|
+
const params = new URLSearchParams();
|
|
133
|
+
if (fromDate) params.set("fromDate", fromDate);
|
|
134
|
+
if (toDate) params.set("toDate", toDate);
|
|
135
|
+
if (periods) params.set("periods", String(periods));
|
|
136
|
+
if (timeframe) params.set("timeframe", timeframe);
|
|
137
|
+
const queryString = params.toString() ? `?${params.toString()}` : "";
|
|
138
|
+
const response = await this.makeRequest(
|
|
139
|
+
`https://api.xero.com/api.xro/2.0/Reports/${reportType}${queryString}`,
|
|
140
|
+
{ headers: this.getHeaders(auth) }
|
|
141
|
+
);
|
|
142
|
+
const result = await response.json();
|
|
143
|
+
return result.Reports[0];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
triggers = {
|
|
148
|
+
onNewInvoice: {
|
|
149
|
+
name: "New Invoice Created",
|
|
150
|
+
description: "Triggered when a new invoice is created in Xero",
|
|
151
|
+
outputSchema: z.object({ invoiceId: z.string(), invoiceNumber: z.string(), total: z.number(), contactName: z.string(), type: z.string() }),
|
|
152
|
+
subscribe: async (_config, _auth) => {
|
|
153
|
+
},
|
|
154
|
+
unsubscribe: async (_config, _auth) => {
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
export {
|
|
160
|
+
XeroAdapter
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=xero-QYO66D45.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/adapters/adapters/xero.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { BaseAdapter } from \"../base-adapter\";\nimport type { AuthResult, ActionDefinition, TriggerDefinition, TriggerConfig } from \"../types\";\n\nexport class XeroAdapter extends BaseAdapter {\n metadata = {\n name: \"Xero\",\n slug: \"xero\",\n displayName: \"Xero\",\n description: \"Create invoices, manage contacts, and generate financial reports with Xero\",\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 tenantId: credentials.tenantId,\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() + 1800 * 1000),\n };\n }\n\n private getHeaders(auth: AuthResult): Record<string, string> {\n const tenantId = (auth.metadata?.tenantId as string) || \"\";\n return {\n Authorization: `Bearer ${auth.accessToken}`,\n \"Xero-Tenant-Id\": tenantId,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n }\n\n actions: Record<string, ActionDefinition> = {\n createInvoice: {\n name: \"Create Invoice\",\n description: \"Create a new invoice in Xero\",\n inputSchema: z.object({\n contactId: z.string(),\n lineItems: z.array(z.object({\n description: z.string(),\n quantity: z.number(),\n unitAmount: z.number(),\n accountCode: z.string().optional(),\n taxType: z.string().optional(),\n })),\n type: z.enum([\"ACCREC\", \"ACCPAY\"]).default(\"ACCREC\"),\n dueDate: z.string().optional(),\n reference: z.string().optional(),\n currencyCode: z.string().optional().default(\"USD\"),\n }),\n outputSchema: z.object({ InvoiceID: z.string(), InvoiceNumber: z.string(), Total: z.number(), Status: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { contactId, lineItems, type, dueDate, reference, currencyCode } = input as {\n contactId: string;\n lineItems: { description: string; quantity: number; unitAmount: number; accountCode?: string; taxType?: string }[];\n type: string; dueDate?: string; reference?: string; currencyCode: string;\n };\n const invoice: Record<string, unknown> = {\n Type: type,\n Contact: { ContactID: contactId },\n LineItems: lineItems.map((item) => ({\n Description: item.description,\n Quantity: item.quantity,\n UnitAmount: item.unitAmount,\n AccountCode: item.accountCode,\n TaxType: item.taxType,\n })),\n CurrencyCode: currencyCode,\n };\n if (dueDate) invoice.DueDate = dueDate;\n if (reference) invoice.Reference = reference;\n const response = await this.makeRequest(\n \"https://api.xero.com/api.xro/2.0/Invoices\",\n { method: \"POST\", body: JSON.stringify({ Invoices: [invoice] }), headers: this.getHeaders(auth) }\n );\n const result = await response.json() as { Invoices: Record<string, unknown>[] };\n return result.Invoices[0];\n },\n },\n createContact: {\n name: \"Create Contact\",\n description: \"Create a new contact in Xero\",\n inputSchema: z.object({\n name: z.string(),\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n emailAddress: z.string().email().optional(),\n phone: z.string().optional(),\n accountNumber: z.string().optional(),\n taxNumber: z.string().optional(),\n isCustomer: z.boolean().optional().default(true),\n isSupplier: z.boolean().optional().default(false),\n }),\n outputSchema: z.object({ ContactID: z.string(), Name: z.string(), ContactStatus: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { name, firstName, lastName, emailAddress, phone, accountNumber, taxNumber, isCustomer, isSupplier } = input as {\n name: string; firstName?: string; lastName?: string; emailAddress?: string;\n phone?: string; accountNumber?: string; taxNumber?: string;\n isCustomer: boolean; isSupplier: boolean;\n };\n const contact: Record<string, unknown> = { Name: name };\n if (firstName) contact.FirstName = firstName;\n if (lastName) contact.LastName = lastName;\n if (emailAddress) contact.EmailAddress = emailAddress;\n if (phone) contact.Phones = [{ PhoneType: \"DEFAULT\", PhoneNumber: phone }];\n if (accountNumber) contact.AccountNumber = accountNumber;\n if (taxNumber) contact.TaxNumber = taxNumber;\n contact.IsCustomer = isCustomer;\n contact.IsSupplier = isSupplier;\n const response = await this.makeRequest(\n \"https://api.xero.com/api.xro/2.0/Contacts\",\n { method: \"POST\", body: JSON.stringify({ Contacts: [contact] }), headers: this.getHeaders(auth) }\n );\n const result = await response.json() as { Contacts: Record<string, unknown>[] };\n return result.Contacts[0];\n },\n },\n getReport: {\n name: \"Get Report\",\n description: \"Generate a financial report from Xero\",\n inputSchema: z.object({\n reportType: z.enum([\"ProfitAndLoss\", \"BalanceSheet\", \"TrialBalance\", \"BankSummary\", \"AgedPayablesByContact\", \"AgedReceivablesByContact\"]),\n fromDate: z.string().optional(),\n toDate: z.string().optional(),\n periods: z.number().optional(),\n timeframe: z.enum([\"MONTH\", \"QUARTER\", \"YEAR\"]).optional(),\n }),\n outputSchema: z.object({ ReportID: z.string(), ReportName: z.string(), ReportDate: z.string(), Rows: z.array(z.record(z.unknown())) }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { reportType, fromDate, toDate, periods, timeframe } = input as {\n reportType: string; fromDate?: string; toDate?: string; periods?: number; timeframe?: string;\n };\n const params = new URLSearchParams();\n if (fromDate) params.set(\"fromDate\", fromDate);\n if (toDate) params.set(\"toDate\", toDate);\n if (periods) params.set(\"periods\", String(periods));\n if (timeframe) params.set(\"timeframe\", timeframe);\n const queryString = params.toString() ? `?${params.toString()}` : \"\";\n const response = await this.makeRequest(\n `https://api.xero.com/api.xro/2.0/Reports/${reportType}${queryString}`,\n { headers: this.getHeaders(auth) }\n );\n const result = await response.json() as { Reports: Record<string, unknown>[] };\n return result.Reports[0];\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 Xero\",\n outputSchema: z.object({ invoiceId: z.string(), invoiceNumber: z.string(), total: z.number(), contactName: z.string(), type: 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,106 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseAdapter
|
|
3
|
+
} from "./chunk-7WQO5J2M.js";
|
|
4
|
+
import "./chunk-PLDDJCW6.js";
|
|
5
|
+
|
|
6
|
+
// src/core/adapters/adapters/zapier-webhook.ts
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
var ZapierWebhookAdapter = class extends BaseAdapter {
|
|
9
|
+
metadata = {
|
|
10
|
+
name: "ZapierWebhook",
|
|
11
|
+
slug: "zapier-webhook",
|
|
12
|
+
displayName: "Zapier Webhook",
|
|
13
|
+
description: "Trigger Zaps and send data via webhooks to integrate with Zapier automations",
|
|
14
|
+
category: "automation",
|
|
15
|
+
authType: "none"
|
|
16
|
+
};
|
|
17
|
+
async authenticate(credentials) {
|
|
18
|
+
return {
|
|
19
|
+
accessToken: "",
|
|
20
|
+
metadata: {
|
|
21
|
+
defaultWebhookUrl: credentials.webhookUrl
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
actions = {
|
|
26
|
+
triggerZap: {
|
|
27
|
+
name: "Trigger Zap",
|
|
28
|
+
description: "Trigger a Zapier Zap by sending data to a catch hook URL",
|
|
29
|
+
inputSchema: z.object({
|
|
30
|
+
webhookUrl: z.string().url(),
|
|
31
|
+
data: z.record(z.unknown())
|
|
32
|
+
}),
|
|
33
|
+
outputSchema: z.object({ status: z.string(), id: z.string().optional(), requestId: z.string().optional() }),
|
|
34
|
+
execute: async (input, _auth) => {
|
|
35
|
+
const { webhookUrl, data } = input;
|
|
36
|
+
const response = await this.makeRequest(
|
|
37
|
+
webhookUrl,
|
|
38
|
+
{ method: "POST", body: JSON.stringify(data) }
|
|
39
|
+
);
|
|
40
|
+
try {
|
|
41
|
+
return await response.json();
|
|
42
|
+
} catch {
|
|
43
|
+
return {
|
|
44
|
+
status: "success",
|
|
45
|
+
requestId: response.headers.get("x-request-id") || ""
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
sendWebhook: {
|
|
51
|
+
name: "Send Webhook",
|
|
52
|
+
description: "Send a generic webhook request to any URL",
|
|
53
|
+
inputSchema: z.object({
|
|
54
|
+
url: z.string().url(),
|
|
55
|
+
method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).optional().default("POST"),
|
|
56
|
+
headers: z.record(z.string()).optional(),
|
|
57
|
+
body: z.record(z.unknown()).optional(),
|
|
58
|
+
queryParams: z.record(z.string()).optional()
|
|
59
|
+
}),
|
|
60
|
+
outputSchema: z.object({ statusCode: z.number(), headers: z.record(z.string()), body: z.unknown() }),
|
|
61
|
+
execute: async (input, _auth) => {
|
|
62
|
+
const { url, method, headers, body, queryParams } = input;
|
|
63
|
+
let fullUrl = url;
|
|
64
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
65
|
+
const params = new URLSearchParams(queryParams);
|
|
66
|
+
fullUrl = `${url}${url.includes("?") ? "&" : "?"}${params.toString()}`;
|
|
67
|
+
}
|
|
68
|
+
const requestOptions = { method };
|
|
69
|
+
if (headers) requestOptions.headers = headers;
|
|
70
|
+
if (body && method !== "GET") requestOptions.body = JSON.stringify(body);
|
|
71
|
+
const response = await this.makeRequest(fullUrl, requestOptions);
|
|
72
|
+
const responseHeaders = {};
|
|
73
|
+
response.headers.forEach((value, key) => {
|
|
74
|
+
responseHeaders[key] = value;
|
|
75
|
+
});
|
|
76
|
+
let responseBody;
|
|
77
|
+
const contentType = response.headers.get("content-type") || "";
|
|
78
|
+
if (contentType.includes("application/json")) {
|
|
79
|
+
responseBody = await response.json();
|
|
80
|
+
} else {
|
|
81
|
+
responseBody = await response.text();
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
statusCode: response.status,
|
|
85
|
+
headers: responseHeaders,
|
|
86
|
+
body: responseBody
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
triggers = {
|
|
92
|
+
onWebhookReceived: {
|
|
93
|
+
name: "Webhook Received",
|
|
94
|
+
description: "Triggered when a webhook is received from Zapier or any external source",
|
|
95
|
+
outputSchema: z.object({ method: z.string(), headers: z.record(z.string()), body: z.unknown(), receivedAt: z.string() }),
|
|
96
|
+
subscribe: async (_config, _auth) => {
|
|
97
|
+
},
|
|
98
|
+
unsubscribe: async (_config, _auth) => {
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
export {
|
|
104
|
+
ZapierWebhookAdapter
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=zapier-webhook-TBZ5YF2A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/adapters/adapters/zapier-webhook.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { BaseAdapter } from \"../base-adapter\";\nimport type { AuthResult, ActionDefinition, TriggerDefinition, TriggerConfig } from \"../types\";\n\nexport class ZapierWebhookAdapter extends BaseAdapter {\n metadata = {\n name: \"ZapierWebhook\",\n slug: \"zapier-webhook\",\n displayName: \"Zapier Webhook\",\n description: \"Trigger Zaps and send data via webhooks to integrate with Zapier automations\",\n category: \"automation\",\n authType: \"none\" as const,\n };\n\n async authenticate(credentials: Record<string, string>): Promise<AuthResult> {\n return {\n accessToken: \"\",\n metadata: {\n defaultWebhookUrl: credentials.webhookUrl,\n },\n };\n }\n\n actions: Record<string, ActionDefinition> = {\n triggerZap: {\n name: \"Trigger Zap\",\n description: \"Trigger a Zapier Zap by sending data to a catch hook URL\",\n inputSchema: z.object({\n webhookUrl: z.string().url(),\n data: z.record(z.unknown()),\n }),\n outputSchema: z.object({ status: z.string(), id: z.string().optional(), requestId: z.string().optional() }),\n execute: async (input: unknown, _auth: AuthResult) => {\n const { webhookUrl, data } = input as { webhookUrl: string; data: Record<string, unknown> };\n const response = await this.makeRequest(\n webhookUrl,\n { method: \"POST\", body: JSON.stringify(data) }\n );\n try {\n return await response.json();\n } catch {\n return {\n status: \"success\",\n requestId: response.headers.get(\"x-request-id\") || \"\",\n };\n }\n },\n },\n sendWebhook: {\n name: \"Send Webhook\",\n description: \"Send a generic webhook request to any URL\",\n inputSchema: z.object({\n url: z.string().url(),\n method: z.enum([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"]).optional().default(\"POST\"),\n headers: z.record(z.string()).optional(),\n body: z.record(z.unknown()).optional(),\n queryParams: z.record(z.string()).optional(),\n }),\n outputSchema: z.object({ statusCode: z.number(), headers: z.record(z.string()), body: z.unknown() }),\n execute: async (input: unknown, _auth: AuthResult) => {\n const { url, method, headers, body, queryParams } = input as {\n url: string; method: string; headers?: Record<string, string>;\n body?: Record<string, unknown>; queryParams?: Record<string, string>;\n };\n let fullUrl = url;\n if (queryParams && Object.keys(queryParams).length > 0) {\n const params = new URLSearchParams(queryParams);\n fullUrl = `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${params.toString()}`;\n }\n const requestOptions: RequestInit = { method };\n if (headers) requestOptions.headers = headers;\n if (body && method !== \"GET\") requestOptions.body = JSON.stringify(body);\n const response = await this.makeRequest(fullUrl, requestOptions);\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n let responseBody: unknown;\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n return {\n statusCode: response.status,\n headers: responseHeaders,\n body: responseBody,\n };\n },\n },\n };\n\n triggers: Record<string, TriggerDefinition> = {\n onWebhookReceived: {\n name: \"Webhook Received\",\n description: \"Triggered when a webhook is received from Zapier or any external source\",\n outputSchema: z.object({ method: z.string(), headers: z.record(z.string()), body: z.unknown(), receivedAt: 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,140 @@
|
|
|
1
|
+
CREATE TABLE "document_chunks" (
|
|
2
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
3
|
+
"document_id" uuid NOT NULL,
|
|
4
|
+
"chunk_index" integer NOT NULL,
|
|
5
|
+
"content" text NOT NULL,
|
|
6
|
+
"embedding" vector(1536),
|
|
7
|
+
"token_count" integer,
|
|
8
|
+
"metadata" jsonb,
|
|
9
|
+
"created_at" timestamp DEFAULT now() NOT NULL
|
|
10
|
+
);
|
|
11
|
+
--> statement-breakpoint
|
|
12
|
+
CREATE TABLE "documents" (
|
|
13
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
14
|
+
"name" text NOT NULL,
|
|
15
|
+
"filename" text,
|
|
16
|
+
"mime_type" text,
|
|
17
|
+
"file_size" integer,
|
|
18
|
+
"source" text,
|
|
19
|
+
"source_url" text,
|
|
20
|
+
"metadata" jsonb,
|
|
21
|
+
"status" text DEFAULT 'pending' NOT NULL,
|
|
22
|
+
"error_message" text,
|
|
23
|
+
"chunk_count" integer DEFAULT 0,
|
|
24
|
+
"total_tokens" integer DEFAULT 0,
|
|
25
|
+
"user_id" uuid,
|
|
26
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
27
|
+
"updated_at" timestamp DEFAULT now() NOT NULL,
|
|
28
|
+
"processed_at" timestamp
|
|
29
|
+
);
|
|
30
|
+
--> statement-breakpoint
|
|
31
|
+
CREATE TABLE "graph_entities" (
|
|
32
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
33
|
+
"user_id" uuid,
|
|
34
|
+
"type" text NOT NULL,
|
|
35
|
+
"name" text NOT NULL,
|
|
36
|
+
"aliases" jsonb DEFAULT '[]'::jsonb,
|
|
37
|
+
"description" text,
|
|
38
|
+
"attributes" jsonb DEFAULT '{}'::jsonb,
|
|
39
|
+
"importance" integer DEFAULT 50,
|
|
40
|
+
"mention_count" integer DEFAULT 1,
|
|
41
|
+
"embedding" vector(1536),
|
|
42
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
43
|
+
"updated_at" timestamp DEFAULT now() NOT NULL
|
|
44
|
+
);
|
|
45
|
+
--> statement-breakpoint
|
|
46
|
+
CREATE TABLE "graph_relationships" (
|
|
47
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
48
|
+
"source_entity_id" uuid NOT NULL,
|
|
49
|
+
"target_entity_id" uuid NOT NULL,
|
|
50
|
+
"type" text NOT NULL,
|
|
51
|
+
"strength" integer DEFAULT 50,
|
|
52
|
+
"bidirectional" boolean DEFAULT false,
|
|
53
|
+
"context" text,
|
|
54
|
+
"attributes" jsonb DEFAULT '{}'::jsonb,
|
|
55
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
56
|
+
"updated_at" timestamp DEFAULT now() NOT NULL
|
|
57
|
+
);
|
|
58
|
+
--> statement-breakpoint
|
|
59
|
+
CREATE TABLE "incident_timeline" (
|
|
60
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
61
|
+
"incident_id" uuid NOT NULL,
|
|
62
|
+
"event_type" text NOT NULL,
|
|
63
|
+
"description" text NOT NULL,
|
|
64
|
+
"performed_by" uuid,
|
|
65
|
+
"metadata" jsonb,
|
|
66
|
+
"created_at" timestamp DEFAULT now() NOT NULL
|
|
67
|
+
);
|
|
68
|
+
--> statement-breakpoint
|
|
69
|
+
CREATE TABLE "security_incidents" (
|
|
70
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
71
|
+
"incident_number" text NOT NULL,
|
|
72
|
+
"title" text NOT NULL,
|
|
73
|
+
"description" text NOT NULL,
|
|
74
|
+
"type" text NOT NULL,
|
|
75
|
+
"severity" text NOT NULL,
|
|
76
|
+
"status" text DEFAULT 'open' NOT NULL,
|
|
77
|
+
"user_id" uuid,
|
|
78
|
+
"assigned_to" uuid,
|
|
79
|
+
"source" text NOT NULL,
|
|
80
|
+
"source_data" jsonb,
|
|
81
|
+
"impact_assessment" text,
|
|
82
|
+
"containment_actions" jsonb,
|
|
83
|
+
"resolution_notes" text,
|
|
84
|
+
"related_incidents" jsonb,
|
|
85
|
+
"metadata" jsonb,
|
|
86
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
87
|
+
"updated_at" timestamp DEFAULT now() NOT NULL,
|
|
88
|
+
"investigated_at" timestamp,
|
|
89
|
+
"contained_at" timestamp,
|
|
90
|
+
"resolved_at" timestamp,
|
|
91
|
+
"closed_at" timestamp,
|
|
92
|
+
CONSTRAINT "security_incidents_incident_number_unique" UNIQUE("incident_number")
|
|
93
|
+
);
|
|
94
|
+
--> statement-breakpoint
|
|
95
|
+
CREATE TABLE "two_factor_auth" (
|
|
96
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
97
|
+
"user_id" uuid NOT NULL,
|
|
98
|
+
"secret_encrypted" text NOT NULL,
|
|
99
|
+
"recovery_codes" jsonb NOT NULL,
|
|
100
|
+
"enabled_at" timestamp NOT NULL,
|
|
101
|
+
"last_verified_at" timestamp,
|
|
102
|
+
"key_version" integer DEFAULT 1 NOT NULL,
|
|
103
|
+
"metadata" jsonb,
|
|
104
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
105
|
+
"updated_at" timestamp DEFAULT now() NOT NULL,
|
|
106
|
+
CONSTRAINT "two_factor_auth_user_id_unique" UNIQUE("user_id")
|
|
107
|
+
);
|
|
108
|
+
--> statement-breakpoint
|
|
109
|
+
ALTER TABLE "audit_logs" ADD COLUMN "sequence_number" integer;--> statement-breakpoint
|
|
110
|
+
ALTER TABLE "audit_logs" ADD COLUMN "entry_hash" text;--> statement-breakpoint
|
|
111
|
+
ALTER TABLE "audit_logs" ADD COLUMN "previous_hash" text;--> statement-breakpoint
|
|
112
|
+
ALTER TABLE "memories" ADD COLUMN "search_vector" "tsvector";--> statement-breakpoint
|
|
113
|
+
ALTER TABLE "memories" ADD COLUMN "provenance" text;--> statement-breakpoint
|
|
114
|
+
ALTER TABLE "memories" ADD COLUMN "encrypted" boolean DEFAULT false NOT NULL;--> statement-breakpoint
|
|
115
|
+
ALTER TABLE "messages" ADD COLUMN "encrypted" boolean DEFAULT false NOT NULL;--> statement-breakpoint
|
|
116
|
+
ALTER TABLE "document_chunks" ADD CONSTRAINT "document_chunks_document_id_documents_id_fk" FOREIGN KEY ("document_id") REFERENCES "public"."documents"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
117
|
+
ALTER TABLE "documents" ADD CONSTRAINT "documents_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
118
|
+
ALTER TABLE "graph_entities" ADD CONSTRAINT "graph_entities_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
119
|
+
ALTER TABLE "graph_relationships" ADD CONSTRAINT "graph_relationships_source_entity_id_graph_entities_id_fk" FOREIGN KEY ("source_entity_id") REFERENCES "public"."graph_entities"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
120
|
+
ALTER TABLE "graph_relationships" ADD CONSTRAINT "graph_relationships_target_entity_id_graph_entities_id_fk" FOREIGN KEY ("target_entity_id") REFERENCES "public"."graph_entities"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
121
|
+
ALTER TABLE "incident_timeline" ADD CONSTRAINT "incident_timeline_incident_id_security_incidents_id_fk" FOREIGN KEY ("incident_id") REFERENCES "public"."security_incidents"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
122
|
+
ALTER TABLE "incident_timeline" ADD CONSTRAINT "incident_timeline_performed_by_users_id_fk" FOREIGN KEY ("performed_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
123
|
+
ALTER TABLE "security_incidents" ADD CONSTRAINT "security_incidents_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
124
|
+
ALTER TABLE "security_incidents" ADD CONSTRAINT "security_incidents_assigned_to_users_id_fk" FOREIGN KEY ("assigned_to") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
125
|
+
ALTER TABLE "two_factor_auth" ADD CONSTRAINT "two_factor_auth_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
126
|
+
CREATE INDEX "document_chunks_document_idx" ON "document_chunks" USING btree ("document_id");--> statement-breakpoint
|
|
127
|
+
CREATE INDEX "documents_user_idx" ON "documents" USING btree ("user_id");--> statement-breakpoint
|
|
128
|
+
CREATE INDEX "documents_status_idx" ON "documents" USING btree ("status");--> statement-breakpoint
|
|
129
|
+
CREATE INDEX "graph_entities_user_idx" ON "graph_entities" USING btree ("user_id");--> statement-breakpoint
|
|
130
|
+
CREATE INDEX "graph_entities_type_idx" ON "graph_entities" USING btree ("type");--> statement-breakpoint
|
|
131
|
+
CREATE INDEX "graph_entities_name_idx" ON "graph_entities" USING btree ("name");--> statement-breakpoint
|
|
132
|
+
CREATE INDEX "graph_rel_source_idx" ON "graph_relationships" USING btree ("source_entity_id");--> statement-breakpoint
|
|
133
|
+
CREATE INDEX "graph_rel_target_idx" ON "graph_relationships" USING btree ("target_entity_id");--> statement-breakpoint
|
|
134
|
+
CREATE INDEX "graph_rel_type_idx" ON "graph_relationships" USING btree ("type");--> statement-breakpoint
|
|
135
|
+
CREATE INDEX "incident_timeline_incident_idx" ON "incident_timeline" USING btree ("incident_id");--> statement-breakpoint
|
|
136
|
+
CREATE INDEX "security_incidents_status_idx" ON "security_incidents" USING btree ("status");--> statement-breakpoint
|
|
137
|
+
CREATE INDEX "security_incidents_severity_idx" ON "security_incidents" USING btree ("severity");--> statement-breakpoint
|
|
138
|
+
CREATE INDEX "security_incidents_created_idx" ON "security_incidents" USING btree ("created_at");--> statement-breakpoint
|
|
139
|
+
CREATE INDEX "two_factor_auth_user_idx" ON "two_factor_auth" USING btree ("user_id");--> statement-breakpoint
|
|
140
|
+
CREATE INDEX "audit_logs_sequence_idx" ON "audit_logs" USING btree ("sequence_number");
|