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
|
@@ -1,34 +1,52 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TOOLS,
|
|
3
|
-
addAgentMessage,
|
|
4
|
-
addAgentProgress,
|
|
5
3
|
chat,
|
|
6
4
|
checkAchievements,
|
|
7
5
|
executeTool,
|
|
8
|
-
flushMetrics,
|
|
9
6
|
generateGrowthReport,
|
|
10
7
|
getAchievementProgress,
|
|
11
|
-
getAgent,
|
|
12
8
|
getCurrentMode,
|
|
13
9
|
getModeStats,
|
|
14
10
|
getTodaysEvents,
|
|
15
11
|
getUpcomingEvents,
|
|
16
|
-
getUserPoints
|
|
17
|
-
|
|
12
|
+
getUserPoints
|
|
13
|
+
} from "./chunk-ZMML6T63.js";
|
|
14
|
+
import {
|
|
15
|
+
AGENT_SYSTEM_PROMPTS,
|
|
16
|
+
AGENT_TOOL_PERMISSIONS
|
|
17
|
+
} from "./chunk-LFDXEYYB.js";
|
|
18
|
+
import {
|
|
19
|
+
captureException
|
|
20
|
+
} from "./chunk-TKBVW7ZJ.js";
|
|
21
|
+
import {
|
|
22
|
+
riskEngine
|
|
23
|
+
} from "./chunk-ODCFS5WD.js";
|
|
24
|
+
import {
|
|
25
|
+
addAgentMessage,
|
|
26
|
+
addAgentProgress,
|
|
27
|
+
getAgent,
|
|
18
28
|
shouldAgentStop,
|
|
19
29
|
updateAgentStatus,
|
|
20
30
|
updateAgentTokens
|
|
21
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-WMFYI7XC.js";
|
|
32
|
+
import {
|
|
33
|
+
flushMetrics,
|
|
34
|
+
metric
|
|
35
|
+
} from "./chunk-YEDEAX6Y.js";
|
|
36
|
+
import {
|
|
37
|
+
providerRegistry
|
|
38
|
+
} from "./chunk-GW6V4D43.js";
|
|
39
|
+
import {
|
|
40
|
+
db
|
|
41
|
+
} from "./chunk-5BTVJR7R.js";
|
|
42
|
+
import {
|
|
43
|
+
env
|
|
44
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
22
45
|
import {
|
|
23
46
|
archivedMemories,
|
|
24
47
|
calendarTriggers,
|
|
25
|
-
db,
|
|
26
|
-
errorLogs,
|
|
27
48
|
memories
|
|
28
|
-
} from "./chunk-
|
|
29
|
-
import {
|
|
30
|
-
env
|
|
31
|
-
} from "./chunk-ZLZKF2PM.js";
|
|
49
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
32
50
|
|
|
33
51
|
// src/core/scheduler.ts
|
|
34
52
|
import { Queue, Worker as Worker2 } from "bullmq";
|
|
@@ -37,182 +55,9 @@ import Redis2 from "ioredis";
|
|
|
37
55
|
// src/core/agents/agent-worker.ts
|
|
38
56
|
import { Worker } from "bullmq";
|
|
39
57
|
import Redis from "ioredis";
|
|
40
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
41
|
-
|
|
42
|
-
// src/core/agents/agent-types.ts
|
|
43
|
-
var AGENT_SYSTEM_PROMPTS = {
|
|
44
|
-
research: `You are a Research Agent. Your goal is to thoroughly investigate a topic and provide comprehensive, well-sourced information.
|
|
45
|
-
|
|
46
|
-
Process:
|
|
47
|
-
1. Break down the research question into sub-questions
|
|
48
|
-
2. Search for information from multiple sources
|
|
49
|
-
3. Cross-reference and verify findings
|
|
50
|
-
4. Synthesize information into a coherent report
|
|
51
|
-
5. Note confidence levels and any uncertainties
|
|
52
|
-
|
|
53
|
-
Guidelines:
|
|
54
|
-
- Always cite or reference your sources
|
|
55
|
-
- Present multiple perspectives when relevant
|
|
56
|
-
- Distinguish between facts and interpretations
|
|
57
|
-
- Flag when information might be outdated
|
|
58
|
-
- Structure findings hierarchically
|
|
59
|
-
|
|
60
|
-
Report your progress after each major step.`,
|
|
61
|
-
coding: `You are a Coding Agent. Your goal is to implement, debug, or improve code based on the given objective.
|
|
62
|
-
|
|
63
|
-
Process:
|
|
64
|
-
1. Understand the requirements thoroughly
|
|
65
|
-
2. Explore existing code if relevant
|
|
66
|
-
3. Plan the implementation approach
|
|
67
|
-
4. Write clean, documented code
|
|
68
|
-
5. Test and verify the solution
|
|
69
|
-
|
|
70
|
-
Guidelines:
|
|
71
|
-
- Follow existing code conventions in the project
|
|
72
|
-
- Write clear comments for complex logic
|
|
73
|
-
- Handle edge cases and errors gracefully
|
|
74
|
-
- Consider performance implications
|
|
75
|
-
- Provide a summary of changes made
|
|
76
|
-
|
|
77
|
-
Report your progress after each significant step.`,
|
|
78
|
-
writing: `You are a Writing Agent. Your goal is to create high-quality written content based on the given objective.
|
|
79
|
-
|
|
80
|
-
Process:
|
|
81
|
-
1. Understand the purpose and audience
|
|
82
|
-
2. Research the topic if needed
|
|
83
|
-
3. Create an outline
|
|
84
|
-
4. Write the first draft
|
|
85
|
-
5. Review and refine
|
|
86
|
-
|
|
87
|
-
Guidelines:
|
|
88
|
-
- Match the tone and style to the purpose
|
|
89
|
-
- Structure content logically
|
|
90
|
-
- Use clear, concise language
|
|
91
|
-
- Support claims with evidence when relevant
|
|
92
|
-
- Proofread for grammar and clarity
|
|
93
|
-
|
|
94
|
-
Report your progress at each stage.`,
|
|
95
|
-
analysis: `You are an Analysis Agent. Your goal is to analyze data or information and provide actionable insights.
|
|
96
|
-
|
|
97
|
-
Process:
|
|
98
|
-
1. Understand the analysis objective
|
|
99
|
-
2. Gather and organize the data
|
|
100
|
-
3. Apply appropriate analytical methods
|
|
101
|
-
4. Identify patterns and insights
|
|
102
|
-
5. Present findings with recommendations
|
|
103
|
-
|
|
104
|
-
Guidelines:
|
|
105
|
-
- Be objective and data-driven
|
|
106
|
-
- Acknowledge limitations in the data
|
|
107
|
-
- Provide context for numbers
|
|
108
|
-
- Make recommendations actionable
|
|
109
|
-
- Visualize data when helpful
|
|
110
|
-
|
|
111
|
-
Report your progress and key findings along the way.`,
|
|
112
|
-
osint: `You are an OSINT (Open Source Intelligence) Agent. Your goal is to investigate entities, trace financial flows, map organizational relationships, and build comprehensive intelligence profiles using public records and open data sources.
|
|
113
|
-
|
|
114
|
-
Process:
|
|
115
|
-
1. Identify the target entity (person, organization, committee)
|
|
116
|
-
2. Search across public records databases (FEC, IRS 990, USAspending, SEC EDGAR, OpenCorporates)
|
|
117
|
-
3. Resolve and deduplicate entities using fuzzy matching and identifiers
|
|
118
|
-
4. Build relationship graphs connecting discovered entities
|
|
119
|
-
5. Enrich discovered entities with additional data from all available sources
|
|
120
|
-
6. Analyze patterns: financial flows, organizational hierarchies, political connections
|
|
121
|
-
7. Generate an intelligence report with confidence levels
|
|
122
|
-
|
|
123
|
-
Guidelines:
|
|
124
|
-
- Use only publicly available information from official government databases
|
|
125
|
-
- Cross-reference data across multiple sources to verify findings
|
|
126
|
-
- Flag low-confidence matches explicitly
|
|
127
|
-
- Build the knowledge graph incrementally, enriching as you discover connections
|
|
128
|
-
- Track the provenance of every data point (source API, date retrieved)
|
|
129
|
-
- Respect rate limits on all public APIs
|
|
130
|
-
- Distinguish between confirmed facts and inferred connections
|
|
131
|
-
- Quantify financial relationships with exact dollar amounts when available
|
|
132
|
-
- Note temporal aspects (when relationships were active)
|
|
133
|
-
- Provide actionable next steps for further investigation
|
|
134
|
-
|
|
135
|
-
Report findings as you progress through each data source.`
|
|
136
|
-
};
|
|
137
|
-
var AGENT_TOOL_PERMISSIONS = {
|
|
138
|
-
research: [
|
|
139
|
-
"web_search",
|
|
140
|
-
"browse_url",
|
|
141
|
-
"read_file",
|
|
142
|
-
"list_directory",
|
|
143
|
-
"search_files"
|
|
144
|
-
],
|
|
145
|
-
coding: [
|
|
146
|
-
"read_file",
|
|
147
|
-
"write_file",
|
|
148
|
-
"list_directory",
|
|
149
|
-
"search_files",
|
|
150
|
-
"execute_command"
|
|
151
|
-
],
|
|
152
|
-
writing: [
|
|
153
|
-
"read_file",
|
|
154
|
-
"write_file",
|
|
155
|
-
"web_search",
|
|
156
|
-
"browse_url"
|
|
157
|
-
],
|
|
158
|
-
analysis: [
|
|
159
|
-
"read_file",
|
|
160
|
-
"web_search",
|
|
161
|
-
"browse_url",
|
|
162
|
-
"list_directory",
|
|
163
|
-
"search_files"
|
|
164
|
-
],
|
|
165
|
-
osint: [
|
|
166
|
-
"web_search",
|
|
167
|
-
"browse_url",
|
|
168
|
-
"read_file",
|
|
169
|
-
"search_files",
|
|
170
|
-
"osint_search",
|
|
171
|
-
"osint_graph",
|
|
172
|
-
"osint_enrich",
|
|
173
|
-
"osint_analyze"
|
|
174
|
-
]
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// src/core/observability/error-tracker.ts
|
|
178
|
-
import { eq, and, gte, lte, desc } from "drizzle-orm";
|
|
179
|
-
async function trackError(error) {
|
|
180
|
-
metric.error(error.source);
|
|
181
|
-
console.error(`[${error.source.toUpperCase()}] ${error.errorType}: ${error.message}`);
|
|
182
|
-
if (error.stack) {
|
|
183
|
-
console.error(error.stack);
|
|
184
|
-
}
|
|
185
|
-
const [logged] = await db.insert(errorLogs).values({
|
|
186
|
-
source: error.source,
|
|
187
|
-
errorType: error.errorType,
|
|
188
|
-
errorCode: error.errorCode,
|
|
189
|
-
message: error.message,
|
|
190
|
-
stack: error.stack,
|
|
191
|
-
context: error.context,
|
|
192
|
-
userId: error.userId,
|
|
193
|
-
conversationId: error.conversationId
|
|
194
|
-
}).returning();
|
|
195
|
-
return logged.id;
|
|
196
|
-
}
|
|
197
|
-
function captureException(err, source, context, userId) {
|
|
198
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
199
|
-
return trackError({
|
|
200
|
-
source,
|
|
201
|
-
errorType: error.constructor.name,
|
|
202
|
-
message: error.message,
|
|
203
|
-
stack: error.stack,
|
|
204
|
-
context,
|
|
205
|
-
userId
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// src/core/agents/agent-worker.ts
|
|
210
58
|
var connection = new Redis(env.REDIS_URL, {
|
|
211
59
|
maxRetriesPerRequest: null
|
|
212
60
|
});
|
|
213
|
-
var anthropic = new Anthropic({
|
|
214
|
-
apiKey: env.CLAUDE_API_KEY
|
|
215
|
-
});
|
|
216
61
|
var worker = null;
|
|
217
62
|
async function processAgentTask(job) {
|
|
218
63
|
const { agentId, userId, type, objective, context, tokenBudget } = job.data;
|
|
@@ -222,22 +67,25 @@ async function processAgentTask(job) {
|
|
|
222
67
|
await updateAgentStatus(agentId, "running");
|
|
223
68
|
await addAgentProgress(agentId, 1, "Starting agent", "running");
|
|
224
69
|
const systemPrompt = buildSystemPrompt(type, context);
|
|
70
|
+
const provider = providerRegistry.getDefault();
|
|
225
71
|
const allowedToolNames = AGENT_TOOL_PERMISSIONS[type];
|
|
226
|
-
const agentTools = TOOLS.filter((t) => allowedToolNames.includes(t.name))
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
72
|
+
const agentTools = TOOLS.filter((t) => allowedToolNames.includes(t.name)).map((t) => ({
|
|
73
|
+
name: t.name,
|
|
74
|
+
description: t.description || "",
|
|
75
|
+
input_schema: t.input_schema || { type: "object", properties: {} }
|
|
76
|
+
}));
|
|
77
|
+
const userContent = `Your objective: ${objective}
|
|
231
78
|
|
|
232
79
|
${context ? `Additional context:
|
|
233
80
|
${JSON.stringify(context, null, 2)}` : ""}
|
|
234
81
|
|
|
235
|
-
Please proceed with the task, reporting your progress as you go
|
|
236
|
-
|
|
82
|
+
Please proceed with the task, reporting your progress as you go.`;
|
|
83
|
+
const messages = [
|
|
84
|
+
{ role: "user", content: userContent }
|
|
237
85
|
];
|
|
238
86
|
await addAgentMessage(agentId, {
|
|
239
87
|
role: "user",
|
|
240
|
-
content:
|
|
88
|
+
content: userContent
|
|
241
89
|
});
|
|
242
90
|
let stepNumber = 2;
|
|
243
91
|
const maxSteps = 20;
|
|
@@ -253,8 +101,9 @@ Please proceed with the task, reporting your progress as you go.`
|
|
|
253
101
|
);
|
|
254
102
|
break;
|
|
255
103
|
}
|
|
256
|
-
const response = await
|
|
257
|
-
model: "
|
|
104
|
+
const response = await provider.createMessage({
|
|
105
|
+
model: "",
|
|
106
|
+
// Use provider's default model
|
|
258
107
|
max_tokens: 4096,
|
|
259
108
|
system: systemPrompt,
|
|
260
109
|
tools: agentTools,
|
|
@@ -272,7 +121,7 @@ Please proceed with the task, reporting your progress as you go.`
|
|
|
272
121
|
break;
|
|
273
122
|
}
|
|
274
123
|
const assistantContent = response.content;
|
|
275
|
-
const textContent = assistantContent.filter((c) => c.type === "text").map((c) => c.text).join("\n");
|
|
124
|
+
const textContent = assistantContent.filter((c) => c.type === "text").map((c) => c.text || "").join("\n");
|
|
276
125
|
if (textContent) {
|
|
277
126
|
await addAgentMessage(agentId, {
|
|
278
127
|
role: "assistant",
|
|
@@ -298,19 +147,48 @@ Please proceed with the task, reporting your progress as you go.`
|
|
|
298
147
|
};
|
|
299
148
|
}
|
|
300
149
|
if (response.stop_reason === "tool_use") {
|
|
301
|
-
const
|
|
150
|
+
const toolResultBlocks = [];
|
|
302
151
|
for (const block of assistantContent) {
|
|
303
152
|
if (block.type === "tool_use") {
|
|
304
153
|
const toolName = block.name;
|
|
305
154
|
const toolInput = block.input;
|
|
306
155
|
console.log(`[Agent ${agentId}] Using tool: ${toolName}`);
|
|
156
|
+
const riskDecision = await riskEngine.evaluate({
|
|
157
|
+
action: "agent_tool_execute",
|
|
158
|
+
userId,
|
|
159
|
+
toolName,
|
|
160
|
+
input: toolInput,
|
|
161
|
+
metadata: { agentId, agentType: type }
|
|
162
|
+
});
|
|
163
|
+
if (!riskDecision.allowed) {
|
|
164
|
+
const failedChecks = riskDecision.checks.filter((c) => !c.passed).map((c) => c.message).join("; ");
|
|
165
|
+
const result2 = {
|
|
166
|
+
success: false,
|
|
167
|
+
result: null,
|
|
168
|
+
error: `[RiskEngine] Agent tool blocked: ${failedChecks}`
|
|
169
|
+
};
|
|
170
|
+
await addAgentMessage(agentId, {
|
|
171
|
+
role: "tool_result",
|
|
172
|
+
content: JSON.stringify({ tool: toolName, result: result2 }),
|
|
173
|
+
metadata: { toolInput }
|
|
174
|
+
});
|
|
175
|
+
toolResultBlocks.push({
|
|
176
|
+
type: "tool_result",
|
|
177
|
+
tool_use_id: block.id,
|
|
178
|
+
content: JSON.stringify(result2)
|
|
179
|
+
});
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (toolName === "crypto_exchange") {
|
|
183
|
+
toolInput._callerContext = "agent";
|
|
184
|
+
}
|
|
307
185
|
const result = await executeTool(toolName, toolInput);
|
|
308
186
|
await addAgentMessage(agentId, {
|
|
309
187
|
role: "tool_result",
|
|
310
188
|
content: JSON.stringify({ tool: toolName, result }),
|
|
311
189
|
metadata: { toolInput }
|
|
312
190
|
});
|
|
313
|
-
|
|
191
|
+
toolResultBlocks.push({
|
|
314
192
|
type: "tool_result",
|
|
315
193
|
tool_use_id: block.id,
|
|
316
194
|
content: JSON.stringify(result)
|
|
@@ -318,7 +196,7 @@ Please proceed with the task, reporting your progress as you go.`
|
|
|
318
196
|
}
|
|
319
197
|
}
|
|
320
198
|
messages.push({ role: "assistant", content: assistantContent });
|
|
321
|
-
messages.push({ role: "user", content:
|
|
199
|
+
messages.push({ role: "user", content: toolResultBlocks });
|
|
322
200
|
}
|
|
323
201
|
stepNumber++;
|
|
324
202
|
}
|
|
@@ -406,9 +284,9 @@ function stopAgentWorker() {
|
|
|
406
284
|
}
|
|
407
285
|
|
|
408
286
|
// src/inputs/calendar/trigger-processor.ts
|
|
409
|
-
import { eq
|
|
287
|
+
import { eq } from "drizzle-orm";
|
|
410
288
|
async function getUserTriggers(userId) {
|
|
411
|
-
const triggers = await db.select().from(calendarTriggers).where(
|
|
289
|
+
const triggers = await db.select().from(calendarTriggers).where(eq(calendarTriggers.userId, userId));
|
|
412
290
|
return triggers.map((t) => ({
|
|
413
291
|
id: t.id,
|
|
414
292
|
userId: t.userId,
|
|
@@ -450,7 +328,7 @@ async function processCalendarTriggers(userId, events, chatId) {
|
|
|
450
328
|
event,
|
|
451
329
|
scheduledJobId: jobId
|
|
452
330
|
});
|
|
453
|
-
await db.update(calendarTriggers).set({ lastTriggered: /* @__PURE__ */ new Date() }).where(
|
|
331
|
+
await db.update(calendarTriggers).set({ lastTriggered: /* @__PURE__ */ new Date() }).where(eq(calendarTriggers.id, trigger.id));
|
|
454
332
|
}
|
|
455
333
|
}
|
|
456
334
|
} catch (error) {
|
|
@@ -519,7 +397,7 @@ async function generateDailyBriefing(userId, events) {
|
|
|
519
397
|
}
|
|
520
398
|
|
|
521
399
|
// src/core/evolution/memory-shedder.ts
|
|
522
|
-
import { eq as
|
|
400
|
+
import { eq as eq2, and as and2, lt, lte as lte2 } from "drizzle-orm";
|
|
523
401
|
var SHED_CONFIG = {
|
|
524
402
|
staleDays: 90,
|
|
525
403
|
// Memories not accessed in 90 days
|
|
@@ -531,8 +409,8 @@ var SHED_CONFIG = {
|
|
|
531
409
|
async function findStaleMemories(userId, staleDays = SHED_CONFIG.staleDays) {
|
|
532
410
|
const cutoff = new Date(Date.now() - staleDays * 24 * 60 * 60 * 1e3);
|
|
533
411
|
const stale = await db.select().from(memories).where(
|
|
534
|
-
|
|
535
|
-
|
|
412
|
+
and2(
|
|
413
|
+
eq2(memories.userId, userId),
|
|
536
414
|
lt(memories.lastAccessed, cutoff)
|
|
537
415
|
)
|
|
538
416
|
);
|
|
@@ -557,9 +435,9 @@ function calculateStaleConfidence(lastAccessed, importance) {
|
|
|
557
435
|
}
|
|
558
436
|
async function findLowImportanceMemories(userId, threshold = SHED_CONFIG.lowImportanceThreshold) {
|
|
559
437
|
const lowImportance = await db.select().from(memories).where(
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
438
|
+
and2(
|
|
439
|
+
eq2(memories.userId, userId),
|
|
440
|
+
lte2(memories.importance, threshold)
|
|
563
441
|
)
|
|
564
442
|
);
|
|
565
443
|
return lowImportance.map((m) => ({
|
|
@@ -573,7 +451,7 @@ async function findLowImportanceMemories(userId, threshold = SHED_CONFIG.lowImpo
|
|
|
573
451
|
}));
|
|
574
452
|
}
|
|
575
453
|
async function findDuplicateMemories(userId) {
|
|
576
|
-
const allMemories = await db.select().from(memories).where(
|
|
454
|
+
const allMemories = await db.select().from(memories).where(eq2(memories.userId, userId));
|
|
577
455
|
const candidates = [];
|
|
578
456
|
const seen = /* @__PURE__ */ new Map();
|
|
579
457
|
for (const memory of allMemories) {
|
|
@@ -616,7 +494,7 @@ async function identifyShedCandidates(userId) {
|
|
|
616
494
|
);
|
|
617
495
|
}
|
|
618
496
|
async function archiveMemory(memoryId, reason) {
|
|
619
|
-
const [memory] = await db.select().from(memories).where(
|
|
497
|
+
const [memory] = await db.select().from(memories).where(eq2(memories.id, memoryId)).limit(1);
|
|
620
498
|
if (!memory) return false;
|
|
621
499
|
await db.insert(archivedMemories).values({
|
|
622
500
|
originalMemoryId: memory.id,
|
|
@@ -626,7 +504,7 @@ async function archiveMemory(memoryId, reason) {
|
|
|
626
504
|
reason,
|
|
627
505
|
originalCreatedAt: memory.createdAt
|
|
628
506
|
});
|
|
629
|
-
await db.delete(memories).where(
|
|
507
|
+
await db.delete(memories).where(eq2(memories.id, memoryId));
|
|
630
508
|
return true;
|
|
631
509
|
}
|
|
632
510
|
async function autoShed(userId, minConfidence = SHED_CONFIG.minConfidence) {
|
|
@@ -649,7 +527,7 @@ async function autoShed(userId, minConfidence = SHED_CONFIG.minConfidence) {
|
|
|
649
527
|
return results;
|
|
650
528
|
}
|
|
651
529
|
async function getArchivedMemories(userId, limit = 50) {
|
|
652
|
-
return db.select().from(archivedMemories).where(
|
|
530
|
+
return db.select().from(archivedMemories).where(eq2(archivedMemories.userId, userId)).limit(limit);
|
|
653
531
|
}
|
|
654
532
|
async function getShedStats(userId) {
|
|
655
533
|
const archived = await getArchivedMemories(userId, 1e3);
|
|
@@ -718,10 +596,10 @@ async function generateReport(userId, startDate, endDate, type) {
|
|
|
718
596
|
pointsGained: newAchievements.reduce((sum, a) => sum + a.points, 0)
|
|
719
597
|
},
|
|
720
598
|
modeUsage: {
|
|
721
|
-
productivity: modeStats.productivity,
|
|
722
|
-
creative: modeStats.creative,
|
|
723
|
-
research: modeStats.research,
|
|
724
|
-
learning: modeStats.learning
|
|
599
|
+
productivity: { sessions: modeStats.productivity.totalSessions, minutes: modeStats.productivity.totalMinutes },
|
|
600
|
+
creative: { sessions: modeStats.creative.totalSessions, minutes: modeStats.creative.totalMinutes },
|
|
601
|
+
research: { sessions: modeStats.research.totalSessions, minutes: modeStats.research.totalMinutes },
|
|
602
|
+
learning: { sessions: modeStats.learning.totalSessions, minutes: modeStats.learning.totalMinutes }
|
|
725
603
|
},
|
|
726
604
|
highlights,
|
|
727
605
|
suggestions
|
|
@@ -1094,4 +972,4 @@ export {
|
|
|
1094
972
|
generateBriefing,
|
|
1095
973
|
getQueueStats
|
|
1096
974
|
};
|
|
1097
|
-
//# sourceMappingURL=chunk-
|
|
975
|
+
//# sourceMappingURL=chunk-GJETKBOY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/scheduler.ts","../src/core/agents/agent-worker.ts","../src/inputs/calendar/trigger-processor.ts","../src/core/evolution/memory-shedder.ts","../src/core/evolution/growth-reporter.ts"],"sourcesContent":["import { Queue, Worker, type Job } from \"bullmq\";\r\nimport Redis from \"ioredis\";\r\nimport { env } from \"../config/env\";\r\nimport { chat } from \"./brain\";\r\nimport { startAgentWorker, stopAgentWorker } from \"./agents/agent-worker\";\r\nimport { processCalendarTriggers, generateDailyBriefing } from \"../inputs/calendar/trigger-processor\";\r\nimport { autoShed } from \"./evolution/memory-shedder\";\r\nimport { generateWeeklyReport, generateMonthlyReport } from \"./evolution/growth-reporter\";\r\nimport { resetMonthlyUsage } from \"./permissions/permission-manager\";\r\nimport { flushMetrics } from \"./observability/metrics\";\r\n\r\n// Lazy Redis connection and queues — created on first use\r\nlet _connection: Redis | null = null;\r\nlet _taskQueue: Queue | null = null;\r\nlet _maintenanceQueue: Queue | null = null;\r\n\r\nfunction getConnection(): Redis {\r\n if (!_connection) {\r\n _connection = new Redis(env.REDIS_URL, {\r\n maxRetriesPerRequest: null,\r\n });\r\n }\r\n return _connection;\r\n}\r\n\r\nfunction getTaskQueue(): Queue {\r\n if (!_taskQueue) {\r\n _taskQueue = new Queue(\"sentinel-tasks\", { connection: getConnection() as any });\r\n }\r\n return _taskQueue;\r\n}\r\n\r\nfunction getMaintenanceQueue(): Queue {\r\n if (!_maintenanceQueue) {\r\n _maintenanceQueue = new Queue(\"sentinel-maintenance\", { connection: getConnection() as any });\r\n }\r\n return _maintenanceQueue;\r\n}\r\n\r\n// Backward-compatible exports\r\nconst connection = new Proxy({} as Redis, {\r\n get(_target, prop) {\r\n const instance = getConnection();\r\n const value = (instance as any)[prop];\r\n if (typeof value === \"function\") return value.bind(instance);\r\n return value;\r\n },\r\n});\r\nconst taskQueue = new Proxy({} as Queue, {\r\n get(_target, prop) {\r\n const instance = getTaskQueue();\r\n const value = (instance as any)[prop];\r\n if (typeof value === \"function\") return value.bind(instance);\r\n return value;\r\n },\r\n});\r\nconst maintenanceQueue = new Proxy({} as Queue, {\r\n get(_target, prop) {\r\n const instance = getMaintenanceQueue();\r\n const value = (instance as any)[prop];\r\n if (typeof value === \"function\") return value.bind(instance);\r\n return value;\r\n },\r\n});\r\n\r\ninterface ScheduledTask {\r\n type: \"reminder\" | \"briefing\" | \"custom\" | \"calendar_check\" | \"memory_shed\" | \"growth_report\" | \"metrics_flush\";\r\n message?: string;\r\n userId?: string;\r\n chatId?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n// Schedule a task\r\nexport async function scheduleTask(\r\n task: ScheduledTask,\r\n delay: number\r\n): Promise<string> {\r\n const job = await taskQueue.add(\"scheduled-task\", task, {\r\n delay,\r\n removeOnComplete: true,\r\n removeOnFail: 100,\r\n });\r\n return job.id || \"\";\r\n}\r\n\r\n// Schedule a recurring task (cron-style)\r\nexport async function scheduleRecurring(\r\n name: string,\r\n task: ScheduledTask,\r\n pattern: string // cron pattern\r\n): Promise<void> {\r\n await taskQueue.add(name, task, {\r\n repeat: { pattern },\r\n removeOnComplete: true,\r\n });\r\n}\r\n\r\n// Cancel a scheduled task\r\nexport async function cancelTask(jobId: string): Promise<boolean> {\r\n const job = await taskQueue.getJob(jobId);\r\n if (job) {\r\n await job.remove();\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n// Process scheduled tasks\r\nlet worker: Worker | null = null;\r\nlet maintenanceWorker: Worker | null = null;\r\n\r\nexport function startWorker(\r\n onTask: (task: ScheduledTask) => Promise<void>\r\n): void {\r\n if (worker) return;\r\n\r\n worker = new Worker(\r\n \"sentinel-tasks\",\r\n async (job: Job<ScheduledTask>) => {\r\n console.log(`[Scheduler] Processing task: ${job.name}`);\r\n await onTask(job.data);\r\n },\r\n { connection: getConnection() as any }\r\n );\r\n\r\n worker.on(\"completed\", (job) => {\r\n console.log(`[Scheduler] Task completed: ${job.id}`);\r\n });\r\n\r\n worker.on(\"failed\", (job, err) => {\r\n console.error(`[Scheduler] Task failed: ${job?.id}`, err);\r\n });\r\n\r\n console.log(\"[Scheduler] Worker started\");\r\n}\r\n\r\n// Start maintenance worker for background jobs\r\nexport function startMaintenanceWorker(): void {\r\n if (maintenanceWorker) return;\r\n\r\n maintenanceWorker = new Worker(\r\n \"sentinel-maintenance\",\r\n async (job: Job<ScheduledTask>) => {\r\n console.log(`[Maintenance] Processing: ${job.name}`);\r\n\r\n switch (job.data.type) {\r\n case \"calendar_check\":\r\n if (job.data.userId) {\r\n await processCalendarTriggers(job.data.userId, []);\r\n }\r\n break;\r\n\r\n case \"memory_shed\":\r\n if (job.data.userId) {\r\n const result = await autoShed(job.data.userId);\r\n console.log(`[Maintenance] Memory shed: archived ${result.archivedCount} memories`);\r\n }\r\n break;\r\n\r\n case \"growth_report\":\r\n if (job.data.userId) {\r\n const reportType = job.data.metadata?.reportType as \"weekly\" | \"monthly\";\r\n if (reportType === \"monthly\") {\r\n await generateMonthlyReport(job.data.userId);\r\n } else {\r\n await generateWeeklyReport(job.data.userId);\r\n }\r\n }\r\n break;\r\n\r\n case \"metrics_flush\":\r\n await flushMetrics();\r\n break;\r\n\r\n default:\r\n console.log(`[Maintenance] Unknown task type: ${job.data.type}`);\r\n }\r\n },\r\n { connection: getConnection() as any }\r\n );\r\n\r\n maintenanceWorker.on(\"completed\", (job) => {\r\n console.log(`[Maintenance] Completed: ${job.id}`);\r\n });\r\n\r\n maintenanceWorker.on(\"failed\", (job, err) => {\r\n console.error(`[Maintenance] Failed: ${job?.id}`, err);\r\n });\r\n\r\n console.log(\"[Maintenance] Worker started\");\r\n}\r\n\r\nexport function stopWorker(): void {\r\n if (worker) {\r\n worker.close();\r\n worker = null;\r\n }\r\n}\r\n\r\nexport function stopMaintenanceWorker(): void {\r\n if (maintenanceWorker) {\r\n maintenanceWorker.close();\r\n maintenanceWorker = null;\r\n }\r\n}\r\n\r\n// Start all workers and scheduled jobs\r\nexport async function initializeScheduler(\r\n onTask: (task: ScheduledTask) => Promise<void>\r\n): Promise<void> {\r\n // Start workers\r\n startWorker(onTask);\r\n startMaintenanceWorker();\r\n startAgentWorker();\r\n\r\n // Schedule recurring maintenance jobs\r\n await setupRecurringJobs();\r\n\r\n console.log(\"[Scheduler] Initialized\");\r\n}\r\n\r\n// Setup recurring maintenance jobs\r\nasync function setupRecurringJobs(): Promise<void> {\r\n // Calendar trigger check - every 15 minutes\r\n await maintenanceQueue.add(\r\n \"calendar-check\",\r\n { type: \"calendar_check\" },\r\n {\r\n repeat: { pattern: \"*/15 * * * *\" },\r\n removeOnComplete: true,\r\n }\r\n );\r\n\r\n // Metrics flush - every 5 minutes\r\n await maintenanceQueue.add(\r\n \"metrics-flush\",\r\n { type: \"metrics_flush\" },\r\n {\r\n repeat: { pattern: \"*/5 * * * *\" },\r\n removeOnComplete: true,\r\n }\r\n );\r\n\r\n // Weekly memory shedding - Sundays at 3 AM\r\n await maintenanceQueue.add(\r\n \"memory-shed-weekly\",\r\n { type: \"memory_shed\" },\r\n {\r\n repeat: { pattern: \"0 3 * * 0\" },\r\n removeOnComplete: true,\r\n }\r\n );\r\n\r\n // Monthly quota reset - 1st of month at midnight\r\n await maintenanceQueue.add(\r\n \"quota-reset-monthly\",\r\n { type: \"custom\", message: \"quota_reset\" },\r\n {\r\n repeat: { pattern: \"0 0 1 * *\" },\r\n removeOnComplete: true,\r\n }\r\n );\r\n\r\n console.log(\"[Scheduler] Recurring jobs scheduled\");\r\n}\r\n\r\n// Schedule user-specific maintenance\r\nexport async function scheduleUserMaintenance(\r\n userId: string,\r\n type: \"calendar_check\" | \"memory_shed\" | \"growth_report\",\r\n options?: { pattern?: string; reportType?: \"weekly\" | \"monthly\" }\r\n): Promise<void> {\r\n const task: ScheduledTask = {\r\n type,\r\n userId,\r\n metadata: options?.reportType ? { reportType: options.reportType } : undefined,\r\n };\r\n\r\n if (options?.pattern) {\r\n await maintenanceQueue.add(`${type}-${userId}`, task, {\r\n repeat: { pattern: options.pattern },\r\n removeOnComplete: true,\r\n });\r\n } else {\r\n await maintenanceQueue.add(`${type}-${userId}`, task, {\r\n removeOnComplete: true,\r\n });\r\n }\r\n}\r\n\r\n// Shutdown all workers\r\nexport async function shutdownScheduler(): Promise<void> {\r\n stopWorker();\r\n stopMaintenanceWorker();\r\n stopAgentWorker();\r\n if (_connection) await _connection.quit();\r\n console.log(\"[Scheduler] Shutdown complete\");\r\n}\r\n\r\n// Helper to schedule a reminder\r\nexport async function scheduleReminder(\r\n message: string,\r\n delayMs: number,\r\n chatId?: string\r\n): Promise<string> {\r\n return scheduleTask(\r\n {\r\n type: \"reminder\",\r\n message,\r\n chatId,\r\n },\r\n delayMs\r\n );\r\n}\r\n\r\n// Generate morning briefing content\r\nexport async function generateBriefing(userId?: string): Promise<string> {\r\n // Try to use calendar-aware briefing\r\n if (userId) {\r\n try {\r\n return await generateDailyBriefing(userId, []);\r\n } catch {\r\n // Fall back to simple briefing\r\n }\r\n }\r\n\r\n const response = await chat(\r\n [\r\n {\r\n role: \"user\",\r\n content: `Generate a brief morning briefing. Include:\r\n1. A motivational greeting\r\n2. Today's date and day of week\r\n3. A productivity tip\r\n\r\nKeep it concise and uplifting.`,\r\n },\r\n ],\r\n \"You are a helpful assistant creating a morning briefing.\"\r\n );\r\n\r\n return response.content;\r\n}\r\n\r\n// Get queue stats\r\nexport async function getQueueStats(): Promise<{\r\n tasks: { waiting: number; active: number; completed: number; failed: number };\r\n maintenance: { waiting: number; active: number; completed: number; failed: number };\r\n}> {\r\n const [taskStats, maintenanceStats] = await Promise.all([\r\n Promise.all([\r\n taskQueue.getWaitingCount(),\r\n taskQueue.getActiveCount(),\r\n taskQueue.getCompletedCount(),\r\n taskQueue.getFailedCount(),\r\n ]),\r\n Promise.all([\r\n maintenanceQueue.getWaitingCount(),\r\n maintenanceQueue.getActiveCount(),\r\n maintenanceQueue.getCompletedCount(),\r\n maintenanceQueue.getFailedCount(),\r\n ]),\r\n ]);\r\n\r\n return {\r\n tasks: {\r\n waiting: taskStats[0],\r\n active: taskStats[1],\r\n completed: taskStats[2],\r\n failed: taskStats[3],\r\n },\r\n maintenance: {\r\n waiting: maintenanceStats[0],\r\n active: maintenanceStats[1],\r\n completed: maintenanceStats[2],\r\n failed: maintenanceStats[3],\r\n },\r\n };\r\n}\r\n\r\nexport { taskQueue, maintenanceQueue, connection };\r\n","import { Worker, Job } from \"bullmq\";\r\nimport Redis from \"ioredis\";\r\nimport { env } from \"../../config/env\";\r\nimport {\r\n AgentType,\r\n AgentResult,\r\n AGENT_SYSTEM_PROMPTS,\r\n AGENT_TOOL_PERMISSIONS,\r\n} from \"./agent-types\";\r\nimport {\r\n updateAgentStatus,\r\n addAgentMessage,\r\n addAgentProgress,\r\n shouldAgentStop,\r\n updateAgentTokens,\r\n getAgent,\r\n} from \"./agent-manager\";\r\nimport { TOOLS, executeTool } from \"../../tools\";\r\nimport { riskEngine } from \"../intelligence/risk-engine\";\r\nimport { metric } from \"../observability/metrics\";\r\nimport { captureException } from \"../observability/error-tracker\";\r\nimport { providerRegistry } from \"../providers\";\r\nimport type { LLMMessage, LLMContentBlock, LLMTool } from \"../providers/types\";\r\n\r\n// Redis connection\r\nconst connection = new Redis(env.REDIS_URL, {\r\n maxRetriesPerRequest: null,\r\n});\r\n\r\ninterface AgentJobData {\r\n agentId: string;\r\n userId: string;\r\n type: AgentType;\r\n objective: string;\r\n context?: Record<string, unknown>;\r\n tokenBudget: number;\r\n timeBudgetMs: number;\r\n}\r\n\r\nlet worker: Worker | null = null;\r\n\r\n// Process an agent task\r\nasync function processAgentTask(job: Job<AgentJobData>): Promise<AgentResult> {\r\n const { agentId, userId, type, objective, context, tokenBudget } = job.data;\r\n const startTime = Date.now();\r\n let totalTokensUsed = 0;\r\n\r\n console.log(`[Agent ${agentId}] Starting ${type} agent: ${objective}`);\r\n\r\n // Update status to running\r\n await updateAgentStatus(agentId, \"running\");\r\n await addAgentProgress(agentId, 1, \"Starting agent\", \"running\");\r\n\r\n // Build system prompt\r\n const systemPrompt = buildSystemPrompt(type, context);\r\n\r\n // Get the configured LLM provider (respects LLM_PROVIDER env var)\r\n const provider = providerRegistry.getDefault();\r\n\r\n // Get allowed tools for this agent type\r\n const allowedToolNames = AGENT_TOOL_PERMISSIONS[type];\r\n const agentTools = TOOLS\r\n .filter((t) => allowedToolNames.includes(t.name))\r\n .map((t) => ({\r\n name: t.name,\r\n description: t.description || \"\",\r\n input_schema: (t.input_schema || { type: \"object\" as const, properties: {} }) as LLMTool[\"input_schema\"],\r\n }));\r\n\r\n // Build initial messages\r\n const userContent = `Your objective: ${objective}\r\n\r\n${context ? `Additional context:\\n${JSON.stringify(context, null, 2)}` : \"\"}\r\n\r\nPlease proceed with the task, reporting your progress as you go.`;\r\n\r\n const messages: LLMMessage[] = [\r\n { role: \"user\", content: userContent },\r\n ];\r\n\r\n await addAgentMessage(agentId, {\r\n role: \"user\",\r\n content: userContent,\r\n });\r\n\r\n let stepNumber = 2;\r\n const maxSteps = 20; // Prevent infinite loops\r\n\r\n try {\r\n // Agent loop\r\n while (stepNumber <= maxSteps) {\r\n // Check if we should stop\r\n const stopCheck = await shouldAgentStop(agentId);\r\n if (stopCheck.stop) {\r\n await addAgentProgress(\r\n agentId,\r\n stepNumber,\r\n `Stopping: ${stopCheck.reason}`,\r\n \"completed\"\r\n );\r\n break;\r\n }\r\n\r\n // Call the configured LLM provider (Claude, Gemini, OpenAI, etc.)\r\n const response = await provider.createMessage({\r\n model: \"\", // Use provider's default model\r\n max_tokens: 4096,\r\n system: systemPrompt,\r\n tools: agentTools,\r\n messages,\r\n });\r\n\r\n // Track tokens\r\n totalTokensUsed += response.usage.input_tokens + response.usage.output_tokens;\r\n await updateAgentTokens(agentId, totalTokensUsed);\r\n\r\n // Check token budget\r\n if (totalTokensUsed >= tokenBudget) {\r\n await addAgentProgress(\r\n agentId,\r\n stepNumber,\r\n \"Token budget reached\",\r\n \"completed\"\r\n );\r\n break;\r\n }\r\n\r\n // Process response\r\n const assistantContent = response.content;\r\n\r\n // Extract text for logging\r\n const textContent = assistantContent\r\n .filter((c) => c.type === \"text\")\r\n .map((c) => c.text || \"\")\r\n .join(\"\\n\");\r\n\r\n if (textContent) {\r\n await addAgentMessage(agentId, {\r\n role: \"assistant\",\r\n content: textContent,\r\n });\r\n\r\n // Extract progress description from text\r\n const progressDesc = textContent.slice(0, 200).replace(/\\n/g, \" \");\r\n await addAgentProgress(agentId, stepNumber, progressDesc, \"running\");\r\n }\r\n\r\n // Check if done\r\n if (response.stop_reason === \"end_turn\") {\r\n // Agent completed naturally\r\n await addAgentProgress(\r\n agentId,\r\n stepNumber + 1,\r\n \"Task completed\",\r\n \"completed\",\r\n textContent\r\n );\r\n\r\n return {\r\n success: true,\r\n output: textContent,\r\n summary: extractSummary(textContent),\r\n tokensUsed: totalTokensUsed,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // Process tool calls\r\n if (response.stop_reason === \"tool_use\") {\r\n const toolResultBlocks: LLMContentBlock[] = [];\r\n\r\n for (const block of assistantContent) {\r\n if (block.type === \"tool_use\") {\r\n const toolName = block.name!;\r\n const toolInput = block.input as Record<string, unknown>;\r\n\r\n console.log(`[Agent ${agentId}] Using tool: ${toolName}`);\r\n\r\n // Risk engine gate: evaluate before executing any tool from an agent\r\n const riskDecision = await riskEngine.evaluate({\r\n action: \"agent_tool_execute\",\r\n userId,\r\n toolName,\r\n input: toolInput,\r\n metadata: { agentId, agentType: type },\r\n });\r\n\r\n if (!riskDecision.allowed) {\r\n const failedChecks = riskDecision.checks\r\n .filter((c) => !c.passed)\r\n .map((c) => c.message)\r\n .join(\"; \");\r\n const result = {\r\n success: false,\r\n result: null,\r\n error: `[RiskEngine] Agent tool blocked: ${failedChecks}`,\r\n };\r\n\r\n await addAgentMessage(agentId, {\r\n role: \"tool_result\",\r\n content: JSON.stringify({ tool: toolName, result }),\r\n metadata: { toolInput },\r\n });\r\n\r\n toolResultBlocks.push({\r\n type: \"tool_result\",\r\n tool_use_id: block.id!,\r\n content: JSON.stringify(result),\r\n });\r\n continue;\r\n }\r\n\r\n // Inject caller context for financial tools\r\n if (toolName === \"crypto_exchange\") {\r\n toolInput._callerContext = \"agent\";\r\n }\r\n\r\n // Execute tool\r\n const result = await executeTool(toolName, toolInput);\r\n\r\n await addAgentMessage(agentId, {\r\n role: \"tool_result\",\r\n content: JSON.stringify({ tool: toolName, result }),\r\n metadata: { toolInput },\r\n });\r\n\r\n toolResultBlocks.push({\r\n type: \"tool_result\",\r\n tool_use_id: block.id!,\r\n content: JSON.stringify(result),\r\n });\r\n }\r\n }\r\n\r\n // Add assistant response and tool results to messages\r\n messages.push({ role: \"assistant\", content: assistantContent });\r\n messages.push({ role: \"user\", content: toolResultBlocks });\r\n }\r\n\r\n stepNumber++;\r\n }\r\n\r\n // Max steps reached\r\n const agent = await getAgent(agentId);\r\n const lastMessage = agent?.messages.slice(-1)[0]?.content || \"\";\r\n\r\n return {\r\n success: true,\r\n output: lastMessage,\r\n summary: \"Agent completed maximum steps\",\r\n tokensUsed: totalTokensUsed,\r\n durationMs: Date.now() - startTime,\r\n };\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n\r\n await captureException(error, \"agent\", {\r\n agentId,\r\n type,\r\n objective,\r\n }, userId);\r\n\r\n await addAgentProgress(\r\n agentId,\r\n stepNumber,\r\n `Error: ${errorMessage}`,\r\n \"failed\"\r\n );\r\n\r\n return {\r\n success: false,\r\n error: errorMessage,\r\n tokensUsed: totalTokensUsed,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n}\r\n\r\nfunction buildSystemPrompt(\r\n type: AgentType,\r\n context?: Record<string, unknown>\r\n): string {\r\n let prompt = AGENT_SYSTEM_PROMPTS[type];\r\n\r\n if (context) {\r\n prompt += `\\n\\nAdditional context about the user/task:\\n${JSON.stringify(context, null, 2)}`;\r\n }\r\n\r\n return prompt;\r\n}\r\n\r\nfunction extractSummary(text: string): string {\r\n // Try to find a summary section\r\n const summaryMatch = text.match(/(?:summary|conclusion|result):\\s*(.+?)(?:\\n\\n|$)/i);\r\n if (summaryMatch) {\r\n return summaryMatch[1].trim();\r\n }\r\n\r\n // Otherwise, take the last paragraph\r\n const paragraphs = text.split(\"\\n\\n\").filter((p) => p.trim());\r\n return paragraphs.slice(-1)[0]?.slice(0, 500) || text.slice(0, 500);\r\n}\r\n\r\n// Start the agent worker\r\nexport function startAgentWorker(): void {\r\n if (worker) return;\r\n\r\n worker = new Worker(\r\n \"sentinel-agents\",\r\n async (job: Job<AgentJobData>) => {\r\n const result = await processAgentTask(job);\r\n\r\n // Update final status\r\n await updateAgentStatus(\r\n job.data.agentId,\r\n result.success ? \"completed\" : \"failed\",\r\n result\r\n );\r\n\r\n // Record metric\r\n metric.agentOperation(\"complete\", job.data.type);\r\n\r\n return result;\r\n },\r\n {\r\n connection,\r\n concurrency: 3, // Run up to 3 agents concurrently\r\n }\r\n );\r\n\r\n worker.on(\"completed\", (job) => {\r\n console.log(`[AgentWorker] Agent completed: ${job.data.agentId}`);\r\n });\r\n\r\n worker.on(\"failed\", (job, err) => {\r\n console.error(`[AgentWorker] Agent failed: ${job?.data.agentId}`, err);\r\n });\r\n\r\n console.log(\"[AgentWorker] Agent worker started\");\r\n}\r\n\r\n// Stop the agent worker\r\nexport function stopAgentWorker(): void {\r\n if (worker) {\r\n worker.close();\r\n worker = null;\r\n }\r\n}\r\n\r\nexport default {\r\n startAgentWorker,\r\n stopAgentWorker,\r\n};\r\n","import { db } from \"../../db\";\nimport { calendarTriggers, users } from \"../../db/schema\";\nimport { eq, and, lte, gte, isNull } from \"drizzle-orm\";\nimport { scheduleTask } from \"../../core/scheduler\";\nimport {\n fetchICalFromUrl,\n CalendarEvent,\n getUpcomingEvents,\n getTodaysEvents,\n} from \"./ical-parser\";\n\nexport type TriggerType = \"event_start\" | \"event_end\" | \"daily_briefing\";\nexport type CalendarSource = \"google\" | \"outlook\" | \"ical\";\n\nexport interface CalendarTriggerConfig {\n id: string;\n userId: string;\n name: string;\n calendarSource: CalendarSource;\n calendarId?: string;\n triggerType: TriggerType;\n offsetMinutes: number;\n action: {\n type: \"message\" | \"tool\" | \"webhook\";\n payload: Record<string, unknown>;\n };\n enabled: boolean;\n}\n\nexport interface TriggerResult {\n triggerId: string;\n event?: CalendarEvent;\n scheduledJobId?: string;\n error?: string;\n}\n\n// Create a calendar trigger\nexport async function createCalendarTrigger(\n config: Omit<CalendarTriggerConfig, \"id\">\n): Promise<string> {\n const [trigger] = await db\n .insert(calendarTriggers)\n .values({\n userId: config.userId,\n name: config.name,\n calendarSource: config.calendarSource,\n calendarId: config.calendarId,\n triggerType: config.triggerType,\n offsetMinutes: config.offsetMinutes,\n action: config.action,\n enabled: config.enabled,\n })\n .returning();\n\n return trigger.id;\n}\n\n// Get user's calendar triggers\nexport async function getUserTriggers(\n userId: string\n): Promise<CalendarTriggerConfig[]> {\n const triggers = await db\n .select()\n .from(calendarTriggers)\n .where(eq(calendarTriggers.userId, userId));\n\n return triggers.map((t) => ({\n id: t.id,\n userId: t.userId,\n name: t.name,\n calendarSource: t.calendarSource as CalendarSource,\n calendarId: t.calendarId || undefined,\n triggerType: t.triggerType as TriggerType,\n offsetMinutes: t.offsetMinutes || 0,\n action: t.action as CalendarTriggerConfig[\"action\"],\n enabled: t.enabled ?? true,\n }));\n}\n\n// Enable/disable a trigger\nexport async function setTriggerEnabled(\n triggerId: string,\n enabled: boolean\n): Promise<boolean> {\n const [updated] = await db\n .update(calendarTriggers)\n .set({ enabled })\n .where(eq(calendarTriggers.id, triggerId))\n .returning();\n\n return !!updated;\n}\n\n// Delete a trigger\nexport async function deleteTrigger(triggerId: string): Promise<boolean> {\n await db.delete(calendarTriggers).where(eq(calendarTriggers.id, triggerId));\n return true;\n}\n\n// Process triggers for upcoming events\nexport async function processCalendarTriggers(\n userId: string,\n events: CalendarEvent[],\n chatId?: string\n): Promise<TriggerResult[]> {\n const triggers = await getUserTriggers(userId);\n const enabledTriggers = triggers.filter((t) => t.enabled);\n const results: TriggerResult[] = [];\n const now = Date.now();\n\n for (const trigger of enabledTriggers) {\n try {\n if (trigger.triggerType === \"daily_briefing\") {\n // Handle daily briefing separately\n continue;\n }\n\n for (const event of events) {\n const eventTime =\n trigger.triggerType === \"event_start\"\n ? event.startDate.getTime()\n : event.endDate.getTime();\n\n const triggerTime = eventTime - trigger.offsetMinutes * 60 * 1000;\n\n // Only schedule if trigger time is in the future\n if (triggerTime > now) {\n const delay = triggerTime - now;\n\n const jobId = await scheduleTask(\n {\n type: \"custom\",\n message: formatTriggerMessage(trigger, event),\n userId,\n chatId,\n },\n delay\n );\n\n results.push({\n triggerId: trigger.id,\n event,\n scheduledJobId: jobId,\n });\n\n // Update last triggered\n await db\n .update(calendarTriggers)\n .set({ lastTriggered: new Date() })\n .where(eq(calendarTriggers.id, trigger.id));\n }\n }\n } catch (error) {\n results.push({\n triggerId: trigger.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n}\n\nfunction formatTriggerMessage(\n trigger: CalendarTriggerConfig,\n event: CalendarEvent\n): string {\n const timeStr = event.startDate.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n if (trigger.triggerType === \"event_start\") {\n if (trigger.offsetMinutes > 0) {\n return `⏰ Reminder: \"${event.summary}\" starts in ${trigger.offsetMinutes} minutes at ${timeStr}`;\n }\n return `🔔 \"${event.summary}\" is starting now!`;\n }\n\n if (trigger.triggerType === \"event_end\") {\n return `✅ \"${event.summary}\" has ended`;\n }\n\n return `📅 Calendar event: ${event.summary}`;\n}\n\n// Generate daily briefing from calendar\nexport async function generateDailyBriefing(\n userId: string,\n events: CalendarEvent[]\n): Promise<string> {\n const todayEvents = getTodaysEvents(events);\n const upcomingEvents = getUpcomingEvents(events, 5);\n\n let briefing = \"📅 **Your Daily Calendar Briefing**\\n\\n\";\n\n if (todayEvents.length === 0) {\n briefing += \"No events scheduled for today.\\n\\n\";\n } else {\n briefing += `**Today's Events (${todayEvents.length}):**\\n`;\n for (const event of todayEvents) {\n const timeStr = event.isAllDay\n ? \"All day\"\n : event.startDate.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n briefing += `• ${timeStr}: ${event.summary}`;\n if (event.location) {\n briefing += ` @ ${event.location}`;\n }\n briefing += \"\\n\";\n }\n briefing += \"\\n\";\n }\n\n const futureEvents = upcomingEvents.filter(\n (e) => !todayEvents.some((t) => t.uid === e.uid)\n );\n\n if (futureEvents.length > 0) {\n briefing += \"**Upcoming:**\\n\";\n for (const event of futureEvents.slice(0, 3)) {\n const dateStr = event.startDate.toLocaleDateString([], {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n });\n briefing += `• ${dateStr}: ${event.summary}\\n`;\n }\n }\n\n return briefing;\n}\n\n// Sync calendar and process triggers\nexport async function syncCalendarAndTriggers(\n userId: string,\n icalUrl: string,\n chatId?: string\n): Promise<{\n eventsFound: number;\n triggersScheduled: number;\n errors: string[];\n}> {\n const errors: string[] = [];\n let eventsFound = 0;\n let triggersScheduled = 0;\n\n try {\n const calendar = await fetchICalFromUrl(icalUrl);\n eventsFound = calendar.events.length;\n\n // Get events for next 24 hours\n const now = new Date();\n const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000);\n const upcomingEvents = calendar.events.filter(\n (e) => e.startDate >= now && e.startDate <= tomorrow\n );\n\n const results = await processCalendarTriggers(userId, upcomingEvents, chatId);\n triggersScheduled = results.filter((r) => r.scheduledJobId).length;\n errors.push(...results.filter((r) => r.error).map((r) => r.error!));\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n\n return { eventsFound, triggersScheduled, errors };\n}\n\nexport default {\n createCalendarTrigger,\n getUserTriggers,\n setTriggerEnabled,\n deleteTrigger,\n processCalendarTriggers,\n generateDailyBriefing,\n syncCalendarAndTriggers,\n};\n","import { db } from \"../../db\";\r\nimport { memories, archivedMemories } from \"../../db/schema\";\r\nimport { eq, and, lt, lte, sql } from \"drizzle-orm\";\r\n\r\nexport type ShedReason =\r\n | \"stale\"\r\n | \"duplicate\"\r\n | \"low_importance\"\r\n | \"user_request\"\r\n | \"deprecated_workflow\";\r\n\r\nexport interface ShedCandidate {\r\n memoryId: string;\r\n content: string;\r\n type: string;\r\n reason: ShedReason;\r\n lastAccessed: Date | null;\r\n importance: number;\r\n confidence: number; // How confident we are this should be shed (0-100)\r\n}\r\n\r\nexport interface ShedResult {\r\n archivedCount: number;\r\n archivedIds: string[];\r\n skippedCount: number;\r\n}\r\n\r\n// Configuration for memory shedding\r\nconst SHED_CONFIG = {\r\n staleDays: 90, // Memories not accessed in 90 days\r\n lowImportanceThreshold: 3, // Memories with importance <= 3\r\n minConfidence: 70, // Minimum confidence to auto-shed\r\n};\r\n\r\n// Find stale memories (not accessed recently)\r\nexport async function findStaleMemories(\r\n userId: string,\r\n staleDays: number = SHED_CONFIG.staleDays\r\n): Promise<ShedCandidate[]> {\r\n const cutoff = new Date(Date.now() - staleDays * 24 * 60 * 60 * 1000);\r\n\r\n const stale = await db\r\n .select()\r\n .from(memories)\r\n .where(\r\n and(\r\n eq(memories.userId, userId),\r\n lt(memories.lastAccessed, cutoff)\r\n )\r\n );\r\n\r\n return stale.map((m) => ({\r\n memoryId: m.id,\r\n content: m.content,\r\n type: m.type,\r\n reason: \"stale\" as ShedReason,\r\n lastAccessed: m.lastAccessed,\r\n importance: m.importance || 5,\r\n confidence: calculateStaleConfidence(m.lastAccessed, m.importance || 5),\r\n }));\r\n}\r\n\r\nfunction calculateStaleConfidence(\r\n lastAccessed: Date | null,\r\n importance: number\r\n): number {\r\n if (!lastAccessed) return 80;\r\n\r\n const daysSinceAccess = Math.floor(\r\n (Date.now() - lastAccessed.getTime()) / (24 * 60 * 60 * 1000)\r\n );\r\n\r\n // Higher confidence for older, less important memories\r\n let confidence = Math.min(daysSinceAccess / 2, 50); // Max 50 from age\r\n confidence += (10 - importance) * 5; // Up to 50 from low importance\r\n\r\n return Math.min(confidence, 100);\r\n}\r\n\r\n// Find low importance memories\r\nexport async function findLowImportanceMemories(\r\n userId: string,\r\n threshold: number = SHED_CONFIG.lowImportanceThreshold\r\n): Promise<ShedCandidate[]> {\r\n const lowImportance = await db\r\n .select()\r\n .from(memories)\r\n .where(\r\n and(\r\n eq(memories.userId, userId),\r\n lte(memories.importance, threshold)\r\n )\r\n );\r\n\r\n return lowImportance.map((m) => ({\r\n memoryId: m.id,\r\n content: m.content,\r\n type: m.type,\r\n reason: \"low_importance\" as ShedReason,\r\n lastAccessed: m.lastAccessed,\r\n importance: m.importance || 5,\r\n confidence: (SHED_CONFIG.lowImportanceThreshold - (m.importance || 5) + 1) * 25,\r\n }));\r\n}\r\n\r\n// Find potential duplicate memories (simplified - would need better NLP in production)\r\nexport async function findDuplicateMemories(\r\n userId: string\r\n): Promise<ShedCandidate[]> {\r\n const allMemories = await db\r\n .select()\r\n .from(memories)\r\n .where(eq(memories.userId, userId));\r\n\r\n const candidates: ShedCandidate[] = [];\r\n const seen = new Map<string, typeof allMemories[0]>();\r\n\r\n for (const memory of allMemories) {\r\n // Simple duplicate detection: normalize and check for similar content\r\n const normalized = memory.content.toLowerCase().trim();\r\n const key = normalized.slice(0, 100); // Use first 100 chars as key\r\n\r\n const existing = seen.get(key);\r\n if (existing) {\r\n // Mark the newer one as duplicate (keep older memories)\r\n const isDuplicate =\r\n memory.createdAt > existing.createdAt ? memory : existing;\r\n\r\n candidates.push({\r\n memoryId: isDuplicate.id,\r\n content: isDuplicate.content,\r\n type: isDuplicate.type,\r\n reason: \"duplicate\",\r\n lastAccessed: isDuplicate.lastAccessed,\r\n importance: isDuplicate.importance || 5,\r\n confidence: 75, // Fairly confident about duplicates\r\n });\r\n } else {\r\n seen.set(key, memory);\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n\r\n// Get all shed candidates for a user\r\nexport async function identifyShedCandidates(\r\n userId: string\r\n): Promise<ShedCandidate[]> {\r\n const [stale, lowImportance, duplicates] = await Promise.all([\r\n findStaleMemories(userId),\r\n findLowImportanceMemories(userId),\r\n findDuplicateMemories(userId),\r\n ]);\r\n\r\n // Combine and deduplicate by memoryId\r\n const candidateMap = new Map<string, ShedCandidate>();\r\n\r\n for (const candidate of [...stale, ...lowImportance, ...duplicates]) {\r\n const existing = candidateMap.get(candidate.memoryId);\r\n if (!existing || candidate.confidence > existing.confidence) {\r\n candidateMap.set(candidate.memoryId, candidate);\r\n }\r\n }\r\n\r\n return Array.from(candidateMap.values()).sort(\r\n (a, b) => b.confidence - a.confidence\r\n );\r\n}\r\n\r\n// Archive a single memory\r\nexport async function archiveMemory(\r\n memoryId: string,\r\n reason: ShedReason\r\n): Promise<boolean> {\r\n const [memory] = await db\r\n .select()\r\n .from(memories)\r\n .where(eq(memories.id, memoryId))\r\n .limit(1);\r\n\r\n if (!memory) return false;\r\n\r\n // Insert into archived memories\r\n await db.insert(archivedMemories).values({\r\n originalMemoryId: memory.id,\r\n userId: memory.userId,\r\n type: memory.type,\r\n content: memory.content,\r\n reason,\r\n originalCreatedAt: memory.createdAt,\r\n });\r\n\r\n // Delete from active memories\r\n await db.delete(memories).where(eq(memories.id, memoryId));\r\n\r\n return true;\r\n}\r\n\r\n// Archive multiple memories\r\nexport async function archiveMemories(\r\n memoryIds: string[],\r\n reason: ShedReason\r\n): Promise<ShedResult> {\r\n let archivedCount = 0;\r\n const archivedIds: string[] = [];\r\n\r\n for (const id of memoryIds) {\r\n const success = await archiveMemory(id, reason);\r\n if (success) {\r\n archivedCount++;\r\n archivedIds.push(id);\r\n }\r\n }\r\n\r\n return {\r\n archivedCount,\r\n archivedIds,\r\n skippedCount: memoryIds.length - archivedCount,\r\n };\r\n}\r\n\r\n// Auto-shed memories based on confidence threshold\r\nexport async function autoShed(\r\n userId: string,\r\n minConfidence: number = SHED_CONFIG.minConfidence\r\n): Promise<ShedResult> {\r\n const candidates = await identifyShedCandidates(userId);\r\n const toArchive = candidates.filter((c) => c.confidence >= minConfidence);\r\n\r\n const results: ShedResult = {\r\n archivedCount: 0,\r\n archivedIds: [],\r\n skippedCount: 0,\r\n };\r\n\r\n for (const candidate of toArchive) {\r\n const success = await archiveMemory(candidate.memoryId, candidate.reason);\r\n if (success) {\r\n results.archivedCount++;\r\n results.archivedIds.push(candidate.memoryId);\r\n } else {\r\n results.skippedCount++;\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n// Restore an archived memory\r\nexport async function restoreMemory(archivedId: string): Promise<boolean> {\r\n const [archived] = await db\r\n .select()\r\n .from(archivedMemories)\r\n .where(eq(archivedMemories.id, archivedId))\r\n .limit(1);\r\n\r\n if (!archived) return false;\r\n\r\n // Re-insert into active memories (without embedding - would need to regenerate)\r\n await db.insert(memories).values({\r\n userId: archived.userId,\r\n type: archived.type as \"episodic\" | \"semantic\" | \"procedural\",\r\n content: archived.content,\r\n importance: 5, // Reset to medium importance\r\n source: \"restored\",\r\n });\r\n\r\n // Remove from archive\r\n await db.delete(archivedMemories).where(eq(archivedMemories.id, archivedId));\r\n\r\n return true;\r\n}\r\n\r\n// Get archived memories for a user\r\nexport async function getArchivedMemories(\r\n userId: string,\r\n limit: number = 50\r\n): Promise<typeof archivedMemories.$inferSelect[]> {\r\n return db\r\n .select()\r\n .from(archivedMemories)\r\n .where(eq(archivedMemories.userId, userId))\r\n .limit(limit);\r\n}\r\n\r\n// Get shedding statistics\r\nexport async function getShedStats(\r\n userId: string\r\n): Promise<{\r\n totalArchived: number;\r\n byReason: Record<ShedReason, number>;\r\n pendingCandidates: number;\r\n}> {\r\n const archived = await getArchivedMemories(userId, 1000);\r\n const candidates = await identifyShedCandidates(userId);\r\n\r\n const byReason: Record<ShedReason, number> = {\r\n stale: 0,\r\n duplicate: 0,\r\n low_importance: 0,\r\n user_request: 0,\r\n deprecated_workflow: 0,\r\n };\r\n\r\n for (const memory of archived) {\r\n const reason = memory.reason as ShedReason;\r\n if (reason in byReason) {\r\n byReason[reason]++;\r\n }\r\n }\r\n\r\n return {\r\n totalArchived: archived.length,\r\n byReason,\r\n pendingCandidates: candidates.length,\r\n };\r\n}\r\n\r\n// Cleanup old archives (permanent deletion)\r\nexport async function cleanupOldArchives(\r\n daysToKeep: number = 365\r\n): Promise<number> {\r\n const cutoff = new Date(Date.now() - daysToKeep * 24 * 60 * 60 * 1000);\r\n\r\n await db\r\n .delete(archivedMemories)\r\n .where(lt(archivedMemories.archivedAt, cutoff));\r\n\r\n return 0; // Cleanup completed\r\n}\r\n","import { generateGrowthReport, getEvolutionSnapshot } from \"./evolution-tracker\";\r\nimport { getUserAchievements, checkAchievements, getUserPoints, getAchievementProgress } from \"./achievement-system\";\r\nimport { getModeStats, getCurrentMode } from \"./mode-manager\";\r\nimport { getShedStats } from \"./memory-shedder\";\r\n\r\nexport interface GrowthReport {\r\n period: {\r\n type: \"weekly\" | \"monthly\";\r\n start: Date;\r\n end: Date;\r\n };\r\n summary: string;\r\n metrics: {\r\n conversations: number;\r\n messages: number;\r\n toolUses: number;\r\n newMemories: number;\r\n archivedMemories: number;\r\n };\r\n achievements: {\r\n newlyUnlocked: Array<{ name: string; emoji: string; points: number }>;\r\n totalPoints: number;\r\n pointsGained: number;\r\n };\r\n modeUsage: Record<string, { sessions: number; minutes: number }>;\r\n highlights: string[];\r\n suggestions: string[];\r\n}\r\n\r\n// Generate a weekly growth report\r\nexport async function generateWeeklyReport(userId: string): Promise<GrowthReport> {\r\n const endDate = new Date();\r\n const startDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);\r\n\r\n return generateReport(userId, startDate, endDate, \"weekly\");\r\n}\r\n\r\n// Generate a monthly growth report\r\nexport async function generateMonthlyReport(userId: string): Promise<GrowthReport> {\r\n const endDate = new Date();\r\n const startDate = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);\r\n\r\n return generateReport(userId, startDate, endDate, \"monthly\");\r\n}\r\n\r\nasync function generateReport(\r\n userId: string,\r\n startDate: Date,\r\n endDate: Date,\r\n type: \"weekly\" | \"monthly\"\r\n): Promise<GrowthReport> {\r\n // Get growth data\r\n const growthData = await generateGrowthReport(userId, startDate, endDate);\r\n\r\n // Check for new achievements\r\n const newAchievements = await checkAchievements(userId);\r\n const totalPoints = await getUserPoints(userId);\r\n\r\n // Get mode stats\r\n const modeStats = await getModeStats(userId);\r\n\r\n // Get shed stats\r\n const shedStats = await getShedStats(userId);\r\n\r\n // Generate highlights\r\n const highlights = generateHighlights(growthData, newAchievements);\r\n\r\n // Generate suggestions\r\n const suggestions = await generateSuggestions(userId, growthData);\r\n\r\n // Generate summary\r\n const summary = generateSummary(growthData, newAchievements, type);\r\n\r\n return {\r\n period: {\r\n type,\r\n start: startDate,\r\n end: endDate,\r\n },\r\n summary,\r\n metrics: {\r\n conversations: growthData.metrics.conversations,\r\n messages: growthData.metrics.messages,\r\n toolUses: growthData.metrics.toolUses,\r\n newMemories: growthData.metrics.newMemories,\r\n archivedMemories: shedStats.totalArchived,\r\n },\r\n achievements: {\r\n newlyUnlocked: newAchievements.map((a) => ({\r\n name: a.name,\r\n emoji: a.iconEmoji,\r\n points: a.points,\r\n })),\r\n totalPoints,\r\n pointsGained: newAchievements.reduce((sum, a) => sum + a.points, 0),\r\n },\r\n modeUsage: {\r\n productivity: { sessions: modeStats.productivity.totalSessions, minutes: modeStats.productivity.totalMinutes },\r\n creative: { sessions: modeStats.creative.totalSessions, minutes: modeStats.creative.totalMinutes },\r\n research: { sessions: modeStats.research.totalSessions, minutes: modeStats.research.totalMinutes },\r\n learning: { sessions: modeStats.learning.totalSessions, minutes: modeStats.learning.totalMinutes },\r\n },\r\n highlights,\r\n suggestions,\r\n };\r\n}\r\n\r\nfunction generateHighlights(\r\n growthData: Awaited<ReturnType<typeof generateGrowthReport>>,\r\n newAchievements: Array<{ name: string; iconEmoji: string }>\r\n): string[] {\r\n const highlights: string[] = [];\r\n\r\n if (growthData.metrics.conversations > 0) {\r\n highlights.push(\r\n `You had ${growthData.metrics.conversations} conversations this period!`\r\n );\r\n }\r\n\r\n if (growthData.metrics.toolUses > 10) {\r\n highlights.push(\r\n `Power user alert! You used tools ${growthData.metrics.toolUses} times.`\r\n );\r\n }\r\n\r\n if (growthData.metrics.newMemories > 5) {\r\n highlights.push(\r\n `I learned ${growthData.metrics.newMemories} new things about you.`\r\n );\r\n }\r\n\r\n for (const achievement of newAchievements) {\r\n highlights.push(\r\n `${achievement.iconEmoji} Achievement unlocked: ${achievement.name}!`\r\n );\r\n }\r\n\r\n if (growthData.patterns.length > 0) {\r\n const topPattern = growthData.patterns[0];\r\n highlights.push(\r\n `New pattern detected: You frequently use ${topPattern.key}.`\r\n );\r\n }\r\n\r\n return highlights;\r\n}\r\n\r\nasync function generateSuggestions(\r\n userId: string,\r\n growthData: Awaited<ReturnType<typeof generateGrowthReport>>\r\n): Promise<string[]> {\r\n const suggestions: string[] = [];\r\n\r\n // Check achievement progress\r\n const progress = await getAchievementProgress(userId);\r\n const almostUnlocked = progress.filter(\r\n (p) => p.progress / p.target >= 0.7 && p.progress / p.target < 1\r\n );\r\n\r\n for (const achievement of almostUnlocked.slice(0, 2)) {\r\n const remaining = achievement.target - achievement.progress;\r\n suggestions.push(\r\n `You're close to unlocking \"${achievement.achievement.name}\"! Just ${remaining} more ${achievement.achievement.criteria.metric}.`\r\n );\r\n }\r\n\r\n // Suggest mode if not used\r\n const currentMode = await getCurrentMode(userId);\r\n if (!currentMode) {\r\n suggestions.push(\r\n \"Try activating a transformation mode! Say 'switch to productivity mode' to get started.\"\r\n );\r\n }\r\n\r\n // Suggest based on low activity\r\n if (growthData.metrics.toolUses < 5) {\r\n suggestions.push(\r\n \"You haven't used many tools this period. Try asking me to search the web, browse a page, or run a command!\"\r\n );\r\n }\r\n\r\n return suggestions;\r\n}\r\n\r\nfunction generateSummary(\r\n growthData: Awaited<ReturnType<typeof generateGrowthReport>>,\r\n newAchievements: Array<{ name: string }>,\r\n type: \"weekly\" | \"monthly\"\r\n): string {\r\n const period = type === \"weekly\" ? \"this week\" : \"this month\";\r\n\r\n let summary = `Here's your ${type} growth report! `;\r\n\r\n if (growthData.metrics.conversations > 0) {\r\n summary += `You've been active with ${growthData.metrics.conversations} conversations ${period}. `;\r\n } else {\r\n summary += `I missed you ${period}! Let's catch up. `;\r\n }\r\n\r\n if (newAchievements.length > 0) {\r\n summary += `You unlocked ${newAchievements.length} new achievement${newAchievements.length > 1 ? \"s\" : \"\"}! `;\r\n }\r\n\r\n if (growthData.metrics.newMemories > 0) {\r\n summary += `I've been learning about you - ${growthData.metrics.newMemories} new memories stored. `;\r\n }\r\n\r\n return summary.trim();\r\n}\r\n\r\n// Format report as text for Telegram/display\r\nexport function formatReportAsText(report: GrowthReport): string {\r\n let text = `📊 **${report.period.type === \"weekly\" ? \"Weekly\" : \"Monthly\"} Growth Report**\\n\\n`;\r\n\r\n text += `${report.summary}\\n\\n`;\r\n\r\n text += `**📈 Activity**\\n`;\r\n text += `• Conversations: ${report.metrics.conversations}\\n`;\r\n text += `• Messages: ${report.metrics.messages}\\n`;\r\n text += `• Tool uses: ${report.metrics.toolUses}\\n`;\r\n text += `• New memories: ${report.metrics.newMemories}\\n\\n`;\r\n\r\n if (report.achievements.newlyUnlocked.length > 0) {\r\n text += `**🏆 New Achievements**\\n`;\r\n for (const achievement of report.achievements.newlyUnlocked) {\r\n text += `${achievement.emoji} ${achievement.name} (+${achievement.points} pts)\\n`;\r\n }\r\n text += `\\nTotal points: ${report.achievements.totalPoints}\\n\\n`;\r\n }\r\n\r\n if (report.highlights.length > 0) {\r\n text += `**✨ Highlights**\\n`;\r\n for (const highlight of report.highlights) {\r\n text += `• ${highlight}\\n`;\r\n }\r\n text += `\\n`;\r\n }\r\n\r\n if (report.suggestions.length > 0) {\r\n text += `**💡 Suggestions**\\n`;\r\n for (const suggestion of report.suggestions) {\r\n text += `• ${suggestion}\\n`;\r\n }\r\n }\r\n\r\n return text;\r\n}\r\n\r\n// Schedule report generation (to be called from scheduler)\r\nexport async function scheduleReportGeneration(\r\n userId: string,\r\n type: \"weekly\" | \"monthly\",\r\n chatId: string\r\n): Promise<{ report: GrowthReport; formattedText: string }> {\r\n const report =\r\n type === \"weekly\"\r\n ? await generateWeeklyReport(userId)\r\n : await generateMonthlyReport(userId);\r\n\r\n const formattedText = formatReportAsText(report);\r\n\r\n return { report, formattedText };\r\n}\r\n"],"mappings":"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","names":["Worker","Redis","result","eq","and","lte","eq","Redis","connection","worker","Worker"]}
|