@agenticmail/enterprise 0.5.324 → 0.5.326
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/dist/{agent-heartbeat-77N4OOQL.js → agent-heartbeat-ZFKA6GMI.js} +2 -2
- package/dist/{agent-tools-BNSTIK4P.js → agent-tools-R6RSBDJQ.js} +25 -25
- package/dist/{agenticmail-EDO5XOTP.js → agenticmail-QMWQNUY2.js} +1 -1
- package/dist/{browser-tool-JF3LNRGX.js → browser-tool-4KWE37RL.js} +4 -4
- package/dist/{chunk-JEGYVXYC.js → chunk-CQV7GGHT.js} +1 -1
- package/dist/{chunk-CQYLRIQ3.js → chunk-DWHJYAV6.js} +143 -26
- package/dist/{chunk-HKCKMCPY.js → chunk-G4YSECQ4.js} +2 -2
- package/dist/{chunk-DM7FTF7W.js → chunk-GNABVGDZ.js} +31 -32
- package/dist/{chunk-DMD24UFZ.js → chunk-HTT6LUPP.js} +19 -19
- package/dist/{chunk-3FMK32KQ.js → chunk-LHQP7QRX.js} +9 -9
- package/dist/{chunk-6C5PKREN.js → chunk-NOAQG5CY.js} +1 -1
- package/dist/{chunk-4EKXYIJF.js → chunk-PAHT4ABL.js} +4 -4
- package/dist/{chunk-JNMDD7JY.js → chunk-RHO7WRVJ.js} +5 -5
- package/dist/{chunk-BQM7MBPS.js → chunk-WYDVMFGJ.js} +5 -5
- package/dist/{chunk-TPLVQFXM.js → chunk-X2YL6KSY.js} +13 -13
- package/dist/{cli-agent-USMKX7WN.js → cli-agent-2NBPF3GN.js} +11 -11
- package/dist/{cli-recover-XEZ2SKPU.js → cli-recover-TTOR7CJR.js} +2 -2
- package/dist/{cli-serve-BDGOOOKQ.js → cli-serve-5VFU4GR4.js} +3 -3
- package/dist/{cli-verify-CZIITRED.js → cli-verify-WICBVLAM.js} +2 -2
- package/dist/cli.js +5 -5
- package/dist/{connection-manager-KAWEUWUR.js → connection-manager-Y7CCQK4X.js} +1 -1
- package/dist/dashboard/docs/cluster.html +285 -0
- package/dist/dashboard/pages/cluster.js +400 -69
- package/dist/{deployer-3YK4RPUL.js → deployer-7NG7LCJW.js} +1 -1
- package/dist/{factory-JFWXTAWK.js → factory-4V2W4BSV.js} +1 -1
- package/dist/index.js +9 -9
- package/dist/{integrations-TF4EBCJ7.js → integrations-V2WXFDIV.js} +13 -13
- package/dist/{local-6MLIZDKO.js → local-OXFH4V7E.js} +2 -2
- package/dist/{meeting-voice-intelligence-CJLR52YV.js → meeting-voice-intelligence-RZZCAD6G.js} +2 -2
- package/dist/{meetings-FJ453ENF.js → meetings-SQNTB6GD.js} +1 -1
- package/dist/{microsoft-2IIHDLJB.js → microsoft-2PDVV6HX.js} +3 -3
- package/dist/{postgres-WGUVC2S7.js → postgres-USXBPTHX.js} +2 -2
- package/dist/{pw-ai-IBEF6HBF.js → pw-ai-NK5GKBDG.js} +1 -1
- package/dist/{routes-XYR2RNEC.js → routes-T3CDAQTD.js} +4 -4
- package/dist/{runtime-6BULDBR3.js → runtime-X4BTVICL.js} +1 -1
- package/dist/{server-7NT4LMSQ.js → server-WQ6LLYGB.js} +5 -5
- package/dist/{setup-2JBXMUDS.js → setup-6DRKSOMH.js} +2 -2
- package/dist/{skills-FR7I5V7H.js → skills-EL4RTJKK.js} +1 -1
- package/logs/cloudflared-error.log +14 -0
- package/logs/enterprise-out.log +2 -0
- package/package.json +1 -1
- package/src/admin/routes.ts +1 -1
- package/src/agent-tools/tool-resolver.ts +1 -1
- package/src/agent-tools/tools/agenticmail.ts +2 -2
- package/src/agent-tools/tools/browser.ts +1 -1
- package/src/agent-tools/tools/enterprise-code-sandbox.ts +1 -1
- package/src/agent-tools/tools/enterprise-diff.ts +1 -1
- package/src/agent-tools/tools/enterprise-http.ts +1 -3
- package/src/agent-tools/tools/enterprise-security-scan.ts +1 -1
- package/src/agent-tools/tools/google/forms.ts +2 -2
- package/src/agent-tools/tools/google/gmail.ts +1 -1
- package/src/agent-tools/tools/google/maps.ts +2 -2
- package/src/agent-tools/tools/google/meeting-voice.ts +1 -1
- package/src/agent-tools/tools/google/meetings.ts +1 -1
- package/src/agent-tools/tools/google/slides.ts +2 -2
- package/src/agent-tools/tools/grep.ts +1 -1
- package/src/agent-tools/tools/knowledge-search.ts +1 -1
- package/src/agent-tools/tools/local/coding.ts +5 -5
- package/src/agent-tools/tools/microsoft/excel-vba.ts +1 -1
- package/src/agent-tools/tools/microsoft/excel.ts +1 -1
- package/src/agent-tools/tools/microsoft/powerpoint.ts +1 -1
- package/src/agent-tools/tools/visual-memory/index.ts +11 -11
- package/src/agent-tools/tools/visual-memory/similarity.ts +2 -2
- package/src/agent-tools/tools/visual-memory/storage.ts +1 -1
- package/src/agenticmail/providers/imap.ts +2 -2
- package/src/browser/enterprise-compat.ts +1 -1
- package/src/cli-agent.ts +3 -3
- package/src/cli-serve.ts +1 -1
- package/src/dashboard/docs/cluster.html +285 -0
- package/src/dashboard/pages/cluster.js +400 -69
- package/src/database-access/connection-manager.ts +6 -6
- package/src/database-access/routes.ts +0 -1
- package/src/db/dynamodb.ts +1 -1
- package/src/db/postgres.ts +2 -2
- package/src/deploy/fly.ts +4 -4
- package/src/deploy/managed.ts +0 -1
- package/src/engine/agent-config.ts +1 -1
- package/src/engine/agent-heartbeat.ts +1 -1
- package/src/engine/agent-hierarchy.ts +1 -1
- package/src/engine/agent-memory.ts +1 -1
- package/src/engine/agent-routes.ts +2 -2
- package/src/engine/chat-poller.ts +1 -1
- package/src/engine/cluster.ts +14 -1
- package/src/engine/community-registry.ts +2 -2
- package/src/engine/db-adapter.ts +0 -1
- package/src/engine/deployer.ts +8 -8
- package/src/engine/email-poller.ts +1 -1
- package/src/engine/knowledge-contribution.ts +1 -1
- package/src/engine/knowledge-import/import-manager.ts +2 -3
- package/src/engine/knowledge-import/processors/extract-github.ts +1 -1
- package/src/engine/knowledge-import/processors/extract-sharepoint.ts +1 -1
- package/src/engine/knowledge-import/processors/validate.ts +1 -1
- package/src/engine/lifecycle.ts +1 -1
- package/src/engine/meeting-monitor.ts +2 -2
- package/src/engine/meeting-voice-intelligence.ts +3 -3
- package/src/engine/messaging-poller.ts +2 -2
- package/src/engine/org-integration-routes.ts +2 -2
- package/src/engine/org-integrations.ts +1 -1
- package/src/engine/routes.ts +119 -1
- package/src/engine/skills.ts +1 -1
- package/src/engine/tool-catalog.ts +1 -1
- package/src/engine/vault-routes.ts +1 -1
- package/src/engine/vault.ts +1 -1
- package/src/mcp/adapters/adp.adapter.ts +1 -1
- package/src/mcp/adapters/auth0.adapter.ts +1 -1
- package/src/mcp/adapters/clickup.adapter.ts +1 -1
- package/src/mcp/adapters/close.adapter.ts +1 -1
- package/src/mcp/adapters/firebase.adapter.ts +1 -1
- package/src/mcp/adapters/google-ads.adapter.ts +1 -1
- package/src/mcp/adapters/kubernetes.adapter.ts +1 -1
- package/src/mcp/adapters/mixpanel.adapter.ts +1 -1
- package/src/mcp/adapters/recurly.adapter.ts +1 -1
- package/src/mcp/adapters/sap.adapter.ts +2 -2
- package/src/mcp/adapters/shortcut.adapter.ts +1 -1
- package/src/mcp/adapters/snowflake.adapter.ts +1 -1
- package/src/mcp/adapters/stripe.adapter.ts +1 -1
- package/src/mcp/adapters/supabase.adapter.ts +1 -1
- package/src/mcp/adapters/zuora.adapter.ts +1 -1
- package/src/middleware/request-limits.ts +1 -1
- package/src/runtime/agent-loop.ts +3 -3
- package/src/runtime/compaction.ts +2 -2
- package/src/runtime/followup.ts +1 -1
- package/src/runtime/hooks.ts +3 -3
- package/src/runtime/index.ts +5 -6
- package/src/runtime/llm-client.ts +1 -1
- package/src/runtime/subagent.ts +0 -1
- package/src/runtime/types.ts +2 -0
- package/src/security/brute-force.ts +1 -1
- package/src/security/csp.ts +1 -1
- package/src/security/index.ts +3 -3
- package/src/security/input-sanitizer.ts +1 -1
- package/src/security/threat-logger.ts +2 -2
- package/src/server.ts +2 -2
- package/src/setup/database.ts +1 -1
- package/src/setup/index.ts +1 -2
- package/src/setup/provision.ts +1 -1
- package/dist/_seed-data-FQR5PY2W.js +0 -4554
- package/dist/agent-heartbeat-3FWNHZFX.js +0 -510
- package/dist/agent-heartbeat-4RWHZR7H.js +0 -510
- package/dist/agent-heartbeat-6ZGB5ILY.js +0 -510
- package/dist/agent-heartbeat-BBINFNL4.js +0 -510
- package/dist/agent-heartbeat-BIVHLKFM.js +0 -510
- package/dist/agent-heartbeat-HGVIAHS5.js +0 -510
- package/dist/agent-heartbeat-HRKVFK2T.js +0 -510
- package/dist/agent-heartbeat-JC5GWVXD.js +0 -510
- package/dist/agent-heartbeat-K6A4HMHB.js +0 -510
- package/dist/agent-heartbeat-LCDXWFVB.js +0 -510
- package/dist/agent-heartbeat-P7HZCZAQ.js +0 -510
- package/dist/agent-heartbeat-PUIRSNIO.js +0 -510
- package/dist/agent-heartbeat-SN5ILQ6Y.js +0 -510
- package/dist/agent-heartbeat-TW5YTDYC.js +0 -510
- package/dist/agent-heartbeat-YCSWP54H.js +0 -510
- package/dist/agent-heartbeat-Z2QQXROL.js +0 -510
- package/dist/agent-tools-3W7XLUYA.js +0 -13949
- package/dist/agent-tools-54VZGT6L.js +0 -9
- package/dist/agent-tools-AYYDPO27.js +0 -13949
- package/dist/agent-tools-F2X47FKF.js +0 -13949
- package/dist/agent-tools-O6W3QAZL.js +0 -13949
- package/dist/agent-tools-OAWVZBMW.js +0 -9
- package/dist/agent-tools-QCCU74PN.js +0 -13949
- package/dist/agent-tools-QGE26U6R.js +0 -9
- package/dist/chunk-2LHUARN6.js +0 -4929
- package/dist/chunk-2WVCNCYC.js +0 -5087
- package/dist/chunk-3FM6YQUK.js +0 -5087
- package/dist/chunk-46GOWZT4.js +0 -5087
- package/dist/chunk-5KYJAUZV.js +0 -1519
- package/dist/chunk-6ZMLNEHB.js +0 -1519
- package/dist/chunk-7HBGXW7Z.js +0 -4929
- package/dist/chunk-7UCKD25B.js +0 -551
- package/dist/chunk-BDCFOP7O.js +0 -537
- package/dist/chunk-BPZQT5N5.js +0 -25652
- package/dist/chunk-C52OQNNY.js +0 -5087
- package/dist/chunk-C7HGQF4Y.js +0 -25652
- package/dist/chunk-CAHNZGGK.js +0 -25656
- package/dist/chunk-CK7R6UHE.js +0 -4945
- package/dist/chunk-D36RPWB7.js +0 -25652
- package/dist/chunk-DJK2UPFH.js +0 -4891
- package/dist/chunk-DXZGPUAF.js +0 -5087
- package/dist/chunk-F46WB5IL.js +0 -5087
- package/dist/chunk-F5QG5SQH.js +0 -5087
- package/dist/chunk-GYB2WHMN.js +0 -5101
- package/dist/chunk-H7GP733U.js +0 -5087
- package/dist/chunk-HHBXWB5U.js +0 -25640
- package/dist/chunk-HS5YWSGM.js +0 -3206
- package/dist/chunk-IMXS4N6W.js +0 -1519
- package/dist/chunk-JTV5LA47.js +0 -1519
- package/dist/chunk-KN3T3CTD.js +0 -4929
- package/dist/chunk-KV6G7NZX.js +0 -1519
- package/dist/chunk-M6ZIC5H3.js +0 -1370
- package/dist/chunk-MU5MEBIK.js +0 -1519
- package/dist/chunk-NLT5MC7X.js +0 -465
- package/dist/chunk-NVLYIM4J.js +0 -4945
- package/dist/chunk-NZY2BIZH.js +0 -4891
- package/dist/chunk-O42L6G67.js +0 -1519
- package/dist/chunk-OCNERGGM.js +0 -4891
- package/dist/chunk-OJSNHONE.js +0 -1519
- package/dist/chunk-OWTLNV4Q.js +0 -25623
- package/dist/chunk-PCNYEP6T.js +0 -4891
- package/dist/chunk-PI4AQ4Z6.js +0 -25652
- package/dist/chunk-PN3EGTCA.js +0 -194
- package/dist/chunk-PWWV2U5P.js +0 -195
- package/dist/chunk-Q37UKNRC.js +0 -1519
- package/dist/chunk-QXTC6J7H.js +0 -5087
- package/dist/chunk-RF2LGX3E.js +0 -1519
- package/dist/chunk-RH7KPWRQ.js +0 -465
- package/dist/chunk-RKERL5LZ.js +0 -4925
- package/dist/chunk-RVBK2IOX.js +0 -25652
- package/dist/chunk-SAKODCZ5.js +0 -4891
- package/dist/chunk-SALGFC5L.js +0 -4945
- package/dist/chunk-STGWZ2MS.js +0 -1519
- package/dist/chunk-SVSLIQYN.js +0 -1519
- package/dist/chunk-UY3ZVQDP.js +0 -25652
- package/dist/chunk-V6OSD62M.js +0 -5087
- package/dist/chunk-VP6YAHX4.js +0 -1519
- package/dist/chunk-WDYJOEAI.js +0 -5087
- package/dist/chunk-WEAFQNOS.js +0 -195
- package/dist/chunk-XKUSAZGP.js +0 -5087
- package/dist/chunk-YCWOCIPH.js +0 -5101
- package/dist/chunk-ZGE3XAXY.js +0 -1519
- package/dist/cli-agent-33GWIF2D.js +0 -2300
- package/dist/cli-agent-4XK6LVQQ.js +0 -2357
- package/dist/cli-agent-64EOV3ST.js +0 -2300
- package/dist/cli-agent-67WP6KKO.js +0 -2300
- package/dist/cli-agent-7RW5Y7C4.js +0 -2294
- package/dist/cli-agent-7TB2BWS6.js +0 -2370
- package/dist/cli-agent-AKXFFST2.js +0 -2370
- package/dist/cli-agent-C3YSECO4.js +0 -2344
- package/dist/cli-agent-DZTKLITB.js +0 -2357
- package/dist/cli-agent-FNMDJN7T.js +0 -2357
- package/dist/cli-agent-FOF7PFEP.js +0 -2357
- package/dist/cli-agent-FXZ6DJKP.js +0 -2357
- package/dist/cli-agent-H74M2ZYN.js +0 -2357
- package/dist/cli-agent-HG4Y657I.js +0 -2300
- package/dist/cli-agent-HORWVPHB.js +0 -2370
- package/dist/cli-agent-HSZT6SKF.js +0 -2423
- package/dist/cli-agent-ION2W5JF.js +0 -2441
- package/dist/cli-agent-JLUQ4ZU6.js +0 -2424
- package/dist/cli-agent-KBPWY3CB.js +0 -2302
- package/dist/cli-agent-MVCDH4HV.js +0 -2370
- package/dist/cli-agent-NZXOEPJ2.js +0 -2357
- package/dist/cli-agent-OO6H57UQ.js +0 -2300
- package/dist/cli-agent-PADN3QRC.js +0 -2357
- package/dist/cli-agent-QAYEX3BE.js +0 -2441
- package/dist/cli-agent-QT64DT5J.js +0 -2370
- package/dist/cli-agent-TCTRKCHN.js +0 -2300
- package/dist/cli-agent-TFL2M6UK.js +0 -2424
- package/dist/cli-agent-TSOJG7EX.js +0 -2357
- package/dist/cli-agent-UIKXATTD.js +0 -2357
- package/dist/cli-agent-UJN6FYTO.js +0 -2370
- package/dist/cli-agent-VIQAYVY4.js +0 -2357
- package/dist/cli-agent-WNWFVOFM.js +0 -2370
- package/dist/cli-agent-XBQX67VJ.js +0 -2423
- package/dist/cli-agent-ZLSC6FF4.js +0 -2357
- package/dist/cli-agent-ZSHUPBBN.js +0 -2357
- package/dist/cli-recover-T32NABFA.js +0 -487
- package/dist/cli-serve-2IL5DTEY.js +0 -153
- package/dist/cli-serve-3NGBX5ER.js +0 -140
- package/dist/cli-serve-47N5UKKW.js +0 -153
- package/dist/cli-serve-4RS4UDHC.js +0 -140
- package/dist/cli-serve-4XGZFUV2.js +0 -140
- package/dist/cli-serve-53FVANQK.js +0 -260
- package/dist/cli-serve-57225XWV.js +0 -140
- package/dist/cli-serve-63BDPSOP.js +0 -140
- package/dist/cli-serve-657NRUOX.js +0 -140
- package/dist/cli-serve-6ER7QMLR.js +0 -140
- package/dist/cli-serve-6OT3UEAN.js +0 -140
- package/dist/cli-serve-7JQ4FVUQ.js +0 -260
- package/dist/cli-serve-7L6EY5UH.js +0 -153
- package/dist/cli-serve-BFNIW2LF.js +0 -153
- package/dist/cli-serve-C7MN6U5Q.js +0 -153
- package/dist/cli-serve-CQFI3LMK.js +0 -140
- package/dist/cli-serve-CR3OY3IM.js +0 -153
- package/dist/cli-serve-DAJFRWQ7.js +0 -153
- package/dist/cli-serve-DTQLN5UI.js +0 -140
- package/dist/cli-serve-EQS2SGT3.js +0 -140
- package/dist/cli-serve-FW6FHFW4.js +0 -153
- package/dist/cli-serve-GEEOQS77.js +0 -153
- package/dist/cli-serve-H562I3ZK.js +0 -153
- package/dist/cli-serve-HDQZF4C4.js +0 -153
- package/dist/cli-serve-KBJNXWYJ.js +0 -140
- package/dist/cli-serve-LICAOMEB.js +0 -140
- package/dist/cli-serve-LLGYLWFS.js +0 -153
- package/dist/cli-serve-LMZKQ5GX.js +0 -140
- package/dist/cli-serve-LNTT73P2.js +0 -140
- package/dist/cli-serve-MQKBUZ7X.js +0 -140
- package/dist/cli-serve-N3OISDNB.js +0 -153
- package/dist/cli-serve-NBFT7B42.js +0 -140
- package/dist/cli-serve-RTWO3AWY.js +0 -140
- package/dist/cli-serve-SIHTSW5P.js +0 -140
- package/dist/cli-serve-SP6TEURE.js +0 -140
- package/dist/cli-serve-TDKZA6I5.js +0 -140
- package/dist/cli-serve-TF5ZVVXF.js +0 -140
- package/dist/cli-serve-TIZ27EVR.js +0 -153
- package/dist/cli-serve-TUNI2RCN.js +0 -153
- package/dist/cli-serve-WCU66CHX.js +0 -140
- package/dist/cli-serve-WNOZMAWD.js +0 -153
- package/dist/cli-serve-YCCKRRUY.js +0 -140
- package/dist/cli-serve-ZD5V7I6G.js +0 -140
- package/dist/cli-validate-6XDDLVVQ.js +0 -150
- package/dist/cli-verify-I4WGRQNT.js +0 -149
- package/dist/connection-manager-4ZA4XAFA.js +0 -9
- package/dist/db-adapter-IK2EDK2N.js +0 -7
- package/dist/db-adapter-IRHOUMVC.js +0 -7
- package/dist/dependency-manager-G6D2XXNY.js +0 -11
- package/dist/dependency-manager-OCUKF72T.js +0 -543
- package/dist/dependency-manager-YULUXN34.js +0 -511
- package/dist/factory-MQASIPEB.js +0 -11
- package/dist/google-W5AYGNUJ.js +0 -33
- package/dist/integrations-VWANOHQ4.js +0 -43830
- package/dist/local-O2FN57UN.js +0 -1128
- package/dist/local-S7SDOQHN.js +0 -1128
- package/dist/microsoft-HPLA5ZL5.js +0 -2414
- package/dist/microsoft-UFLZBEAC.js +0 -1619
- package/dist/microsoft-VREAZ7M2.js +0 -3955
- package/dist/microsoft-YUT6EIGP.js +0 -3400
- package/dist/postgres-BOTHOPDW.js +0 -875
- package/dist/routes-3MMLQTB6.js +0 -90
- package/dist/routes-4ZUIJ4HE.js +0 -90
- package/dist/routes-5MXHKKH4.js +0 -90
- package/dist/routes-64NJFK3B.js +0 -90
- package/dist/routes-6AKQ2LBV.js +0 -90
- package/dist/routes-CRRBUDO4.js +0 -90
- package/dist/routes-D7SMYOLT.js +0 -90
- package/dist/routes-DIAF3MC3.js +0 -90
- package/dist/routes-KMUNU6CY.js +0 -90
- package/dist/routes-LRRLXIZR.js +0 -90
- package/dist/routes-N647AJYG.js +0 -90
- package/dist/routes-SSSELAAR.js +0 -90
- package/dist/routes-STERVGKJ.js +0 -90
- package/dist/routes-TZMPYLHJ.js +0 -90
- package/dist/routes-XNK2MAVO.js +0 -90
- package/dist/routes-ZEZZACZP.js +0 -90
- package/dist/runtime-4UVCTFNQ.js +0 -45
- package/dist/runtime-5EQN4GFM.js +0 -45
- package/dist/runtime-5LP7PUD4.js +0 -45
- package/dist/runtime-6YEENDN3.js +0 -45
- package/dist/runtime-7LQFRG3B.js +0 -45
- package/dist/runtime-AMXJU2MB.js +0 -45
- package/dist/runtime-D6WSE7FG.js +0 -45
- package/dist/runtime-EYVN7NFJ.js +0 -45
- package/dist/runtime-F6RPWQVW.js +0 -45
- package/dist/runtime-FYMJURFC.js +0 -45
- package/dist/runtime-GGF4P55M.js +0 -45
- package/dist/runtime-H3SAMWWF.js +0 -45
- package/dist/runtime-H7T4I7I7.js +0 -45
- package/dist/runtime-HTIM7GZR.js +0 -45
- package/dist/runtime-JRNBL4O4.js +0 -45
- package/dist/runtime-K4C7NQLW.js +0 -45
- package/dist/runtime-MWWZCPC2.js +0 -45
- package/dist/runtime-N7CM2DYA.js +0 -45
- package/dist/runtime-OM2NIBMI.js +0 -45
- package/dist/runtime-OVGSOTAH.js +0 -45
- package/dist/runtime-QQ6LAY4U.js +0 -45
- package/dist/runtime-QWPVD7CY.js +0 -45
- package/dist/runtime-SX3B5MG3.js +0 -45
- package/dist/runtime-YLIIPTE4.js +0 -45
- package/dist/runtime-YU6P22CG.js +0 -45
- package/dist/runtime-ZOC337DD.js +0 -45
- package/dist/server-3AVWBRIF.js +0 -28
- package/dist/server-5BKJI5OW.js +0 -28
- package/dist/server-6NDO2S52.js +0 -28
- package/dist/server-7TD3M2BW.js +0 -28
- package/dist/server-AMCSXINC.js +0 -28
- package/dist/server-BEJ6RAGL.js +0 -28
- package/dist/server-BFPYDHBG.js +0 -28
- package/dist/server-BKEWXGVX.js +0 -28
- package/dist/server-BMEJZGFG.js +0 -28
- package/dist/server-CU6LVQS4.js +0 -28
- package/dist/server-DFR7FI3Q.js +0 -28
- package/dist/server-DFYGH2CV.js +0 -28
- package/dist/server-DURRN3GJ.js +0 -28
- package/dist/server-EELWOC3X.js +0 -28
- package/dist/server-EN5E2OWQ.js +0 -28
- package/dist/server-EXZC3OJO.js +0 -28
- package/dist/server-GW2HYJYI.js +0 -28
- package/dist/server-J25NCRWJ.js +0 -28
- package/dist/server-JDGNOTFV.js +0 -28
- package/dist/server-KA6U3YNP.js +0 -28
- package/dist/server-L52A2ME4.js +0 -28
- package/dist/server-NE5HD5DJ.js +0 -28
- package/dist/server-NLQAXPOG.js +0 -28
- package/dist/server-NQOT7W77.js +0 -28
- package/dist/server-OHHAA34U.js +0 -28
- package/dist/server-PWE5PQTR.js +0 -28
- package/dist/server-Q2Q32H2B.js +0 -28
- package/dist/server-Q77ME7TL.js +0 -28
- package/dist/server-QDKO6OVO.js +0 -28
- package/dist/server-RR6QJIXM.js +0 -28
- package/dist/server-T3R6BO6A.js +0 -28
- package/dist/server-TRIBAHDV.js +0 -28
- package/dist/server-TXV3ZVVR.js +0 -28
- package/dist/server-VHSFJP3I.js +0 -28
- package/dist/server-VOJF2XGU.js +0 -28
- package/dist/server-W76YHPEC.js +0 -28
- package/dist/server-WLLH4WST.js +0 -28
- package/dist/server-WTUJ2O3F.js +0 -28
- package/dist/server-X4CJTHHF.js +0 -28
- package/dist/server-XK3ILCJC.js +0 -28
- package/dist/server-ZRD3NDJE.js +0 -28
- package/dist/setup-2JYXGTW6.js +0 -20
- package/dist/setup-3XOSZEW5.js +0 -20
- package/dist/setup-44VBAO4J.js +0 -20
- package/dist/setup-4OA7QNJW.js +0 -20
- package/dist/setup-4ONNQBWB.js +0 -20
- package/dist/setup-4OSBXSCL.js +0 -20
- package/dist/setup-4QFGRBLZ.js +0 -20
- package/dist/setup-52US54Z4.js +0 -20
- package/dist/setup-5CY3CKKT.js +0 -20
- package/dist/setup-6766SGAR.js +0 -20
- package/dist/setup-6NUSB4XO.js +0 -20
- package/dist/setup-7FZJEOD4.js +0 -20
- package/dist/setup-7LYYXBUL.js +0 -20
- package/dist/setup-ADSKKBGV.js +0 -20
- package/dist/setup-AMV2WKVH.js +0 -20
- package/dist/setup-AYY24DKM.js +0 -20
- package/dist/setup-B34N4HPU.js +0 -20
- package/dist/setup-CEF4QY4L.js +0 -20
- package/dist/setup-E2YLC2EY.js +0 -20
- package/dist/setup-ER6NXTY5.js +0 -20
- package/dist/setup-FIOAQJ6C.js +0 -20
- package/dist/setup-G76S7X44.js +0 -20
- package/dist/setup-H2AGCBW5.js +0 -20
- package/dist/setup-H4JZUHH5.js +0 -20
- package/dist/setup-ICOZRKCX.js +0 -20
- package/dist/setup-JFTJH7UF.js +0 -20
- package/dist/setup-JJHOT2ZU.js +0 -20
- package/dist/setup-KEAM2BCL.js +0 -20
- package/dist/setup-LW4MLU2N.js +0 -20
- package/dist/setup-NHAZABW4.js +0 -20
- package/dist/setup-PRFNI6YW.js +0 -20
- package/dist/setup-RAHBMYHE.js +0 -20
- package/dist/setup-T6KYFR7O.js +0 -20
- package/dist/setup-TGM6L362.js +0 -20
- package/dist/setup-TNANAH7C.js +0 -20
- package/dist/setup-TXPR5UQX.js +0 -20
- package/dist/setup-UJSNSCLM.js +0 -20
- package/dist/setup-XCJMELVU.js +0 -20
- package/dist/setup-XIYEIFVK.js +0 -20
- package/dist/setup-XP2VGBEU.js +0 -20
- package/dist/setup-Z4PZSHBI.js +0 -20
- package/dist/skills-HCVBA6PK.js +0 -16
- package/dist/skills-HFSW74KZ.js +0 -16
- package/dist/system-prompts-6OUTAMH6.js +0 -41
- package/dist/task-queue-YP2I54IA.js +0 -9
- package/dist/transport-encryption-F2NQYACT.js +0 -25
- package/seed-data.mjs +0 -455
- package/src/agent-tools/tools/integrations/_seed-data.json +0 -4548
- package/src/agent-tools/tools/integrations/_seed-data.ts +0 -4563
- package/src/engine/NOTE.MD +0 -52
package/src/db/postgres.ts
CHANGED
|
@@ -142,7 +142,7 @@ export class PostgresAdapter extends DatabaseAdapter {
|
|
|
142
142
|
|
|
143
143
|
getEngineDB() {
|
|
144
144
|
if (!this.pool || this.ended) return null;
|
|
145
|
-
const
|
|
145
|
+
const _pool = this.pool;
|
|
146
146
|
const self = this;
|
|
147
147
|
// Convert ? placeholders to $1, $2, ... for pg driver
|
|
148
148
|
const pgSql = (sql: string) => {
|
|
@@ -699,7 +699,7 @@ export class PostgresAdapter extends DatabaseAdapter {
|
|
|
699
699
|
totalAgents: parseInt(agents.rows[0].count, 10),
|
|
700
700
|
activeAgents: parseInt(active.rows[0].count, 10),
|
|
701
701
|
totalUsers: parseInt(users.rows[0].count, 10),
|
|
702
|
-
totalEmails: 0, //
|
|
702
|
+
totalEmails: 0, // Email count tracked externally via AgenticMail
|
|
703
703
|
totalAuditEvents: parseInt(audit.rows[0].count, 10),
|
|
704
704
|
};
|
|
705
705
|
}
|
package/src/deploy/fly.ts
CHANGED
|
@@ -93,10 +93,10 @@ async function createApp(name: string, fly: FlyConfig): Promise<void> {
|
|
|
93
93
|
/**
|
|
94
94
|
* Set secrets (environment variables) on a Fly.io app.
|
|
95
95
|
*/
|
|
96
|
-
async function
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
async function _setSecrets(
|
|
97
|
+
_appName: string,
|
|
98
|
+
_secrets: Record<string, string>,
|
|
99
|
+
_fly: FlyConfig,
|
|
100
100
|
): Promise<void> {
|
|
101
101
|
// Fly Machines API doesn't have a direct "set secrets" endpoint
|
|
102
102
|
// like flyctl does. Secrets are passed as env vars in machine config.
|
package/src/deploy/managed.ts
CHANGED
|
@@ -623,7 +623,7 @@ Check every ${config.heartbeat.intervalMinutes} minutes during active hours.
|
|
|
623
623
|
`;
|
|
624
624
|
}
|
|
625
625
|
|
|
626
|
-
private generateTools(
|
|
626
|
+
private generateTools(_config: AgentConfig): string {
|
|
627
627
|
return `# TOOLS.md — Local Notes
|
|
628
628
|
|
|
629
629
|
_Add environment-specific notes here (camera names, SSH hosts, etc.)_
|
|
@@ -182,7 +182,7 @@ function createUpcomingEventsCheck(): HeartbeatCheck {
|
|
|
182
182
|
check: async (ctx: HeartbeatContext): Promise<HeartbeatCheckResult> => {
|
|
183
183
|
try {
|
|
184
184
|
// Check for calendar events in next 2 hours from agent_memory
|
|
185
|
-
const
|
|
185
|
+
const _twoHoursFromNow = new Date(ctx.now.getTime() + 2 * 60 * 60 * 1000).toISOString();
|
|
186
186
|
const rows = await ctx.db.query<any>(
|
|
187
187
|
`SELECT content FROM agent_memory
|
|
188
188
|
WHERE agent_id = $1
|
|
@@ -893,7 +893,7 @@ export class AgentHierarchyManager {
|
|
|
893
893
|
* If 'email' or 'meeting', management context is minimal.
|
|
894
894
|
* If 'task' or 'management', full context is included.
|
|
895
895
|
*/
|
|
896
|
-
async buildManagerPrompt(agentId: string,
|
|
896
|
+
async buildManagerPrompt(agentId: string, _sessionContext?: string): Promise<string | null> {
|
|
897
897
|
const hierarchy = await this.buildHierarchy();
|
|
898
898
|
const node = hierarchy.get(agentId);
|
|
899
899
|
if (!node) return null;
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import type { EngineDatabase } from './db-adapter.js';
|
|
17
|
-
import { MemorySearchIndex
|
|
17
|
+
import { MemorySearchIndex } from '../lib/text-search.js';
|
|
18
18
|
|
|
19
19
|
function sj(v: string|null|undefined, fb: any = {}): any { if(!v) return fb; try { return JSON.parse(v); } catch { return fb; } }
|
|
20
20
|
// ─── Types ──────────────────────────────────────────────
|
|
@@ -1730,7 +1730,7 @@ export function createAgentRoutes(opts: {
|
|
|
1730
1730
|
|
|
1731
1731
|
// ── Create a realistic browser profile using agent identity ──
|
|
1732
1732
|
const agentName = managed.displayName || managed.display_name || managed.name || (managed.config as any)?.displayName || (managed.config as any)?.name || 'Agent';
|
|
1733
|
-
const
|
|
1733
|
+
const _agentRole = (managed.config as any)?.role || (managed.config as any)?.description || 'AI Assistant';
|
|
1734
1734
|
const profileDir = join(homedir(), '.agenticmail', 'browser-profiles', agentId);
|
|
1735
1735
|
mkdirSync(profileDir, { recursive: true });
|
|
1736
1736
|
|
|
@@ -1885,7 +1885,7 @@ export function createAgentRoutes(opts: {
|
|
|
1885
1885
|
const data = await resp.json() as any;
|
|
1886
1886
|
if (data.webSocketDebuggerUrl) {
|
|
1887
1887
|
try {
|
|
1888
|
-
const
|
|
1888
|
+
const _closeResp = await fetch(`http://127.0.0.1:${port}/json/close`, { method: 'PUT', signal: AbortSignal.timeout(3000) });
|
|
1889
1889
|
closed = true;
|
|
1890
1890
|
} catch { /* fallback to kill */ }
|
|
1891
1891
|
}
|
package/src/engine/cluster.ts
CHANGED
|
@@ -26,7 +26,7 @@ export interface WorkerNode {
|
|
|
26
26
|
name: string;
|
|
27
27
|
host: string; // IP or hostname reachable from control plane
|
|
28
28
|
port: number; // Worker API port
|
|
29
|
-
url: string; // Full base URL (e.g., http://
|
|
29
|
+
url: string; // Full base URL (e.g., http://186.158.1.50:3101)
|
|
30
30
|
platform: string; // darwin, linux, win32
|
|
31
31
|
arch: string; // arm64, x64
|
|
32
32
|
cpuCount: number;
|
|
@@ -113,6 +113,14 @@ export class ClusterManager {
|
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
/** Validate node ID format */
|
|
117
|
+
private validateNodeId(nodeId: string): string | null {
|
|
118
|
+
if (!nodeId || nodeId.length < 2) return 'Node ID must be at least 2 characters';
|
|
119
|
+
if (nodeId.length > 64) return 'Node ID must be at most 64 characters';
|
|
120
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(nodeId)) return 'Node ID must start with alphanumeric and contain only alphanumeric, dots, hyphens, underscores';
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
116
124
|
/** Register or re-register a worker node */
|
|
117
125
|
async register(data: {
|
|
118
126
|
nodeId: string;
|
|
@@ -128,6 +136,11 @@ export class ClusterManager {
|
|
|
128
136
|
capabilities?: string[];
|
|
129
137
|
metadata?: Record<string, any>;
|
|
130
138
|
}): Promise<WorkerNode> {
|
|
139
|
+
// Validate
|
|
140
|
+
const idErr = this.validateNodeId(data.nodeId);
|
|
141
|
+
if (idErr) throw new Error(idErr);
|
|
142
|
+
if (!data.host) throw new Error('host is required');
|
|
143
|
+
if (!data.port || data.port < 1 || data.port > 65535) throw new Error('port must be 1-65535');
|
|
131
144
|
const now = new Date().toISOString();
|
|
132
145
|
const existing = this.nodes.get(data.nodeId);
|
|
133
146
|
const node: WorkerNode = {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import type { EngineDatabase } from './db-adapter.js';
|
|
12
12
|
import type { PermissionEngine, SkillDefinition } from './skills.js';
|
|
13
|
-
import { validateSkillManifest,
|
|
13
|
+
import { validateSkillManifest, VALID_CATEGORIES, type ManifestValidationResult as _MVR } from './skill-validator.js';
|
|
14
14
|
|
|
15
15
|
// ─── Types ──────────────────────────────────────────────
|
|
16
16
|
|
|
@@ -133,7 +133,7 @@ export class CommunitySkillRegistry {
|
|
|
133
133
|
// For simplicity, load installed for all orgs
|
|
134
134
|
// (in production this would be per-org on request)
|
|
135
135
|
try {
|
|
136
|
-
const
|
|
136
|
+
const _rows = await this.engineDb.getInstalledSkillsByOrg('*').catch(() => [] as any[]);
|
|
137
137
|
// Actually load per-org when requested; for startup, just clear
|
|
138
138
|
this.installed.clear();
|
|
139
139
|
} catch {
|
package/src/engine/db-adapter.ts
CHANGED
|
@@ -21,7 +21,6 @@ import type { Organization, OrgPlan } from './tenant.js';
|
|
|
21
21
|
import type { ApprovalRequest, ApprovalPolicy } from './approvals.js';
|
|
22
22
|
import type { KnowledgeBase, KBDocument, KBChunk } from './knowledge.js';
|
|
23
23
|
import type { ActivityEvent, ToolCallRecord, ConversationEntry } from './activity.js';
|
|
24
|
-
import type { AgentConfig } from './agent-config.js';
|
|
25
24
|
import {
|
|
26
25
|
ENGINE_TABLES,
|
|
27
26
|
MIGRATIONS,
|
package/src/engine/deployer.ts
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
import type { AgentConfig, DeploymentTarget, DeploymentStatus } from './agent-config.js';
|
|
11
11
|
import { AgentConfigGenerator } from './agent-config.js';
|
|
12
12
|
import { execSync } from 'child_process';
|
|
13
|
-
import { resolve
|
|
14
|
-
import { existsSync
|
|
13
|
+
import { resolve } from 'path';
|
|
14
|
+
import { existsSync } from 'fs';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Derive PM2 process name from agent config.
|
|
@@ -126,7 +126,7 @@ function generateEcosystemConfig(config: AgentConfig): { script: string; args: s
|
|
|
126
126
|
export class DeploymentEngine {
|
|
127
127
|
private configGen = new AgentConfigGenerator();
|
|
128
128
|
private deployments = new Map<string, DeploymentResult>();
|
|
129
|
-
private
|
|
129
|
+
private _liveStatus = new Map<string, LiveAgentStatus>();
|
|
130
130
|
|
|
131
131
|
/**
|
|
132
132
|
* Deploy an agent to its configured target
|
|
@@ -273,13 +273,13 @@ export class DeploymentEngine {
|
|
|
273
273
|
*/
|
|
274
274
|
async updateConfig(config: AgentConfig): Promise<{ success: boolean; message: string }> {
|
|
275
275
|
const workspace = this.configGen.generateWorkspace(config);
|
|
276
|
-
const
|
|
276
|
+
const _gatewayConfig = this.configGen.generateGatewayConfig(config);
|
|
277
277
|
|
|
278
278
|
switch (config.deployment.target) {
|
|
279
279
|
case 'docker': {
|
|
280
280
|
// Write config files into the container
|
|
281
281
|
for (const [file, content] of Object.entries(workspace)) {
|
|
282
|
-
const
|
|
282
|
+
const _escaped = content.replace(/'/g, "'\\''");
|
|
283
283
|
await this.execCommand(`docker exec agenticmail-${config.name} sh -c 'echo "${Buffer.from(content).toString('base64')}" | base64 -d > /workspace/${file}'`);
|
|
284
284
|
}
|
|
285
285
|
// Restart gateway inside container
|
|
@@ -307,7 +307,7 @@ export class DeploymentEngine {
|
|
|
307
307
|
|
|
308
308
|
// Generate docker-compose
|
|
309
309
|
emit('provision', 'started', 'Generating Docker configuration...');
|
|
310
|
-
const
|
|
310
|
+
const _compose = this.configGen.generateDockerCompose(config);
|
|
311
311
|
emit('provision', 'completed', 'Docker Compose generated');
|
|
312
312
|
|
|
313
313
|
// Generate workspace files
|
|
@@ -897,7 +897,7 @@ export class DeploymentEngine {
|
|
|
897
897
|
}
|
|
898
898
|
}
|
|
899
899
|
|
|
900
|
-
private
|
|
900
|
+
private _generateDockerfile(config: AgentConfig): string {
|
|
901
901
|
return `FROM node:22-slim
|
|
902
902
|
|
|
903
903
|
WORKDIR /app
|
|
@@ -947,7 +947,7 @@ CMD ["agenticmail-enterprise", "start"]
|
|
|
947
947
|
return this.execCommand(`ssh ${sshArgs}`);
|
|
948
948
|
}
|
|
949
949
|
|
|
950
|
-
private async
|
|
950
|
+
private async _writeFile(path: string, content: string): Promise<void> {
|
|
951
951
|
const { writeFile } = await import('fs/promises');
|
|
952
952
|
const { dirname } = await import('path');
|
|
953
953
|
const { mkdir } = await import('fs/promises');
|
|
@@ -258,7 +258,7 @@ export class EmailPoller {
|
|
|
258
258
|
|
|
259
259
|
private async connectMailbox(mailbox: AgentMailbox): Promise<void> {
|
|
260
260
|
// Refresh token
|
|
261
|
-
const
|
|
261
|
+
const _token = await this.refreshToken(mailbox);
|
|
262
262
|
|
|
263
263
|
// Get profile + historyId
|
|
264
264
|
const profile = await this.gmailFetch(mailbox, '/profile');
|
|
@@ -425,7 +425,7 @@ export class KnowledgeContributionManager {
|
|
|
425
425
|
contributors.add(entry.sourceAgentId);
|
|
426
426
|
}
|
|
427
427
|
|
|
428
|
-
private
|
|
428
|
+
private _indexEntryRemove(entry: KnowledgeEntry): void {
|
|
429
429
|
const baseSet = this.baseEntryIndex.get(entry.baseId);
|
|
430
430
|
if (baseSet) { baseSet.delete(entry.id); if (baseSet.size === 0) this.baseEntryIndex.delete(entry.baseId); }
|
|
431
431
|
|
|
@@ -16,7 +16,6 @@ import type {
|
|
|
16
16
|
} from './types.js';
|
|
17
17
|
import { chunkDocument } from './chunker.js';
|
|
18
18
|
import { processDocument } from './processors/pipeline.js';
|
|
19
|
-
import type { ProcessedDocument } from './processors/types.js';
|
|
20
19
|
import { GitHubImportProvider } from './provider-github.js';
|
|
21
20
|
import { SharePointImportProvider } from './provider-sharepoint.js';
|
|
22
21
|
import { GoogleSitesImportProvider } from './provider-google-sites.js';
|
|
@@ -35,8 +34,8 @@ const PROVIDERS: Record<ImportSourceType, ImportProvider> = {
|
|
|
35
34
|
'google-sites': new GoogleSitesImportProvider(),
|
|
36
35
|
'url': new UrlImportProvider(),
|
|
37
36
|
'file-upload': new FileUploadImportProvider(),
|
|
38
|
-
'confluence': new UrlImportProvider(), //
|
|
39
|
-
'notion': new UrlImportProvider(), //
|
|
37
|
+
'confluence': new UrlImportProvider(), // Uses URL-based import; add dedicated API provider when Confluence OAuth is supported
|
|
38
|
+
'notion': new UrlImportProvider(), // Uses URL-based import; add dedicated API provider when Notion OAuth is supported
|
|
40
39
|
};
|
|
41
40
|
|
|
42
41
|
// ─── Source Catalog ──────────────────────────────────
|
|
@@ -11,7 +11,7 @@ import type { ContentExtractor, ExtractResult } from './types.js';
|
|
|
11
11
|
export class GitHubContentExtractor implements ContentExtractor {
|
|
12
12
|
extract(raw: string, sourceUrl?: string): ExtractResult {
|
|
13
13
|
let content = raw;
|
|
14
|
-
const
|
|
14
|
+
const _isReadme = sourceUrl?.toLowerCase().includes('readme') || false;
|
|
15
15
|
|
|
16
16
|
// Remove GitHub badge images at top of README
|
|
17
17
|
content = content.replace(/^\s*(\[!\[[^\]]*\]\([^)]*\)\]\([^)]*\)\s*)+/gm, '');
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import type { ContentExtractor, ExtractResult } from './types.js';
|
|
10
10
|
|
|
11
11
|
export class SharePointContentExtractor implements ContentExtractor {
|
|
12
|
-
extract(raw: string,
|
|
12
|
+
extract(raw: string, _sourceUrl?: string): ExtractResult {
|
|
13
13
|
let content = raw;
|
|
14
14
|
|
|
15
15
|
// If HTML (SharePoint page or Word export)
|
|
@@ -21,7 +21,7 @@ const MIN_SENTENCE_COUNT = 2;
|
|
|
21
21
|
const MAX_DUPLICATE_RATIO = 0.4;
|
|
22
22
|
const MIN_QUALITY_SCORE = 30; // out of 100
|
|
23
23
|
|
|
24
|
-
export function validateContent(content: string,
|
|
24
|
+
export function validateContent(content: string, _title?: string): QualityReport {
|
|
25
25
|
const checks: QualityCheck[] = [];
|
|
26
26
|
const warnings: string[] = [];
|
|
27
27
|
|
package/src/engine/lifecycle.ts
CHANGED
|
@@ -188,7 +188,7 @@ export class AgentLifecycleManager {
|
|
|
188
188
|
/** When true, this lifecycle runs on a standalone agent machine (not the enterprise server).
|
|
189
189
|
* In standalone mode, persistAgent reloads dashboard-managed fields from DB before saving. */
|
|
190
190
|
public standaloneMode = false;
|
|
191
|
-
private
|
|
191
|
+
private _configGen = new AgentConfigGenerator();
|
|
192
192
|
private permissions: PermissionEngine;
|
|
193
193
|
private engineDb?: EngineDatabase;
|
|
194
194
|
private eventListeners: ((event: LifecycleEvent) => void)[] = [];
|
|
@@ -52,8 +52,8 @@ export class MeetingMonitor {
|
|
|
52
52
|
private sendChatIndicator?: (page: Page, text: string) => Promise<void>;
|
|
53
53
|
private flushTimer: ReturnType<typeof setInterval> | null = null;
|
|
54
54
|
private running = false;
|
|
55
|
-
private
|
|
56
|
-
private
|
|
55
|
+
private _lastCaptionCount = 0;
|
|
56
|
+
private _lastChatCount = 0;
|
|
57
57
|
private consecutiveEmpty = 0;
|
|
58
58
|
private consecutiveSendFailures = 0;
|
|
59
59
|
/** Pending captions accumulated across flush cycles (for debouncing) */
|
|
@@ -21,7 +21,7 @@ import { promises as fs } from 'node:fs';
|
|
|
21
21
|
import * as path from 'node:path';
|
|
22
22
|
import * as os from 'node:os';
|
|
23
23
|
|
|
24
|
-
const
|
|
24
|
+
const _ELEVENLABS_BASE = 'https://api.elevenlabs.io/v1';
|
|
25
25
|
|
|
26
26
|
// ═══════════════════════════════════════════════════════════
|
|
27
27
|
// GLOBAL RESPONSE PLAYER KILL
|
|
@@ -221,7 +221,7 @@ export class MeetingVoiceIntelligence {
|
|
|
221
221
|
// ─── Speech State (called by meeting_speak tool) ────────
|
|
222
222
|
|
|
223
223
|
/** Call BEFORE streaming TTS response audio */
|
|
224
|
-
markSpeaking(
|
|
224
|
+
markSpeaking(_text: string): void {
|
|
225
225
|
this._state = 'speaking';
|
|
226
226
|
}
|
|
227
227
|
|
|
@@ -306,7 +306,7 @@ export class MeetingVoiceIntelligence {
|
|
|
306
306
|
hasPendingResume() { return false; }
|
|
307
307
|
async executeResume() { return { success: false, text: '' }; }
|
|
308
308
|
cancelResume() {}
|
|
309
|
-
markDoneSpeaking_legacy(
|
|
309
|
+
markDoneSpeaking_legacy(_completed: boolean) { this.markDoneSpeaking(); }
|
|
310
310
|
|
|
311
311
|
// Legacy — decisionEngine stub
|
|
312
312
|
get decisionEngine() {
|
|
@@ -408,7 +408,7 @@ export class MessagingPoller {
|
|
|
408
408
|
}
|
|
409
409
|
}
|
|
410
410
|
|
|
411
|
-
private async downloadTelegramMedia(agent: AgentEndpoint, fileId: string, mediaType: string, fileName?: string,
|
|
411
|
+
private async downloadTelegramMedia(agent: AgentEndpoint, fileId: string, mediaType: string, fileName?: string, _mimeType?: string): Promise<{ localPath: string } | null> {
|
|
412
412
|
try {
|
|
413
413
|
var channelConfig = this.config.getAgentChannelConfig(agent.id);
|
|
414
414
|
var botToken = channelConfig?.telegram?.botToken;
|
|
@@ -647,7 +647,7 @@ export class MessagingPoller {
|
|
|
647
647
|
|
|
648
648
|
// ─── Security Wrapping ────────────────────────────
|
|
649
649
|
|
|
650
|
-
private wrapCustomerMessage(text: string, senderName: string,
|
|
650
|
+
private wrapCustomerMessage(text: string, senderName: string, _config: any): string {
|
|
651
651
|
return [
|
|
652
652
|
'<<<CUSTOMER_MESSAGE>>>',
|
|
653
653
|
'SECURITY NOTICE: This message is from a CUSTOMER (external, untrusted sender).',
|
|
@@ -185,7 +185,7 @@ export function createOrgIntegrationRoutes(manager: OrgIntegrationManager) {
|
|
|
185
185
|
// ─── Resolve credentials for an agent ─────────────────
|
|
186
186
|
router.get('/resolve/:agentId', async (c) => {
|
|
187
187
|
try {
|
|
188
|
-
const
|
|
188
|
+
const _agentId = c.req.param('agentId');
|
|
189
189
|
const provider = c.req.query('provider') || 'google';
|
|
190
190
|
const orgId = c.req.query('orgId') || null;
|
|
191
191
|
|
|
@@ -288,7 +288,7 @@ export function createOrgIntegrationRoutes(manager: OrgIntegrationManager) {
|
|
|
288
288
|
});
|
|
289
289
|
|
|
290
290
|
if (!tokenRes.ok) {
|
|
291
|
-
const
|
|
291
|
+
const _err = await tokenRes.text();
|
|
292
292
|
return c.html(`<script>window.opener?.postMessage({type:'org-oauth-result',status:'error',message:'Token exchange failed: ${tokenRes.status}'},'*');window.close();</script>`);
|
|
293
293
|
}
|
|
294
294
|
|
|
@@ -427,7 +427,7 @@ export class OrgIntegrationManager {
|
|
|
427
427
|
* Used by Google Workspace and Microsoft tools at runtime.
|
|
428
428
|
*/
|
|
429
429
|
async createTokenProviderForAgent(
|
|
430
|
-
|
|
430
|
+
_agentId: string,
|
|
431
431
|
agentOrgId: string | null,
|
|
432
432
|
provider: 'google' | 'microsoft',
|
|
433
433
|
onTokenRefresh?: (tokens: any) => void
|
package/src/engine/routes.ts
CHANGED
|
@@ -343,6 +343,124 @@ engine.get('/cluster/best-node', (c) => {
|
|
|
343
343
|
const node = cluster.findBestNode(caps);
|
|
344
344
|
return node ? c.json(node) : c.json({ error: 'No suitable node available' }, 404);
|
|
345
345
|
});
|
|
346
|
+
engine.post('/cluster/test-connection', async (c) => {
|
|
347
|
+
const { host, port } = await c.req.json();
|
|
348
|
+
if (!host) return c.json({ error: 'host required' }, 400);
|
|
349
|
+
const p = port || 3101;
|
|
350
|
+
const start = Date.now();
|
|
351
|
+
try {
|
|
352
|
+
const ctrl = new AbortController();
|
|
353
|
+
const timeout = setTimeout(() => ctrl.abort(), 5000);
|
|
354
|
+
const res = await fetch(`http://${host}:${p}/health`, { signal: ctrl.signal }).catch(() => null);
|
|
355
|
+
clearTimeout(timeout);
|
|
356
|
+
if (res && res.ok) {
|
|
357
|
+
const data = await res.json().catch(() => ({}));
|
|
358
|
+
return c.json({ success: true, latencyMs: Date.now() - start, version: data.version, agentId: data.agentId });
|
|
359
|
+
}
|
|
360
|
+
// Try the enterprise status endpoint as fallback
|
|
361
|
+
const ctrl2 = new AbortController();
|
|
362
|
+
const timeout2 = setTimeout(() => ctrl2.abort(), 5000);
|
|
363
|
+
const res2 = await fetch(`http://${host}:${p}/api/status`, { signal: ctrl2.signal }).catch(() => null);
|
|
364
|
+
clearTimeout(timeout2);
|
|
365
|
+
if (res2 && res2.ok) {
|
|
366
|
+
return c.json({ success: true, latencyMs: Date.now() - start, version: 'enterprise' });
|
|
367
|
+
}
|
|
368
|
+
return c.json({ success: false, error: 'No response from ' + host + ':' + p, latencyMs: Date.now() - start });
|
|
369
|
+
} catch (e: any) {
|
|
370
|
+
return c.json({ success: false, error: e.message || 'Connection failed', latencyMs: Date.now() - start });
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
engine.post('/cluster/deploy-via-ssh', async (c) => {
|
|
375
|
+
const body = await c.req.json();
|
|
376
|
+
if (!body.host) return c.json({ error: 'host required' }, 400);
|
|
377
|
+
// Use the deployment engine's SSH infrastructure
|
|
378
|
+
try {
|
|
379
|
+
const dbUrl = process.env.DATABASE_URL || '';
|
|
380
|
+
const enterpriseUrl = process.env.ENTERPRISE_URL || `http://${body.host}:${body.port || 3101}`;
|
|
381
|
+
const nodeId = body.name?.toLowerCase().replace(/[^a-z0-9-]/g, '-') || 'worker-' + body.host.replace(/\./g, '-');
|
|
382
|
+
|
|
383
|
+
// Build remote setup script
|
|
384
|
+
const script = [
|
|
385
|
+
'#!/bin/bash',
|
|
386
|
+
'set -e',
|
|
387
|
+
'export NVM_DIR="$HOME/.nvm"',
|
|
388
|
+
'[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"',
|
|
389
|
+
'',
|
|
390
|
+
'# Install Node.js if not present',
|
|
391
|
+
'if ! command -v node &> /dev/null; then',
|
|
392
|
+
' if command -v apt-get &> /dev/null; then',
|
|
393
|
+
' curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -',
|
|
394
|
+
' sudo apt-get install -y nodejs',
|
|
395
|
+
' elif command -v brew &> /dev/null; then',
|
|
396
|
+
' brew install node',
|
|
397
|
+
' fi',
|
|
398
|
+
'fi',
|
|
399
|
+
'',
|
|
400
|
+
'# Install PM2 and AgenticMail',
|
|
401
|
+
'npm install -g pm2 @agenticmail/enterprise',
|
|
402
|
+
'',
|
|
403
|
+
'# Write env file',
|
|
404
|
+
'mkdir -p ~/.agenticmail',
|
|
405
|
+
`cat > ~/.agenticmail/worker.env << 'ENVEOF'`,
|
|
406
|
+
`ENTERPRISE_URL=${enterpriseUrl}`,
|
|
407
|
+
`WORKER_NODE_ID=${nodeId}`,
|
|
408
|
+
`WORKER_NAME="${body.name || nodeId}"`,
|
|
409
|
+
`DATABASE_URL=${dbUrl}`,
|
|
410
|
+
`PORT=${body.port || 3101}`,
|
|
411
|
+
'LOG_LEVEL=warn',
|
|
412
|
+
'ENVEOF',
|
|
413
|
+
'',
|
|
414
|
+
'# Start agents via PM2',
|
|
415
|
+
...(body.agentIds || []).map((id: string, i: number) =>
|
|
416
|
+
`pm2 start "$(which agenticmail-enterprise || echo npx @agenticmail/enterprise) agent --id ${id}" --name "agent-${i}" --env ~/.agenticmail/worker.env`
|
|
417
|
+
),
|
|
418
|
+
'pm2 save',
|
|
419
|
+
'echo "DEPLOY_SUCCESS"',
|
|
420
|
+
].join('\n');
|
|
421
|
+
|
|
422
|
+
const { execSync } = await import('child_process');
|
|
423
|
+
const sshTarget = `${body.user || 'root'}@${body.host}`;
|
|
424
|
+
const keyOpt = body.privateKey ? `-i /tmp/_am_ssh_key_${Date.now()}` : '';
|
|
425
|
+
|
|
426
|
+
if (body.privateKey) {
|
|
427
|
+
const { writeFileSync, chmodSync } = await import('fs');
|
|
428
|
+
const keyPath = `/tmp/_am_ssh_key_${Date.now()}`;
|
|
429
|
+
writeFileSync(keyPath, body.privateKey, { mode: 0o600 });
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const scriptB64 = Buffer.from(script).toString('base64');
|
|
433
|
+
const sshCmd = `ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${keyOpt} ${sshTarget} "echo '${scriptB64}' | base64 -d | bash"`;
|
|
434
|
+
|
|
435
|
+
// Run async — don't block the request
|
|
436
|
+
const { exec } = await import('child_process');
|
|
437
|
+
exec(sshCmd, { timeout: 120_000 }, (err, stdout, _stderr) => {
|
|
438
|
+
if (err) {
|
|
439
|
+
console.warn(`[cluster] SSH deploy to ${body.host} failed:`, err.message);
|
|
440
|
+
} else if (stdout.includes('DEPLOY_SUCCESS')) {
|
|
441
|
+
console.log(`[cluster] SSH deploy to ${body.host} succeeded`);
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
return c.json({ message: 'Deployment started via SSH to ' + sshTarget + '. Check the Cluster page for the node to appear.', nodeId });
|
|
446
|
+
} catch (e: any) {
|
|
447
|
+
return c.json({ error: 'SSH deploy failed: ' + e.message }, 500);
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
engine.post('/cluster/nodes/:nodeId/restart', async (c) => {
|
|
452
|
+
const node = cluster.getNode(c.req.param('nodeId'));
|
|
453
|
+
if (!node) return c.json({ error: 'Node not found' }, 404);
|
|
454
|
+
try {
|
|
455
|
+
const ctrl = new AbortController();
|
|
456
|
+
setTimeout(() => ctrl.abort(), 10000);
|
|
457
|
+
await fetch(`${node.url}/restart`, { method: 'POST', signal: ctrl.signal }).catch(() => {});
|
|
458
|
+
return c.json({ ok: true, message: 'Restart signal sent to ' + node.name });
|
|
459
|
+
} catch (e: any) {
|
|
460
|
+
return c.json({ error: e.message }, 500);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
|
|
346
464
|
engine.get('/cluster/stream', (c) => {
|
|
347
465
|
const stream = new ReadableStream({
|
|
348
466
|
start(controller) {
|
|
@@ -350,7 +468,7 @@ engine.get('/cluster/stream', (c) => {
|
|
|
350
468
|
const send = (d: string) => { try { controller.enqueue(encoder.encode(`data: ${d}\n\n`)); } catch { unsub(); } };
|
|
351
469
|
// Send current state
|
|
352
470
|
for (const n of cluster.getAllNodes()) send(JSON.stringify({ type: 'node', event: 'snapshot', ...n }));
|
|
353
|
-
const unsub = cluster.subscribe((
|
|
471
|
+
const unsub = cluster.subscribe((_nodeId, node, event) => send(JSON.stringify({ type: 'node', event, ...node })));
|
|
354
472
|
const hb = setInterval(() => send(JSON.stringify({ type: 'heartbeat' })), 30_000);
|
|
355
473
|
c.req.raw.signal.addEventListener('abort', () => { unsub(); clearInterval(hb); });
|
|
356
474
|
},
|
package/src/engine/skills.ts
CHANGED
|
@@ -575,7 +575,7 @@ export class PermissionEngine {
|
|
|
575
575
|
return this._checkApproval(profile, toolId, tool);
|
|
576
576
|
}
|
|
577
577
|
|
|
578
|
-
private _checkApproval(profile: AgentPermissionProfile,
|
|
578
|
+
private _checkApproval(profile: AgentPermissionProfile, _toolId: string, tool?: ToolDefinition): PermissionResult {
|
|
579
579
|
if (!profile.requireApproval.enabled) {
|
|
580
580
|
return { allowed: true, reason: 'Permitted', requiresApproval: false };
|
|
581
581
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import type { ToolDefinition, SkillCategory, RiskLevel, SideEffect } from './skills.js';
|
|
14
|
-
import { M365_TOOLS as M365_SKILL_TOOLS, GWS_TOOLS as GWS_SKILL_TOOLS, ENTERPRISE_UTILITY_TOOLS, AGENTICMAIL_TOOLS as
|
|
14
|
+
import { M365_TOOLS as M365_SKILL_TOOLS, GWS_TOOLS as GWS_SKILL_TOOLS, ENTERPRISE_UTILITY_TOOLS, AGENTICMAIL_TOOLS as _AGENTICMAIL_SKILL_TOOLS, SYSTEM_TOOLS } from './skills/index.js';
|
|
15
15
|
|
|
16
16
|
// ─── Core Platform Tools ────────────────────────────────
|
|
17
17
|
|
|
@@ -7,7 +7,7 @@ import { Hono } from 'hono';
|
|
|
7
7
|
import type { SecureVault } from './vault.js';
|
|
8
8
|
import type { DLPEngine } from './dlp.js';
|
|
9
9
|
|
|
10
|
-
export function createVaultRoutes(vault: SecureVault,
|
|
10
|
+
export function createVaultRoutes(vault: SecureVault, _dlp?: DLPEngine) {
|
|
11
11
|
const router = new Hono();
|
|
12
12
|
|
|
13
13
|
// ─── Secrets CRUD ────────────────────────────────────
|
package/src/engine/vault.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Master key from AGENTICMAIL_VAULT_KEY env var.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { randomBytes, createCipheriv, createDecipheriv, pbkdf2Sync } from 'crypto';
|
|
12
12
|
import type { EngineDatabase } from './db-adapter.js';
|
|
13
13
|
|
|
14
14
|
function safeJsonParse(val: string | null | undefined, fallback: any = {}): any {
|
|
@@ -33,7 +33,7 @@ function formatWorker(worker: any): string {
|
|
|
33
33
|
? [person.legalName.givenName, person.legalName.familyName1].filter(Boolean).join(' ')
|
|
34
34
|
: '(no name)';
|
|
35
35
|
const email = person.communication?.emails?.[0]?.emailUri || '(no email)';
|
|
36
|
-
const
|
|
36
|
+
const _assignment = worker.workerDates ? '' : '';
|
|
37
37
|
const status = worker.workerStatus?.statusCode?.codeValue || 'N/A';
|
|
38
38
|
const id = worker.workerID?.idValue || worker.associateOID || 'N/A';
|
|
39
39
|
return `${name} <${email}> -- Status: ${status} (ID: ${id})`;
|
|
@@ -333,7 +333,7 @@ const blockUser: ToolHandler = {
|
|
|
333
333
|
const baseUrl = auth0Url(ctx);
|
|
334
334
|
const blocked = params.blocked !== false;
|
|
335
335
|
|
|
336
|
-
const
|
|
336
|
+
const _result = await ctx.apiExecutor.request({
|
|
337
337
|
method: 'PATCH',
|
|
338
338
|
path: undefined,
|
|
339
339
|
url: `${baseUrl}/users/${encodeURIComponent(params.user_id)}`,
|
|
@@ -64,7 +64,7 @@ const listTasks: ToolHandler = {
|
|
|
64
64
|
};
|
|
65
65
|
if (params.include_closed) query.include_closed = 'true';
|
|
66
66
|
if (params.statuses?.length) {
|
|
67
|
-
params.statuses.forEach((s: string,
|
|
67
|
+
params.statuses.forEach((s: string, _i: number) => {
|
|
68
68
|
query[`statuses[]`] = s; // ClickUp expects repeated params
|
|
69
69
|
});
|
|
70
70
|
}
|
|
@@ -32,7 +32,7 @@ function formatLead(lead: any): string {
|
|
|
32
32
|
const status = lead.status_label || 'unknown';
|
|
33
33
|
const contacts = lead.contacts?.length || 0;
|
|
34
34
|
const created = lead.date_created ? lead.date_created.slice(0, 16) : '';
|
|
35
|
-
const
|
|
35
|
+
const _url = lead.url || '';
|
|
36
36
|
return `${name} -- ${status} -- ${contacts} contact(s) -- ${created} (ID: ${lead.id})`;
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -292,7 +292,7 @@ const updateDocument: ToolHandler = {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
-
const
|
|
295
|
+
const _queryParts = updateMaskPaths.map(p => `updateMask.fieldPaths=${encodeURIComponent(p)}`);
|
|
296
296
|
const query: Record<string, string> = {};
|
|
297
297
|
for (const path of updateMaskPaths) {
|
|
298
298
|
query[`updateMask.fieldPaths`] = path;
|