opensentinel 3.1.1 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -83
- package/dist/agent-manager-JZ4IM7XI.js +39 -0
- package/dist/agent-processor-DDDHC2SO.js +281 -0
- package/dist/agent-processor-DDDHC2SO.js.map +1 -0
- package/dist/agent-types-2T4PXLFQ.js +12 -0
- package/dist/alerting-LK7VVYTX.js +699 -0
- package/dist/alerting-LK7VVYTX.js.map +1 -0
- package/dist/analysis-agent-JWN2GXYE.js +288 -0
- package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
- package/dist/analyzer-OTWE3ARE.js +22 -0
- package/dist/{archiver-AVNBYCKQ.js → archiver-FPGKRP6P.js} +2 -2
- package/dist/{audit-logger-OBPR7CRO.js → audit-logger-CI4WZQPD.js} +6 -5
- package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
- package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
- package/dist/autonomy-N7W5XPLX.js.map +1 -0
- package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
- package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
- package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
- package/dist/bot-VDHBGUVI.js +47 -0
- package/dist/brain-6QTXN4QP.js +66 -0
- package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
- package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
- package/dist/{chunk-WRAKK6K6.js → chunk-2I5QHYG6.js} +5 -3
- package/dist/chunk-2I5QHYG6.js.map +1 -0
- package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
- package/dist/chunk-3AWAWRWB.js +143 -0
- package/dist/chunk-3AWAWRWB.js.map +1 -0
- package/dist/{chunk-ZLZKF2PM.js → chunk-4KIHDIXZ.js} +43 -2
- package/dist/chunk-4KIHDIXZ.js.map +1 -0
- package/dist/{chunk-EVE7MIIY.js → chunk-4WH6MFEW.js} +15 -16
- package/dist/chunk-4WH6MFEW.js.map +1 -0
- package/dist/{chunk-I6BDYQIG.js → chunk-56UJS2LA.js} +6 -6
- package/dist/chunk-56UJS2LA.js.map +1 -0
- package/dist/chunk-5BTVJR7R.js +37 -0
- package/dist/chunk-5BTVJR7R.js.map +1 -0
- package/dist/chunk-5JJTLWOR.js +1021 -0
- package/dist/chunk-5JJTLWOR.js.map +1 -0
- package/dist/chunk-66SAOZPU.js +236 -0
- package/dist/chunk-66SAOZPU.js.map +1 -0
- package/dist/chunk-6HGMRR4J.js +113 -0
- package/dist/chunk-6HGMRR4J.js.map +1 -0
- package/dist/chunk-6W6PTJFT.js +181 -0
- package/dist/chunk-6W6PTJFT.js.map +1 -0
- package/dist/chunk-6ZNCY2GI.js +418 -0
- package/dist/chunk-6ZNCY2GI.js.map +1 -0
- package/dist/chunk-7BNFELEK.js +31 -0
- package/dist/chunk-7BNFELEK.js.map +1 -0
- package/dist/chunk-ADTDYJO7.js +265 -0
- package/dist/chunk-ADTDYJO7.js.map +1 -0
- package/dist/{chunk-OCVQGBJK.js → chunk-BBN4VCNK.js} +6 -4
- package/dist/chunk-BBN4VCNK.js.map +1 -0
- package/dist/{chunk-SJSUSJ47.js → chunk-BNZHWAZC.js} +2 -2
- package/dist/chunk-C6PELIHS.js +60 -0
- package/dist/chunk-C6PELIHS.js.map +1 -0
- package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
- package/dist/{chunk-NHMBTUMW.js → chunk-CWT6CAE5.js} +2 -2
- package/dist/{chunk-4GLYY4NN.js → chunk-CZTMGHUC.js} +8 -2
- package/dist/chunk-CZTMGHUC.js.map +1 -0
- package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
- package/dist/chunk-DOYGMNMK.js.map +1 -0
- package/dist/chunk-DTISLIMB.js +89 -0
- package/dist/chunk-DTISLIMB.js.map +1 -0
- package/dist/{chunk-SPPMCAKG.js → chunk-GBVJTRXS.js} +2 -2
- package/dist/chunk-GBVJTRXS.js.map +1 -0
- package/dist/{chunk-AYUKPTSM.js → chunk-GJETKBOY.js} +96 -218
- package/dist/chunk-GJETKBOY.js.map +1 -0
- package/dist/{chunk-BXZ6EA52.js → chunk-GW6V4D43.js} +57 -3
- package/dist/chunk-GW6V4D43.js.map +1 -0
- package/dist/{chunk-6PMVAAA7.js → chunk-HJSEEFO3.js} +3 -3
- package/dist/{chunk-TYAGMJNV.js → chunk-HQZQFEAX.js} +5 -5
- package/dist/{chunk-MXAPLSJ5.js → chunk-J4JW73TT.js} +2 -2
- package/dist/{chunk-VEHFVBLI.js → chunk-JHYYFPKX.js} +2 -2
- package/dist/chunk-LFDXEYYB.js +150 -0
- package/dist/chunk-LFDXEYYB.js.map +1 -0
- package/dist/chunk-MIC5IBQF.js +386 -0
- package/dist/chunk-MIC5IBQF.js.map +1 -0
- package/dist/chunk-ODCFS5WD.js +463 -0
- package/dist/chunk-ODCFS5WD.js.map +1 -0
- package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
- package/dist/chunk-P64EV4YY.js.map +1 -0
- package/dist/chunk-PBOCSGNL.js +84 -0
- package/dist/chunk-PBOCSGNL.js.map +1 -0
- package/dist/{chunk-66OJ3WB4.js → chunk-PD3CTDO6.js} +2 -2
- package/dist/chunk-QPY3WRVM.js +647 -0
- package/dist/chunk-QPY3WRVM.js.map +1 -0
- package/dist/chunk-S2EOIVF4.js +3907 -0
- package/dist/chunk-S2EOIVF4.js.map +1 -0
- package/dist/chunk-SDLOMKCW.js +213 -0
- package/dist/chunk-SDLOMKCW.js.map +1 -0
- package/dist/chunk-TKBVW7ZJ.js +162 -0
- package/dist/chunk-TKBVW7ZJ.js.map +1 -0
- package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
- package/dist/chunk-U2X2J3FI.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
- package/dist/{chunk-SVAPX2XN.js → chunk-V3OKHQUX.js} +9 -7
- package/dist/{chunk-SVAPX2XN.js.map → chunk-V3OKHQUX.js.map} +1 -1
- package/dist/{chunk-4UOE5TUZ.js → chunk-WMDVOWN6.js} +4 -4
- package/dist/chunk-WMFYI7XC.js +564 -0
- package/dist/chunk-WMFYI7XC.js.map +1 -0
- package/dist/chunk-WZAH34TG.js +129 -0
- package/dist/chunk-WZAH34TG.js.map +1 -0
- package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
- package/dist/chunk-X6Q3K3L2.js.map +1 -0
- package/dist/chunk-XTX7EK43.js +134 -0
- package/dist/chunk-XTX7EK43.js.map +1 -0
- package/dist/chunk-YEDEAX6Y.js +194 -0
- package/dist/chunk-YEDEAX6Y.js.map +1 -0
- package/dist/{chunk-XKYRH4FM.js → chunk-ZIBRVA3Y.js} +70 -30
- package/dist/chunk-ZIBRVA3Y.js.map +1 -0
- package/dist/chunk-ZIYTHUM5.js +457 -0
- package/dist/chunk-ZIYTHUM5.js.map +1 -0
- package/dist/{chunk-766ASQWE.js → chunk-ZMML6T63.js} +2711 -2329
- package/dist/chunk-ZMML6T63.js.map +1 -0
- package/dist/chunk-ZVHG4KF2.js +380 -0
- package/dist/chunk-ZVHG4KF2.js.map +1 -0
- package/dist/chunker-K6WTR62A.js +12 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
- package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
- package/dist/coding-agent-DESSU3AC.js +233 -0
- package/dist/coding-agent-DESSU3AC.js.map +1 -0
- package/dist/commands/setup.js +2 -2
- 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/cost-tracker-KZQSTSE2.js +11 -0
- package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
- package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
- package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
- package/dist/db-I7MNG6CL.js +83 -0
- package/dist/discord-6UQHCN27.js +81 -0
- package/dist/documents-PFHSK7SZ.js +184 -0
- package/dist/documents-PFHSK7SZ.js.map +1 -0
- package/dist/docx-parser-EXL4TN5E.js +16 -0
- package/dist/{email-K7LO2IPB.js → email-6OIN4SYL.js} +34 -25
- package/dist/email-6OIN4SYL.js.map +1 -0
- package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-JWX2HWU4.js} +12 -8
- package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
- package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
- package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-7Z6STVXX.js} +6 -5
- package/dist/env-GN5VHI43.js +12 -0
- package/dist/error-tracker-64DEH3D7.js +32 -0
- package/dist/finnhub-X7ZMQSXF.js +178 -0
- package/dist/finnhub-X7ZMQSXF.js.map +1 -0
- package/dist/fred-TMUF3J2V.js +203 -0
- package/dist/fred-TMUF3J2V.js.map +1 -0
- package/dist/github-DUWSXCNP.js +833 -0
- package/dist/github-DUWSXCNP.js.map +1 -0
- package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
- package/dist/graph-client-NB475AK5.js +17 -0
- package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
- package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
- package/dist/hooks-N4MIFBVM.js +14 -0
- package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
- package/dist/imessage-DSGSGUZS.js +44 -0
- package/dist/inbox-summarizer-F2KAU72V.js +56 -0
- package/dist/{incident-response-C5J7Q6DT.js → incident-response-E3UGMX5G.js} +8 -6
- package/dist/incident-response-E3UGMX5G.js.map +1 -0
- package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
- package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
- package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
- package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
- package/dist/knowledge-base-5SMMOGQJ.js +46 -0
- package/dist/lib.d.ts +94 -1
- package/dist/lib.js +83 -66
- package/dist/lib.js.map +1 -1
- package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
- package/dist/{matrix-QVHG76I7.js → matrix-WYGEOZL5.js} +30 -21
- package/dist/{matrix-QVHG76I7.js.map → matrix-WYGEOZL5.js.map} +1 -1
- package/dist/{mcp-3JI6W7ZE.js → mcp-DJ2QDA6A.js} +3 -3
- package/dist/metrics-BH3ZLGEV.js +25 -0
- package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
- package/dist/multi-user-XAEMB244.js +411 -0
- package/dist/multi-user-XAEMB244.js.map +1 -0
- package/dist/oauth-UPJYFOVU.js +34 -0
- package/dist/{ocr-AC7NPX33.js → ocr-UONKTQU7.js} +6 -4
- package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
- package/dist/osint-agent-RL5XPBRQ.js +189 -0
- package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
- package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
- package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
- package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
- package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
- package/dist/pdf-parser-YLMTTYHL.js +14 -0
- package/dist/{presentations-DSV5IHG5.js → presentations-UOET2FVZ.js} +3 -3
- package/dist/presentations-UOET2FVZ.js.map +1 -0
- package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
- package/dist/prometheus-YETCZO4I.js.map +1 -0
- package/dist/{providers-J4LYPHDR.js → providers-2YQ6E3IF.js} +6 -4
- package/dist/providers-2YQ6E3IF.js.map +1 -0
- package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
- package/dist/qr-code-6WZJHRKL.js.map +1 -0
- package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
- package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
- package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
- package/dist/research-agent-WCRSY3UZ.js +168 -0
- package/dist/research-agent-WCRSY3UZ.js.map +1 -0
- package/dist/risk-engine-YKCPT5D5.js +10 -0
- package/dist/risk-engine-YKCPT5D5.js.map +1 -0
- package/dist/scheduler-6PLLAQI7.js +74 -0
- package/dist/scheduler-6PLLAQI7.js.map +1 -0
- package/dist/schema-ETY7L2VA.js +78 -0
- package/dist/schema-ETY7L2VA.js.map +1 -0
- package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
- package/dist/search-GMLKBHSW.js.map +1 -0
- package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
- package/dist/sharepoint-V5P4Q62L.js +30 -0
- package/dist/sharepoint-V5P4Q62L.js.map +1 -0
- package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
- package/dist/signal-7D5EPGVL.js +44 -0
- package/dist/signal-7D5EPGVL.js.map +1 -0
- package/dist/slack-KSS6YK5Z.js +86 -0
- package/dist/slack-KSS6YK5Z.js.map +1 -0
- package/dist/{sms-M3JIOTCW.js → sms-CSUCC7HL.js} +4 -4
- package/dist/sms-CSUCC7HL.js.map +1 -0
- package/dist/{src-VYUE6LRA.js → src-GO7GGW7O.js} +190 -52
- package/dist/src-GO7GGW7O.js.map +1 -0
- package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
- package/dist/stocks-4M4HZWZS.js.map +1 -0
- package/dist/text-extractor-OAUBAW5P.js +12 -0
- package/dist/text-extractor-OAUBAW5P.js.map +1 -0
- package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
- package/dist/text-transform-HCLCUDFZ.js.map +1 -0
- package/dist/token-store-SEWRX6RE.js +20 -0
- package/dist/token-store-SEWRX6RE.js.map +1 -0
- package/dist/tools-PJZ6RI4P.js +47 -0
- package/dist/tools-PJZ6RI4P.js.map +1 -0
- package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
- package/dist/tunnel-XOUVVRAK.js.map +1 -0
- package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
- package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
- package/dist/unit-converter-LYPAHU64.js.map +1 -0
- package/dist/whatsapp-DWXK25V2.js +44 -0
- package/dist/whatsapp-DWXK25V2.js.map +1 -0
- package/dist/{word-document-7B6SJMAY.js → word-document-AV3YB4L2.js} +4 -4
- package/dist/word-document-AV3YB4L2.js.map +1 -0
- package/dist/workflow-store-5Y56GUP7.js +373 -0
- package/dist/workflow-store-5Y56GUP7.js.map +1 -0
- package/dist/writing-agent-VDGLNOGO.js +243 -0
- package/dist/writing-agent-VDGLNOGO.js.map +1 -0
- package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
- package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
- package/drizzle/0002_mushy_master_mold.sql +139 -139
- package/drizzle/0003_overjoyed_rhodey.sql +46 -0
- package/drizzle/meta/0002_snapshot.json +3636 -3636
- package/drizzle/meta/0003_snapshot.json +3946 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +110 -100
- package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
- package/dist/bot-QRARP4UN.js +0 -36
- package/dist/brain-7XLLM3KC.js +0 -56
- package/dist/chunk-4GLYY4NN.js.map +0 -1
- package/dist/chunk-766ASQWE.js.map +0 -1
- package/dist/chunk-AYUKPTSM.js.map +0 -1
- package/dist/chunk-BRBWNV65.js.map +0 -1
- package/dist/chunk-BXZ6EA52.js.map +0 -1
- package/dist/chunk-EVE7MIIY.js.map +0 -1
- package/dist/chunk-H5RQOFO2.js.map +0 -1
- package/dist/chunk-I6BDYQIG.js.map +0 -1
- package/dist/chunk-IZJMVV7O.js +0 -347
- package/dist/chunk-IZJMVV7O.js.map +0 -1
- package/dist/chunk-O7IH7JTI.js +0 -1898
- package/dist/chunk-O7IH7JTI.js.map +0 -1
- package/dist/chunk-OCVQGBJK.js.map +0 -1
- package/dist/chunk-RZ4YESBG.js.map +0 -1
- package/dist/chunk-SPPMCAKG.js.map +0 -1
- package/dist/chunk-VRD5CYRL.js +0 -1568
- package/dist/chunk-VRD5CYRL.js.map +0 -1
- package/dist/chunk-WRAKK6K6.js.map +0 -1
- package/dist/chunk-XKYRH4FM.js.map +0 -1
- package/dist/chunk-XMCVRVTF.js.map +0 -1
- package/dist/chunk-ZLZKF2PM.js.map +0 -1
- package/dist/discord-B3HUPGQ6.js +0 -70
- package/dist/dist-UISMLMFN.js +0 -21847
- package/dist/dist-UISMLMFN.js.map +0 -1
- package/dist/email-K7LO2IPB.js.map +0 -1
- package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
- package/dist/env-IWXUVTCB.js +0 -12
- package/dist/imessage-NGA2XF2V.js +0 -35
- package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
- package/dist/incident-response-C5J7Q6DT.js.map +0 -1
- package/dist/presentations-DSV5IHG5.js.map +0 -1
- package/dist/scheduler-VK4WFERV.js +0 -63
- package/dist/signal-6CGDFYL2.js +0 -35
- package/dist/slack-IZQWIKOH.js +0 -75
- package/dist/src-VYUE6LRA.js.map +0 -1
- package/dist/tools-2RLEI2N6.js +0 -38
- package/dist/tunnel-IWMXUML4.js.map +0 -1
- package/dist/whatsapp-LFX6YKCM.js +0 -35
- package/dist/word-document-7B6SJMAY.js.map +0 -1
- /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-JZ4IM7XI.js.map} +0 -0
- /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
- /package/dist/{backup-restore-PZ7CYYB7.js.map → analyzer-OTWE3ARE.js.map} +0 -0
- /package/dist/{archiver-AVNBYCKQ.js.map → archiver-FPGKRP6P.js.map} +0 -0
- /package/dist/{blocks-R3PODY47.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
- /package/dist/{bot-QRARP4UN.js.map → auth-PH5IHISW.js.map} +0 -0
- /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
- /package/dist/{brain-7XLLM3KC.js.map → backup-restore-72OQTZO3.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → blocks-YOWOESDD.js.map} +0 -0
- /package/dist/{client-ZQSFPMOB.js.map → bot-VDHBGUVI.js.map} +0 -0
- /package/dist/{clipboard-manager-TEO2GEDN.js.map → brain-6QTXN4QP.js.map} +0 -0
- /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
- /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
- /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
- /package/dist/{chunk-SJSUSJ47.js.map → chunk-BNZHWAZC.js.map} +0 -0
- /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
- /package/dist/{chunk-NHMBTUMW.js.map → chunk-CWT6CAE5.js.map} +0 -0
- /package/dist/{chunk-6PMVAAA7.js.map → chunk-HJSEEFO3.js.map} +0 -0
- /package/dist/{chunk-TYAGMJNV.js.map → chunk-HQZQFEAX.js.map} +0 -0
- /package/dist/{chunk-MXAPLSJ5.js.map → chunk-J4JW73TT.js.map} +0 -0
- /package/dist/{chunk-VEHFVBLI.js.map → chunk-JHYYFPKX.js.map} +0 -0
- /package/dist/{chunk-66OJ3WB4.js.map → chunk-PD3CTDO6.js.map} +0 -0
- /package/dist/{cron-explain-HHQKPD3M.js.map → chunk-UP2VWCW5.js.map} +0 -0
- /package/dist/{chunk-4UOE5TUZ.js.map → chunk-WMDVOWN6.js.map} +0 -0
- /package/dist/{crypto-4AP47IKC.js.map → chunker-K6WTR62A.js.map} +0 -0
- /package/dist/{databases-37X4CI2Y.js.map → client-FOIYPOZQ.js.map} +0 -0
- /package/dist/{discord-B3HUPGQ6.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
- /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
- /package/dist/{entity-resolution-Y3IUWEAT.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
- /package/dist/{env-IWXUVTCB.js.map → crypto-2VG3RJR2.js.map} +0 -0
- /package/dist/{hash-tool-ULQYD7B5.js.map → databases-XDPMG5AV.js.map} +0 -0
- /package/dist/{heartbeat-monitor-GCISLXI3.js.map → db-I7MNG6CL.js.map} +0 -0
- /package/dist/{imessage-NGA2XF2V.js.map → discord-6UQHCN27.js.map} +0 -0
- /package/dist/{inbox-summarizer-NRI4S7IF.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
- /package/dist/{inventory-manager-352OHXWD.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
- /package/dist/{json-tool-QE2SYHEG.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
- /package/dist/{key-rotation-DPHU4ZTB.js.map → env-GN5VHI43.js.map} +0 -0
- /package/dist/{mcp-3JI6W7ZE.js.map → error-tracker-64DEH3D7.js.map} +0 -0
- /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
- /package/dist/{ocr-AC7NPX33.js.map → graph-client-NB475AK5.js.map} +0 -0
- /package/dist/{ollama-BOAMSPLJ.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
- /package/dist/{pages-MI523RB7.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
- /package/dist/{pairing-IFQYCPNS.js.map → hooks-N4MIFBVM.js.map} +0 -0
- /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
- /package/dist/{pdf-ALQVOEJR.js.map → imessage-DSGSGUZS.js.map} +0 -0
- /package/dist/{prometheus-JNT2BD4L.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
- /package/dist/{providers-J4LYPHDR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
- /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
- /package/dist/{qr-code-WIX4PB4U.js.map → json-tool-4FK5RNER.js.map} +0 -0
- /package/dist/{regex-tool-W4ABRKGK.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
- /package/dist/{scheduler-VK4WFERV.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
- /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
- /package/dist/{search-BCLBO5E3.js.map → mcp-DJ2QDA6A.js.map} +0 -0
- /package/dist/{signal-6CGDFYL2.js.map → metrics-BH3ZLGEV.js.map} +0 -0
- /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
- /package/dist/{slack-IZQWIKOH.js.map → oauth-UPJYFOVU.js.map} +0 -0
- /package/dist/{sms-M3JIOTCW.js.map → ocr-UONKTQU7.js.map} +0 -0
- /package/dist/{stocks-XXWBPOCU.js.map → ollama-J7CU45WT.js.map} +0 -0
- /package/dist/{text-transform-6SGUA5Z4.js.map → pages-XDE7JRCA.js.map} +0 -0
- /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
- /package/dist/{tools-2RLEI2N6.js.map → pairing-77N47RAT.js.map} +0 -0
- /package/dist/{unit-converter-ZYXMEZOE.js.map → pdf-67HGXCFJ.js.map} +0 -0
- /package/dist/{whatsapp-LFX6YKCM.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
- /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
- /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
- /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
- /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
- /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
- /package/dist/{zapier-webhook-TBZ5YF2A.js.map → zapier-webhook-NIELLTXR.js.map} +0 -0
package/dist/chunk-IZJMVV7O.js
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
archivedMemories,
|
|
3
|
-
db,
|
|
4
|
-
memories
|
|
5
|
-
} from "./chunk-XKYRH4FM.js";
|
|
6
|
-
import {
|
|
7
|
-
env
|
|
8
|
-
} from "./chunk-ZLZKF2PM.js";
|
|
9
|
-
|
|
10
|
-
// src/core/memory.ts
|
|
11
|
-
import { eq, desc, sql } from "drizzle-orm";
|
|
12
|
-
import OpenAI from "openai";
|
|
13
|
-
|
|
14
|
-
// src/core/security/field-encryption.ts
|
|
15
|
-
import { createCipheriv, createDecipheriv, randomBytes } from "crypto";
|
|
16
|
-
var ALGORITHM = "aes-256-gcm";
|
|
17
|
-
var IV_LENGTH = 16;
|
|
18
|
-
var TAG_LENGTH = 16;
|
|
19
|
-
var KEY_LENGTH = 32;
|
|
20
|
-
var CURRENT_KEY_VERSION = 1;
|
|
21
|
-
var _masterKey = null;
|
|
22
|
-
function getMasterKey() {
|
|
23
|
-
if (_masterKey) return _masterKey;
|
|
24
|
-
const keyBase64 = env.ENCRYPTION_MASTER_KEY;
|
|
25
|
-
if (keyBase64) {
|
|
26
|
-
const key = Buffer.from(keyBase64, "base64");
|
|
27
|
-
if (key.length !== KEY_LENGTH) {
|
|
28
|
-
throw new Error(
|
|
29
|
-
`ENCRYPTION_MASTER_KEY must be ${KEY_LENGTH} bytes (${KEY_LENGTH * 4 / 3} base64 chars). Got ${key.length} bytes.`
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
_masterKey = key;
|
|
33
|
-
return _masterKey;
|
|
34
|
-
}
|
|
35
|
-
if (env.NODE_ENV === "production") {
|
|
36
|
-
throw new Error(
|
|
37
|
-
`ENCRYPTION_MASTER_KEY is required in production for SOC 2 compliance. Generate one with: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"`
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
console.warn("[field-encryption] No ENCRYPTION_MASTER_KEY set \u2014 using ephemeral key (dev only)");
|
|
41
|
-
_masterKey = randomBytes(KEY_LENGTH);
|
|
42
|
-
return _masterKey;
|
|
43
|
-
}
|
|
44
|
-
function encryptField(plaintext) {
|
|
45
|
-
if (plaintext === null || plaintext === void 0) return null;
|
|
46
|
-
const key = getMasterKey();
|
|
47
|
-
const iv = randomBytes(IV_LENGTH);
|
|
48
|
-
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
49
|
-
const encrypted = Buffer.concat([
|
|
50
|
-
cipher.update(plaintext, "utf8"),
|
|
51
|
-
cipher.final()
|
|
52
|
-
]);
|
|
53
|
-
const tag = cipher.getAuthTag();
|
|
54
|
-
const combined = Buffer.concat([
|
|
55
|
-
Buffer.from([CURRENT_KEY_VERSION]),
|
|
56
|
-
iv,
|
|
57
|
-
tag,
|
|
58
|
-
encrypted
|
|
59
|
-
]);
|
|
60
|
-
return combined.toString("base64");
|
|
61
|
-
}
|
|
62
|
-
function decryptField(encryptedBase64) {
|
|
63
|
-
if (encryptedBase64 === null || encryptedBase64 === void 0) return null;
|
|
64
|
-
const combined = Buffer.from(encryptedBase64, "base64");
|
|
65
|
-
if (combined.length < 1 + IV_LENGTH + TAG_LENGTH + 1) {
|
|
66
|
-
throw new Error("Encrypted data too short");
|
|
67
|
-
}
|
|
68
|
-
const keyVersion = combined[0];
|
|
69
|
-
if (keyVersion !== CURRENT_KEY_VERSION) {
|
|
70
|
-
throw new Error(`Unsupported encryption key version: ${keyVersion}`);
|
|
71
|
-
}
|
|
72
|
-
const iv = combined.subarray(1, 1 + IV_LENGTH);
|
|
73
|
-
const tag = combined.subarray(1 + IV_LENGTH, 1 + IV_LENGTH + TAG_LENGTH);
|
|
74
|
-
const ciphertext = combined.subarray(1 + IV_LENGTH + TAG_LENGTH);
|
|
75
|
-
const key = getMasterKey();
|
|
76
|
-
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
77
|
-
decipher.setAuthTag(tag);
|
|
78
|
-
const decrypted = Buffer.concat([
|
|
79
|
-
decipher.update(ciphertext),
|
|
80
|
-
decipher.final()
|
|
81
|
-
]);
|
|
82
|
-
return decrypted.toString("utf8");
|
|
83
|
-
}
|
|
84
|
-
function isEncryptionAvailable() {
|
|
85
|
-
try {
|
|
86
|
-
getMasterKey();
|
|
87
|
-
return true;
|
|
88
|
-
} catch {
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// src/core/memory.ts
|
|
94
|
-
var _openai = null;
|
|
95
|
-
function getOpenAI() {
|
|
96
|
-
if (!_openai) {
|
|
97
|
-
_openai = new OpenAI({ apiKey: env.OPENAI_API_KEY });
|
|
98
|
-
}
|
|
99
|
-
return _openai;
|
|
100
|
-
}
|
|
101
|
-
var openai = new Proxy({}, {
|
|
102
|
-
get(_target, prop) {
|
|
103
|
-
const instance = getOpenAI();
|
|
104
|
-
const value = instance[prop];
|
|
105
|
-
if (typeof value === "function") {
|
|
106
|
-
return value.bind(instance);
|
|
107
|
-
}
|
|
108
|
-
return value;
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
async function generateEmbedding(text) {
|
|
112
|
-
const response = await openai.embeddings.create({
|
|
113
|
-
model: "text-embedding-3-small",
|
|
114
|
-
input: text
|
|
115
|
-
});
|
|
116
|
-
return response.data[0].embedding;
|
|
117
|
-
}
|
|
118
|
-
async function storeMemory(memory) {
|
|
119
|
-
const embedding = await generateEmbedding(memory.content);
|
|
120
|
-
const shouldEncrypt = isEncryptionAvailable();
|
|
121
|
-
const contentForDb = shouldEncrypt ? encryptField(memory.content) : memory.content;
|
|
122
|
-
const [stored] = await db.insert(memories).values({
|
|
123
|
-
...memory,
|
|
124
|
-
content: contentForDb,
|
|
125
|
-
encrypted: shouldEncrypt,
|
|
126
|
-
embedding,
|
|
127
|
-
provenance: memory.provenance || `${memory.source || "unknown"}:auto`
|
|
128
|
-
}).returning();
|
|
129
|
-
try {
|
|
130
|
-
await db.execute(sql`
|
|
131
|
-
UPDATE memories
|
|
132
|
-
SET search_vector = to_tsvector('english', ${memory.content})
|
|
133
|
-
WHERE id = ${stored.id}
|
|
134
|
-
`);
|
|
135
|
-
} catch {
|
|
136
|
-
}
|
|
137
|
-
return { ...stored, content: memory.content };
|
|
138
|
-
}
|
|
139
|
-
async function updateMemory(id, updates) {
|
|
140
|
-
const setClauses = [];
|
|
141
|
-
if (updates.content) {
|
|
142
|
-
const newEmbedding = await generateEmbedding(updates.content);
|
|
143
|
-
setClauses.push(sql`content = ${updates.content}`);
|
|
144
|
-
setClauses.push(sql`embedding = ${JSON.stringify(newEmbedding)}::vector`);
|
|
145
|
-
setClauses.push(sql`search_vector = to_tsvector('english', ${updates.content})`);
|
|
146
|
-
}
|
|
147
|
-
if (updates.type) {
|
|
148
|
-
setClauses.push(sql`type = ${updates.type}`);
|
|
149
|
-
}
|
|
150
|
-
if (updates.importance !== void 0) {
|
|
151
|
-
setClauses.push(sql`importance = ${updates.importance}`);
|
|
152
|
-
}
|
|
153
|
-
if (setClauses.length === 0) return null;
|
|
154
|
-
const result = await db.execute(sql`
|
|
155
|
-
UPDATE memories
|
|
156
|
-
SET ${sql.join(setClauses, sql`, `)}
|
|
157
|
-
WHERE id = ${id}
|
|
158
|
-
RETURNING *
|
|
159
|
-
`);
|
|
160
|
-
return result[0] || null;
|
|
161
|
-
}
|
|
162
|
-
async function deleteMemory(id) {
|
|
163
|
-
const result = await db.execute(sql`
|
|
164
|
-
SELECT * FROM memories WHERE id = ${id}
|
|
165
|
-
`);
|
|
166
|
-
const memory = result[0];
|
|
167
|
-
if (!memory) return false;
|
|
168
|
-
await db.insert(archivedMemories).values({
|
|
169
|
-
originalMemoryId: memory.id,
|
|
170
|
-
userId: memory.user_id,
|
|
171
|
-
type: memory.type,
|
|
172
|
-
content: memory.content,
|
|
173
|
-
reason: "user_request",
|
|
174
|
-
originalCreatedAt: memory.created_at
|
|
175
|
-
});
|
|
176
|
-
await db.execute(sql`DELETE FROM memories WHERE id = ${id}`);
|
|
177
|
-
return true;
|
|
178
|
-
}
|
|
179
|
-
async function exportMemories(userId, format = "markdown") {
|
|
180
|
-
const mems = await db.select().from(memories).where(userId ? eq(memories.userId, userId) : void 0).orderBy(desc(memories.createdAt));
|
|
181
|
-
for (const m of mems) {
|
|
182
|
-
if (m.encrypted) {
|
|
183
|
-
try {
|
|
184
|
-
m.content = decryptField(m.content) ?? m.content;
|
|
185
|
-
} catch {
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
if (format === "json") {
|
|
190
|
-
return JSON.stringify(
|
|
191
|
-
mems.map((m) => ({
|
|
192
|
-
id: m.id,
|
|
193
|
-
type: m.type,
|
|
194
|
-
content: m.content,
|
|
195
|
-
importance: m.importance,
|
|
196
|
-
source: m.source,
|
|
197
|
-
provenance: m.provenance,
|
|
198
|
-
createdAt: m.createdAt
|
|
199
|
-
})),
|
|
200
|
-
null,
|
|
201
|
-
2
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
const lines = [
|
|
205
|
-
"# Memories Export",
|
|
206
|
-
`Exported: ${(/* @__PURE__ */ new Date()).toISOString()}`,
|
|
207
|
-
`Total: ${mems.length} memories`,
|
|
208
|
-
""
|
|
209
|
-
];
|
|
210
|
-
for (const m of mems) {
|
|
211
|
-
lines.push(`## [${m.type}] (Importance: ${m.importance}/10)`);
|
|
212
|
-
lines.push(m.content);
|
|
213
|
-
lines.push(`_Source: ${m.source || "unknown"} | Created: ${m.createdAt.toISOString()}_`);
|
|
214
|
-
lines.push("");
|
|
215
|
-
}
|
|
216
|
-
return lines.join("\n");
|
|
217
|
-
}
|
|
218
|
-
async function searchMemories(query, userId, limit = 5) {
|
|
219
|
-
const queryEmbedding = await generateEmbedding(query);
|
|
220
|
-
const results = await db.execute(sql`
|
|
221
|
-
SELECT
|
|
222
|
-
id, user_id, type, content, importance, source, provenance, metadata,
|
|
223
|
-
last_accessed, created_at,
|
|
224
|
-
1 - (embedding <=> ${JSON.stringify(queryEmbedding)}::vector) as similarity
|
|
225
|
-
FROM memories
|
|
226
|
-
${userId ? sql`WHERE user_id = ${userId}` : sql``}
|
|
227
|
-
ORDER BY embedding <=> ${JSON.stringify(queryEmbedding)}::vector
|
|
228
|
-
LIMIT ${limit}
|
|
229
|
-
`);
|
|
230
|
-
const rows = results;
|
|
231
|
-
const memoryIds = rows.map((r) => r.id);
|
|
232
|
-
if (memoryIds.length > 0) {
|
|
233
|
-
await db.execute(sql`
|
|
234
|
-
UPDATE memories
|
|
235
|
-
SET last_accessed = NOW()
|
|
236
|
-
WHERE id = ANY(${memoryIds}::uuid[])
|
|
237
|
-
`);
|
|
238
|
-
}
|
|
239
|
-
for (const row of rows) {
|
|
240
|
-
if (row.encrypted) {
|
|
241
|
-
try {
|
|
242
|
-
row.content = decryptField(row.content) ?? row.content;
|
|
243
|
-
} catch {
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
return rows;
|
|
248
|
-
}
|
|
249
|
-
async function getMemoryById(id) {
|
|
250
|
-
const result = await db.execute(sql`
|
|
251
|
-
SELECT * FROM memories WHERE id = ${id}
|
|
252
|
-
`);
|
|
253
|
-
const row = result[0] || null;
|
|
254
|
-
if (row && row.encrypted) {
|
|
255
|
-
try {
|
|
256
|
-
row.content = decryptField(row.content) ?? row.content;
|
|
257
|
-
} catch {
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return row;
|
|
261
|
-
}
|
|
262
|
-
async function extractMemories(content, userId) {
|
|
263
|
-
const extractionPrompt = `Analyze this text and extract any important facts that should be remembered about the user or their preferences. Return a JSON array of objects with "content" (the fact), "type" (semantic/episodic/procedural), and "importance" (1-10).
|
|
264
|
-
|
|
265
|
-
Text: "${content}"
|
|
266
|
-
|
|
267
|
-
Return only the JSON array, no other text. If no memorable facts, return [].`;
|
|
268
|
-
try {
|
|
269
|
-
const response = await openai.chat.completions.create({
|
|
270
|
-
model: "gpt-4o-mini",
|
|
271
|
-
messages: [{ role: "user", content: extractionPrompt }],
|
|
272
|
-
response_format: { type: "json_object" }
|
|
273
|
-
});
|
|
274
|
-
const extracted = JSON.parse(
|
|
275
|
-
response.choices[0].message.content || '{"memories":[]}'
|
|
276
|
-
);
|
|
277
|
-
const memoriesToStore = extracted.memories || extracted || [];
|
|
278
|
-
const storedMemories = [];
|
|
279
|
-
for (const mem of memoriesToStore) {
|
|
280
|
-
if (mem.content && mem.content.length > 5) {
|
|
281
|
-
const stored = await storeMemory({
|
|
282
|
-
userId,
|
|
283
|
-
content: mem.content,
|
|
284
|
-
type: mem.type || "semantic",
|
|
285
|
-
importance: mem.importance || 5,
|
|
286
|
-
source: "conversation",
|
|
287
|
-
provenance: "extraction:auto"
|
|
288
|
-
});
|
|
289
|
-
storedMemories.push(stored);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
return storedMemories;
|
|
293
|
-
} catch (error) {
|
|
294
|
-
console.error("Error extracting memories:", error);
|
|
295
|
-
return [];
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
async function buildMemoryContext(query, userId, conversationHistory) {
|
|
299
|
-
const anyAdvancedEnabled = env.HYDE_ENABLED || env.RERANK_ENABLED || env.MULTISTEP_RAG_ENABLED || env.RETRIEVAL_CACHE_ENABLED || env.CONTEXTUAL_QUERY_ENABLED;
|
|
300
|
-
if (anyAdvancedEnabled) {
|
|
301
|
-
try {
|
|
302
|
-
const { enhancedRetrieve } = await import("./enhanced-retrieval-DNLLEM4Z.js");
|
|
303
|
-
const result = await enhancedRetrieve(query, { userId, limit: 5, conversationHistory });
|
|
304
|
-
if (result.results.length === 0) {
|
|
305
|
-
return "";
|
|
306
|
-
}
|
|
307
|
-
const memoryStrings2 = result.results.map((m) => {
|
|
308
|
-
const provenance = m.provenance ? ` [${m.provenance}]` : "";
|
|
309
|
-
const score = m.rerankScore != null ? `rerank: ${m.rerankScore}/10` : `relevance: ${((m.similarity || 0) * 100).toFixed(0)}%`;
|
|
310
|
-
return `- [${m.type}] ${m.content} (${score})${provenance}`;
|
|
311
|
-
});
|
|
312
|
-
return `
|
|
313
|
-
|
|
314
|
-
Relevant memories about the user:
|
|
315
|
-
${memoryStrings2.join("\n")}`;
|
|
316
|
-
} catch {
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
const relevantMemories = await searchMemories(query, userId, 5);
|
|
320
|
-
if (relevantMemories.length === 0) {
|
|
321
|
-
return "";
|
|
322
|
-
}
|
|
323
|
-
const memoryStrings = relevantMemories.map(
|
|
324
|
-
(m) => {
|
|
325
|
-
const provenance = m.provenance ? ` [${m.provenance}]` : "";
|
|
326
|
-
return `- [${m.type}] ${m.content} (relevance: ${(m.similarity * 100).toFixed(0)}%)${provenance}`;
|
|
327
|
-
}
|
|
328
|
-
);
|
|
329
|
-
return `
|
|
330
|
-
|
|
331
|
-
Relevant memories about the user:
|
|
332
|
-
${memoryStrings.join("\n")}`;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
export {
|
|
336
|
-
decryptField,
|
|
337
|
-
generateEmbedding,
|
|
338
|
-
storeMemory,
|
|
339
|
-
updateMemory,
|
|
340
|
-
deleteMemory,
|
|
341
|
-
exportMemories,
|
|
342
|
-
searchMemories,
|
|
343
|
-
getMemoryById,
|
|
344
|
-
extractMemories,
|
|
345
|
-
buildMemoryContext
|
|
346
|
-
};
|
|
347
|
-
//# sourceMappingURL=chunk-IZJMVV7O.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/memory.ts","../src/core/security/field-encryption.ts"],"sourcesContent":["import { db, memories, archivedMemories, type NewMemory, type Memory } from \"../db\";\r\nimport { eq, desc, sql, and } from \"drizzle-orm\";\r\nimport OpenAI from \"openai\";\r\nimport { env } from \"../config/env\";\r\nimport { encryptField, decryptField, isEncryptionAvailable } from \"./security/field-encryption\";\r\n\r\n// Lazy OpenAI client — created on first use\r\nlet _openai: OpenAI | null = null;\r\nfunction getOpenAI(): OpenAI {\r\n if (!_openai) {\r\n _openai = new OpenAI({ apiKey: env.OPENAI_API_KEY });\r\n }\r\n return _openai;\r\n}\r\nconst openai = new Proxy({} as OpenAI, {\r\n get(_target, prop) {\r\n const instance = getOpenAI();\r\n const value = (instance as any)[prop];\r\n if (typeof value === \"function\") {\r\n return value.bind(instance);\r\n }\r\n return value;\r\n },\r\n});\r\n\r\n// Generate embedding for text using OpenAI\r\nexport async function generateEmbedding(text: string): Promise<number[]> {\r\n const response = await openai.embeddings.create({\r\n model: \"text-embedding-3-small\",\r\n input: text,\r\n });\r\n return response.data[0].embedding;\r\n}\r\n\r\n// Store a new memory with embedding and tsvector\r\n// Content is encrypted at rest when ENCRYPTION_MASTER_KEY is configured\r\nexport async function storeMemory(\r\n memory: Omit<NewMemory, \"embedding\" | \"searchVector\">\r\n): Promise<Memory> {\r\n // Generate embedding from plaintext BEFORE encryption (vectors can't be encrypted)\r\n const embedding = await generateEmbedding(memory.content);\r\n\r\n // Encrypt content at rest if encryption is available\r\n const shouldEncrypt = isEncryptionAvailable();\r\n const contentForDb = shouldEncrypt ? encryptField(memory.content)! : memory.content;\r\n\r\n const [stored] = await db\r\n .insert(memories)\r\n .values({\r\n ...memory,\r\n content: contentForDb,\r\n encrypted: shouldEncrypt,\r\n embedding,\r\n provenance: memory.provenance || `${memory.source || \"unknown\"}:auto`,\r\n })\r\n .returning();\r\n\r\n // Update tsvector for full-text search (uses plaintext for indexing)\r\n try {\r\n await db.execute(sql`\r\n UPDATE memories\r\n SET search_vector = to_tsvector('english', ${memory.content})\r\n WHERE id = ${stored.id}\r\n `);\r\n } catch {\r\n // tsvector update is non-critical\r\n }\r\n\r\n // Return with plaintext content (caller expects readable content)\r\n return { ...stored, content: memory.content };\r\n}\r\n\r\n// Update an existing memory\r\nexport async function updateMemory(\r\n id: string,\r\n updates: { content?: string; type?: string; importance?: number }\r\n): Promise<Memory | null> {\r\n // Build SET clause dynamically\r\n const setClauses: any[] = [];\r\n if (updates.content) {\r\n const newEmbedding = await generateEmbedding(updates.content);\r\n setClauses.push(sql`content = ${updates.content}`);\r\n setClauses.push(sql`embedding = ${JSON.stringify(newEmbedding)}::vector`);\r\n setClauses.push(sql`search_vector = to_tsvector('english', ${updates.content})`);\r\n }\r\n if (updates.type) {\r\n setClauses.push(sql`type = ${updates.type}`);\r\n }\r\n if (updates.importance !== undefined) {\r\n setClauses.push(sql`importance = ${updates.importance}`);\r\n }\r\n\r\n if (setClauses.length === 0) return null;\r\n\r\n const result = await db.execute(sql`\r\n UPDATE memories\r\n SET ${sql.join(setClauses, sql`, `)}\r\n WHERE id = ${id}\r\n RETURNING *\r\n `);\r\n\r\n return (result as any[])[0] || null;\r\n}\r\n\r\n// Delete a memory (soft-delete: move to archived)\r\nexport async function deleteMemory(id: string): Promise<boolean> {\r\n // Get the memory first\r\n const result = await db.execute(sql`\r\n SELECT * FROM memories WHERE id = ${id}\r\n `);\r\n const memory = (result as any[])[0];\r\n if (!memory) return false;\r\n\r\n // Archive it\r\n await db.insert(archivedMemories).values({\r\n originalMemoryId: memory.id,\r\n userId: memory.user_id,\r\n type: memory.type,\r\n content: memory.content,\r\n reason: \"user_request\",\r\n originalCreatedAt: memory.created_at,\r\n });\r\n\r\n // Delete from active memories\r\n await db.execute(sql`DELETE FROM memories WHERE id = ${id}`);\r\n\r\n return true;\r\n}\r\n\r\n// Export memories as Markdown or JSON\r\nexport async function exportMemories(\r\n userId?: string,\r\n format: \"markdown\" | \"json\" = \"markdown\"\r\n): Promise<string> {\r\n const mems = await db\r\n .select()\r\n .from(memories)\r\n .where(userId ? eq(memories.userId, userId) : undefined)\r\n .orderBy(desc(memories.createdAt));\r\n\r\n // Decrypt encrypted memories\r\n for (const m of mems) {\r\n if ((m as any).encrypted) {\r\n try {\r\n (m as any).content = decryptField(m.content) ?? m.content;\r\n } catch {\r\n // If decryption fails, return as-is\r\n }\r\n }\r\n }\r\n\r\n if (format === \"json\") {\r\n return JSON.stringify(\r\n mems.map((m) => ({\r\n id: m.id,\r\n type: m.type,\r\n content: m.content,\r\n importance: m.importance,\r\n source: m.source,\r\n provenance: (m as any).provenance,\r\n createdAt: m.createdAt,\r\n })),\r\n null,\r\n 2\r\n );\r\n }\r\n\r\n // Markdown format\r\n const lines = [\r\n \"# Memories Export\",\r\n `Exported: ${new Date().toISOString()}`,\r\n `Total: ${mems.length} memories`,\r\n \"\",\r\n ];\r\n\r\n for (const m of mems) {\r\n lines.push(`## [${m.type}] (Importance: ${m.importance}/10)`);\r\n lines.push(m.content);\r\n lines.push(`_Source: ${m.source || \"unknown\"} | Created: ${m.createdAt.toISOString()}_`);\r\n lines.push(\"\");\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n// Search memories by semantic similarity\r\nexport async function searchMemories(\r\n query: string,\r\n userId?: string,\r\n limit = 5\r\n): Promise<Memory[]> {\r\n const queryEmbedding = await generateEmbedding(query);\r\n\r\n // Use pgvector cosine similarity search\r\n const results = await db.execute(sql`\r\n SELECT\r\n id, user_id, type, content, importance, source, provenance, metadata,\r\n last_accessed, created_at,\r\n 1 - (embedding <=> ${JSON.stringify(queryEmbedding)}::vector) as similarity\r\n FROM memories\r\n ${userId ? sql`WHERE user_id = ${userId}` : sql``}\r\n ORDER BY embedding <=> ${JSON.stringify(queryEmbedding)}::vector\r\n LIMIT ${limit}\r\n `);\r\n\r\n // Update last_accessed for retrieved memories\r\n const rows = results as any[];\r\n const memoryIds = rows.map((r: any) => r.id);\r\n if (memoryIds.length > 0) {\r\n await db.execute(sql`\r\n UPDATE memories\r\n SET last_accessed = NOW()\r\n WHERE id = ANY(${memoryIds}::uuid[])\r\n `);\r\n }\r\n\r\n // Decrypt content for any encrypted memories\r\n for (const row of rows) {\r\n if (row.encrypted) {\r\n try {\r\n row.content = decryptField(row.content) ?? row.content;\r\n } catch {\r\n // If decryption fails, return as-is\r\n }\r\n }\r\n }\r\n\r\n return rows as Memory[];\r\n}\r\n\r\n// Get a single memory by ID\r\nexport async function getMemoryById(id: string): Promise<Memory | null> {\r\n const result = await db.execute(sql`\r\n SELECT * FROM memories WHERE id = ${id}\r\n `);\r\n const row = (result as any[])[0] || null;\r\n if (row && row.encrypted) {\r\n try {\r\n row.content = decryptField(row.content) ?? row.content;\r\n } catch {\r\n // If decryption fails, return as-is\r\n }\r\n }\r\n return row;\r\n}\r\n\r\n// Get recent memories for a user\r\nexport async function getRecentMemories(\r\n userId: string,\r\n limit = 10\r\n): Promise<Memory[]> {\r\n return db\r\n .select()\r\n .from(memories)\r\n .where(eq(memories.userId, userId))\r\n .orderBy(desc(memories.createdAt))\r\n .limit(limit);\r\n}\r\n\r\n// Extract and store memories from a conversation turn\r\nexport async function extractMemories(\r\n content: string,\r\n userId?: string\r\n): Promise<Memory[]> {\r\n // Use Claude to extract memorable facts\r\n const extractionPrompt = `Analyze this text and extract any important facts that should be remembered about the user or their preferences. Return a JSON array of objects with \"content\" (the fact), \"type\" (semantic/episodic/procedural), and \"importance\" (1-10).\r\n\r\nText: \"${content}\"\r\n\r\nReturn only the JSON array, no other text. If no memorable facts, return [].`;\r\n\r\n try {\r\n const response = await openai.chat.completions.create({\r\n model: \"gpt-4o-mini\",\r\n messages: [{ role: \"user\", content: extractionPrompt }],\r\n response_format: { type: \"json_object\" },\r\n });\r\n\r\n const extracted = JSON.parse(\r\n response.choices[0].message.content || '{\"memories\":[]}'\r\n );\r\n const memoriesToStore = extracted.memories || extracted || [];\r\n\r\n const storedMemories: Memory[] = [];\r\n for (const mem of memoriesToStore) {\r\n if (mem.content && mem.content.length > 5) {\r\n const stored = await storeMemory({\r\n userId,\r\n content: mem.content,\r\n type: mem.type || \"semantic\",\r\n importance: mem.importance || 5,\r\n source: \"conversation\",\r\n provenance: \"extraction:auto\",\r\n });\r\n storedMemories.push(stored);\r\n }\r\n }\r\n\r\n return storedMemories;\r\n } catch (error) {\r\n console.error(\"Error extracting memories:\", error);\r\n return [];\r\n }\r\n}\r\n\r\n// Build context string from relevant memories\r\nexport async function buildMemoryContext(\r\n query: string,\r\n userId?: string,\r\n conversationHistory?: Array<{ role: \"user\" | \"assistant\"; content: string }>\r\n): Promise<string> {\r\n // Use enhanced retrieval pipeline when any advanced RAG feature is enabled\r\n const anyAdvancedEnabled = env.HYDE_ENABLED || env.RERANK_ENABLED ||\r\n env.MULTISTEP_RAG_ENABLED || env.RETRIEVAL_CACHE_ENABLED || env.CONTEXTUAL_QUERY_ENABLED;\r\n\r\n if (anyAdvancedEnabled) {\r\n try {\r\n const { enhancedRetrieve } = await import(\"./memory/enhanced-retrieval\");\r\n const result = await enhancedRetrieve(query, { userId, limit: 5, conversationHistory });\r\n\r\n if (result.results.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const memoryStrings = result.results.map((m: any) => {\r\n const provenance = m.provenance ? ` [${m.provenance}]` : \"\";\r\n const score = m.rerankScore != null\r\n ? `rerank: ${m.rerankScore}/10`\r\n : `relevance: ${((m.similarity || 0) * 100).toFixed(0)}%`;\r\n return `- [${m.type}] ${m.content} (${score})${provenance}`;\r\n });\r\n\r\n return `\\n\\nRelevant memories about the user:\\n${memoryStrings.join(\"\\n\")}`;\r\n } catch {\r\n // Enhanced retrieval failed, fall back to basic search\r\n }\r\n }\r\n\r\n // Fallback: basic vector search\r\n const relevantMemories = await searchMemories(query, userId, 5);\r\n\r\n if (relevantMemories.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const memoryStrings = relevantMemories.map(\r\n (m: any) => {\r\n const provenance = m.provenance ? ` [${m.provenance}]` : \"\";\r\n return `- [${m.type}] ${m.content} (relevance: ${(m.similarity * 100).toFixed(0)}%)${provenance}`;\r\n }\r\n );\r\n\r\n return `\\n\\nRelevant memories about the user:\\n${memoryStrings.join(\"\\n\")}`;\r\n}\r\n","/**\n * Field-Level Encryption for SOC 2 Compliance\n *\n * AES-256-GCM encryption for database column values.\n * Used to encrypt sensitive fields (messages, memories) at rest.\n *\n * Format: base64(keyVersion[1] + iv[16] + authTag[16] + ciphertext)\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes } from \"crypto\";\nimport { env } from \"../../config/env\";\n\nconst ALGORITHM = \"aes-256-gcm\";\nconst IV_LENGTH = 16;\nconst TAG_LENGTH = 16;\nconst KEY_LENGTH = 32;\nconst CURRENT_KEY_VERSION = 1;\n\nlet _masterKey: Buffer | null = null;\n\nfunction getMasterKey(): Buffer {\n if (_masterKey) return _masterKey;\n\n const keyBase64 = env.ENCRYPTION_MASTER_KEY;\n\n if (keyBase64) {\n const key = Buffer.from(keyBase64, \"base64\");\n if (key.length !== KEY_LENGTH) {\n throw new Error(\n `ENCRYPTION_MASTER_KEY must be ${KEY_LENGTH} bytes (${KEY_LENGTH * 4 / 3} base64 chars). Got ${key.length} bytes.`\n );\n }\n _masterKey = key;\n return _masterKey;\n }\n\n // No key configured — in production this is an error\n if (env.NODE_ENV === \"production\") {\n throw new Error(\n \"ENCRYPTION_MASTER_KEY is required in production for SOC 2 compliance. \" +\n \"Generate one with: node -e \\\"console.log(require('crypto').randomBytes(32).toString('base64'))\\\"\"\n );\n }\n\n // Dev/test: generate ephemeral key (data won't survive restarts)\n console.warn(\"[field-encryption] No ENCRYPTION_MASTER_KEY set — using ephemeral key (dev only)\");\n _masterKey = randomBytes(KEY_LENGTH);\n return _masterKey;\n}\n\n/**\n * Encrypt a field value using AES-256-GCM.\n * Returns base64(keyVersion + iv + authTag + ciphertext), or null if input is null.\n */\nexport function encryptField(plaintext: string | null): string | null {\n if (plaintext === null || plaintext === undefined) return null;\n\n const key = getMasterKey();\n const iv = randomBytes(IV_LENGTH);\n const cipher = createCipheriv(ALGORITHM, key, iv);\n\n const encrypted = Buffer.concat([\n cipher.update(plaintext, \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n\n // keyVersion (1 byte) + iv (16) + tag (16) + ciphertext\n const combined = Buffer.concat([\n Buffer.from([CURRENT_KEY_VERSION]),\n iv,\n tag,\n encrypted,\n ]);\n\n return combined.toString(\"base64\");\n}\n\n/**\n * Decrypt a field value encrypted by encryptField().\n * Returns plaintext, or null if input is null.\n */\nexport function decryptField(encryptedBase64: string | null): string | null {\n if (encryptedBase64 === null || encryptedBase64 === undefined) return null;\n\n const combined = Buffer.from(encryptedBase64, \"base64\");\n\n if (combined.length < 1 + IV_LENGTH + TAG_LENGTH + 1) {\n throw new Error(\"Encrypted data too short\");\n }\n\n const keyVersion = combined[0];\n if (keyVersion !== CURRENT_KEY_VERSION) {\n throw new Error(`Unsupported encryption key version: ${keyVersion}`);\n }\n\n const iv = combined.subarray(1, 1 + IV_LENGTH);\n const tag = combined.subarray(1 + IV_LENGTH, 1 + IV_LENGTH + TAG_LENGTH);\n const ciphertext = combined.subarray(1 + IV_LENGTH + TAG_LENGTH);\n\n const key = getMasterKey();\n const decipher = createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n const decrypted = Buffer.concat([\n decipher.update(ciphertext),\n decipher.final(),\n ]);\n\n return decrypted.toString(\"utf8\");\n}\n\n/**\n * Encrypt multiple fields at once.\n */\nexport function encryptFields(\n fields: Record<string, string | null>\n): Record<string, string | null> {\n const result: Record<string, string | null> = {};\n for (const [k, v] of Object.entries(fields)) {\n result[k] = encryptField(v);\n }\n return result;\n}\n\n/**\n * Decrypt multiple fields at once.\n */\nexport function decryptFields(\n fields: Record<string, string | null>\n): Record<string, string | null> {\n const result: Record<string, string | null> = {};\n for (const [k, v] of Object.entries(fields)) {\n result[k] = decryptField(v);\n }\n return result;\n}\n\n/**\n * Generate a new random 32-byte encryption key, returned as base64.\n * Use this to create an ENCRYPTION_MASTER_KEY for .env.\n */\nexport function generateEncryptionKey(): string {\n return randomBytes(KEY_LENGTH).toString(\"base64\");\n}\n\n/**\n * Check whether field encryption is available (master key is configured).\n */\nexport function isEncryptionAvailable(): boolean {\n try {\n getMasterKey();\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;;;;;AACA,SAAS,IAAI,MAAM,WAAgB;AACnC,OAAO,YAAY;;;ACOnB,SAAS,gBAAgB,kBAAkB,mBAAmB;AAG9D,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,sBAAsB;AAE5B,IAAI,aAA4B;AAEhC,SAAS,eAAuB;AAC9B,MAAI,WAAY,QAAO;AAEvB,QAAM,YAAY,IAAI;AAEtB,MAAI,WAAW;AACb,UAAM,MAAM,OAAO,KAAK,WAAW,QAAQ;AAC3C,QAAI,IAAI,WAAW,YAAY;AAC7B,YAAM,IAAI;AAAA,QACR,iCAAiC,UAAU,WAAW,aAAa,IAAI,CAAC,uBAAuB,IAAI,MAAM;AAAA,MAC3G;AAAA,IACF;AACA,iBAAa;AACb,WAAO;AAAA,EACT;AAGA,MAAI,IAAI,aAAa,cAAc;AACjC,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAGA,UAAQ,KAAK,uFAAkF;AAC/F,eAAa,YAAY,UAAU;AACnC,SAAO;AACT;AAMO,SAAS,aAAa,WAAyC;AACpE,MAAI,cAAc,QAAQ,cAAc,OAAW,QAAO;AAE1D,QAAM,MAAM,aAAa;AACzB,QAAM,KAAK,YAAY,SAAS;AAChC,QAAM,SAAS,eAAe,WAAW,KAAK,EAAE;AAEhD,QAAM,YAAY,OAAO,OAAO;AAAA,IAC9B,OAAO,OAAO,WAAW,MAAM;AAAA,IAC/B,OAAO,MAAM;AAAA,EACf,CAAC;AACD,QAAM,MAAM,OAAO,WAAW;AAG9B,QAAM,WAAW,OAAO,OAAO;AAAA,IAC7B,OAAO,KAAK,CAAC,mBAAmB,CAAC;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,SAAS,SAAS,QAAQ;AACnC;AAMO,SAAS,aAAa,iBAA+C;AAC1E,MAAI,oBAAoB,QAAQ,oBAAoB,OAAW,QAAO;AAEtE,QAAM,WAAW,OAAO,KAAK,iBAAiB,QAAQ;AAEtD,MAAI,SAAS,SAAS,IAAI,YAAY,aAAa,GAAG;AACpD,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,aAAa,SAAS,CAAC;AAC7B,MAAI,eAAe,qBAAqB;AACtC,UAAM,IAAI,MAAM,uCAAuC,UAAU,EAAE;AAAA,EACrE;AAEA,QAAM,KAAK,SAAS,SAAS,GAAG,IAAI,SAAS;AAC7C,QAAM,MAAM,SAAS,SAAS,IAAI,WAAW,IAAI,YAAY,UAAU;AACvE,QAAM,aAAa,SAAS,SAAS,IAAI,YAAY,UAAU;AAE/D,QAAM,MAAM,aAAa;AACzB,QAAM,WAAW,iBAAiB,WAAW,KAAK,EAAE;AACpD,WAAS,WAAW,GAAG;AAEvB,QAAM,YAAY,OAAO,OAAO;AAAA,IAC9B,SAAS,OAAO,UAAU;AAAA,IAC1B,SAAS,MAAM;AAAA,EACjB,CAAC;AAED,SAAO,UAAU,SAAS,MAAM;AAClC;AAuCO,SAAS,wBAAiC;AAC/C,MAAI;AACF,iBAAa;AACb,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADrJA,IAAI,UAAyB;AAC7B,SAAS,YAAoB;AAC3B,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,OAAO,EAAE,QAAQ,IAAI,eAAe,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AACA,IAAM,SAAS,IAAI,MAAM,CAAC,GAAa;AAAA,EACrC,IAAI,SAAS,MAAM;AACjB,UAAM,WAAW,UAAU;AAC3B,UAAM,QAAS,SAAiB,IAAI;AACpC,QAAI,OAAO,UAAU,YAAY;AAC/B,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AACF,CAAC;AAGD,eAAsB,kBAAkB,MAAiC;AACvE,QAAM,WAAW,MAAM,OAAO,WAAW,OAAO;AAAA,IAC9C,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AACD,SAAO,SAAS,KAAK,CAAC,EAAE;AAC1B;AAIA,eAAsB,YACpB,QACiB;AAEjB,QAAM,YAAY,MAAM,kBAAkB,OAAO,OAAO;AAGxD,QAAM,gBAAgB,sBAAsB;AAC5C,QAAM,eAAe,gBAAgB,aAAa,OAAO,OAAO,IAAK,OAAO;AAE5E,QAAM,CAAC,MAAM,IAAI,MAAM,GACpB,OAAO,QAAQ,EACf,OAAO;AAAA,IACN,GAAG;AAAA,IACH,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,IACA,YAAY,OAAO,cAAc,GAAG,OAAO,UAAU,SAAS;AAAA,EAChE,CAAC,EACA,UAAU;AAGb,MAAI;AACF,UAAM,GAAG,QAAQ;AAAA;AAAA,mDAE8B,OAAO,OAAO;AAAA,mBAC9C,OAAO,EAAE;AAAA,KACvB;AAAA,EACH,QAAQ;AAAA,EAER;AAGA,SAAO,EAAE,GAAG,QAAQ,SAAS,OAAO,QAAQ;AAC9C;AAGA,eAAsB,aACpB,IACA,SACwB;AAExB,QAAM,aAAoB,CAAC;AAC3B,MAAI,QAAQ,SAAS;AACnB,UAAM,eAAe,MAAM,kBAAkB,QAAQ,OAAO;AAC5D,eAAW,KAAK,gBAAgB,QAAQ,OAAO,EAAE;AACjD,eAAW,KAAK,kBAAkB,KAAK,UAAU,YAAY,CAAC,UAAU;AACxE,eAAW,KAAK,6CAA6C,QAAQ,OAAO,GAAG;AAAA,EACjF;AACA,MAAI,QAAQ,MAAM;AAChB,eAAW,KAAK,aAAa,QAAQ,IAAI,EAAE;AAAA,EAC7C;AACA,MAAI,QAAQ,eAAe,QAAW;AACpC,eAAW,KAAK,mBAAmB,QAAQ,UAAU,EAAE;AAAA,EACzD;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,QAAM,SAAS,MAAM,GAAG,QAAQ;AAAA;AAAA,UAExB,IAAI,KAAK,YAAY,OAAO,CAAC;AAAA,iBACtB,EAAE;AAAA;AAAA,GAEhB;AAED,SAAQ,OAAiB,CAAC,KAAK;AACjC;AAGA,eAAsB,aAAa,IAA8B;AAE/D,QAAM,SAAS,MAAM,GAAG,QAAQ;AAAA,wCACM,EAAE;AAAA,GACvC;AACD,QAAM,SAAU,OAAiB,CAAC;AAClC,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,GAAG,OAAO,gBAAgB,EAAE,OAAO;AAAA,IACvC,kBAAkB,OAAO;AAAA,IACzB,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,QAAQ;AAAA,IACR,mBAAmB,OAAO;AAAA,EAC5B,CAAC;AAGD,QAAM,GAAG,QAAQ,sCAAsC,EAAE,EAAE;AAE3D,SAAO;AACT;AAGA,eAAsB,eACpB,QACA,SAA8B,YACb;AACjB,QAAM,OAAO,MAAM,GAChB,OAAO,EACP,KAAK,QAAQ,EACb,MAAM,SAAS,GAAG,SAAS,QAAQ,MAAM,IAAI,MAAS,EACtD,QAAQ,KAAK,SAAS,SAAS,CAAC;AAGnC,aAAW,KAAK,MAAM;AACpB,QAAK,EAAU,WAAW;AACxB,UAAI;AACF,QAAC,EAAU,UAAU,aAAa,EAAE,OAAO,KAAK,EAAE;AAAA,MACpD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO,KAAK;AAAA,MACV,KAAK,IAAI,CAAC,OAAO;AAAA,QACf,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,SAAS,EAAE;AAAA,QACX,YAAY,EAAE;AAAA,QACd,QAAQ,EAAE;AAAA,QACV,YAAa,EAAU;AAAA,QACvB,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,IACrC,UAAU,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,aAAW,KAAK,MAAM;AACpB,UAAM,KAAK,OAAO,EAAE,IAAI,kBAAkB,EAAE,UAAU,MAAM;AAC5D,UAAM,KAAK,EAAE,OAAO;AACpB,UAAM,KAAK,YAAY,EAAE,UAAU,SAAS,eAAe,EAAE,UAAU,YAAY,CAAC,GAAG;AACvF,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGA,eAAsB,eACpB,OACA,QACA,QAAQ,GACW;AACnB,QAAM,iBAAiB,MAAM,kBAAkB,KAAK;AAGpD,QAAM,UAAU,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,2BAIR,KAAK,UAAU,cAAc,CAAC;AAAA;AAAA,MAEnD,SAAS,sBAAsB,MAAM,KAAK,KAAK;AAAA,6BACxB,KAAK,UAAU,cAAc,CAAC;AAAA,YAC/C,KAAK;AAAA,GACd;AAGD,QAAM,OAAO;AACb,QAAM,YAAY,KAAK,IAAI,CAAC,MAAW,EAAE,EAAE;AAC3C,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,GAAG,QAAQ;AAAA;AAAA;AAAA,uBAGE,SAAS;AAAA,KAC3B;AAAA,EACH;AAGA,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,WAAW;AACjB,UAAI;AACF,YAAI,UAAU,aAAa,IAAI,OAAO,KAAK,IAAI;AAAA,MACjD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,eAAsB,cAAc,IAAoC;AACtE,QAAM,SAAS,MAAM,GAAG,QAAQ;AAAA,wCACM,EAAE;AAAA,GACvC;AACD,QAAM,MAAO,OAAiB,CAAC,KAAK;AACpC,MAAI,OAAO,IAAI,WAAW;AACxB,QAAI;AACF,UAAI,UAAU,aAAa,IAAI,OAAO,KAAK,IAAI;AAAA,IACjD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAgBA,eAAsB,gBACpB,SACA,QACmB;AAEnB,QAAM,mBAAmB;AAAA;AAAA,SAElB,OAAO;AAAA;AAAA;AAId,MAAI;AACF,UAAM,WAAW,MAAM,OAAO,KAAK,YAAY,OAAO;AAAA,MACpD,OAAO;AAAA,MACP,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,iBAAiB,CAAC;AAAA,MACtD,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AAED,UAAM,YAAY,KAAK;AAAA,MACrB,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW;AAAA,IACzC;AACA,UAAM,kBAAkB,UAAU,YAAY,aAAa,CAAC;AAE5D,UAAM,iBAA2B,CAAC;AAClC,eAAW,OAAO,iBAAiB;AACjC,UAAI,IAAI,WAAW,IAAI,QAAQ,SAAS,GAAG;AACzC,cAAM,SAAS,MAAM,YAAY;AAAA,UAC/B;AAAA,UACA,SAAS,IAAI;AAAA,UACb,MAAM,IAAI,QAAQ;AAAA,UAClB,YAAY,IAAI,cAAc;AAAA,UAC9B,QAAQ;AAAA,UACR,YAAY;AAAA,QACd,CAAC;AACD,uBAAe,KAAK,MAAM;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AACjD,WAAO,CAAC;AAAA,EACV;AACF;AAGA,eAAsB,mBACpB,OACA,QACA,qBACiB;AAEjB,QAAM,qBAAqB,IAAI,gBAAgB,IAAI,kBACjD,IAAI,yBAAyB,IAAI,2BAA2B,IAAI;AAElE,MAAI,oBAAoB;AACtB,QAAI;AACF,YAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,kCAA6B;AACvE,YAAM,SAAS,MAAM,iBAAiB,OAAO,EAAE,QAAQ,OAAO,GAAG,oBAAoB,CAAC;AAEtF,UAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,eAAO;AAAA,MACT;AAEA,YAAMA,iBAAgB,OAAO,QAAQ,IAAI,CAAC,MAAW;AACnD,cAAM,aAAa,EAAE,aAAa,KAAK,EAAE,UAAU,MAAM;AACzD,cAAM,QAAQ,EAAE,eAAe,OAC3B,WAAW,EAAE,WAAW,QACxB,gBAAgB,EAAE,cAAc,KAAK,KAAK,QAAQ,CAAC,CAAC;AACxD,eAAO,MAAM,EAAE,IAAI,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,UAAU;AAAA,MAC3D,CAAC;AAED,aAAO;AAAA;AAAA;AAAA,EAA0CA,eAAc,KAAK,IAAI,CAAC;AAAA,IAC3E,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,mBAAmB,MAAM,eAAe,OAAO,QAAQ,CAAC;AAE9D,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,iBAAiB;AAAA,IACrC,CAAC,MAAW;AACV,YAAM,aAAa,EAAE,aAAa,KAAK,EAAE,UAAU,MAAM;AACzD,aAAO,MAAM,EAAE,IAAI,KAAK,EAAE,OAAO,iBAAiB,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,KAAK,UAAU;AAAA,IACjG;AAAA,EACF;AAEA,SAAO;AAAA;AAAA;AAAA,EAA0C,cAAc,KAAK,IAAI,CAAC;AAC3E;","names":["memoryStrings"]}
|