opensentinel 3.1.1 → 3.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -83
- package/dist/agent-manager-7N7REQZQ.js +39 -0
- package/dist/agent-processor-I23VWQY3.js +280 -0
- package/dist/agent-processor-I23VWQY3.js.map +1 -0
- package/dist/agent-types-2T4PXLFQ.js +12 -0
- package/dist/alerting-4I37GG4U.js +699 -0
- package/dist/alerting-4I37GG4U.js.map +1 -0
- package/dist/analysis-agent-JWN2GXYE.js +288 -0
- package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
- package/dist/{archiver-AVNBYCKQ.js → archiver-XLRIIXPY.js} +86 -17
- package/dist/archiver-XLRIIXPY.js.map +1 -0
- package/dist/{audit-logger-OBPR7CRO.js → audit-logger-AU3TMWKI.js} +6 -5
- package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
- package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
- package/dist/autonomy-N7W5XPLX.js.map +1 -0
- package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
- package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
- package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
- package/dist/bot-MU2TJQ3Y.js +46 -0
- package/dist/brain-SLA474EU.js +65 -0
- package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
- package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
- package/dist/{chunk-6PMVAAA7.js → chunk-2RGPWU77.js} +3 -3
- package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
- package/dist/{chunk-MXAPLSJ5.js → chunk-45YXODSB.js} +2 -2
- package/dist/{chunk-SJSUSJ47.js → chunk-4YJRBMMA.js} +2 -2
- package/dist/chunk-643M3AP5.js +564 -0
- package/dist/chunk-643M3AP5.js.map +1 -0
- package/dist/{chunk-766ASQWE.js → chunk-6JY4HNUH.js} +2413 -2368
- package/dist/chunk-6JY4HNUH.js.map +1 -0
- package/dist/chunk-6LTLIYAQ.js +194 -0
- package/dist/chunk-6LTLIYAQ.js.map +1 -0
- package/dist/chunk-6UZPE35A.js +724 -0
- package/dist/chunk-6UZPE35A.js.map +1 -0
- package/dist/chunk-6W6PTJFT.js +181 -0
- package/dist/chunk-6W6PTJFT.js.map +1 -0
- package/dist/chunk-7MZN73J2.js +162 -0
- package/dist/chunk-7MZN73J2.js.map +1 -0
- package/dist/{chunk-SVAPX2XN.js → chunk-A24GPVLY.js} +9 -7
- package/dist/{chunk-SVAPX2XN.js.map → chunk-A24GPVLY.js.map} +1 -1
- package/dist/chunk-AD6YEH6U.js +3408 -0
- package/dist/chunk-AD6YEH6U.js.map +1 -0
- package/dist/chunk-ADTDYJO7.js +265 -0
- package/dist/chunk-ADTDYJO7.js.map +1 -0
- package/dist/{chunk-WRAKK6K6.js → chunk-AR34B6XR.js} +5 -3
- package/dist/{chunk-WRAKK6K6.js.map → chunk-AR34B6XR.js.map} +1 -1
- package/dist/chunk-BMOUYXLX.js +418 -0
- package/dist/chunk-BMOUYXLX.js.map +1 -0
- package/dist/chunk-C6PELIHS.js +60 -0
- package/dist/chunk-C6PELIHS.js.map +1 -0
- package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
- package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
- package/dist/chunk-DOYGMNMK.js.map +1 -0
- package/dist/chunk-FFV2SXFD.js +380 -0
- package/dist/chunk-FFV2SXFD.js.map +1 -0
- package/dist/{chunk-EVE7MIIY.js → chunk-GUKKW7JI.js} +15 -16
- package/dist/chunk-GUKKW7JI.js.map +1 -0
- package/dist/{chunk-66OJ3WB4.js → chunk-H3BOLSTS.js} +2 -2
- package/dist/chunk-HKOPRRDJ.js +1021 -0
- package/dist/chunk-HKOPRRDJ.js.map +1 -0
- package/dist/{chunk-BXZ6EA52.js → chunk-HTF2GIQC.js} +57 -3
- package/dist/chunk-HTF2GIQC.js.map +1 -0
- package/dist/{chunk-TYAGMJNV.js → chunk-JOA5A3G3.js} +5 -5
- package/dist/{chunk-OCVQGBJK.js → chunk-KABG5PG3.js} +6 -4
- package/dist/{chunk-OCVQGBJK.js.map → chunk-KABG5PG3.js.map} +1 -1
- package/dist/{chunk-VEHFVBLI.js → chunk-KT7NLIXP.js} +2 -2
- package/dist/chunk-LFDXEYYB.js +150 -0
- package/dist/chunk-LFDXEYYB.js.map +1 -0
- package/dist/{chunk-I6BDYQIG.js → chunk-M7YLQHFP.js} +6 -6
- package/dist/chunk-M7YLQHFP.js.map +1 -0
- package/dist/{chunk-AYUKPTSM.js → chunk-MFK34XSY.js} +96 -218
- package/dist/chunk-MFK34XSY.js.map +1 -0
- package/dist/chunk-MIC5IBQF.js +386 -0
- package/dist/chunk-MIC5IBQF.js.map +1 -0
- package/dist/{chunk-4UOE5TUZ.js → chunk-NMSHVO5O.js} +4 -4
- package/dist/{chunk-XKYRH4FM.js → chunk-NYVBXUGD.js} +13 -32
- package/dist/chunk-NYVBXUGD.js.map +1 -0
- package/dist/chunk-ODCFS5WD.js +463 -0
- package/dist/chunk-ODCFS5WD.js.map +1 -0
- package/dist/{chunk-ZLZKF2PM.js → chunk-PUNIMPMY.js} +32 -2
- package/dist/chunk-PUNIMPMY.js.map +1 -0
- package/dist/chunk-S4NJJS5C.js +37 -0
- package/dist/chunk-S4NJJS5C.js.map +1 -0
- package/dist/{chunk-NHMBTUMW.js → chunk-TAAZB5KN.js} +2 -2
- package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
- package/dist/chunk-U2X2J3FI.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
- package/dist/{chunk-4GLYY4NN.js → chunk-UWUIJTT4.js} +8 -2
- package/dist/chunk-UWUIJTT4.js.map +1 -0
- package/dist/{chunk-SPPMCAKG.js → chunk-VKMFUIVA.js} +2 -2
- package/dist/chunk-VKMFUIVA.js.map +1 -0
- package/dist/chunk-WZAH34TG.js +129 -0
- package/dist/chunk-WZAH34TG.js.map +1 -0
- package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
- package/dist/chunk-X6Q3K3L2.js.map +1 -0
- package/dist/chunk-XTX7EK43.js +134 -0
- package/dist/chunk-XTX7EK43.js.map +1 -0
- package/dist/chunk-ZIYTHUM5.js +457 -0
- package/dist/chunk-ZIYTHUM5.js.map +1 -0
- package/dist/chunker-K6WTR62A.js +12 -0
- package/dist/cli.js +1 -1
- package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
- package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
- package/dist/coding-agent-DESSU3AC.js +233 -0
- package/dist/coding-agent-DESSU3AC.js.map +1 -0
- package/dist/commands/setup.js +1 -1
- package/dist/commands/start.js +2 -2
- package/dist/commands/status.js +1 -1
- package/dist/commands/stop.js +1 -1
- package/dist/commands/utils.js +1 -1
- package/dist/cost-tracker-EMOIOYH7.js +11 -0
- package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
- package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
- package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
- package/dist/db-LRIOKQBO.js +77 -0
- package/dist/discord-NKR3X4AV.js +80 -0
- package/dist/documents-EYIYLZK2.js +184 -0
- package/dist/documents-EYIYLZK2.js.map +1 -0
- package/dist/docx-parser-EXL4TN5E.js +16 -0
- package/dist/{email-K7LO2IPB.js → email-EAQNULVD.js} +33 -25
- package/dist/{email-K7LO2IPB.js.map → email-EAQNULVD.js.map} +1 -1
- package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-OGHT6TS5.js} +11 -8
- package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-OGHT6TS5.js.map} +1 -1
- package/dist/enrichment-pipeline-CMUVBDC7.js +14 -0
- package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-4X4JU43O.js} +6 -5
- package/dist/env-CHOFICED.js +12 -0
- package/dist/error-tracker-SVQSDQDW.js +32 -0
- package/dist/finnhub-X7ZMQSXF.js +178 -0
- package/dist/finnhub-X7ZMQSXF.js.map +1 -0
- package/dist/fred-TMUF3J2V.js +203 -0
- package/dist/fred-TMUF3J2V.js.map +1 -0
- package/dist/github-KGNILDWJ.js +833 -0
- package/dist/github-KGNILDWJ.js.map +1 -0
- package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
- package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
- package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
- package/dist/hooks-N4MIFBVM.js +14 -0
- package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
- package/dist/imessage-V2XNDDHT.js +43 -0
- package/dist/inbox-summarizer-DKKRYXDR.js +55 -0
- package/dist/{incident-response-C5J7Q6DT.js → incident-response-ZTIKUWEO.js} +8 -6
- package/dist/{incident-response-C5J7Q6DT.js.map → incident-response-ZTIKUWEO.js.map} +1 -1
- package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
- package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
- package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
- package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
- package/dist/knowledge-base-J7PJ7MZ3.js +46 -0
- package/dist/lib.d.ts +73 -1
- package/dist/lib.js +86 -76
- package/dist/lib.js.map +1 -1
- package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
- package/dist/{matrix-QVHG76I7.js → matrix-XHTR53VQ.js} +29 -21
- package/dist/{matrix-QVHG76I7.js.map → matrix-XHTR53VQ.js.map} +1 -1
- package/dist/{mcp-3JI6W7ZE.js → mcp-3C2TN67D.js} +3 -3
- package/dist/metrics-VJDWQWU7.js +25 -0
- package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
- package/dist/multi-user-S56GUD6L.js +411 -0
- package/dist/multi-user-S56GUD6L.js.map +1 -0
- package/dist/{ocr-AC7NPX33.js → ocr-LGUIPKVZ.js} +6 -4
- package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
- package/dist/osint-agent-RL5XPBRQ.js +189 -0
- package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
- package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
- package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
- package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
- package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
- package/dist/pdf-parser-YLMTTYHL.js +14 -0
- package/dist/{presentations-DSV5IHG5.js → presentations-HXTAMGHT.js} +3 -3
- package/dist/presentations-HXTAMGHT.js.map +1 -0
- package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
- package/dist/{providers-J4LYPHDR.js → providers-H6YIC3MG.js} +6 -4
- package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
- package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
- package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
- package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
- package/dist/research-agent-WCRSY3UZ.js +168 -0
- package/dist/research-agent-WCRSY3UZ.js.map +1 -0
- package/dist/risk-engine-YKCPT5D5.js +10 -0
- package/dist/risk-engine-YKCPT5D5.js.map +1 -0
- package/dist/scheduler-CA5UNHZV.js +73 -0
- package/dist/scheduler-CA5UNHZV.js.map +1 -0
- package/dist/schema-ALJ67YVG.js +72 -0
- package/dist/schema-ALJ67YVG.js.map +1 -0
- package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
- package/dist/search-GMLKBHSW.js.map +1 -0
- package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
- package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
- package/dist/signal-X7IQJGRQ.js +43 -0
- package/dist/signal-X7IQJGRQ.js.map +1 -0
- package/dist/slack-P2LFUJUQ.js +85 -0
- package/dist/slack-P2LFUJUQ.js.map +1 -0
- package/dist/{sms-M3JIOTCW.js → sms-4VME2HUL.js} +4 -4
- package/dist/sms-4VME2HUL.js.map +1 -0
- package/dist/{src-VYUE6LRA.js → src-S5KX4YEV.js} +179 -48
- package/dist/src-S5KX4YEV.js.map +1 -0
- package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
- package/dist/stocks-4M4HZWZS.js.map +1 -0
- package/dist/text-extractor-OAUBAW5P.js +12 -0
- package/dist/text-extractor-OAUBAW5P.js.map +1 -0
- package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
- package/dist/text-transform-HCLCUDFZ.js.map +1 -0
- package/dist/tools-FGPN522P.js +46 -0
- package/dist/tools-FGPN522P.js.map +1 -0
- package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
- package/dist/tunnel-XOUVVRAK.js.map +1 -0
- package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
- package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
- package/dist/unit-converter-LYPAHU64.js.map +1 -0
- package/dist/whatsapp-KRPQ4YUX.js +43 -0
- package/dist/whatsapp-KRPQ4YUX.js.map +1 -0
- package/dist/{word-document-7B6SJMAY.js → word-document-D6N2C47N.js} +4 -4
- package/dist/word-document-D6N2C47N.js.map +1 -0
- package/dist/workflow-store-ZYAYE5P6.js +373 -0
- package/dist/workflow-store-ZYAYE5P6.js.map +1 -0
- package/dist/writing-agent-VDGLNOGO.js +243 -0
- package/dist/writing-agent-VDGLNOGO.js.map +1 -0
- package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
- package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
- package/package.json +11 -1
- package/dist/archiver-AVNBYCKQ.js.map +0 -1
- package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
- package/dist/bot-QRARP4UN.js +0 -36
- package/dist/brain-7XLLM3KC.js +0 -56
- package/dist/chunk-4GLYY4NN.js.map +0 -1
- package/dist/chunk-766ASQWE.js.map +0 -1
- package/dist/chunk-AYUKPTSM.js.map +0 -1
- package/dist/chunk-BRBWNV65.js.map +0 -1
- package/dist/chunk-BXZ6EA52.js.map +0 -1
- package/dist/chunk-EVE7MIIY.js.map +0 -1
- package/dist/chunk-H5RQOFO2.js.map +0 -1
- package/dist/chunk-I6BDYQIG.js.map +0 -1
- package/dist/chunk-IZJMVV7O.js +0 -347
- package/dist/chunk-IZJMVV7O.js.map +0 -1
- package/dist/chunk-O7IH7JTI.js +0 -1898
- package/dist/chunk-O7IH7JTI.js.map +0 -1
- package/dist/chunk-RZ4YESBG.js.map +0 -1
- package/dist/chunk-SPPMCAKG.js.map +0 -1
- package/dist/chunk-VRD5CYRL.js +0 -1568
- package/dist/chunk-VRD5CYRL.js.map +0 -1
- package/dist/chunk-XKYRH4FM.js.map +0 -1
- package/dist/chunk-ZLZKF2PM.js.map +0 -1
- package/dist/discord-B3HUPGQ6.js +0 -70
- package/dist/dist-UISMLMFN.js +0 -21847
- package/dist/dist-UISMLMFN.js.map +0 -1
- package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
- package/dist/env-IWXUVTCB.js +0 -12
- package/dist/imessage-NGA2XF2V.js +0 -35
- package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
- package/dist/presentations-DSV5IHG5.js.map +0 -1
- package/dist/scheduler-VK4WFERV.js +0 -63
- package/dist/signal-6CGDFYL2.js +0 -35
- package/dist/slack-IZQWIKOH.js +0 -75
- package/dist/src-VYUE6LRA.js.map +0 -1
- package/dist/tools-2RLEI2N6.js +0 -38
- package/dist/tunnel-IWMXUML4.js.map +0 -1
- package/dist/whatsapp-LFX6YKCM.js +0 -35
- package/dist/word-document-7B6SJMAY.js.map +0 -1
- /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-7N7REQZQ.js.map} +0 -0
- /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
- /package/dist/{backup-restore-PZ7CYYB7.js.map → audit-logger-AU3TMWKI.js.map} +0 -0
- /package/dist/{blocks-R3PODY47.js.map → auth-PH5IHISW.js.map} +0 -0
- /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
- /package/dist/{bot-QRARP4UN.js.map → backup-restore-72OQTZO3.js.map} +0 -0
- /package/dist/{brain-7XLLM3KC.js.map → blocks-YOWOESDD.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → bot-MU2TJQ3Y.js.map} +0 -0
- /package/dist/{client-ZQSFPMOB.js.map → brain-SLA474EU.js.map} +0 -0
- /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
- /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
- /package/dist/{chunk-6PMVAAA7.js.map → chunk-2RGPWU77.js.map} +0 -0
- /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
- /package/dist/{chunk-MXAPLSJ5.js.map → chunk-45YXODSB.js.map} +0 -0
- /package/dist/{chunk-SJSUSJ47.js.map → chunk-4YJRBMMA.js.map} +0 -0
- /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
- /package/dist/{chunk-66OJ3WB4.js.map → chunk-H3BOLSTS.js.map} +0 -0
- /package/dist/{chunk-TYAGMJNV.js.map → chunk-JOA5A3G3.js.map} +0 -0
- /package/dist/{chunk-VEHFVBLI.js.map → chunk-KT7NLIXP.js.map} +0 -0
- /package/dist/{chunk-4UOE5TUZ.js.map → chunk-NMSHVO5O.js.map} +0 -0
- /package/dist/{chunk-NHMBTUMW.js.map → chunk-TAAZB5KN.js.map} +0 -0
- /package/dist/{clipboard-manager-TEO2GEDN.js.map → chunk-UP2VWCW5.js.map} +0 -0
- /package/dist/{cron-explain-HHQKPD3M.js.map → chunker-K6WTR62A.js.map} +0 -0
- /package/dist/{crypto-4AP47IKC.js.map → client-FOIYPOZQ.js.map} +0 -0
- /package/dist/{databases-37X4CI2Y.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
- /package/dist/{discord-B3HUPGQ6.js.map → cost-tracker-EMOIOYH7.js.map} +0 -0
- /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
- /package/dist/{entity-resolution-Y3IUWEAT.js.map → crypto-2VG3RJR2.js.map} +0 -0
- /package/dist/{env-IWXUVTCB.js.map → databases-XDPMG5AV.js.map} +0 -0
- /package/dist/{hash-tool-ULQYD7B5.js.map → db-LRIOKQBO.js.map} +0 -0
- /package/dist/{heartbeat-monitor-GCISLXI3.js.map → discord-NKR3X4AV.js.map} +0 -0
- /package/dist/{imessage-NGA2XF2V.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
- /package/dist/{inbox-summarizer-NRI4S7IF.js.map → enrichment-pipeline-CMUVBDC7.js.map} +0 -0
- /package/dist/{inventory-manager-352OHXWD.js.map → entity-resolution-4X4JU43O.js.map} +0 -0
- /package/dist/{json-tool-QE2SYHEG.js.map → env-CHOFICED.js.map} +0 -0
- /package/dist/{key-rotation-DPHU4ZTB.js.map → error-tracker-SVQSDQDW.js.map} +0 -0
- /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
- /package/dist/{mcp-3JI6W7ZE.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
- /package/dist/{ocr-AC7NPX33.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
- /package/dist/{ollama-BOAMSPLJ.js.map → hooks-N4MIFBVM.js.map} +0 -0
- /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
- /package/dist/{pages-MI523RB7.js.map → imessage-V2XNDDHT.js.map} +0 -0
- /package/dist/{pairing-IFQYCPNS.js.map → inbox-summarizer-DKKRYXDR.js.map} +0 -0
- /package/dist/{pdf-ALQVOEJR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
- /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
- /package/dist/{prometheus-JNT2BD4L.js.map → json-tool-4FK5RNER.js.map} +0 -0
- /package/dist/{providers-J4LYPHDR.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
- /package/dist/{qr-code-WIX4PB4U.js.map → knowledge-base-J7PJ7MZ3.js.map} +0 -0
- /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
- /package/dist/{regex-tool-W4ABRKGK.js.map → mcp-3C2TN67D.js.map} +0 -0
- /package/dist/{scheduler-VK4WFERV.js.map → metrics-VJDWQWU7.js.map} +0 -0
- /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
- /package/dist/{search-BCLBO5E3.js.map → ocr-LGUIPKVZ.js.map} +0 -0
- /package/dist/{signal-6CGDFYL2.js.map → ollama-J7CU45WT.js.map} +0 -0
- /package/dist/{slack-IZQWIKOH.js.map → pages-XDE7JRCA.js.map} +0 -0
- /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
- /package/dist/{sms-M3JIOTCW.js.map → pairing-77N47RAT.js.map} +0 -0
- /package/dist/{stocks-XXWBPOCU.js.map → pdf-67HGXCFJ.js.map} +0 -0
- /package/dist/{text-transform-6SGUA5Z4.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
- /package/dist/{tools-2RLEI2N6.js.map → prometheus-YETCZO4I.js.map} +0 -0
- /package/dist/{unit-converter-ZYXMEZOE.js.map → providers-H6YIC3MG.js.map} +0 -0
- /package/dist/{whatsapp-LFX6YKCM.js.map → qr-code-6WZJHRKL.js.map} +0 -0
- /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
- /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
- /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
- /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
- /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
- /package/dist/{zapier-webhook-TBZ5YF2A.js.map → zapier-webhook-NIELLTXR.js.map} +0 -0
|
@@ -0,0 +1,724 @@
|
|
|
1
|
+
import {
|
|
2
|
+
db
|
|
3
|
+
} from "./chunk-S4NJJS5C.js";
|
|
4
|
+
import {
|
|
5
|
+
env
|
|
6
|
+
} from "./chunk-PUNIMPMY.js";
|
|
7
|
+
import {
|
|
8
|
+
archivedMemories,
|
|
9
|
+
memories
|
|
10
|
+
} from "./chunk-NYVBXUGD.js";
|
|
11
|
+
|
|
12
|
+
// src/core/embeddings/provider.ts
|
|
13
|
+
var AbstractEmbeddingProvider = class {
|
|
14
|
+
async embedSingle(text) {
|
|
15
|
+
const [embedding] = await this.embed([text]);
|
|
16
|
+
return embedding;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
var OpenAIEmbeddingProvider = class _OpenAIEmbeddingProvider extends AbstractEmbeddingProvider {
|
|
20
|
+
name = "openai";
|
|
21
|
+
dimensions;
|
|
22
|
+
apiKey;
|
|
23
|
+
model;
|
|
24
|
+
static MODEL_DIMENSIONS = {
|
|
25
|
+
"text-embedding-3-small": 1536,
|
|
26
|
+
"text-embedding-3-large": 3072,
|
|
27
|
+
"text-embedding-ada-002": 1536
|
|
28
|
+
};
|
|
29
|
+
constructor(apiKey, model = "text-embedding-3-small") {
|
|
30
|
+
super();
|
|
31
|
+
this.apiKey = apiKey;
|
|
32
|
+
this.model = model;
|
|
33
|
+
this.dimensions = _OpenAIEmbeddingProvider.MODEL_DIMENSIONS[model] ?? 1536;
|
|
34
|
+
}
|
|
35
|
+
async embed(texts) {
|
|
36
|
+
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: {
|
|
39
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
40
|
+
"Content-Type": "application/json"
|
|
41
|
+
},
|
|
42
|
+
body: JSON.stringify({ input: texts, model: this.model })
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`OpenAI embedding failed: ${response.status}`);
|
|
46
|
+
}
|
|
47
|
+
const data = await response.json();
|
|
48
|
+
return data.data.map((d) => d.embedding);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var HuggingFaceEmbeddingProvider = class extends AbstractEmbeddingProvider {
|
|
52
|
+
name = "huggingface";
|
|
53
|
+
dimensions;
|
|
54
|
+
accessToken;
|
|
55
|
+
model;
|
|
56
|
+
batchSize;
|
|
57
|
+
constructor(accessToken, model = "sentence-transformers/all-MiniLM-L6-v2", dimensions = 384, batchSize = 32) {
|
|
58
|
+
super();
|
|
59
|
+
this.accessToken = accessToken;
|
|
60
|
+
this.model = model;
|
|
61
|
+
this.dimensions = dimensions;
|
|
62
|
+
this.batchSize = batchSize;
|
|
63
|
+
}
|
|
64
|
+
async embed(texts) {
|
|
65
|
+
const allEmbeddings = [];
|
|
66
|
+
for (let i = 0; i < texts.length; i += this.batchSize) {
|
|
67
|
+
const batch = texts.slice(i, i + this.batchSize);
|
|
68
|
+
const embeddings = await this.embedBatch(batch);
|
|
69
|
+
allEmbeddings.push(...embeddings);
|
|
70
|
+
}
|
|
71
|
+
return allEmbeddings;
|
|
72
|
+
}
|
|
73
|
+
async embedBatch(texts, retries = 3) {
|
|
74
|
+
const url = `https://api-inference.huggingface.co/pipeline/feature-extraction/${this.model}`;
|
|
75
|
+
for (let attempt = 0; attempt < retries; attempt++) {
|
|
76
|
+
const response = await fetch(url, {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: {
|
|
79
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
80
|
+
"Content-Type": "application/json"
|
|
81
|
+
},
|
|
82
|
+
body: JSON.stringify({
|
|
83
|
+
inputs: texts,
|
|
84
|
+
options: { wait_for_model: true }
|
|
85
|
+
})
|
|
86
|
+
});
|
|
87
|
+
if (response.status === 429) {
|
|
88
|
+
const delay = Math.pow(2, attempt) * 1e3;
|
|
89
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (response.status === 503) {
|
|
93
|
+
const delay = Math.pow(2, attempt) * 2e3;
|
|
94
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
const body = await response.text().catch(() => "");
|
|
99
|
+
throw new Error(
|
|
100
|
+
`HuggingFace embedding failed: ${response.status} ${body}`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
const data = await response.json();
|
|
104
|
+
return this.processResponse(data, texts.length);
|
|
105
|
+
}
|
|
106
|
+
throw new Error(
|
|
107
|
+
`HuggingFace embedding failed after ${retries} retries`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* HuggingFace returns different shapes depending on the model:
|
|
112
|
+
* - Sentence-level: number[][] (one embedding per input)
|
|
113
|
+
* - Token-level: number[][][] (one embedding per token per input, needs mean pooling)
|
|
114
|
+
*/
|
|
115
|
+
processResponse(data, expectedCount) {
|
|
116
|
+
if (!Array.isArray(data) || data.length === 0) {
|
|
117
|
+
throw new Error("HuggingFace returned empty response");
|
|
118
|
+
}
|
|
119
|
+
if (typeof data[0][0] === "number") {
|
|
120
|
+
return data.map((v) => this.l2Normalize(v));
|
|
121
|
+
}
|
|
122
|
+
if (Array.isArray(data[0][0])) {
|
|
123
|
+
return data.map(
|
|
124
|
+
(tokenEmbeddings) => this.l2Normalize(this.meanPool(tokenEmbeddings))
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
throw new Error(
|
|
128
|
+
`Unexpected HuggingFace response shape: ${typeof data[0][0]}`
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
meanPool(tokenEmbeddings) {
|
|
132
|
+
if (tokenEmbeddings.length === 0) return [];
|
|
133
|
+
const dims = tokenEmbeddings[0].length;
|
|
134
|
+
const result = new Array(dims).fill(0);
|
|
135
|
+
for (const token of tokenEmbeddings) {
|
|
136
|
+
for (let i = 0; i < dims; i++) {
|
|
137
|
+
result[i] += token[i];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const count = tokenEmbeddings.length;
|
|
141
|
+
for (let i = 0; i < dims; i++) {
|
|
142
|
+
result[i] /= count;
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
l2Normalize(vector) {
|
|
147
|
+
const norm = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
|
|
148
|
+
if (norm === 0) return vector;
|
|
149
|
+
return vector.map((v) => v / norm);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
var TFIDFProvider = class extends AbstractEmbeddingProvider {
|
|
153
|
+
name = "tfidf";
|
|
154
|
+
dimensions = 256;
|
|
155
|
+
vocabulary = /* @__PURE__ */ new Map();
|
|
156
|
+
idf = /* @__PURE__ */ new Map();
|
|
157
|
+
docCount = 0;
|
|
158
|
+
tokenize(text) {
|
|
159
|
+
return text.toLowerCase().replace(/[^\w\s]/g, " ").split(/\s+/).filter((t) => t.length > 1);
|
|
160
|
+
}
|
|
161
|
+
buildVocabulary(documents) {
|
|
162
|
+
this.docCount = documents.length;
|
|
163
|
+
const docFreq = /* @__PURE__ */ new Map();
|
|
164
|
+
for (const doc of documents) {
|
|
165
|
+
const tokens = new Set(this.tokenize(doc));
|
|
166
|
+
for (const token of tokens) {
|
|
167
|
+
docFreq.set(token, (docFreq.get(token) || 0) + 1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const sorted = Array.from(docFreq.entries()).sort((a, b) => b[1] - a[1]).slice(0, this.dimensions);
|
|
171
|
+
sorted.forEach(([term, df], i) => {
|
|
172
|
+
this.vocabulary.set(term, i);
|
|
173
|
+
this.idf.set(term, Math.log(this.docCount / (1 + df)));
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async embed(texts) {
|
|
177
|
+
if (this.vocabulary.size === 0) {
|
|
178
|
+
this.buildVocabulary(texts);
|
|
179
|
+
}
|
|
180
|
+
return texts.map((text) => {
|
|
181
|
+
const tokens = this.tokenize(text);
|
|
182
|
+
const tf = /* @__PURE__ */ new Map();
|
|
183
|
+
for (const token of tokens) {
|
|
184
|
+
tf.set(token, (tf.get(token) || 0) + 1);
|
|
185
|
+
}
|
|
186
|
+
const vector = new Array(this.dimensions).fill(0);
|
|
187
|
+
for (const [term, freq] of tf) {
|
|
188
|
+
const idx = this.vocabulary.get(term);
|
|
189
|
+
if (idx !== void 0) {
|
|
190
|
+
const tfidf = freq / tokens.length * (this.idf.get(term) || 1);
|
|
191
|
+
vector[idx] = tfidf;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const norm = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
|
|
195
|
+
if (norm > 0) {
|
|
196
|
+
for (let i = 0; i < vector.length; i++) {
|
|
197
|
+
vector[i] /= norm;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return vector;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// src/core/embeddings/adapter.ts
|
|
206
|
+
var DimensionAdapter = class {
|
|
207
|
+
providerDimensions;
|
|
208
|
+
dbDimensions;
|
|
209
|
+
constructor(providerDimensions, dbDimensions) {
|
|
210
|
+
this.providerDimensions = providerDimensions;
|
|
211
|
+
this.dbDimensions = dbDimensions;
|
|
212
|
+
}
|
|
213
|
+
needsAdaptation() {
|
|
214
|
+
return this.providerDimensions !== this.dbDimensions;
|
|
215
|
+
}
|
|
216
|
+
adapt(embedding) {
|
|
217
|
+
if (embedding.length === this.dbDimensions) return embedding;
|
|
218
|
+
if (embedding.length < this.dbDimensions) {
|
|
219
|
+
const padded = new Array(this.dbDimensions).fill(0);
|
|
220
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
221
|
+
padded[i] = embedding[i];
|
|
222
|
+
}
|
|
223
|
+
return padded;
|
|
224
|
+
}
|
|
225
|
+
return embedding.slice(0, this.dbDimensions);
|
|
226
|
+
}
|
|
227
|
+
adaptBatch(embeddings) {
|
|
228
|
+
if (!this.needsAdaptation()) return embeddings;
|
|
229
|
+
return embeddings.map((e) => this.adapt(e));
|
|
230
|
+
}
|
|
231
|
+
getProviderDimensions() {
|
|
232
|
+
return this.providerDimensions;
|
|
233
|
+
}
|
|
234
|
+
getDbDimensions() {
|
|
235
|
+
return this.dbDimensions;
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// src/core/embeddings/registry.ts
|
|
240
|
+
var MODEL_DIMENSIONS = {
|
|
241
|
+
// OpenAI
|
|
242
|
+
"text-embedding-3-small": 1536,
|
|
243
|
+
"text-embedding-3-large": 3072,
|
|
244
|
+
"text-embedding-ada-002": 1536,
|
|
245
|
+
// HuggingFace sentence-transformers
|
|
246
|
+
"sentence-transformers/all-MiniLM-L6-v2": 384,
|
|
247
|
+
"sentence-transformers/all-mpnet-base-v2": 768,
|
|
248
|
+
"sentence-transformers/all-MiniLM-L12-v2": 384,
|
|
249
|
+
"sentence-transformers/paraphrase-MiniLM-L6-v2": 384,
|
|
250
|
+
// BAAI
|
|
251
|
+
"BAAI/bge-small-en-v1.5": 384,
|
|
252
|
+
"BAAI/bge-base-en-v1.5": 768,
|
|
253
|
+
"BAAI/bge-large-en-v1.5": 1024
|
|
254
|
+
};
|
|
255
|
+
var EmbeddingRegistry = class {
|
|
256
|
+
provider = null;
|
|
257
|
+
adapter = null;
|
|
258
|
+
config = null;
|
|
259
|
+
initialize(provider, config) {
|
|
260
|
+
this.provider = provider;
|
|
261
|
+
this.config = config;
|
|
262
|
+
this.adapter = new DimensionAdapter(
|
|
263
|
+
provider.dimensions,
|
|
264
|
+
config.dbDimensions
|
|
265
|
+
);
|
|
266
|
+
if (this.adapter.needsAdaptation()) {
|
|
267
|
+
const action = provider.dimensions < config.dbDimensions ? "zero-padded" : "truncated";
|
|
268
|
+
console.log(
|
|
269
|
+
`[Embeddings] Provider: ${provider.name} (${provider.dimensions} dims, ${action} to ${config.dbDimensions})`
|
|
270
|
+
);
|
|
271
|
+
} else {
|
|
272
|
+
console.log(
|
|
273
|
+
`[Embeddings] Provider: ${provider.name} (${provider.dimensions} dims)`
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
isInitialized() {
|
|
278
|
+
return this.provider !== null;
|
|
279
|
+
}
|
|
280
|
+
getProvider() {
|
|
281
|
+
if (!this.provider) {
|
|
282
|
+
throw new Error(
|
|
283
|
+
"[Embeddings] Not initialized. Call initializeEmbeddings() first."
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
return this.provider;
|
|
287
|
+
}
|
|
288
|
+
getAdapter() {
|
|
289
|
+
if (!this.adapter) {
|
|
290
|
+
throw new Error(
|
|
291
|
+
"[Embeddings] Not initialized. Call initializeEmbeddings() first."
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
return this.adapter;
|
|
295
|
+
}
|
|
296
|
+
getConfig() {
|
|
297
|
+
if (!this.config) {
|
|
298
|
+
throw new Error(
|
|
299
|
+
"[Embeddings] Not initialized. Call initializeEmbeddings() first."
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
return this.config;
|
|
303
|
+
}
|
|
304
|
+
getDimensions() {
|
|
305
|
+
return this.getProvider().dimensions;
|
|
306
|
+
}
|
|
307
|
+
getDbDimensions() {
|
|
308
|
+
return this.getConfig().dbDimensions;
|
|
309
|
+
}
|
|
310
|
+
static resolveModelDimensions(model, explicitDimensions) {
|
|
311
|
+
return explicitDimensions ?? MODEL_DIMENSIONS[model] ?? 384;
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
var embeddingRegistry = new EmbeddingRegistry();
|
|
315
|
+
|
|
316
|
+
// src/core/embeddings/index.ts
|
|
317
|
+
var _initPromise = null;
|
|
318
|
+
async function initializeEmbeddings() {
|
|
319
|
+
if (embeddingRegistry.isInitialized()) return;
|
|
320
|
+
const providerType = env.EMBEDDING_PROVIDER || "openai";
|
|
321
|
+
const model = env.EMBEDDING_MODEL;
|
|
322
|
+
const explicitDimensions = env.EMBEDDING_DIMENSIONS;
|
|
323
|
+
const dbDimensions = env.EMBEDDING_DB_DIMENSIONS ?? 1536;
|
|
324
|
+
let provider;
|
|
325
|
+
switch (providerType) {
|
|
326
|
+
case "huggingface": {
|
|
327
|
+
const token = env.HUGGINGFACE_ACCESS_TOKEN;
|
|
328
|
+
if (!token) {
|
|
329
|
+
throw new Error(
|
|
330
|
+
"[Embeddings] HUGGINGFACE_ACCESS_TOKEN required for huggingface provider"
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
const hfModel = model || "sentence-transformers/all-MiniLM-L6-v2";
|
|
334
|
+
const dims = EmbeddingRegistry.resolveModelDimensions(
|
|
335
|
+
hfModel,
|
|
336
|
+
explicitDimensions
|
|
337
|
+
);
|
|
338
|
+
const batchSize = env.EMBEDDING_BATCH_SIZE ?? 32;
|
|
339
|
+
provider = new HuggingFaceEmbeddingProvider(
|
|
340
|
+
token,
|
|
341
|
+
hfModel,
|
|
342
|
+
dims,
|
|
343
|
+
batchSize
|
|
344
|
+
);
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
case "tfidf": {
|
|
348
|
+
provider = new TFIDFProvider();
|
|
349
|
+
console.log("[Embeddings] Using TF-IDF fallback (no API required)");
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
case "openai":
|
|
353
|
+
default: {
|
|
354
|
+
const apiKey = env.OPENAI_API_KEY;
|
|
355
|
+
if (!apiKey) {
|
|
356
|
+
console.warn(
|
|
357
|
+
"[Embeddings] OPENAI_API_KEY not set, falling back to TF-IDF"
|
|
358
|
+
);
|
|
359
|
+
provider = new TFIDFProvider();
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
const oaiModel = model || "text-embedding-3-small";
|
|
363
|
+
provider = new OpenAIEmbeddingProvider(apiKey, oaiModel);
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
embeddingRegistry.initialize(provider, {
|
|
368
|
+
provider: providerType,
|
|
369
|
+
model,
|
|
370
|
+
dimensions: provider.dimensions,
|
|
371
|
+
dbDimensions
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
async function ensureInitialized() {
|
|
375
|
+
if (embeddingRegistry.isInitialized()) return;
|
|
376
|
+
if (!_initPromise) {
|
|
377
|
+
_initPromise = initializeEmbeddings();
|
|
378
|
+
}
|
|
379
|
+
await _initPromise;
|
|
380
|
+
}
|
|
381
|
+
async function generateEmbedding(text) {
|
|
382
|
+
await ensureInitialized();
|
|
383
|
+
const provider = embeddingRegistry.getProvider();
|
|
384
|
+
const adapter = embeddingRegistry.getAdapter();
|
|
385
|
+
const raw = await provider.embedSingle(text);
|
|
386
|
+
return adapter.adapt(raw);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// src/core/memory.ts
|
|
390
|
+
import { eq, desc, sql } from "drizzle-orm";
|
|
391
|
+
import OpenAI from "openai";
|
|
392
|
+
|
|
393
|
+
// src/core/security/field-encryption.ts
|
|
394
|
+
import { createCipheriv, createDecipheriv, randomBytes } from "crypto";
|
|
395
|
+
var ALGORITHM = "aes-256-gcm";
|
|
396
|
+
var IV_LENGTH = 16;
|
|
397
|
+
var TAG_LENGTH = 16;
|
|
398
|
+
var KEY_LENGTH = 32;
|
|
399
|
+
var CURRENT_KEY_VERSION = 1;
|
|
400
|
+
var _masterKey = null;
|
|
401
|
+
function getMasterKey() {
|
|
402
|
+
if (_masterKey) return _masterKey;
|
|
403
|
+
const keyBase64 = env.ENCRYPTION_MASTER_KEY;
|
|
404
|
+
if (keyBase64) {
|
|
405
|
+
const key = Buffer.from(keyBase64, "base64");
|
|
406
|
+
if (key.length !== KEY_LENGTH) {
|
|
407
|
+
throw new Error(
|
|
408
|
+
`ENCRYPTION_MASTER_KEY must be ${KEY_LENGTH} bytes (${KEY_LENGTH * 4 / 3} base64 chars). Got ${key.length} bytes.`
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
_masterKey = key;
|
|
412
|
+
return _masterKey;
|
|
413
|
+
}
|
|
414
|
+
if (env.NODE_ENV === "production") {
|
|
415
|
+
throw new Error(
|
|
416
|
+
`ENCRYPTION_MASTER_KEY is required in production for SOC 2 compliance. Generate one with: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"`
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
console.warn("[field-encryption] No ENCRYPTION_MASTER_KEY set \u2014 using ephemeral key (dev only)");
|
|
420
|
+
_masterKey = randomBytes(KEY_LENGTH);
|
|
421
|
+
return _masterKey;
|
|
422
|
+
}
|
|
423
|
+
function encryptField(plaintext) {
|
|
424
|
+
if (plaintext === null || plaintext === void 0) return null;
|
|
425
|
+
const key = getMasterKey();
|
|
426
|
+
const iv = randomBytes(IV_LENGTH);
|
|
427
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
428
|
+
const encrypted = Buffer.concat([
|
|
429
|
+
cipher.update(plaintext, "utf8"),
|
|
430
|
+
cipher.final()
|
|
431
|
+
]);
|
|
432
|
+
const tag = cipher.getAuthTag();
|
|
433
|
+
const combined = Buffer.concat([
|
|
434
|
+
Buffer.from([CURRENT_KEY_VERSION]),
|
|
435
|
+
iv,
|
|
436
|
+
tag,
|
|
437
|
+
encrypted
|
|
438
|
+
]);
|
|
439
|
+
return combined.toString("base64");
|
|
440
|
+
}
|
|
441
|
+
function decryptField(encryptedBase64) {
|
|
442
|
+
if (encryptedBase64 === null || encryptedBase64 === void 0) return null;
|
|
443
|
+
const combined = Buffer.from(encryptedBase64, "base64");
|
|
444
|
+
if (combined.length < 1 + IV_LENGTH + TAG_LENGTH + 1) {
|
|
445
|
+
throw new Error("Encrypted data too short");
|
|
446
|
+
}
|
|
447
|
+
const keyVersion = combined[0];
|
|
448
|
+
if (keyVersion !== CURRENT_KEY_VERSION) {
|
|
449
|
+
throw new Error(`Unsupported encryption key version: ${keyVersion}`);
|
|
450
|
+
}
|
|
451
|
+
const iv = combined.subarray(1, 1 + IV_LENGTH);
|
|
452
|
+
const tag = combined.subarray(1 + IV_LENGTH, 1 + IV_LENGTH + TAG_LENGTH);
|
|
453
|
+
const ciphertext = combined.subarray(1 + IV_LENGTH + TAG_LENGTH);
|
|
454
|
+
const key = getMasterKey();
|
|
455
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
456
|
+
decipher.setAuthTag(tag);
|
|
457
|
+
const decrypted = Buffer.concat([
|
|
458
|
+
decipher.update(ciphertext),
|
|
459
|
+
decipher.final()
|
|
460
|
+
]);
|
|
461
|
+
return decrypted.toString("utf8");
|
|
462
|
+
}
|
|
463
|
+
function isEncryptionAvailable() {
|
|
464
|
+
try {
|
|
465
|
+
getMasterKey();
|
|
466
|
+
return true;
|
|
467
|
+
} catch {
|
|
468
|
+
return false;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// src/core/memory.ts
|
|
473
|
+
var _openai = null;
|
|
474
|
+
function getOpenAI() {
|
|
475
|
+
if (!_openai) {
|
|
476
|
+
_openai = new OpenAI({ apiKey: env.OPENAI_API_KEY });
|
|
477
|
+
}
|
|
478
|
+
return _openai;
|
|
479
|
+
}
|
|
480
|
+
var openai = new Proxy({}, {
|
|
481
|
+
get(_target, prop) {
|
|
482
|
+
const instance = getOpenAI();
|
|
483
|
+
const value = instance[prop];
|
|
484
|
+
if (typeof value === "function") {
|
|
485
|
+
return value.bind(instance);
|
|
486
|
+
}
|
|
487
|
+
return value;
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
async function generateEmbedding2(text) {
|
|
491
|
+
return generateEmbedding(text);
|
|
492
|
+
}
|
|
493
|
+
async function storeMemory(memory) {
|
|
494
|
+
const embedding = await generateEmbedding2(memory.content);
|
|
495
|
+
const shouldEncrypt = isEncryptionAvailable();
|
|
496
|
+
const contentForDb = shouldEncrypt ? encryptField(memory.content) : memory.content;
|
|
497
|
+
const [stored] = await db.insert(memories).values({
|
|
498
|
+
...memory,
|
|
499
|
+
content: contentForDb,
|
|
500
|
+
encrypted: shouldEncrypt,
|
|
501
|
+
embedding,
|
|
502
|
+
provenance: memory.provenance || `${memory.source || "unknown"}:auto`
|
|
503
|
+
}).returning();
|
|
504
|
+
try {
|
|
505
|
+
await db.execute(sql`
|
|
506
|
+
UPDATE memories
|
|
507
|
+
SET search_vector = to_tsvector('english', ${memory.content})
|
|
508
|
+
WHERE id = ${stored.id}
|
|
509
|
+
`);
|
|
510
|
+
} catch {
|
|
511
|
+
}
|
|
512
|
+
return { ...stored, content: memory.content };
|
|
513
|
+
}
|
|
514
|
+
async function updateMemory(id, updates) {
|
|
515
|
+
const setClauses = [];
|
|
516
|
+
if (updates.content) {
|
|
517
|
+
const newEmbedding = await generateEmbedding2(updates.content);
|
|
518
|
+
setClauses.push(sql`content = ${updates.content}`);
|
|
519
|
+
setClauses.push(sql`embedding = ${JSON.stringify(newEmbedding)}::vector`);
|
|
520
|
+
setClauses.push(sql`search_vector = to_tsvector('english', ${updates.content})`);
|
|
521
|
+
}
|
|
522
|
+
if (updates.type) {
|
|
523
|
+
setClauses.push(sql`type = ${updates.type}`);
|
|
524
|
+
}
|
|
525
|
+
if (updates.importance !== void 0) {
|
|
526
|
+
setClauses.push(sql`importance = ${updates.importance}`);
|
|
527
|
+
}
|
|
528
|
+
if (setClauses.length === 0) return null;
|
|
529
|
+
const result = await db.execute(sql`
|
|
530
|
+
UPDATE memories
|
|
531
|
+
SET ${sql.join(setClauses, sql`, `)}
|
|
532
|
+
WHERE id = ${id}
|
|
533
|
+
RETURNING *
|
|
534
|
+
`);
|
|
535
|
+
return result[0] || null;
|
|
536
|
+
}
|
|
537
|
+
async function deleteMemory(id) {
|
|
538
|
+
const result = await db.execute(sql`
|
|
539
|
+
SELECT * FROM memories WHERE id = ${id}
|
|
540
|
+
`);
|
|
541
|
+
const memory = result[0];
|
|
542
|
+
if (!memory) return false;
|
|
543
|
+
await db.insert(archivedMemories).values({
|
|
544
|
+
originalMemoryId: memory.id,
|
|
545
|
+
userId: memory.user_id,
|
|
546
|
+
type: memory.type,
|
|
547
|
+
content: memory.content,
|
|
548
|
+
reason: "user_request",
|
|
549
|
+
originalCreatedAt: memory.created_at
|
|
550
|
+
});
|
|
551
|
+
await db.execute(sql`DELETE FROM memories WHERE id = ${id}`);
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
async function exportMemories(userId, format = "markdown") {
|
|
555
|
+
const mems = await db.select().from(memories).where(userId ? eq(memories.userId, userId) : void 0).orderBy(desc(memories.createdAt));
|
|
556
|
+
for (const m of mems) {
|
|
557
|
+
if (m.encrypted) {
|
|
558
|
+
try {
|
|
559
|
+
m.content = decryptField(m.content) ?? m.content;
|
|
560
|
+
} catch {
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
if (format === "json") {
|
|
565
|
+
return JSON.stringify(
|
|
566
|
+
mems.map((m) => ({
|
|
567
|
+
id: m.id,
|
|
568
|
+
type: m.type,
|
|
569
|
+
content: m.content,
|
|
570
|
+
importance: m.importance,
|
|
571
|
+
source: m.source,
|
|
572
|
+
provenance: m.provenance,
|
|
573
|
+
createdAt: m.createdAt
|
|
574
|
+
})),
|
|
575
|
+
null,
|
|
576
|
+
2
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
const lines = [
|
|
580
|
+
"# Memories Export",
|
|
581
|
+
`Exported: ${(/* @__PURE__ */ new Date()).toISOString()}`,
|
|
582
|
+
`Total: ${mems.length} memories`,
|
|
583
|
+
""
|
|
584
|
+
];
|
|
585
|
+
for (const m of mems) {
|
|
586
|
+
lines.push(`## [${m.type}] (Importance: ${m.importance}/10)`);
|
|
587
|
+
lines.push(m.content);
|
|
588
|
+
lines.push(`_Source: ${m.source || "unknown"} | Created: ${m.createdAt.toISOString()}_`);
|
|
589
|
+
lines.push("");
|
|
590
|
+
}
|
|
591
|
+
return lines.join("\n");
|
|
592
|
+
}
|
|
593
|
+
async function searchMemories(query, userId, limit = 5) {
|
|
594
|
+
const queryEmbedding = await generateEmbedding2(query);
|
|
595
|
+
const results = await db.execute(sql`
|
|
596
|
+
SELECT
|
|
597
|
+
id, user_id, type, content, importance, source, provenance, metadata,
|
|
598
|
+
last_accessed, created_at,
|
|
599
|
+
1 - (embedding <=> ${JSON.stringify(queryEmbedding)}::vector) as similarity
|
|
600
|
+
FROM memories
|
|
601
|
+
${userId ? sql`WHERE user_id = ${userId}` : sql``}
|
|
602
|
+
ORDER BY embedding <=> ${JSON.stringify(queryEmbedding)}::vector
|
|
603
|
+
LIMIT ${limit}
|
|
604
|
+
`);
|
|
605
|
+
const rows = results;
|
|
606
|
+
const memoryIds = rows.map((r) => r.id);
|
|
607
|
+
if (memoryIds.length > 0) {
|
|
608
|
+
await db.execute(sql`
|
|
609
|
+
UPDATE memories
|
|
610
|
+
SET last_accessed = NOW()
|
|
611
|
+
WHERE id = ANY(${memoryIds}::uuid[])
|
|
612
|
+
`);
|
|
613
|
+
}
|
|
614
|
+
for (const row of rows) {
|
|
615
|
+
if (row.encrypted) {
|
|
616
|
+
try {
|
|
617
|
+
row.content = decryptField(row.content) ?? row.content;
|
|
618
|
+
} catch {
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
return rows;
|
|
623
|
+
}
|
|
624
|
+
async function getMemoryById(id) {
|
|
625
|
+
const result = await db.execute(sql`
|
|
626
|
+
SELECT * FROM memories WHERE id = ${id}
|
|
627
|
+
`);
|
|
628
|
+
const row = result[0] || null;
|
|
629
|
+
if (row && row.encrypted) {
|
|
630
|
+
try {
|
|
631
|
+
row.content = decryptField(row.content) ?? row.content;
|
|
632
|
+
} catch {
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
return row;
|
|
636
|
+
}
|
|
637
|
+
async function extractMemories(content, userId) {
|
|
638
|
+
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).
|
|
639
|
+
|
|
640
|
+
Text: "${content}"
|
|
641
|
+
|
|
642
|
+
Return only the JSON array, no other text. If no memorable facts, return [].`;
|
|
643
|
+
try {
|
|
644
|
+
const response = await openai.chat.completions.create({
|
|
645
|
+
model: "gpt-4o-mini",
|
|
646
|
+
messages: [{ role: "user", content: extractionPrompt }],
|
|
647
|
+
response_format: { type: "json_object" }
|
|
648
|
+
});
|
|
649
|
+
const extracted = JSON.parse(
|
|
650
|
+
response.choices[0].message.content || '{"memories":[]}'
|
|
651
|
+
);
|
|
652
|
+
const memoriesToStore = extracted.memories || extracted || [];
|
|
653
|
+
const storedMemories = [];
|
|
654
|
+
for (const mem of memoriesToStore) {
|
|
655
|
+
if (mem.content && mem.content.length > 5) {
|
|
656
|
+
const stored = await storeMemory({
|
|
657
|
+
userId,
|
|
658
|
+
content: mem.content,
|
|
659
|
+
type: mem.type || "semantic",
|
|
660
|
+
importance: mem.importance || 5,
|
|
661
|
+
source: "conversation",
|
|
662
|
+
provenance: "extraction:auto"
|
|
663
|
+
});
|
|
664
|
+
storedMemories.push(stored);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
return storedMemories;
|
|
668
|
+
} catch (error) {
|
|
669
|
+
console.error("Error extracting memories:", error);
|
|
670
|
+
return [];
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
async function buildMemoryContext(query, userId, conversationHistory) {
|
|
674
|
+
const anyAdvancedEnabled = env.HYDE_ENABLED || env.RERANK_ENABLED || env.MULTISTEP_RAG_ENABLED || env.RETRIEVAL_CACHE_ENABLED || env.CONTEXTUAL_QUERY_ENABLED;
|
|
675
|
+
if (anyAdvancedEnabled) {
|
|
676
|
+
try {
|
|
677
|
+
const { enhancedRetrieve } = await import("./enhanced-retrieval-OGHT6TS5.js");
|
|
678
|
+
const result = await enhancedRetrieve(query, { userId, limit: 5, conversationHistory });
|
|
679
|
+
if (result.results.length === 0) {
|
|
680
|
+
return "";
|
|
681
|
+
}
|
|
682
|
+
const memoryStrings2 = result.results.map((m) => {
|
|
683
|
+
const provenance = m.provenance ? ` [${m.provenance}]` : "";
|
|
684
|
+
const score = m.rerankScore != null ? `rerank: ${m.rerankScore}/10` : `relevance: ${((m.similarity || 0) * 100).toFixed(0)}%`;
|
|
685
|
+
return `- [${m.type}] ${m.content} (${score})${provenance}`;
|
|
686
|
+
});
|
|
687
|
+
return `
|
|
688
|
+
|
|
689
|
+
Relevant memories about the user:
|
|
690
|
+
${memoryStrings2.join("\n")}`;
|
|
691
|
+
} catch {
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
const relevantMemories = await searchMemories(query, userId, 5);
|
|
695
|
+
if (relevantMemories.length === 0) {
|
|
696
|
+
return "";
|
|
697
|
+
}
|
|
698
|
+
const memoryStrings = relevantMemories.map(
|
|
699
|
+
(m) => {
|
|
700
|
+
const provenance = m.provenance ? ` [${m.provenance}]` : "";
|
|
701
|
+
return `- [${m.type}] ${m.content} (relevance: ${(m.similarity * 100).toFixed(0)}%)${provenance}`;
|
|
702
|
+
}
|
|
703
|
+
);
|
|
704
|
+
return `
|
|
705
|
+
|
|
706
|
+
Relevant memories about the user:
|
|
707
|
+
${memoryStrings.join("\n")}`;
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
export {
|
|
711
|
+
TFIDFProvider,
|
|
712
|
+
decryptField,
|
|
713
|
+
initializeEmbeddings,
|
|
714
|
+
generateEmbedding2 as generateEmbedding,
|
|
715
|
+
storeMemory,
|
|
716
|
+
updateMemory,
|
|
717
|
+
deleteMemory,
|
|
718
|
+
exportMemories,
|
|
719
|
+
searchMemories,
|
|
720
|
+
getMemoryById,
|
|
721
|
+
extractMemories,
|
|
722
|
+
buildMemoryContext
|
|
723
|
+
};
|
|
724
|
+
//# sourceMappingURL=chunk-6UZPE35A.js.map
|