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.
Files changed (361) hide show
  1. package/README.md +138 -83
  2. package/dist/agent-manager-JZ4IM7XI.js +39 -0
  3. package/dist/agent-processor-DDDHC2SO.js +281 -0
  4. package/dist/agent-processor-DDDHC2SO.js.map +1 -0
  5. package/dist/agent-types-2T4PXLFQ.js +12 -0
  6. package/dist/alerting-LK7VVYTX.js +699 -0
  7. package/dist/alerting-LK7VVYTX.js.map +1 -0
  8. package/dist/analysis-agent-JWN2GXYE.js +288 -0
  9. package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
  10. package/dist/analyzer-OTWE3ARE.js +22 -0
  11. package/dist/{archiver-AVNBYCKQ.js → archiver-FPGKRP6P.js} +2 -2
  12. package/dist/{audit-logger-OBPR7CRO.js → audit-logger-CI4WZQPD.js} +6 -5
  13. package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
  14. package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
  15. package/dist/autonomy-N7W5XPLX.js.map +1 -0
  16. package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
  17. package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
  18. package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
  19. package/dist/bot-VDHBGUVI.js +47 -0
  20. package/dist/brain-6QTXN4QP.js +66 -0
  21. package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
  22. package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
  23. package/dist/{chunk-WRAKK6K6.js → chunk-2I5QHYG6.js} +5 -3
  24. package/dist/chunk-2I5QHYG6.js.map +1 -0
  25. package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
  26. package/dist/chunk-3AWAWRWB.js +143 -0
  27. package/dist/chunk-3AWAWRWB.js.map +1 -0
  28. package/dist/{chunk-ZLZKF2PM.js → chunk-4KIHDIXZ.js} +43 -2
  29. package/dist/chunk-4KIHDIXZ.js.map +1 -0
  30. package/dist/{chunk-EVE7MIIY.js → chunk-4WH6MFEW.js} +15 -16
  31. package/dist/chunk-4WH6MFEW.js.map +1 -0
  32. package/dist/{chunk-I6BDYQIG.js → chunk-56UJS2LA.js} +6 -6
  33. package/dist/chunk-56UJS2LA.js.map +1 -0
  34. package/dist/chunk-5BTVJR7R.js +37 -0
  35. package/dist/chunk-5BTVJR7R.js.map +1 -0
  36. package/dist/chunk-5JJTLWOR.js +1021 -0
  37. package/dist/chunk-5JJTLWOR.js.map +1 -0
  38. package/dist/chunk-66SAOZPU.js +236 -0
  39. package/dist/chunk-66SAOZPU.js.map +1 -0
  40. package/dist/chunk-6HGMRR4J.js +113 -0
  41. package/dist/chunk-6HGMRR4J.js.map +1 -0
  42. package/dist/chunk-6W6PTJFT.js +181 -0
  43. package/dist/chunk-6W6PTJFT.js.map +1 -0
  44. package/dist/chunk-6ZNCY2GI.js +418 -0
  45. package/dist/chunk-6ZNCY2GI.js.map +1 -0
  46. package/dist/chunk-7BNFELEK.js +31 -0
  47. package/dist/chunk-7BNFELEK.js.map +1 -0
  48. package/dist/chunk-ADTDYJO7.js +265 -0
  49. package/dist/chunk-ADTDYJO7.js.map +1 -0
  50. package/dist/{chunk-OCVQGBJK.js → chunk-BBN4VCNK.js} +6 -4
  51. package/dist/chunk-BBN4VCNK.js.map +1 -0
  52. package/dist/{chunk-SJSUSJ47.js → chunk-BNZHWAZC.js} +2 -2
  53. package/dist/chunk-C6PELIHS.js +60 -0
  54. package/dist/chunk-C6PELIHS.js.map +1 -0
  55. package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
  56. package/dist/{chunk-NHMBTUMW.js → chunk-CWT6CAE5.js} +2 -2
  57. package/dist/{chunk-4GLYY4NN.js → chunk-CZTMGHUC.js} +8 -2
  58. package/dist/chunk-CZTMGHUC.js.map +1 -0
  59. package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
  60. package/dist/chunk-DOYGMNMK.js.map +1 -0
  61. package/dist/chunk-DTISLIMB.js +89 -0
  62. package/dist/chunk-DTISLIMB.js.map +1 -0
  63. package/dist/{chunk-SPPMCAKG.js → chunk-GBVJTRXS.js} +2 -2
  64. package/dist/chunk-GBVJTRXS.js.map +1 -0
  65. package/dist/{chunk-AYUKPTSM.js → chunk-GJETKBOY.js} +96 -218
  66. package/dist/chunk-GJETKBOY.js.map +1 -0
  67. package/dist/{chunk-BXZ6EA52.js → chunk-GW6V4D43.js} +57 -3
  68. package/dist/chunk-GW6V4D43.js.map +1 -0
  69. package/dist/{chunk-6PMVAAA7.js → chunk-HJSEEFO3.js} +3 -3
  70. package/dist/{chunk-TYAGMJNV.js → chunk-HQZQFEAX.js} +5 -5
  71. package/dist/{chunk-MXAPLSJ5.js → chunk-J4JW73TT.js} +2 -2
  72. package/dist/{chunk-VEHFVBLI.js → chunk-JHYYFPKX.js} +2 -2
  73. package/dist/chunk-LFDXEYYB.js +150 -0
  74. package/dist/chunk-LFDXEYYB.js.map +1 -0
  75. package/dist/chunk-MIC5IBQF.js +386 -0
  76. package/dist/chunk-MIC5IBQF.js.map +1 -0
  77. package/dist/chunk-ODCFS5WD.js +463 -0
  78. package/dist/chunk-ODCFS5WD.js.map +1 -0
  79. package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
  80. package/dist/chunk-P64EV4YY.js.map +1 -0
  81. package/dist/chunk-PBOCSGNL.js +84 -0
  82. package/dist/chunk-PBOCSGNL.js.map +1 -0
  83. package/dist/{chunk-66OJ3WB4.js → chunk-PD3CTDO6.js} +2 -2
  84. package/dist/chunk-QPY3WRVM.js +647 -0
  85. package/dist/chunk-QPY3WRVM.js.map +1 -0
  86. package/dist/chunk-S2EOIVF4.js +3907 -0
  87. package/dist/chunk-S2EOIVF4.js.map +1 -0
  88. package/dist/chunk-SDLOMKCW.js +213 -0
  89. package/dist/chunk-SDLOMKCW.js.map +1 -0
  90. package/dist/chunk-TKBVW7ZJ.js +162 -0
  91. package/dist/chunk-TKBVW7ZJ.js.map +1 -0
  92. package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
  93. package/dist/chunk-U2X2J3FI.js.map +1 -0
  94. package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
  95. package/dist/{chunk-SVAPX2XN.js → chunk-V3OKHQUX.js} +9 -7
  96. package/dist/{chunk-SVAPX2XN.js.map → chunk-V3OKHQUX.js.map} +1 -1
  97. package/dist/{chunk-4UOE5TUZ.js → chunk-WMDVOWN6.js} +4 -4
  98. package/dist/chunk-WMFYI7XC.js +564 -0
  99. package/dist/chunk-WMFYI7XC.js.map +1 -0
  100. package/dist/chunk-WZAH34TG.js +129 -0
  101. package/dist/chunk-WZAH34TG.js.map +1 -0
  102. package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
  103. package/dist/chunk-X6Q3K3L2.js.map +1 -0
  104. package/dist/chunk-XTX7EK43.js +134 -0
  105. package/dist/chunk-XTX7EK43.js.map +1 -0
  106. package/dist/chunk-YEDEAX6Y.js +194 -0
  107. package/dist/chunk-YEDEAX6Y.js.map +1 -0
  108. package/dist/{chunk-XKYRH4FM.js → chunk-ZIBRVA3Y.js} +70 -30
  109. package/dist/chunk-ZIBRVA3Y.js.map +1 -0
  110. package/dist/chunk-ZIYTHUM5.js +457 -0
  111. package/dist/chunk-ZIYTHUM5.js.map +1 -0
  112. package/dist/{chunk-766ASQWE.js → chunk-ZMML6T63.js} +2711 -2329
  113. package/dist/chunk-ZMML6T63.js.map +1 -0
  114. package/dist/chunk-ZVHG4KF2.js +380 -0
  115. package/dist/chunk-ZVHG4KF2.js.map +1 -0
  116. package/dist/chunker-K6WTR62A.js +12 -0
  117. package/dist/cli.js +1 -1
  118. package/dist/cli.js.map +1 -1
  119. package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
  120. package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
  121. package/dist/coding-agent-DESSU3AC.js +233 -0
  122. package/dist/coding-agent-DESSU3AC.js.map +1 -0
  123. package/dist/commands/setup.js +2 -2
  124. package/dist/commands/start.js +3 -3
  125. package/dist/commands/status.js +2 -2
  126. package/dist/commands/stop.js +2 -2
  127. package/dist/commands/utils.js +2 -2
  128. package/dist/cost-tracker-KZQSTSE2.js +11 -0
  129. package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
  130. package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
  131. package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
  132. package/dist/db-I7MNG6CL.js +83 -0
  133. package/dist/discord-6UQHCN27.js +81 -0
  134. package/dist/documents-PFHSK7SZ.js +184 -0
  135. package/dist/documents-PFHSK7SZ.js.map +1 -0
  136. package/dist/docx-parser-EXL4TN5E.js +16 -0
  137. package/dist/{email-K7LO2IPB.js → email-6OIN4SYL.js} +34 -25
  138. package/dist/email-6OIN4SYL.js.map +1 -0
  139. package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-JWX2HWU4.js} +12 -8
  140. package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
  141. package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
  142. package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-7Z6STVXX.js} +6 -5
  143. package/dist/env-GN5VHI43.js +12 -0
  144. package/dist/error-tracker-64DEH3D7.js +32 -0
  145. package/dist/finnhub-X7ZMQSXF.js +178 -0
  146. package/dist/finnhub-X7ZMQSXF.js.map +1 -0
  147. package/dist/fred-TMUF3J2V.js +203 -0
  148. package/dist/fred-TMUF3J2V.js.map +1 -0
  149. package/dist/github-DUWSXCNP.js +833 -0
  150. package/dist/github-DUWSXCNP.js.map +1 -0
  151. package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
  152. package/dist/graph-client-NB475AK5.js +17 -0
  153. package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
  154. package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
  155. package/dist/hooks-N4MIFBVM.js +14 -0
  156. package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
  157. package/dist/imessage-DSGSGUZS.js +44 -0
  158. package/dist/inbox-summarizer-F2KAU72V.js +56 -0
  159. package/dist/{incident-response-C5J7Q6DT.js → incident-response-E3UGMX5G.js} +8 -6
  160. package/dist/incident-response-E3UGMX5G.js.map +1 -0
  161. package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
  162. package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
  163. package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
  164. package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
  165. package/dist/knowledge-base-5SMMOGQJ.js +46 -0
  166. package/dist/lib.d.ts +94 -1
  167. package/dist/lib.js +83 -66
  168. package/dist/lib.js.map +1 -1
  169. package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
  170. package/dist/{matrix-QVHG76I7.js → matrix-WYGEOZL5.js} +30 -21
  171. package/dist/{matrix-QVHG76I7.js.map → matrix-WYGEOZL5.js.map} +1 -1
  172. package/dist/{mcp-3JI6W7ZE.js → mcp-DJ2QDA6A.js} +3 -3
  173. package/dist/metrics-BH3ZLGEV.js +25 -0
  174. package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
  175. package/dist/multi-user-XAEMB244.js +411 -0
  176. package/dist/multi-user-XAEMB244.js.map +1 -0
  177. package/dist/oauth-UPJYFOVU.js +34 -0
  178. package/dist/{ocr-AC7NPX33.js → ocr-UONKTQU7.js} +6 -4
  179. package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
  180. package/dist/osint-agent-RL5XPBRQ.js +189 -0
  181. package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
  182. package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
  183. package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
  184. package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
  185. package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
  186. package/dist/pdf-parser-YLMTTYHL.js +14 -0
  187. package/dist/{presentations-DSV5IHG5.js → presentations-UOET2FVZ.js} +3 -3
  188. package/dist/presentations-UOET2FVZ.js.map +1 -0
  189. package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
  190. package/dist/prometheus-YETCZO4I.js.map +1 -0
  191. package/dist/{providers-J4LYPHDR.js → providers-2YQ6E3IF.js} +6 -4
  192. package/dist/providers-2YQ6E3IF.js.map +1 -0
  193. package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
  194. package/dist/qr-code-6WZJHRKL.js.map +1 -0
  195. package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
  196. package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
  197. package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
  198. package/dist/research-agent-WCRSY3UZ.js +168 -0
  199. package/dist/research-agent-WCRSY3UZ.js.map +1 -0
  200. package/dist/risk-engine-YKCPT5D5.js +10 -0
  201. package/dist/risk-engine-YKCPT5D5.js.map +1 -0
  202. package/dist/scheduler-6PLLAQI7.js +74 -0
  203. package/dist/scheduler-6PLLAQI7.js.map +1 -0
  204. package/dist/schema-ETY7L2VA.js +78 -0
  205. package/dist/schema-ETY7L2VA.js.map +1 -0
  206. package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
  207. package/dist/search-GMLKBHSW.js.map +1 -0
  208. package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
  209. package/dist/sharepoint-V5P4Q62L.js +30 -0
  210. package/dist/sharepoint-V5P4Q62L.js.map +1 -0
  211. package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
  212. package/dist/signal-7D5EPGVL.js +44 -0
  213. package/dist/signal-7D5EPGVL.js.map +1 -0
  214. package/dist/slack-KSS6YK5Z.js +86 -0
  215. package/dist/slack-KSS6YK5Z.js.map +1 -0
  216. package/dist/{sms-M3JIOTCW.js → sms-CSUCC7HL.js} +4 -4
  217. package/dist/sms-CSUCC7HL.js.map +1 -0
  218. package/dist/{src-VYUE6LRA.js → src-GO7GGW7O.js} +190 -52
  219. package/dist/src-GO7GGW7O.js.map +1 -0
  220. package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
  221. package/dist/stocks-4M4HZWZS.js.map +1 -0
  222. package/dist/text-extractor-OAUBAW5P.js +12 -0
  223. package/dist/text-extractor-OAUBAW5P.js.map +1 -0
  224. package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
  225. package/dist/text-transform-HCLCUDFZ.js.map +1 -0
  226. package/dist/token-store-SEWRX6RE.js +20 -0
  227. package/dist/token-store-SEWRX6RE.js.map +1 -0
  228. package/dist/tools-PJZ6RI4P.js +47 -0
  229. package/dist/tools-PJZ6RI4P.js.map +1 -0
  230. package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
  231. package/dist/tunnel-XOUVVRAK.js.map +1 -0
  232. package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
  233. package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
  234. package/dist/unit-converter-LYPAHU64.js.map +1 -0
  235. package/dist/whatsapp-DWXK25V2.js +44 -0
  236. package/dist/whatsapp-DWXK25V2.js.map +1 -0
  237. package/dist/{word-document-7B6SJMAY.js → word-document-AV3YB4L2.js} +4 -4
  238. package/dist/word-document-AV3YB4L2.js.map +1 -0
  239. package/dist/workflow-store-5Y56GUP7.js +373 -0
  240. package/dist/workflow-store-5Y56GUP7.js.map +1 -0
  241. package/dist/writing-agent-VDGLNOGO.js +243 -0
  242. package/dist/writing-agent-VDGLNOGO.js.map +1 -0
  243. package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
  244. package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
  245. package/drizzle/0002_mushy_master_mold.sql +139 -139
  246. package/drizzle/0003_overjoyed_rhodey.sql +46 -0
  247. package/drizzle/meta/0002_snapshot.json +3636 -3636
  248. package/drizzle/meta/0003_snapshot.json +3946 -0
  249. package/drizzle/meta/_journal.json +7 -0
  250. package/package.json +110 -100
  251. package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
  252. package/dist/bot-QRARP4UN.js +0 -36
  253. package/dist/brain-7XLLM3KC.js +0 -56
  254. package/dist/chunk-4GLYY4NN.js.map +0 -1
  255. package/dist/chunk-766ASQWE.js.map +0 -1
  256. package/dist/chunk-AYUKPTSM.js.map +0 -1
  257. package/dist/chunk-BRBWNV65.js.map +0 -1
  258. package/dist/chunk-BXZ6EA52.js.map +0 -1
  259. package/dist/chunk-EVE7MIIY.js.map +0 -1
  260. package/dist/chunk-H5RQOFO2.js.map +0 -1
  261. package/dist/chunk-I6BDYQIG.js.map +0 -1
  262. package/dist/chunk-IZJMVV7O.js +0 -347
  263. package/dist/chunk-IZJMVV7O.js.map +0 -1
  264. package/dist/chunk-O7IH7JTI.js +0 -1898
  265. package/dist/chunk-O7IH7JTI.js.map +0 -1
  266. package/dist/chunk-OCVQGBJK.js.map +0 -1
  267. package/dist/chunk-RZ4YESBG.js.map +0 -1
  268. package/dist/chunk-SPPMCAKG.js.map +0 -1
  269. package/dist/chunk-VRD5CYRL.js +0 -1568
  270. package/dist/chunk-VRD5CYRL.js.map +0 -1
  271. package/dist/chunk-WRAKK6K6.js.map +0 -1
  272. package/dist/chunk-XKYRH4FM.js.map +0 -1
  273. package/dist/chunk-XMCVRVTF.js.map +0 -1
  274. package/dist/chunk-ZLZKF2PM.js.map +0 -1
  275. package/dist/discord-B3HUPGQ6.js +0 -70
  276. package/dist/dist-UISMLMFN.js +0 -21847
  277. package/dist/dist-UISMLMFN.js.map +0 -1
  278. package/dist/email-K7LO2IPB.js.map +0 -1
  279. package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
  280. package/dist/env-IWXUVTCB.js +0 -12
  281. package/dist/imessage-NGA2XF2V.js +0 -35
  282. package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
  283. package/dist/incident-response-C5J7Q6DT.js.map +0 -1
  284. package/dist/presentations-DSV5IHG5.js.map +0 -1
  285. package/dist/scheduler-VK4WFERV.js +0 -63
  286. package/dist/signal-6CGDFYL2.js +0 -35
  287. package/dist/slack-IZQWIKOH.js +0 -75
  288. package/dist/src-VYUE6LRA.js.map +0 -1
  289. package/dist/tools-2RLEI2N6.js +0 -38
  290. package/dist/tunnel-IWMXUML4.js.map +0 -1
  291. package/dist/whatsapp-LFX6YKCM.js +0 -35
  292. package/dist/word-document-7B6SJMAY.js.map +0 -1
  293. /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-JZ4IM7XI.js.map} +0 -0
  294. /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
  295. /package/dist/{backup-restore-PZ7CYYB7.js.map → analyzer-OTWE3ARE.js.map} +0 -0
  296. /package/dist/{archiver-AVNBYCKQ.js.map → archiver-FPGKRP6P.js.map} +0 -0
  297. /package/dist/{blocks-R3PODY47.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
  298. /package/dist/{bot-QRARP4UN.js.map → auth-PH5IHISW.js.map} +0 -0
  299. /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
  300. /package/dist/{brain-7XLLM3KC.js.map → backup-restore-72OQTZO3.js.map} +0 -0
  301. /package/dist/{chunk-PLDDJCW6.js.map → blocks-YOWOESDD.js.map} +0 -0
  302. /package/dist/{client-ZQSFPMOB.js.map → bot-VDHBGUVI.js.map} +0 -0
  303. /package/dist/{clipboard-manager-TEO2GEDN.js.map → brain-6QTXN4QP.js.map} +0 -0
  304. /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
  305. /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
  306. /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
  307. /package/dist/{chunk-SJSUSJ47.js.map → chunk-BNZHWAZC.js.map} +0 -0
  308. /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
  309. /package/dist/{chunk-NHMBTUMW.js.map → chunk-CWT6CAE5.js.map} +0 -0
  310. /package/dist/{chunk-6PMVAAA7.js.map → chunk-HJSEEFO3.js.map} +0 -0
  311. /package/dist/{chunk-TYAGMJNV.js.map → chunk-HQZQFEAX.js.map} +0 -0
  312. /package/dist/{chunk-MXAPLSJ5.js.map → chunk-J4JW73TT.js.map} +0 -0
  313. /package/dist/{chunk-VEHFVBLI.js.map → chunk-JHYYFPKX.js.map} +0 -0
  314. /package/dist/{chunk-66OJ3WB4.js.map → chunk-PD3CTDO6.js.map} +0 -0
  315. /package/dist/{cron-explain-HHQKPD3M.js.map → chunk-UP2VWCW5.js.map} +0 -0
  316. /package/dist/{chunk-4UOE5TUZ.js.map → chunk-WMDVOWN6.js.map} +0 -0
  317. /package/dist/{crypto-4AP47IKC.js.map → chunker-K6WTR62A.js.map} +0 -0
  318. /package/dist/{databases-37X4CI2Y.js.map → client-FOIYPOZQ.js.map} +0 -0
  319. /package/dist/{discord-B3HUPGQ6.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
  320. /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
  321. /package/dist/{entity-resolution-Y3IUWEAT.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
  322. /package/dist/{env-IWXUVTCB.js.map → crypto-2VG3RJR2.js.map} +0 -0
  323. /package/dist/{hash-tool-ULQYD7B5.js.map → databases-XDPMG5AV.js.map} +0 -0
  324. /package/dist/{heartbeat-monitor-GCISLXI3.js.map → db-I7MNG6CL.js.map} +0 -0
  325. /package/dist/{imessage-NGA2XF2V.js.map → discord-6UQHCN27.js.map} +0 -0
  326. /package/dist/{inbox-summarizer-NRI4S7IF.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
  327. /package/dist/{inventory-manager-352OHXWD.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
  328. /package/dist/{json-tool-QE2SYHEG.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
  329. /package/dist/{key-rotation-DPHU4ZTB.js.map → env-GN5VHI43.js.map} +0 -0
  330. /package/dist/{mcp-3JI6W7ZE.js.map → error-tracker-64DEH3D7.js.map} +0 -0
  331. /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
  332. /package/dist/{ocr-AC7NPX33.js.map → graph-client-NB475AK5.js.map} +0 -0
  333. /package/dist/{ollama-BOAMSPLJ.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
  334. /package/dist/{pages-MI523RB7.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
  335. /package/dist/{pairing-IFQYCPNS.js.map → hooks-N4MIFBVM.js.map} +0 -0
  336. /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
  337. /package/dist/{pdf-ALQVOEJR.js.map → imessage-DSGSGUZS.js.map} +0 -0
  338. /package/dist/{prometheus-JNT2BD4L.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
  339. /package/dist/{providers-J4LYPHDR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
  340. /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
  341. /package/dist/{qr-code-WIX4PB4U.js.map → json-tool-4FK5RNER.js.map} +0 -0
  342. /package/dist/{regex-tool-W4ABRKGK.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
  343. /package/dist/{scheduler-VK4WFERV.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
  344. /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
  345. /package/dist/{search-BCLBO5E3.js.map → mcp-DJ2QDA6A.js.map} +0 -0
  346. /package/dist/{signal-6CGDFYL2.js.map → metrics-BH3ZLGEV.js.map} +0 -0
  347. /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
  348. /package/dist/{slack-IZQWIKOH.js.map → oauth-UPJYFOVU.js.map} +0 -0
  349. /package/dist/{sms-M3JIOTCW.js.map → ocr-UONKTQU7.js.map} +0 -0
  350. /package/dist/{stocks-XXWBPOCU.js.map → ollama-J7CU45WT.js.map} +0 -0
  351. /package/dist/{text-transform-6SGUA5Z4.js.map → pages-XDE7JRCA.js.map} +0 -0
  352. /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
  353. /package/dist/{tools-2RLEI2N6.js.map → pairing-77N47RAT.js.map} +0 -0
  354. /package/dist/{unit-converter-ZYXMEZOE.js.map → pdf-67HGXCFJ.js.map} +0 -0
  355. /package/dist/{whatsapp-LFX6YKCM.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
  356. /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
  357. /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
  358. /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
  359. /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
  360. /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
  361. /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