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,373 @@
|
|
|
1
|
+
import {
|
|
2
|
+
db
|
|
3
|
+
} from "./chunk-5BTVJR7R.js";
|
|
4
|
+
import "./chunk-4KIHDIXZ.js";
|
|
5
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
6
|
+
import "./chunk-UP2VWCW5.js";
|
|
7
|
+
|
|
8
|
+
// src/core/workflows/workflow-store.ts
|
|
9
|
+
import { eq, desc, and, sql } from "drizzle-orm";
|
|
10
|
+
import {
|
|
11
|
+
pgTable,
|
|
12
|
+
text,
|
|
13
|
+
timestamp,
|
|
14
|
+
uuid,
|
|
15
|
+
integer,
|
|
16
|
+
jsonb,
|
|
17
|
+
index
|
|
18
|
+
} from "drizzle-orm/pg-core";
|
|
19
|
+
var workflows = pgTable(
|
|
20
|
+
"workflows",
|
|
21
|
+
{
|
|
22
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
23
|
+
name: text("name").notNull(),
|
|
24
|
+
description: text("description"),
|
|
25
|
+
userId: uuid("user_id"),
|
|
26
|
+
status: text("status").notNull().$type(),
|
|
27
|
+
triggers: jsonb("triggers").notNull().$type(),
|
|
28
|
+
steps: jsonb("steps").notNull(),
|
|
29
|
+
variables: jsonb("variables").$type(),
|
|
30
|
+
metadata: jsonb("metadata").$type(),
|
|
31
|
+
onError: jsonb("on_error"),
|
|
32
|
+
rateLimit: jsonb("rate_limit"),
|
|
33
|
+
tags: jsonb("tags").$type(),
|
|
34
|
+
lastExecutedAt: timestamp("last_executed_at"),
|
|
35
|
+
lastExecutionId: uuid("last_execution_id"),
|
|
36
|
+
lastExecutionStatus: text("last_execution_status").$type(),
|
|
37
|
+
executionCount: integer("execution_count").default(0),
|
|
38
|
+
createdAt: timestamp("created_at").defaultNow().notNull(),
|
|
39
|
+
updatedAt: timestamp("updated_at").defaultNow().notNull()
|
|
40
|
+
},
|
|
41
|
+
(table) => [
|
|
42
|
+
index("workflows_user_idx").on(table.userId),
|
|
43
|
+
index("workflows_status_idx").on(table.status)
|
|
44
|
+
]
|
|
45
|
+
);
|
|
46
|
+
var workflowExecutions = pgTable(
|
|
47
|
+
"workflow_executions",
|
|
48
|
+
{
|
|
49
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
50
|
+
workflowId: uuid("workflow_id").references(() => workflows.id, { onDelete: "cascade" }).notNull(),
|
|
51
|
+
workflowName: text("workflow_name").notNull(),
|
|
52
|
+
status: text("status").notNull().$type(),
|
|
53
|
+
triggerContext: jsonb("trigger_context").notNull(),
|
|
54
|
+
stepResults: jsonb("step_results").notNull(),
|
|
55
|
+
variables: jsonb("variables").$type(),
|
|
56
|
+
error: text("error"),
|
|
57
|
+
durationMs: integer("duration_ms"),
|
|
58
|
+
startedAt: timestamp("started_at").notNull(),
|
|
59
|
+
completedAt: timestamp("completed_at")
|
|
60
|
+
},
|
|
61
|
+
(table) => [
|
|
62
|
+
index("workflow_executions_workflow_idx").on(table.workflowId),
|
|
63
|
+
index("workflow_executions_status_idx").on(table.status),
|
|
64
|
+
index("workflow_executions_started_idx").on(table.startedAt)
|
|
65
|
+
]
|
|
66
|
+
);
|
|
67
|
+
var WorkflowStore = class _WorkflowStore {
|
|
68
|
+
static tableReady = false;
|
|
69
|
+
/**
|
|
70
|
+
* Ensure the workflows and workflow_executions tables exist
|
|
71
|
+
*/
|
|
72
|
+
async ensureTables() {
|
|
73
|
+
if (_WorkflowStore.tableReady) return;
|
|
74
|
+
try {
|
|
75
|
+
await db.execute(sql`
|
|
76
|
+
CREATE TABLE IF NOT EXISTS workflows (
|
|
77
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
78
|
+
name TEXT NOT NULL,
|
|
79
|
+
description TEXT,
|
|
80
|
+
user_id UUID,
|
|
81
|
+
status TEXT NOT NULL,
|
|
82
|
+
triggers JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
83
|
+
steps JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
84
|
+
variables JSONB,
|
|
85
|
+
metadata JSONB,
|
|
86
|
+
on_error JSONB,
|
|
87
|
+
rate_limit JSONB,
|
|
88
|
+
tags JSONB,
|
|
89
|
+
last_executed_at TIMESTAMP,
|
|
90
|
+
last_execution_id UUID,
|
|
91
|
+
last_execution_status TEXT,
|
|
92
|
+
execution_count INTEGER DEFAULT 0,
|
|
93
|
+
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
94
|
+
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
95
|
+
)
|
|
96
|
+
`);
|
|
97
|
+
await db.execute(sql`
|
|
98
|
+
CREATE TABLE IF NOT EXISTS workflow_executions (
|
|
99
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
100
|
+
workflow_id UUID NOT NULL REFERENCES workflows(id) ON DELETE CASCADE,
|
|
101
|
+
workflow_name TEXT NOT NULL,
|
|
102
|
+
status TEXT NOT NULL,
|
|
103
|
+
trigger_context JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
104
|
+
step_results JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
105
|
+
variables JSONB,
|
|
106
|
+
error TEXT,
|
|
107
|
+
duration_ms INTEGER,
|
|
108
|
+
started_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
109
|
+
completed_at TIMESTAMP
|
|
110
|
+
)
|
|
111
|
+
`);
|
|
112
|
+
await db.execute(sql`CREATE INDEX IF NOT EXISTS workflows_user_idx ON workflows(user_id)`);
|
|
113
|
+
await db.execute(sql`CREATE INDEX IF NOT EXISTS workflows_status_idx ON workflows(status)`);
|
|
114
|
+
_WorkflowStore.tableReady = true;
|
|
115
|
+
} catch {
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ============================================
|
|
119
|
+
// WORKFLOW CRUD
|
|
120
|
+
// ============================================
|
|
121
|
+
/**
|
|
122
|
+
* Create a new workflow
|
|
123
|
+
*/
|
|
124
|
+
async createWorkflow(workflow) {
|
|
125
|
+
await this.ensureTables();
|
|
126
|
+
const [created] = await db.insert(workflows).values({
|
|
127
|
+
id: workflow.id,
|
|
128
|
+
name: workflow.name,
|
|
129
|
+
description: workflow.description,
|
|
130
|
+
userId: workflow.userId,
|
|
131
|
+
status: workflow.status,
|
|
132
|
+
triggers: workflow.triggers,
|
|
133
|
+
steps: workflow.steps,
|
|
134
|
+
variables: workflow.variables,
|
|
135
|
+
metadata: workflow.metadata,
|
|
136
|
+
onError: workflow.onError,
|
|
137
|
+
rateLimit: workflow.rateLimit,
|
|
138
|
+
tags: workflow.tags,
|
|
139
|
+
executionCount: workflow.executionCount,
|
|
140
|
+
createdAt: workflow.createdAt,
|
|
141
|
+
updatedAt: workflow.updatedAt
|
|
142
|
+
}).returning();
|
|
143
|
+
return created;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get a workflow by ID
|
|
147
|
+
*/
|
|
148
|
+
async getWorkflow(workflowId) {
|
|
149
|
+
await this.ensureTables();
|
|
150
|
+
const [workflow] = await db.select().from(workflows).where(eq(workflows.id, workflowId)).limit(1);
|
|
151
|
+
return workflow ?? null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get all workflows
|
|
155
|
+
*/
|
|
156
|
+
async getAllWorkflows() {
|
|
157
|
+
await this.ensureTables();
|
|
158
|
+
return db.select().from(workflows).orderBy(desc(workflows.createdAt));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get workflows by user ID
|
|
162
|
+
*/
|
|
163
|
+
async getWorkflowsByUser(userId) {
|
|
164
|
+
return db.select().from(workflows).where(eq(workflows.userId, userId)).orderBy(desc(workflows.createdAt));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get active workflows
|
|
168
|
+
*/
|
|
169
|
+
async getActiveWorkflows() {
|
|
170
|
+
return db.select().from(workflows).where(eq(workflows.status, "active")).orderBy(desc(workflows.createdAt));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get workflows by tags
|
|
174
|
+
*/
|
|
175
|
+
async getWorkflowsByTags(tags) {
|
|
176
|
+
return db.select().from(workflows).where(sql`${workflows.tags} ?| ${tags}`).orderBy(desc(workflows.createdAt));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Update a workflow
|
|
180
|
+
*/
|
|
181
|
+
async updateWorkflow(workflowId, updates) {
|
|
182
|
+
await this.ensureTables();
|
|
183
|
+
const updateData = {
|
|
184
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
185
|
+
};
|
|
186
|
+
if (updates.name !== void 0) updateData.name = updates.name;
|
|
187
|
+
if (updates.description !== void 0) updateData.description = updates.description;
|
|
188
|
+
if (updates.userId !== void 0) updateData.userId = updates.userId;
|
|
189
|
+
if (updates.status !== void 0) updateData.status = updates.status;
|
|
190
|
+
if (updates.triggers !== void 0) updateData.triggers = updates.triggers;
|
|
191
|
+
if (updates.steps !== void 0) updateData.steps = updates.steps;
|
|
192
|
+
if (updates.variables !== void 0) updateData.variables = updates.variables;
|
|
193
|
+
if (updates.metadata !== void 0) updateData.metadata = updates.metadata;
|
|
194
|
+
if (updates.onError !== void 0) updateData.onError = updates.onError;
|
|
195
|
+
if (updates.rateLimit !== void 0) updateData.rateLimit = updates.rateLimit;
|
|
196
|
+
if (updates.tags !== void 0) updateData.tags = updates.tags;
|
|
197
|
+
if (updates.lastExecutedAt !== void 0) updateData.lastExecutedAt = updates.lastExecutedAt;
|
|
198
|
+
if (updates.lastExecutionId !== void 0) updateData.lastExecutionId = updates.lastExecutionId;
|
|
199
|
+
if (updates.lastExecutionStatus !== void 0) updateData.lastExecutionStatus = updates.lastExecutionStatus;
|
|
200
|
+
if (updates.executionCount !== void 0) updateData.executionCount = updates.executionCount;
|
|
201
|
+
const [updated] = await db.update(workflows).set(updateData).where(eq(workflows.id, workflowId)).returning();
|
|
202
|
+
return updated ?? null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Update workflow status
|
|
206
|
+
*/
|
|
207
|
+
async updateWorkflowStatus(workflowId, status) {
|
|
208
|
+
return this.updateWorkflow(workflowId, { status });
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Delete a workflow
|
|
212
|
+
*/
|
|
213
|
+
async deleteWorkflow(workflowId) {
|
|
214
|
+
await this.ensureTables();
|
|
215
|
+
const result = await db.delete(workflows).where(eq(workflows.id, workflowId));
|
|
216
|
+
return (result.rowCount ?? 0) > 0;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Increment execution count
|
|
220
|
+
*/
|
|
221
|
+
async incrementExecutionCount(workflowId) {
|
|
222
|
+
await db.update(workflows).set({
|
|
223
|
+
executionCount: sql`${workflows.executionCount} + 1`,
|
|
224
|
+
lastExecutedAt: /* @__PURE__ */ new Date(),
|
|
225
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
226
|
+
}).where(eq(workflows.id, workflowId));
|
|
227
|
+
}
|
|
228
|
+
// ============================================
|
|
229
|
+
// EXECUTION HISTORY
|
|
230
|
+
// ============================================
|
|
231
|
+
/**
|
|
232
|
+
* Save an execution record
|
|
233
|
+
*/
|
|
234
|
+
async saveExecution(execution) {
|
|
235
|
+
const [saved] = await db.insert(workflowExecutions).values({
|
|
236
|
+
id: execution.id,
|
|
237
|
+
workflowId: execution.workflowId,
|
|
238
|
+
workflowName: execution.workflowName,
|
|
239
|
+
status: execution.status,
|
|
240
|
+
triggerContext: execution.triggerContext,
|
|
241
|
+
stepResults: execution.stepResults,
|
|
242
|
+
variables: execution.variables,
|
|
243
|
+
error: execution.error,
|
|
244
|
+
durationMs: execution.durationMs,
|
|
245
|
+
startedAt: execution.startedAt,
|
|
246
|
+
completedAt: execution.completedAt
|
|
247
|
+
}).returning();
|
|
248
|
+
return saved;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Update an execution record
|
|
252
|
+
*/
|
|
253
|
+
async updateExecution(executionId, updates) {
|
|
254
|
+
const updateData = {};
|
|
255
|
+
if (updates.status !== void 0) updateData.status = updates.status;
|
|
256
|
+
if (updates.stepResults !== void 0) updateData.stepResults = updates.stepResults;
|
|
257
|
+
if (updates.variables !== void 0) updateData.variables = updates.variables;
|
|
258
|
+
if (updates.error !== void 0) updateData.error = updates.error;
|
|
259
|
+
if (updates.durationMs !== void 0) updateData.durationMs = updates.durationMs;
|
|
260
|
+
if (updates.completedAt !== void 0) updateData.completedAt = updates.completedAt;
|
|
261
|
+
const [updated] = await db.update(workflowExecutions).set(updateData).where(eq(workflowExecutions.id, executionId)).returning();
|
|
262
|
+
return updated ?? null;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get an execution by ID
|
|
266
|
+
*/
|
|
267
|
+
async getExecution(executionId) {
|
|
268
|
+
const [execution] = await db.select().from(workflowExecutions).where(eq(workflowExecutions.id, executionId)).limit(1);
|
|
269
|
+
return execution ?? null;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get execution history for a workflow
|
|
273
|
+
*/
|
|
274
|
+
async getExecutionHistory(workflowId, options) {
|
|
275
|
+
let query = db.select().from(workflowExecutions).where(eq(workflowExecutions.workflowId, workflowId)).orderBy(desc(workflowExecutions.startedAt));
|
|
276
|
+
if (options?.status) {
|
|
277
|
+
query = db.select().from(workflowExecutions).where(
|
|
278
|
+
and(
|
|
279
|
+
eq(workflowExecutions.workflowId, workflowId),
|
|
280
|
+
eq(workflowExecutions.status, options.status)
|
|
281
|
+
)
|
|
282
|
+
).orderBy(desc(workflowExecutions.startedAt));
|
|
283
|
+
}
|
|
284
|
+
if (options?.limit) {
|
|
285
|
+
query = query.limit(options.limit);
|
|
286
|
+
}
|
|
287
|
+
if (options?.offset) {
|
|
288
|
+
query = query.offset(options.offset);
|
|
289
|
+
}
|
|
290
|
+
return query;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Get recent executions across all workflows
|
|
294
|
+
*/
|
|
295
|
+
async getRecentExecutions(limit = 50) {
|
|
296
|
+
return db.select().from(workflowExecutions).orderBy(desc(workflowExecutions.startedAt)).limit(limit);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Get execution stats for a workflow
|
|
300
|
+
*/
|
|
301
|
+
async getExecutionStats(workflowId) {
|
|
302
|
+
const result = await db.select({
|
|
303
|
+
total: sql`count(*)::int`,
|
|
304
|
+
completed: sql`count(*) filter (where ${workflowExecutions.status} = 'completed')::int`,
|
|
305
|
+
failed: sql`count(*) filter (where ${workflowExecutions.status} = 'failed')::int`,
|
|
306
|
+
avgDurationMs: sql`avg(${workflowExecutions.durationMs})`
|
|
307
|
+
}).from(workflowExecutions).where(eq(workflowExecutions.workflowId, workflowId));
|
|
308
|
+
return result[0] ?? { total: 0, completed: 0, failed: 0, avgDurationMs: null };
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Delete old executions (cleanup)
|
|
312
|
+
*/
|
|
313
|
+
async deleteOldExecutions(olderThanDays) {
|
|
314
|
+
const cutoffDate = /* @__PURE__ */ new Date();
|
|
315
|
+
cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);
|
|
316
|
+
const result = await db.delete(workflowExecutions).where(sql`${workflowExecutions.startedAt} < ${cutoffDate}`);
|
|
317
|
+
return result.rowCount ?? 0;
|
|
318
|
+
}
|
|
319
|
+
// ============================================
|
|
320
|
+
// CONVERSION HELPERS
|
|
321
|
+
// ============================================
|
|
322
|
+
/**
|
|
323
|
+
* Convert database workflow to domain workflow
|
|
324
|
+
*/
|
|
325
|
+
toWorkflow(dbWorkflow) {
|
|
326
|
+
return {
|
|
327
|
+
id: dbWorkflow.id,
|
|
328
|
+
name: dbWorkflow.name,
|
|
329
|
+
description: dbWorkflow.description ?? void 0,
|
|
330
|
+
userId: dbWorkflow.userId ?? void 0,
|
|
331
|
+
status: dbWorkflow.status,
|
|
332
|
+
triggers: dbWorkflow.triggers,
|
|
333
|
+
steps: dbWorkflow.steps,
|
|
334
|
+
variables: dbWorkflow.variables ?? void 0,
|
|
335
|
+
metadata: dbWorkflow.metadata ?? void 0,
|
|
336
|
+
onError: dbWorkflow.onError,
|
|
337
|
+
rateLimit: dbWorkflow.rateLimit,
|
|
338
|
+
tags: dbWorkflow.tags ?? void 0,
|
|
339
|
+
lastExecutedAt: dbWorkflow.lastExecutedAt ?? void 0,
|
|
340
|
+
lastExecutionId: dbWorkflow.lastExecutionId ?? void 0,
|
|
341
|
+
lastExecutionStatus: dbWorkflow.lastExecutionStatus ?? void 0,
|
|
342
|
+
executionCount: dbWorkflow.executionCount ?? 0,
|
|
343
|
+
createdAt: dbWorkflow.createdAt,
|
|
344
|
+
updatedAt: dbWorkflow.updatedAt
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Convert database execution to domain execution
|
|
349
|
+
*/
|
|
350
|
+
toExecution(dbExecution) {
|
|
351
|
+
return {
|
|
352
|
+
id: dbExecution.id,
|
|
353
|
+
workflowId: dbExecution.workflowId,
|
|
354
|
+
workflowName: dbExecution.workflowName,
|
|
355
|
+
status: dbExecution.status,
|
|
356
|
+
triggerContext: dbExecution.triggerContext,
|
|
357
|
+
stepResults: dbExecution.stepResults,
|
|
358
|
+
variables: dbExecution.variables ?? {},
|
|
359
|
+
error: dbExecution.error ?? void 0,
|
|
360
|
+
durationMs: dbExecution.durationMs ?? void 0,
|
|
361
|
+
startedAt: dbExecution.startedAt,
|
|
362
|
+
completedAt: dbExecution.completedAt ?? void 0
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
var workflowStore = new WorkflowStore();
|
|
367
|
+
export {
|
|
368
|
+
WorkflowStore,
|
|
369
|
+
workflowExecutions,
|
|
370
|
+
workflowStore,
|
|
371
|
+
workflows
|
|
372
|
+
};
|
|
373
|
+
//# sourceMappingURL=workflow-store-5Y56GUP7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/workflows/workflow-store.ts"],"sourcesContent":["/**\r\n * Workflow Store - Persist workflows and executions in the database\r\n */\r\n\r\nimport { db } from \"../../db\";\r\nimport { eq, desc, and, sql } from \"drizzle-orm\";\r\nimport {\r\n pgTable,\r\n text,\r\n timestamp,\r\n uuid,\r\n integer,\r\n jsonb,\r\n boolean,\r\n index,\r\n} from \"drizzle-orm/pg-core\";\r\nimport type { Workflow, WorkflowExecution, WorkflowStatus } from \"./workflow-engine\";\r\nimport type { Trigger } from \"./triggers\";\r\nimport type { Action } from \"./actions\";\r\n\r\n// ============================================\r\n// DATABASE SCHEMA\r\n// ============================================\r\n\r\nexport const workflows = pgTable(\r\n \"workflows\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n name: text(\"name\").notNull(),\r\n description: text(\"description\"),\r\n userId: uuid(\"user_id\"),\r\n status: text(\"status\").notNull().$type<WorkflowStatus>(),\r\n triggers: jsonb(\"triggers\").notNull().$type<Trigger[]>(),\r\n steps: jsonb(\"steps\").notNull(),\r\n variables: jsonb(\"variables\").$type<Record<string, unknown>>(),\r\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\r\n onError: jsonb(\"on_error\"),\r\n rateLimit: jsonb(\"rate_limit\"),\r\n tags: jsonb(\"tags\").$type<string[]>(),\r\n lastExecutedAt: timestamp(\"last_executed_at\"),\r\n lastExecutionId: uuid(\"last_execution_id\"),\r\n lastExecutionStatus: text(\"last_execution_status\").$type<\"success\" | \"failure\" | \"partial\">(),\r\n executionCount: integer(\"execution_count\").default(0),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"workflows_user_idx\").on(table.userId),\r\n index(\"workflows_status_idx\").on(table.status),\r\n ]\r\n);\r\n\r\nexport const workflowExecutions = pgTable(\r\n \"workflow_executions\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n workflowId: uuid(\"workflow_id\")\r\n .references(() => workflows.id, { onDelete: \"cascade\" })\r\n .notNull(),\r\n workflowName: text(\"workflow_name\").notNull(),\r\n status: text(\"status\").notNull().$type<WorkflowExecution[\"status\"]>(),\r\n triggerContext: jsonb(\"trigger_context\").notNull(),\r\n stepResults: jsonb(\"step_results\").notNull(),\r\n variables: jsonb(\"variables\").$type<Record<string, unknown>>(),\r\n error: text(\"error\"),\r\n durationMs: integer(\"duration_ms\"),\r\n startedAt: timestamp(\"started_at\").notNull(),\r\n completedAt: timestamp(\"completed_at\"),\r\n },\r\n (table) => [\r\n index(\"workflow_executions_workflow_idx\").on(table.workflowId),\r\n index(\"workflow_executions_status_idx\").on(table.status),\r\n index(\"workflow_executions_started_idx\").on(table.startedAt),\r\n ]\r\n);\r\n\r\n// ============================================\r\n// TYPES\r\n// ============================================\r\n\r\nexport type DbWorkflow = typeof workflows.$inferSelect;\r\nexport type NewDbWorkflow = typeof workflows.$inferInsert;\r\nexport type DbWorkflowExecution = typeof workflowExecutions.$inferSelect;\r\nexport type NewDbWorkflowExecution = typeof workflowExecutions.$inferInsert;\r\n\r\n// ============================================\r\n// WORKFLOW STORE\r\n// ============================================\r\n\r\nexport class WorkflowStore {\r\n private static tableReady = false;\r\n\r\n /**\r\n * Ensure the workflows and workflow_executions tables exist\r\n */\r\n private async ensureTables(): Promise<void> {\r\n if (WorkflowStore.tableReady) return;\r\n try {\r\n await db.execute(sql`\r\n CREATE TABLE IF NOT EXISTS workflows (\r\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\r\n name TEXT NOT NULL,\r\n description TEXT,\r\n user_id UUID,\r\n status TEXT NOT NULL,\r\n triggers JSONB NOT NULL DEFAULT '[]'::jsonb,\r\n steps JSONB NOT NULL DEFAULT '[]'::jsonb,\r\n variables JSONB,\r\n metadata JSONB,\r\n on_error JSONB,\r\n rate_limit JSONB,\r\n tags JSONB,\r\n last_executed_at TIMESTAMP,\r\n last_execution_id UUID,\r\n last_execution_status TEXT,\r\n execution_count INTEGER DEFAULT 0,\r\n created_at TIMESTAMP NOT NULL DEFAULT NOW(),\r\n updated_at TIMESTAMP NOT NULL DEFAULT NOW()\r\n )\r\n `);\r\n await db.execute(sql`\r\n CREATE TABLE IF NOT EXISTS workflow_executions (\r\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\r\n workflow_id UUID NOT NULL REFERENCES workflows(id) ON DELETE CASCADE,\r\n workflow_name TEXT NOT NULL,\r\n status TEXT NOT NULL,\r\n trigger_context JSONB NOT NULL DEFAULT '{}'::jsonb,\r\n step_results JSONB NOT NULL DEFAULT '[]'::jsonb,\r\n variables JSONB,\r\n error TEXT,\r\n duration_ms INTEGER,\r\n started_at TIMESTAMP NOT NULL DEFAULT NOW(),\r\n completed_at TIMESTAMP\r\n )\r\n `);\r\n await db.execute(sql`CREATE INDEX IF NOT EXISTS workflows_user_idx ON workflows(user_id)`);\r\n await db.execute(sql`CREATE INDEX IF NOT EXISTS workflows_status_idx ON workflows(status)`);\r\n WorkflowStore.tableReady = true;\r\n } catch {\r\n // Tables may already exist or DB may not be available\r\n }\r\n }\r\n\r\n // ============================================\r\n // WORKFLOW CRUD\r\n // ============================================\r\n\r\n /**\r\n * Create a new workflow\r\n */\r\n async createWorkflow(workflow: Workflow): Promise<DbWorkflow> {\r\n await this.ensureTables();\r\n const [created] = await db\r\n .insert(workflows)\r\n .values({\r\n id: workflow.id,\r\n name: workflow.name,\r\n description: workflow.description,\r\n userId: workflow.userId,\r\n status: workflow.status,\r\n triggers: workflow.triggers,\r\n steps: workflow.steps as unknown as ReturnType<typeof jsonb>,\r\n variables: workflow.variables,\r\n metadata: workflow.metadata,\r\n onError: workflow.onError as unknown as ReturnType<typeof jsonb>,\r\n rateLimit: workflow.rateLimit as unknown as ReturnType<typeof jsonb>,\r\n tags: workflow.tags,\r\n executionCount: workflow.executionCount,\r\n createdAt: workflow.createdAt,\r\n updatedAt: workflow.updatedAt,\r\n })\r\n .returning();\r\n\r\n return created;\r\n }\r\n\r\n /**\r\n * Get a workflow by ID\r\n */\r\n async getWorkflow(workflowId: string): Promise<DbWorkflow | null> {\r\n await this.ensureTables();\r\n const [workflow] = await db\r\n .select()\r\n .from(workflows)\r\n .where(eq(workflows.id, workflowId))\r\n .limit(1);\r\n\r\n return workflow ?? null;\r\n }\r\n\r\n /**\r\n * Get all workflows\r\n */\r\n async getAllWorkflows(): Promise<DbWorkflow[]> {\r\n await this.ensureTables();\r\n return db\r\n .select()\r\n .from(workflows)\r\n .orderBy(desc(workflows.createdAt));\r\n }\r\n\r\n /**\r\n * Get workflows by user ID\r\n */\r\n async getWorkflowsByUser(userId: string): Promise<DbWorkflow[]> {\r\n return db\r\n .select()\r\n .from(workflows)\r\n .where(eq(workflows.userId, userId))\r\n .orderBy(desc(workflows.createdAt));\r\n }\r\n\r\n /**\r\n * Get active workflows\r\n */\r\n async getActiveWorkflows(): Promise<DbWorkflow[]> {\r\n return db\r\n .select()\r\n .from(workflows)\r\n .where(eq(workflows.status, \"active\"))\r\n .orderBy(desc(workflows.createdAt));\r\n }\r\n\r\n /**\r\n * Get workflows by tags\r\n */\r\n async getWorkflowsByTags(tags: string[]): Promise<DbWorkflow[]> {\r\n // Use PostgreSQL's array contains operator\r\n return db\r\n .select()\r\n .from(workflows)\r\n .where(sql`${workflows.tags} ?| ${tags}`)\r\n .orderBy(desc(workflows.createdAt));\r\n }\r\n\r\n /**\r\n * Update a workflow\r\n */\r\n async updateWorkflow(\r\n workflowId: string,\r\n updates: Partial<Omit<Workflow, \"id\" | \"createdAt\">>\r\n ): Promise<DbWorkflow | null> {\r\n await this.ensureTables();\r\n const updateData: Record<string, unknown> = {\r\n updatedAt: new Date(),\r\n };\r\n\r\n if (updates.name !== undefined) updateData.name = updates.name;\r\n if (updates.description !== undefined) updateData.description = updates.description;\r\n if (updates.userId !== undefined) updateData.userId = updates.userId;\r\n if (updates.status !== undefined) updateData.status = updates.status;\r\n if (updates.triggers !== undefined) updateData.triggers = updates.triggers;\r\n if (updates.steps !== undefined) updateData.steps = updates.steps;\r\n if (updates.variables !== undefined) updateData.variables = updates.variables;\r\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\r\n if (updates.onError !== undefined) updateData.onError = updates.onError;\r\n if (updates.rateLimit !== undefined) updateData.rateLimit = updates.rateLimit;\r\n if (updates.tags !== undefined) updateData.tags = updates.tags;\r\n if (updates.lastExecutedAt !== undefined) updateData.lastExecutedAt = updates.lastExecutedAt;\r\n if (updates.lastExecutionId !== undefined) updateData.lastExecutionId = updates.lastExecutionId;\r\n if (updates.lastExecutionStatus !== undefined) updateData.lastExecutionStatus = updates.lastExecutionStatus;\r\n if (updates.executionCount !== undefined) updateData.executionCount = updates.executionCount;\r\n\r\n const [updated] = await db\r\n .update(workflows)\r\n .set(updateData)\r\n .where(eq(workflows.id, workflowId))\r\n .returning();\r\n\r\n return updated ?? null;\r\n }\r\n\r\n /**\r\n * Update workflow status\r\n */\r\n async updateWorkflowStatus(\r\n workflowId: string,\r\n status: WorkflowStatus\r\n ): Promise<DbWorkflow | null> {\r\n return this.updateWorkflow(workflowId, { status });\r\n }\r\n\r\n /**\r\n * Delete a workflow\r\n */\r\n async deleteWorkflow(workflowId: string): Promise<boolean> {\r\n await this.ensureTables();\r\n const result = await db\r\n .delete(workflows)\r\n .where(eq(workflows.id, workflowId)) as unknown as { rowCount: number };\r\n\r\n return (result.rowCount ?? 0) > 0;\r\n }\r\n\r\n /**\r\n * Increment execution count\r\n */\r\n async incrementExecutionCount(workflowId: string): Promise<void> {\r\n await db\r\n .update(workflows)\r\n .set({\r\n executionCount: sql`${workflows.executionCount} + 1`,\r\n lastExecutedAt: new Date(),\r\n updatedAt: new Date(),\r\n })\r\n .where(eq(workflows.id, workflowId));\r\n }\r\n\r\n // ============================================\r\n // EXECUTION HISTORY\r\n // ============================================\r\n\r\n /**\r\n * Save an execution record\r\n */\r\n async saveExecution(execution: WorkflowExecution): Promise<DbWorkflowExecution> {\r\n const [saved] = await db\r\n .insert(workflowExecutions)\r\n .values({\r\n id: execution.id,\r\n workflowId: execution.workflowId,\r\n workflowName: execution.workflowName,\r\n status: execution.status,\r\n triggerContext: execution.triggerContext as unknown as ReturnType<typeof jsonb>,\r\n stepResults: execution.stepResults as unknown as ReturnType<typeof jsonb>,\r\n variables: execution.variables,\r\n error: execution.error,\r\n durationMs: execution.durationMs,\r\n startedAt: execution.startedAt,\r\n completedAt: execution.completedAt,\r\n })\r\n .returning();\r\n\r\n return saved;\r\n }\r\n\r\n /**\r\n * Update an execution record\r\n */\r\n async updateExecution(\r\n executionId: string,\r\n updates: Partial<Omit<WorkflowExecution, \"id\" | \"workflowId\" | \"workflowName\" | \"startedAt\">>\r\n ): Promise<DbWorkflowExecution | null> {\r\n const updateData: Record<string, unknown> = {};\r\n\r\n if (updates.status !== undefined) updateData.status = updates.status;\r\n if (updates.stepResults !== undefined) updateData.stepResults = updates.stepResults;\r\n if (updates.variables !== undefined) updateData.variables = updates.variables;\r\n if (updates.error !== undefined) updateData.error = updates.error;\r\n if (updates.durationMs !== undefined) updateData.durationMs = updates.durationMs;\r\n if (updates.completedAt !== undefined) updateData.completedAt = updates.completedAt;\r\n\r\n const [updated] = await db\r\n .update(workflowExecutions)\r\n .set(updateData)\r\n .where(eq(workflowExecutions.id, executionId))\r\n .returning();\r\n\r\n return updated ?? null;\r\n }\r\n\r\n /**\r\n * Get an execution by ID\r\n */\r\n async getExecution(executionId: string): Promise<DbWorkflowExecution | null> {\r\n const [execution] = await db\r\n .select()\r\n .from(workflowExecutions)\r\n .where(eq(workflowExecutions.id, executionId))\r\n .limit(1);\r\n\r\n return execution ?? null;\r\n }\r\n\r\n /**\r\n * Get execution history for a workflow\r\n */\r\n async getExecutionHistory(\r\n workflowId: string,\r\n options?: { limit?: number; offset?: number; status?: WorkflowExecution[\"status\"] }\r\n ): Promise<DbWorkflowExecution[]> {\r\n let query = db\r\n .select()\r\n .from(workflowExecutions)\r\n .where(eq(workflowExecutions.workflowId, workflowId))\r\n .orderBy(desc(workflowExecutions.startedAt));\r\n\r\n if (options?.status) {\r\n query = db\r\n .select()\r\n .from(workflowExecutions)\r\n .where(\r\n and(\r\n eq(workflowExecutions.workflowId, workflowId),\r\n eq(workflowExecutions.status, options.status)\r\n )\r\n )\r\n .orderBy(desc(workflowExecutions.startedAt));\r\n }\r\n\r\n if (options?.limit) {\r\n query = query.limit(options.limit) as typeof query;\r\n }\r\n\r\n if (options?.offset) {\r\n query = query.offset(options.offset) as typeof query;\r\n }\r\n\r\n return query;\r\n }\r\n\r\n /**\r\n * Get recent executions across all workflows\r\n */\r\n async getRecentExecutions(limit = 50): Promise<DbWorkflowExecution[]> {\r\n return db\r\n .select()\r\n .from(workflowExecutions)\r\n .orderBy(desc(workflowExecutions.startedAt))\r\n .limit(limit);\r\n }\r\n\r\n /**\r\n * Get execution stats for a workflow\r\n */\r\n async getExecutionStats(workflowId: string): Promise<{\r\n total: number;\r\n completed: number;\r\n failed: number;\r\n avgDurationMs: number | null;\r\n }> {\r\n const result = await db\r\n .select({\r\n total: sql<number>`count(*)::int`,\r\n completed: sql<number>`count(*) filter (where ${workflowExecutions.status} = 'completed')::int`,\r\n failed: sql<number>`count(*) filter (where ${workflowExecutions.status} = 'failed')::int`,\r\n avgDurationMs: sql<number | null>`avg(${workflowExecutions.durationMs})`,\r\n })\r\n .from(workflowExecutions)\r\n .where(eq(workflowExecutions.workflowId, workflowId));\r\n\r\n return result[0] ?? { total: 0, completed: 0, failed: 0, avgDurationMs: null };\r\n }\r\n\r\n /**\r\n * Delete old executions (cleanup)\r\n */\r\n async deleteOldExecutions(olderThanDays: number): Promise<number> {\r\n const cutoffDate = new Date();\r\n cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);\r\n\r\n const result = await db\r\n .delete(workflowExecutions)\r\n .where(sql`${workflowExecutions.startedAt} < ${cutoffDate}`) as unknown as { rowCount: number };\r\n\r\n return result.rowCount ?? 0;\r\n }\r\n\r\n // ============================================\r\n // CONVERSION HELPERS\r\n // ============================================\r\n\r\n /**\r\n * Convert database workflow to domain workflow\r\n */\r\n toWorkflow(dbWorkflow: DbWorkflow): Workflow {\r\n return {\r\n id: dbWorkflow.id,\r\n name: dbWorkflow.name,\r\n description: dbWorkflow.description ?? undefined,\r\n userId: dbWorkflow.userId ?? undefined,\r\n status: dbWorkflow.status,\r\n triggers: dbWorkflow.triggers as Trigger[],\r\n steps: dbWorkflow.steps as Workflow[\"steps\"],\r\n variables: dbWorkflow.variables ?? undefined,\r\n metadata: dbWorkflow.metadata ?? undefined,\r\n onError: dbWorkflow.onError as Workflow[\"onError\"],\r\n rateLimit: dbWorkflow.rateLimit as Workflow[\"rateLimit\"],\r\n tags: dbWorkflow.tags ?? undefined,\r\n lastExecutedAt: dbWorkflow.lastExecutedAt ?? undefined,\r\n lastExecutionId: dbWorkflow.lastExecutionId ?? undefined,\r\n lastExecutionStatus: dbWorkflow.lastExecutionStatus ?? undefined,\r\n executionCount: dbWorkflow.executionCount ?? 0,\r\n createdAt: dbWorkflow.createdAt,\r\n updatedAt: dbWorkflow.updatedAt,\r\n };\r\n }\r\n\r\n /**\r\n * Convert database execution to domain execution\r\n */\r\n toExecution(dbExecution: DbWorkflowExecution): WorkflowExecution {\r\n return {\r\n id: dbExecution.id,\r\n workflowId: dbExecution.workflowId,\r\n workflowName: dbExecution.workflowName,\r\n status: dbExecution.status,\r\n triggerContext: dbExecution.triggerContext as WorkflowExecution[\"triggerContext\"],\r\n stepResults: dbExecution.stepResults as WorkflowExecution[\"stepResults\"],\r\n variables: dbExecution.variables ?? {},\r\n error: dbExecution.error ?? undefined,\r\n durationMs: dbExecution.durationMs ?? undefined,\r\n startedAt: dbExecution.startedAt,\r\n completedAt: dbExecution.completedAt ?? undefined,\r\n };\r\n }\r\n}\r\n\r\n// Singleton store instance\r\nexport const workflowStore = new WorkflowStore();\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AGENT_SYSTEM_PROMPTS,
|
|
3
|
+
AGENT_TOOL_PERMISSIONS
|
|
4
|
+
} from "./chunk-LFDXEYYB.js";
|
|
5
|
+
import "./chunk-UP2VWCW5.js";
|
|
6
|
+
|
|
7
|
+
// src/core/agents/specialized/writing-agent.ts
|
|
8
|
+
var WRITING_AGENT_CONFIG = {
|
|
9
|
+
type: "writing",
|
|
10
|
+
name: "Writing Agent",
|
|
11
|
+
description: "Specialized agent for content creation and writing tasks",
|
|
12
|
+
systemPrompt: AGENT_SYSTEM_PROMPTS.writing,
|
|
13
|
+
tools: AGENT_TOOL_PERMISSIONS.writing,
|
|
14
|
+
// Writing-specific settings
|
|
15
|
+
settings: {
|
|
16
|
+
maxWordCount: 5e3,
|
|
17
|
+
defaultTone: "professional",
|
|
18
|
+
grammarCheck: true,
|
|
19
|
+
plagiarismCheck: false
|
|
20
|
+
},
|
|
21
|
+
// Writing styles
|
|
22
|
+
styles: {
|
|
23
|
+
professional: {
|
|
24
|
+
tone: "formal",
|
|
25
|
+
vocabulary: "business",
|
|
26
|
+
structure: "clear and organized"
|
|
27
|
+
},
|
|
28
|
+
casual: {
|
|
29
|
+
tone: "conversational",
|
|
30
|
+
vocabulary: "everyday",
|
|
31
|
+
structure: "relaxed"
|
|
32
|
+
},
|
|
33
|
+
academic: {
|
|
34
|
+
tone: "scholarly",
|
|
35
|
+
vocabulary: "technical",
|
|
36
|
+
structure: "rigorous"
|
|
37
|
+
},
|
|
38
|
+
creative: {
|
|
39
|
+
tone: "expressive",
|
|
40
|
+
vocabulary: "varied",
|
|
41
|
+
structure: "flexible"
|
|
42
|
+
},
|
|
43
|
+
technical: {
|
|
44
|
+
tone: "precise",
|
|
45
|
+
vocabulary: "specialized",
|
|
46
|
+
structure: "logical"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var WRITING_TASKS = {
|
|
51
|
+
article: {
|
|
52
|
+
name: "Article",
|
|
53
|
+
description: "Write an informative article",
|
|
54
|
+
structure: ["Headline", "Introduction", "Body Sections", "Conclusion"],
|
|
55
|
+
wordRange: { min: 500, max: 2e3 }
|
|
56
|
+
},
|
|
57
|
+
blogPost: {
|
|
58
|
+
name: "Blog Post",
|
|
59
|
+
description: "Write an engaging blog post",
|
|
60
|
+
structure: ["Title", "Hook", "Main Content", "Call to Action"],
|
|
61
|
+
wordRange: { min: 300, max: 1500 }
|
|
62
|
+
},
|
|
63
|
+
email: {
|
|
64
|
+
name: "Email",
|
|
65
|
+
description: "Write a professional email",
|
|
66
|
+
structure: ["Subject Line", "Greeting", "Body", "Closing", "Signature"],
|
|
67
|
+
wordRange: { min: 50, max: 500 }
|
|
68
|
+
},
|
|
69
|
+
report: {
|
|
70
|
+
name: "Report",
|
|
71
|
+
description: "Write a formal report",
|
|
72
|
+
structure: [
|
|
73
|
+
"Executive Summary",
|
|
74
|
+
"Introduction",
|
|
75
|
+
"Methodology",
|
|
76
|
+
"Findings",
|
|
77
|
+
"Analysis",
|
|
78
|
+
"Recommendations",
|
|
79
|
+
"Conclusion"
|
|
80
|
+
],
|
|
81
|
+
wordRange: { min: 1e3, max: 5e3 }
|
|
82
|
+
},
|
|
83
|
+
documentation: {
|
|
84
|
+
name: "Documentation",
|
|
85
|
+
description: "Write technical documentation",
|
|
86
|
+
structure: ["Overview", "Getting Started", "Usage", "API Reference", "Examples", "FAQ"],
|
|
87
|
+
wordRange: { min: 500, max: 3e3 }
|
|
88
|
+
},
|
|
89
|
+
socialMedia: {
|
|
90
|
+
name: "Social Media",
|
|
91
|
+
description: "Write social media content",
|
|
92
|
+
structure: ["Hook", "Message", "Call to Action", "Hashtags"],
|
|
93
|
+
wordRange: { min: 10, max: 280 }
|
|
94
|
+
},
|
|
95
|
+
script: {
|
|
96
|
+
name: "Script",
|
|
97
|
+
description: "Write a video or presentation script",
|
|
98
|
+
structure: ["Opening", "Main Points", "Transitions", "Closing"],
|
|
99
|
+
wordRange: { min: 200, max: 2e3 }
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
function validateWritingOutput(content, taskType) {
|
|
103
|
+
const issues = [];
|
|
104
|
+
const suggestions = [];
|
|
105
|
+
const words = content.split(/\s+/).filter((w) => w.length > 0);
|
|
106
|
+
const sentences = content.split(/[.!?]+/).filter((s) => s.trim().length > 0);
|
|
107
|
+
const wordCount = words.length;
|
|
108
|
+
const sentenceCount = sentences.length;
|
|
109
|
+
const avgWordsPerSentence = sentenceCount > 0 ? wordCount / sentenceCount : 0;
|
|
110
|
+
const syllables = words.reduce((count, word) => {
|
|
111
|
+
return count + countSyllables(word);
|
|
112
|
+
}, 0);
|
|
113
|
+
const readabilityScore = Math.max(
|
|
114
|
+
0,
|
|
115
|
+
Math.min(100, 206.835 - 1.015 * avgWordsPerSentence - 84.6 * (syllables / wordCount))
|
|
116
|
+
);
|
|
117
|
+
const task = WRITING_TASKS[taskType];
|
|
118
|
+
if (wordCount < task.wordRange.min) {
|
|
119
|
+
issues.push(`Content is too short (${wordCount} words, minimum ${task.wordRange.min})`);
|
|
120
|
+
}
|
|
121
|
+
if (wordCount > task.wordRange.max) {
|
|
122
|
+
suggestions.push(`Content may be too long (${wordCount} words, maximum ${task.wordRange.max})`);
|
|
123
|
+
}
|
|
124
|
+
if (avgWordsPerSentence > 25) {
|
|
125
|
+
suggestions.push("Consider breaking up long sentences for readability");
|
|
126
|
+
}
|
|
127
|
+
const passivePatterns = /\b(was|were|been|being|is|are|am)\s+\w+ed\b/gi;
|
|
128
|
+
const passiveMatches = content.match(passivePatterns);
|
|
129
|
+
if (passiveMatches && passiveMatches.length > 3) {
|
|
130
|
+
suggestions.push("Consider reducing passive voice for more engaging writing");
|
|
131
|
+
}
|
|
132
|
+
const fillerWords = ["very", "really", "just", "actually", "basically", "literally"];
|
|
133
|
+
const fillerCount = fillerWords.reduce((count, word) => {
|
|
134
|
+
const regex = new RegExp(`\\b${word}\\b`, "gi");
|
|
135
|
+
return count + (content.match(regex)?.length || 0);
|
|
136
|
+
}, 0);
|
|
137
|
+
if (fillerCount > 5) {
|
|
138
|
+
suggestions.push("Consider removing filler words for stronger writing");
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
isValid: issues.length === 0,
|
|
142
|
+
issues,
|
|
143
|
+
suggestions,
|
|
144
|
+
metrics: {
|
|
145
|
+
wordCount,
|
|
146
|
+
sentenceCount,
|
|
147
|
+
avgWordsPerSentence: Math.round(avgWordsPerSentence * 10) / 10,
|
|
148
|
+
readabilityScore: Math.round(readabilityScore)
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function countSyllables(word) {
|
|
153
|
+
word = word.toLowerCase();
|
|
154
|
+
if (word.length <= 3) return 1;
|
|
155
|
+
word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, "");
|
|
156
|
+
word = word.replace(/^y/, "");
|
|
157
|
+
const matches = word.match(/[aeiouy]{1,2}/g);
|
|
158
|
+
return matches ? matches.length : 1;
|
|
159
|
+
}
|
|
160
|
+
function generateOutline(taskType, topic) {
|
|
161
|
+
const task = WRITING_TASKS[taskType];
|
|
162
|
+
let outline = `# ${topic}
|
|
163
|
+
|
|
164
|
+
`;
|
|
165
|
+
outline += `Type: ${task.name}
|
|
166
|
+
`;
|
|
167
|
+
outline += `Target Word Count: ${task.wordRange.min}-${task.wordRange.max} words
|
|
168
|
+
|
|
169
|
+
`;
|
|
170
|
+
outline += `## Structure
|
|
171
|
+
|
|
172
|
+
`;
|
|
173
|
+
for (const section of task.structure) {
|
|
174
|
+
outline += `### ${section}
|
|
175
|
+
`;
|
|
176
|
+
outline += `[TODO: Write ${section.toLowerCase()} content]
|
|
177
|
+
|
|
178
|
+
`;
|
|
179
|
+
}
|
|
180
|
+
return outline;
|
|
181
|
+
}
|
|
182
|
+
function buildWritingPrompt(taskType, topic, context) {
|
|
183
|
+
const task = WRITING_TASKS[taskType];
|
|
184
|
+
let prompt = `Writing Task: ${task.name}
|
|
185
|
+
`;
|
|
186
|
+
prompt += `Topic: ${topic}
|
|
187
|
+
`;
|
|
188
|
+
prompt += `Description: ${task.description}
|
|
189
|
+
|
|
190
|
+
`;
|
|
191
|
+
if (context?.style) {
|
|
192
|
+
const style = WRITING_AGENT_CONFIG.styles[context.style];
|
|
193
|
+
prompt += `Style: ${context.style}
|
|
194
|
+
`;
|
|
195
|
+
prompt += `- Tone: ${style.tone}
|
|
196
|
+
`;
|
|
197
|
+
prompt += `- Vocabulary: ${style.vocabulary}
|
|
198
|
+
`;
|
|
199
|
+
prompt += `- Structure: ${style.structure}
|
|
200
|
+
|
|
201
|
+
`;
|
|
202
|
+
}
|
|
203
|
+
if (context?.audience) {
|
|
204
|
+
prompt += `Target Audience: ${context.audience}
|
|
205
|
+
`;
|
|
206
|
+
}
|
|
207
|
+
if (context?.tone) {
|
|
208
|
+
prompt += `Tone: ${context.tone}
|
|
209
|
+
`;
|
|
210
|
+
}
|
|
211
|
+
if (context?.keyPoints?.length) {
|
|
212
|
+
prompt += `
|
|
213
|
+
Key Points to Cover:
|
|
214
|
+
${context.keyPoints.map((p) => `- ${p}`).join("\n")}
|
|
215
|
+
`;
|
|
216
|
+
}
|
|
217
|
+
prompt += `
|
|
218
|
+
Expected Structure:
|
|
219
|
+
${task.structure.map((s) => `- ${s}`).join("\n")}
|
|
220
|
+
`;
|
|
221
|
+
prompt += `
|
|
222
|
+
Word Count Target: ${task.wordRange.min}-${task.wordRange.max} words
|
|
223
|
+
`;
|
|
224
|
+
prompt += `
|
|
225
|
+
Please write this content following your guidelines.`;
|
|
226
|
+
return prompt;
|
|
227
|
+
}
|
|
228
|
+
var writing_agent_default = {
|
|
229
|
+
WRITING_AGENT_CONFIG,
|
|
230
|
+
WRITING_TASKS,
|
|
231
|
+
validateWritingOutput,
|
|
232
|
+
generateOutline,
|
|
233
|
+
buildWritingPrompt
|
|
234
|
+
};
|
|
235
|
+
export {
|
|
236
|
+
WRITING_AGENT_CONFIG,
|
|
237
|
+
WRITING_TASKS,
|
|
238
|
+
buildWritingPrompt,
|
|
239
|
+
writing_agent_default as default,
|
|
240
|
+
generateOutline,
|
|
241
|
+
validateWritingOutput
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=writing-agent-VDGLNOGO.js.map
|