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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/image-analysis.ts","../src/tools/ocr.ts"],"sourcesContent":["import { providerRegistry } from \"../core/providers\";\r\nimport { readFile } from \"fs/promises\";\r\nimport { isPathAllowed } from \"../utils/paths\";\r\n\r\nexport interface ImageAnalysisResult {\r\n success: boolean;\r\n analysis?: string;\r\n error?: string;\r\n}\r\n\r\n// Supported image MIME types\r\nconst SUPPORTED_TYPES: Record<string, string> = {\r\n \".jpg\": \"image/jpeg\",\r\n \".jpeg\": \"image/jpeg\",\r\n \".png\": \"image/png\",\r\n \".gif\": \"image/gif\",\r\n \".webp\": \"image/webp\",\r\n};\r\n\r\nfunction getMimeType(filename: string): string | null {\r\n const ext = filename.toLowerCase().slice(filename.lastIndexOf(\".\"));\r\n return SUPPORTED_TYPES[ext] || null;\r\n}\r\n\r\n// Analyze image from URL\r\nexport async function analyzeImageUrl(\r\n imageUrl: string,\r\n prompt: string\r\n): Promise<ImageAnalysisResult> {\r\n try {\r\n const provider = providerRegistry.getDefault();\r\n const response = await provider.createMessage({\r\n model: \"claude-sonnet-4-20250514\",\r\n max_tokens: 1024,\r\n messages: [\r\n {\r\n role: \"user\",\r\n content: [\r\n {\r\n type: \"image\",\r\n source: {\r\n type: \"url\",\r\n url: imageUrl,\r\n },\r\n },\r\n {\r\n type: \"text\",\r\n text: prompt || \"Describe this image in detail.\",\r\n },\r\n ],\r\n },\r\n ],\r\n });\r\n\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n return {\r\n success: true,\r\n analysis: textContent?.text,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\n// Analyze image from local file\r\nexport async function analyzeImageFile(\r\n filePath: string,\r\n prompt: string\r\n): Promise<ImageAnalysisResult> {\r\n try {\r\n // Security check\r\n if (!isPathAllowed(filePath)) {\r\n return {\r\n success: false,\r\n error: \"Access to this path is not allowed\",\r\n };\r\n }\r\n\r\n const mimeType = getMimeType(filePath);\r\n if (!mimeType) {\r\n return {\r\n success: false,\r\n error: \"Unsupported image format. Supported: jpg, png, gif, webp\",\r\n };\r\n }\r\n\r\n const imageData = await readFile(filePath);\r\n const base64 = imageData.toString(\"base64\");\r\n\r\n const provider = providerRegistry.getDefault();\r\n const response = await provider.createMessage({\r\n model: \"claude-sonnet-4-20250514\",\r\n max_tokens: 1024,\r\n messages: [\r\n {\r\n role: \"user\",\r\n content: [\r\n {\r\n type: \"image\",\r\n source: {\r\n type: \"base64\",\r\n mediaType: mimeType,\r\n data: base64,\r\n },\r\n },\r\n {\r\n type: \"text\",\r\n text: prompt || \"Describe this image in detail.\",\r\n },\r\n ],\r\n },\r\n ],\r\n });\r\n\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n return {\r\n success: true,\r\n analysis: textContent?.text,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\n// Analyze image from buffer\r\nexport async function analyzeImageBuffer(\r\n imageBuffer: Buffer,\r\n mimeType: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\",\r\n prompt: string\r\n): Promise<ImageAnalysisResult> {\r\n try {\r\n const base64 = imageBuffer.toString(\"base64\");\r\n\r\n const provider = providerRegistry.getDefault();\r\n const response = await provider.createMessage({\r\n model: \"claude-sonnet-4-20250514\",\r\n max_tokens: 1024,\r\n messages: [\r\n {\r\n role: \"user\",\r\n content: [\r\n {\r\n type: \"image\",\r\n source: {\r\n type: \"base64\",\r\n mediaType: mimeType,\r\n data: base64,\r\n },\r\n },\r\n {\r\n type: \"text\",\r\n text: prompt || \"Describe this image in detail.\",\r\n },\r\n ],\r\n },\r\n ],\r\n });\r\n\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n return {\r\n success: true,\r\n analysis: textContent?.text,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\n// Combined function for tool use\r\nexport async function analyzeImage(\r\n options: {\r\n imageUrl?: string;\r\n imagePath?: string;\r\n prompt: string;\r\n }\r\n): Promise<ImageAnalysisResult> {\r\n if (options.imageUrl) {\r\n return analyzeImageUrl(options.imageUrl, options.prompt);\r\n }\r\n\r\n if (options.imagePath) {\r\n return analyzeImageFile(options.imagePath, options.prompt);\r\n }\r\n\r\n return {\r\n success: false,\r\n error: \"Either imageUrl or imagePath must be provided\",\r\n };\r\n}\r\n\r\nexport default {\r\n analyzeImage,\r\n analyzeImageUrl,\r\n analyzeImageFile,\r\n analyzeImageBuffer,\r\n};\r\n","import { readFile } from \"fs/promises\";\r\nimport { isPathAllowed } from \"../utils/paths\";\r\nimport { analyzeImageFile } from \"./image-analysis\";\r\n\r\nexport interface OCRResult {\r\n success: boolean;\r\n text?: string;\r\n confidence?: number;\r\n error?: string;\r\n}\r\n\r\n// OCR using Tesseract.js (local, no API key needed)\r\nexport async function ocrWithTesseract(\r\n filePath: string,\r\n language: string = \"eng\"\r\n): Promise<OCRResult> {\r\n try {\r\n const Tesseract = await import(\"tesseract.js\");\r\n const worker = await Tesseract.createWorker(language);\r\n const { data } = await worker.recognize(filePath);\r\n await worker.terminate();\r\n\r\n return {\r\n success: true,\r\n text: data.text,\r\n confidence: data.confidence / 100,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: `Tesseract OCR failed: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n }\r\n}\r\n\r\n// Use LLM Vision for OCR (most reliable for complex documents)\r\nexport async function ocrWithVision(\r\n filePath: string,\r\n language?: string\r\n): Promise<OCRResult> {\r\n const prompt = language\r\n ? `Extract all text from this image. The text is in ${language}. Return only the extracted text, preserving the original formatting and layout as much as possible.`\r\n : `Extract all text from this image. Return only the extracted text, preserving the original formatting and layout as much as possible.`;\r\n\r\n const result = await analyzeImageFile(filePath, prompt);\r\n\r\n if (result.success && result.analysis) {\r\n return {\r\n success: true,\r\n text: result.analysis,\r\n };\r\n }\r\n\r\n return {\r\n success: false,\r\n error: result.error || \"Failed to extract text\",\r\n };\r\n}\r\n\r\n// OCR using Tesseract.js as primary, falling back to Vision API\r\nexport async function ocrSimple(filePath: string): Promise<OCRResult> {\r\n const result = await ocrWithTesseract(filePath);\r\n if (result.success && result.confidence && result.confidence > 0.6) {\r\n return result;\r\n }\r\n // Fall back to Vision API on low confidence or failure\r\n return ocrWithVision(filePath);\r\n}\r\n\r\n// OCR for PDF files (extract text from each page)\r\nexport async function ocrPdf(\r\n filePath: string,\r\n pages?: string // e.g., \"1-5\" or \"1,3,5\"\r\n): Promise<OCRResult> {\r\n // For PDFs, we'll use LLM Vision on the file directly\r\n const prompt = `Extract all text from this PDF document. Return the text content, preserving the structure and formatting as much as possible. If there are multiple pages, separate them clearly.`;\r\n\r\n const result = await analyzeImageFile(filePath, prompt);\r\n\r\n if (result.success && result.analysis) {\r\n return {\r\n success: true,\r\n text: result.analysis,\r\n };\r\n }\r\n\r\n return {\r\n success: false,\r\n error: result.error || \"Failed to extract text from PDF\",\r\n };\r\n}\r\n\r\n// Main OCR function that determines the best approach\r\nexport async function performOCR(\r\n filePath: string,\r\n options?: {\r\n language?: string;\r\n useVision?: boolean;\r\n }\r\n): Promise<OCRResult> {\r\n // Security check\r\n if (!isPathAllowed(filePath)) {\r\n return {\r\n success: false,\r\n error: \"Access to this path is not allowed\",\r\n };\r\n }\r\n\r\n const ext = filePath.toLowerCase().slice(filePath.lastIndexOf(\".\"));\r\n\r\n // PDF handling\r\n if (ext === \".pdf\") {\r\n return ocrPdf(filePath);\r\n }\r\n\r\n // Image handling - use Vision API (most accurate)\r\n if ([\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".bmp\", \".tiff\"].includes(ext)) {\r\n if (options?.useVision !== false) {\r\n return ocrWithVision(filePath, options?.language);\r\n }\r\n return ocrSimple(filePath);\r\n }\r\n\r\n return {\r\n success: false,\r\n error: `Unsupported file type: ${ext}`,\r\n };\r\n}\r\n\r\n// Extract structured data from document (tables, forms)\r\nexport async function extractStructuredData(\r\n filePath: string,\r\n dataType?: \"table\" | \"form\" | \"receipt\" | \"invoice\"\r\n): Promise<{\r\n success: boolean;\r\n data?: Record<string, unknown>;\r\n error?: string;\r\n}> {\r\n const prompts: Record<string, string> = {\r\n table: `Extract all tables from this image. Return the data as JSON arrays where each table is an array of rows, and each row is an array of cell values.`,\r\n form: `Extract all form fields from this image. Return as a JSON object where keys are field labels and values are the filled-in content.`,\r\n receipt: `Extract receipt information from this image. Return as JSON with: store_name, date, items (array with name, quantity, price), subtotal, tax, total.`,\r\n invoice: `Extract invoice information from this image. Return as JSON with: vendor, invoice_number, date, due_date, line_items (array), subtotal, tax, total, billing_address.`,\r\n };\r\n\r\n const prompt = dataType\r\n ? prompts[dataType]\r\n : `Extract any structured data from this image. Return as JSON.`;\r\n\r\n const result = await analyzeImageFile(filePath, prompt);\r\n\r\n if (result.success && result.analysis) {\r\n try {\r\n // Try to parse as JSON\r\n const jsonMatch = result.analysis.match(/```json\\n?([\\s\\S]*?)\\n?```/);\r\n if (jsonMatch) {\r\n return {\r\n success: true,\r\n data: JSON.parse(jsonMatch[1]),\r\n };\r\n }\r\n\r\n // Try direct parse\r\n const data = JSON.parse(result.analysis);\r\n return { success: true, data };\r\n } catch {\r\n // Return raw text if not JSON\r\n return {\r\n success: true,\r\n data: { rawText: result.analysis },\r\n };\r\n }\r\n }\r\n\r\n return {\r\n success: false,\r\n error: result.error || \"Failed to extract structured data\",\r\n };\r\n}\r\n\r\nexport default {\r\n performOCR,\r\n ocrWithVision,\r\n ocrWithTesseract,\r\n extractStructuredData,\r\n};\r\n"],"mappings":";;;;;;;;AACA,SAAS,gBAAgB;AAUzB,IAAM,kBAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,SAAS,YAAY,UAAiC;AACpD,QAAM,MAAM,SAAS,YAAY,EAAE,MAAM,SAAS,YAAY,GAAG,CAAC;AAClE,SAAO,gBAAgB,GAAG,KAAK;AACjC;AAGA,eAAsB,gBACpB,UACA,QAC8B;AAC9B,MAAI;AACF,UAAM,WAAW,iBAAiB,WAAW;AAC7C,UAAM,WAAW,MAAM,SAAS,cAAc;AAAA,MAC5C,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,KAAK;AAAA,cACP;AAAA,YACF;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,cAAc,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAClE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,aAAa;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAGA,eAAsB,iBACpB,UACA,QAC8B;AAC9B,MAAI;AAEF,QAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,WAAW,YAAY,QAAQ;AACrC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,SAAS,QAAQ;AACzC,UAAM,SAAS,UAAU,SAAS,QAAQ;AAE1C,UAAM,WAAW,iBAAiB,WAAW;AAC7C,UAAM,WAAW,MAAM,SAAS,cAAc;AAAA,MAC5C,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,cAAc,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAClE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,aAAa;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAGA,eAAsB,mBACpB,aACA,UACA,QAC8B;AAC9B,MAAI;AACF,UAAM,SAAS,YAAY,SAAS,QAAQ;AAE5C,UAAM,WAAW,iBAAiB,WAAW;AAC7C,UAAM,WAAW,MAAM,SAAS,cAAc;AAAA,MAC5C,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,cAAc,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAClE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,aAAa;AAAA,IACzB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAGA,eAAsB,aACpB,SAK8B;AAC9B,MAAI,QAAQ,UAAU;AACpB,WAAO,gBAAgB,QAAQ,UAAU,QAAQ,MAAM;AAAA,EACzD;AAEA,MAAI,QAAQ,WAAW;AACrB,WAAO,iBAAiB,QAAQ,WAAW,QAAQ,MAAM;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;;;ACzLA,eAAsB,iBACpB,UACA,WAAmB,OACC;AACpB,MAAI;AACF,UAAM,YAAY,MAAM,OAAO,cAAc;AAC7C,UAAM,SAAS,MAAM,UAAU,aAAa,QAAQ;AACpD,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,UAAU,QAAQ;AAChD,UAAM,OAAO,UAAU;AAEvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,KAAK;AAAA,MACX,YAAY,KAAK,aAAa;AAAA,IAChC;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACxF;AAAA,EACF;AACF;AAGA,eAAsB,cACpB,UACA,UACoB;AACpB,QAAM,SAAS,WACX,oDAAoD,QAAQ,yGAC5D;AAEJ,QAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM;AAEtD,MAAI,OAAO,WAAW,OAAO,UAAU;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,OAAO,SAAS;AAAA,EACzB;AACF;AAGA,eAAsB,UAAU,UAAsC;AACpE,QAAM,SAAS,MAAM,iBAAiB,QAAQ;AAC9C,MAAI,OAAO,WAAW,OAAO,cAAc,OAAO,aAAa,KAAK;AAClE,WAAO;AAAA,EACT;AAEA,SAAO,cAAc,QAAQ;AAC/B;AAGA,eAAsB,OACpB,UACA,OACoB;AAEpB,QAAM,SAAS;AAEf,QAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM;AAEtD,MAAI,OAAO,WAAW,OAAO,UAAU;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,OAAO,SAAS;AAAA,EACzB;AACF;AAGA,eAAsB,WACpB,UACA,SAIoB;AAEpB,MAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,MAAM,SAAS,YAAY,EAAE,MAAM,SAAS,YAAY,GAAG,CAAC;AAGlE,MAAI,QAAQ,QAAQ;AAClB,WAAO,OAAO,QAAQ;AAAA,EACxB;AAGA,MAAI,CAAC,QAAQ,SAAS,QAAQ,QAAQ,SAAS,QAAQ,OAAO,EAAE,SAAS,GAAG,GAAG;AAC7E,QAAI,SAAS,cAAc,OAAO;AAChC,aAAO,cAAc,UAAU,SAAS,QAAQ;AAAA,IAClD;AACA,WAAO,UAAU,QAAQ;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,0BAA0B,GAAG;AAAA,EACtC;AACF;AAGA,eAAsB,sBACpB,UACA,UAKC;AACD,QAAM,UAAkC;AAAA,IACtC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAEA,QAAM,SAAS,WACX,QAAQ,QAAQ,IAChB;AAEJ,QAAM,SAAS,MAAM,iBAAiB,UAAU,MAAM;AAEtD,MAAI,OAAO,WAAW,OAAO,UAAU;AACrC,QAAI;AAEF,YAAM,YAAY,OAAO,SAAS,MAAM,4BAA4B;AACpE,UAAI,WAAW;AACb,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM,KAAK,MAAM,UAAU,CAAC,CAAC;AAAA,QAC/B;AAAA,MACF;AAGA,YAAM,OAAO,KAAK,MAAM,OAAO,QAAQ;AACvC,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B,QAAQ;AAEN,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,EAAE,SAAS,OAAO,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,OAAO,SAAS;AAAA,EACzB;AACF;AAEA,IAAO,cAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
textToSpeech
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-J4JW73TT.js";
|
|
4
4
|
import {
|
|
5
5
|
transcribeAudio
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BNZHWAZC.js";
|
|
7
7
|
import {
|
|
8
8
|
scheduleReminder
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-GJETKBOY.js";
|
|
10
10
|
import {
|
|
11
11
|
chatWithTools
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-ZMML6T63.js";
|
|
13
13
|
import {
|
|
14
14
|
env
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
16
16
|
|
|
17
17
|
// src/inputs/telegram/bot.ts
|
|
18
18
|
import { Bot, session } from "grammy";
|
|
@@ -259,4 +259,4 @@ Send me a message or voice note to get started!`
|
|
|
259
259
|
export {
|
|
260
260
|
createBot
|
|
261
261
|
};
|
|
262
|
-
//# sourceMappingURL=chunk-
|
|
262
|
+
//# sourceMappingURL=chunk-56UJS2LA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/inputs/telegram/bot.ts","../src/inputs/telegram/handlers.ts"],"sourcesContent":["import { Bot, Context, session } from \"grammy\";\nimport { env } from \"../../config/env\";\nimport { handleMessage, handleVoice } from \"./handlers\";\nimport { scheduleReminder } from \"../../core/scheduler\";\n\nexport interface SessionData {\n messages: Array<{ role: \"user\" | \"assistant\"; content: string }>;\n}\n\nexport type OpenSentinelContext = Context & { session: SessionData };\n\nexport function createBot() {\n const bot = new Bot<OpenSentinelContext>(env.TELEGRAM_BOT_TOKEN);\n\n // Session middleware for conversation history\n bot.use(\n session({\n initial: (): SessionData => ({\n messages: [],\n }),\n })\n );\n\n // Only allow configured chat ID\n bot.use(async (ctx, next) => {\n const chatId = ctx.chat?.id?.toString();\n if (chatId !== env.TELEGRAM_CHAT_ID) {\n console.log(`Unauthorized access attempt from chat ID: ${chatId}`);\n return;\n }\n await next();\n });\n\n // Command handlers\n bot.command(\"start\", async (ctx) => {\n await ctx.reply(\n `Hello! I'm OpenSentinel, your personal AI assistant with JARVIS-like capabilities.\n\nI can:\n• Chat and answer questions using Claude AI\n• Execute shell commands on your system\n• Read and write files\n• Search the web\n• Remember important information\n• Set reminders\n\nSend me a message or voice note to get started!`\n );\n });\n\n bot.command(\"clear\", async (ctx) => {\n ctx.session.messages = [];\n await ctx.reply(\"✓ Conversation history cleared.\");\n });\n\n bot.command(\"remind\", async (ctx) => {\n const text = ctx.message?.text?.replace(\"/remind\", \"\").trim();\n\n if (!text) {\n await ctx.reply(\n \"Usage: /remind <time> <message>\\n\\nExamples:\\n• /remind 5m Check the oven\\n• /remind 1h Call mom\\n• /remind 30s Test reminder\"\n );\n return;\n }\n\n // Parse time and message\n const match = text.match(/^(\\d+)(s|m|h)\\s+(.+)$/i);\n if (!match) {\n await ctx.reply(\n \"Invalid format. Use: /remind <number><s/m/h> <message>\\n\\nExample: /remind 5m Check the oven\"\n );\n return;\n }\n\n const [, amount, unit, message] = match;\n const multipliers: Record<string, number> = {\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n };\n const delayMs = parseInt(amount) * multipliers[unit.toLowerCase()];\n\n try {\n await scheduleReminder(message, delayMs, ctx.chat?.id?.toString());\n const timeStr = unit === \"s\" ? \"seconds\" : unit === \"m\" ? \"minutes\" : \"hours\";\n await ctx.reply(`✓ Reminder set for ${amount} ${timeStr}: \"${message}\"`);\n } catch (error) {\n await ctx.reply(\"Sorry, I couldn't set the reminder. Please try again.\");\n }\n });\n\n bot.command(\"help\", async (ctx) => {\n await ctx.reply(\n `*OpenSentinel Commands*\n\n/start - Welcome message\n/clear - Clear conversation history\n/remind <time> <message> - Set a reminder\n/help - Show this help\n\n*Features*\n• Send text messages for AI chat\n• Send voice messages for voice interaction\n• Ask me to run commands, search the web, or manage files\n\n*Examples*\n• \"What's the weather like?\"\n• \"List files in my Downloads folder\"\n• \"Search for the latest news about AI\"\n• /remind 5m Take a break`,\n { parse_mode: \"Markdown\" }\n );\n });\n\n // Message handlers\n bot.on(\"message:text\", handleMessage);\n bot.on(\"message:voice\", handleVoice);\n\n // Error handling\n bot.catch((err) => {\n console.error(\"Bot error:\", err);\n });\n\n return bot;\n}\n","import { InputFile } from \"grammy\";\r\nimport type { OpenSentinelContext as SentinelContext } from \"./bot\";\r\nimport { chatWithTools, type Message } from \"../../core/brain\";\r\nimport { transcribeAudio } from \"../../outputs/stt\";\r\nimport { textToSpeech } from \"../../outputs/tts\";\r\n\r\nconst MAX_HISTORY = 20; // Keep last 20 messages for context\r\n\r\nexport async function handleMessage(ctx: SentinelContext) {\r\n const text = ctx.message?.text;\r\n if (!text) return;\r\n\r\n // Add user message to history\r\n ctx.session.messages.push({ role: \"user\", content: text });\r\n\r\n // Trim history if too long\r\n if (ctx.session.messages.length > MAX_HISTORY) {\r\n ctx.session.messages = ctx.session.messages.slice(-MAX_HISTORY);\r\n }\r\n\r\n // Show typing indicator\r\n await ctx.replyWithChatAction(\"typing\");\r\n\r\n try {\r\n // Use chatWithTools for full capability\r\n const response = await chatWithTools(\r\n ctx.session.messages as Message[],\r\n ctx.chat?.id?.toString(),\r\n async () => {\r\n // Keep typing indicator alive during tool use\r\n await ctx.replyWithChatAction(\"typing\");\r\n }\r\n );\r\n\r\n // Add assistant response to history\r\n ctx.session.messages.push({ role: \"assistant\", content: response.content });\r\n\r\n // Build response with tool usage info\r\n let finalResponse = response.content;\r\n if (response.toolsUsed && response.toolsUsed.length > 0) {\r\n const toolList = [...new Set(response.toolsUsed)].join(\", \");\r\n finalResponse = `🔧 _Used: ${toolList}_\\n\\n${response.content}`;\r\n }\r\n\r\n // Send response (split if too long for Telegram)\r\n await sendResponse(ctx, finalResponse);\r\n\r\n console.log(\r\n `[Telegram] Processed message. Tokens: ${response.inputTokens}/${response.outputTokens}` +\r\n (response.toolsUsed ? ` Tools: ${response.toolsUsed.join(\", \")}` : \"\")\r\n );\r\n } catch (error) {\r\n console.error(\"Error processing message:\", error);\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n if (errMsg.includes(\"credit balance is too low\")) {\r\n await ctx.reply(\r\n \"⚠️ The AI service is temporarily unavailable due to API billing. The admin has been notified.\"\r\n );\r\n } else if (errMsg.includes(\"rate_limit\") || errMsg.includes(\"429\")) {\r\n await ctx.reply(\r\n \"⏳ Too many requests — please wait a moment and try again.\"\r\n );\r\n } else {\r\n await ctx.reply(\r\n \"Sorry, I encountered an error processing your message. Please try again.\"\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport async function handleVoice(ctx: SentinelContext) {\r\n const voice = ctx.message?.voice;\r\n if (!voice) return;\r\n\r\n await ctx.replyWithChatAction(\"typing\");\r\n\r\n try {\r\n // Get voice file\r\n const file = await ctx.getFile();\r\n const fileUrl = `https://api.telegram.org/file/bot${process.env.TELEGRAM_BOT_TOKEN}/${file.file_path}`;\r\n\r\n // Download and transcribe\r\n const response = await fetch(fileUrl);\r\n const audioBuffer = await response.arrayBuffer();\r\n\r\n const transcription = await transcribeAudio(Buffer.from(audioBuffer));\r\n\r\n if (!transcription) {\r\n await ctx.reply(\"Sorry, I couldn't transcribe that voice message.\");\r\n return;\r\n }\r\n\r\n // Show what was transcribed\r\n await ctx.reply(`🎤 _\"${transcription}\"_`, { parse_mode: \"Markdown\" });\r\n\r\n // Process as text message\r\n ctx.session.messages.push({ role: \"user\", content: transcription });\r\n\r\n if (ctx.session.messages.length > MAX_HISTORY) {\r\n ctx.session.messages = ctx.session.messages.slice(-MAX_HISTORY);\r\n }\r\n\r\n await ctx.replyWithChatAction(\"typing\");\r\n\r\n const aiResponse = await chatWithTools(\r\n ctx.session.messages as Message[],\r\n ctx.chat?.id?.toString()\r\n );\r\n ctx.session.messages.push({\r\n role: \"assistant\",\r\n content: aiResponse.content,\r\n });\r\n\r\n // Send text response first\r\n await sendResponse(ctx, aiResponse.content);\r\n\r\n // Also send voice response if text is short enough\r\n if (aiResponse.content.length < 1000 && aiResponse.content.length > 10) {\r\n try {\r\n await ctx.replyWithChatAction(\"record_voice\");\r\n const audioBuffer = await textToSpeech(aiResponse.content);\r\n if (audioBuffer) {\r\n await ctx.replyWithVoice(new InputFile(audioBuffer, \"response.ogg\"));\r\n }\r\n } catch (ttsError) {\r\n console.error(\"TTS error:\", ttsError);\r\n // Don't fail if TTS fails, text was already sent\r\n }\r\n }\r\n\r\n console.log(\r\n `[Telegram] Processed voice message. Tokens: ${aiResponse.inputTokens}/${aiResponse.outputTokens}`\r\n );\r\n } catch (error) {\r\n console.error(\"Error processing voice message:\", error);\r\n await ctx.reply(\r\n \"Sorry, I encountered an error processing your voice message. Please try again.\"\r\n );\r\n }\r\n}\r\n\r\n// Helper to send response, handling Markdown errors\r\nasync function sendResponse(ctx: SentinelContext, text: string) {\r\n const maxLength = 4096;\r\n\r\n // Try with Markdown first\r\n try {\r\n if (text.length <= maxLength) {\r\n await ctx.reply(text, { parse_mode: \"Markdown\" });\r\n } else {\r\n const chunks = splitMessage(text, maxLength);\r\n for (const chunk of chunks) {\r\n await ctx.reply(chunk, { parse_mode: \"Markdown\" });\r\n }\r\n }\r\n } catch {\r\n // If Markdown fails, send as plain text\r\n if (text.length <= maxLength) {\r\n await ctx.reply(text);\r\n } else {\r\n const chunks = splitMessage(text, maxLength);\r\n for (const chunk of chunks) {\r\n await ctx.reply(chunk);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction splitMessage(text: string, maxLength: number): string[] {\r\n const chunks: string[] = [];\r\n let remaining = text;\r\n\r\n while (remaining.length > 0) {\r\n if (remaining.length <= maxLength) {\r\n chunks.push(remaining);\r\n break;\r\n }\r\n\r\n // Find a good break point (newline or space)\r\n let breakPoint = remaining.lastIndexOf(\"\\n\", maxLength);\r\n if (breakPoint === -1 || breakPoint < maxLength / 2) {\r\n breakPoint = remaining.lastIndexOf(\" \", maxLength);\r\n }\r\n if (breakPoint === -1 || breakPoint < maxLength / 2) {\r\n breakPoint = maxLength;\r\n }\r\n\r\n chunks.push(remaining.slice(0, breakPoint));\r\n remaining = remaining.slice(breakPoint).trim();\r\n }\r\n\r\n return chunks;\r\n}\r\n"],"mappings":"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","names":["audioBuffer"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
env
|
|
3
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
4
|
+
import {
|
|
5
|
+
schema_exports
|
|
6
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
7
|
+
|
|
8
|
+
// src/db/index.ts
|
|
9
|
+
import { drizzle } from "drizzle-orm/postgres-js";
|
|
10
|
+
import postgres from "postgres";
|
|
11
|
+
var _client = null;
|
|
12
|
+
var _db = null;
|
|
13
|
+
function getDb() {
|
|
14
|
+
if (!_db) {
|
|
15
|
+
_client = postgres(env.DATABASE_URL);
|
|
16
|
+
_db = drizzle(_client, { schema: schema_exports });
|
|
17
|
+
}
|
|
18
|
+
return _db;
|
|
19
|
+
}
|
|
20
|
+
var db = new Proxy(
|
|
21
|
+
{},
|
|
22
|
+
{
|
|
23
|
+
get(_target, prop) {
|
|
24
|
+
const instance = getDb();
|
|
25
|
+
const value = instance[prop];
|
|
26
|
+
if (typeof value === "function") {
|
|
27
|
+
return value.bind(instance);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
db
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=chunk-5BTVJR7R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/index.ts"],"sourcesContent":["import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport { env } from \"../config/env\";\nimport * as schema from \"./schema\";\n\n// Lazy database connection — created on first access\nlet _client: ReturnType<typeof postgres> | null = null;\nlet _db: ReturnType<typeof drizzle> | null = null;\n\nfunction getDb() {\n if (!_db) {\n _client = postgres(env.DATABASE_URL);\n _db = drizzle(_client, { schema });\n }\n return _db;\n}\n\n// Proxy preserves the `db.select()`, `db.insert()`, `db.execute()` access pattern\n// so all existing consumer files work unchanged.\nexport const db: ReturnType<typeof drizzle<typeof schema>> = new Proxy(\n {} as any,\n {\n get(_target, prop) {\n const instance = getDb();\n const value = (instance as any)[prop];\n if (typeof value === \"function\") {\n return value.bind(instance);\n }\n return value;\n },\n }\n);\n\nexport * from \"./schema\";\n"],"mappings":";;;;;;;;AAAA,SAAS,eAAe;AACxB,OAAO,cAAc;AAKrB,IAAI,UAA8C;AAClD,IAAI,MAAyC;AAE7C,SAAS,QAAQ;AACf,MAAI,CAAC,KAAK;AACR,cAAU,SAAS,IAAI,YAAY;AACnC,UAAM,QAAQ,SAAS,EAAE,uBAAO,CAAC;AAAA,EACnC;AACA,SAAO;AACT;AAIO,IAAM,KAAgD,IAAI;AAAA,EAC/D,CAAC;AAAA,EACD;AAAA,IACE,IAAI,SAAS,MAAM;AACjB,YAAM,WAAW,MAAM;AACvB,YAAM,QAAS,SAAiB,IAAI;AACpC,UAAI,OAAO,UAAU,YAAY;AAC/B,eAAO,MAAM,KAAK,QAAQ;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
|