@agenticmail/enterprise 0.5.319 → 0.5.321
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/CHANGELOG.md +68 -0
- package/CODE_OF_CONDUCT.md +31 -0
- package/README.md +118 -38
- package/SECURITY.md +42 -0
- package/dist/agent-heartbeat-3FWNHZFX.js +510 -0
- package/dist/agent-heartbeat-4RWHZR7H.js +510 -0
- package/dist/agent-heartbeat-6ZGB5ILY.js +510 -0
- package/dist/agent-heartbeat-BIVHLKFM.js +510 -0
- package/dist/agent-heartbeat-HRKVFK2T.js +510 -0
- package/dist/agent-heartbeat-JC5GWVXD.js +510 -0
- package/dist/agent-heartbeat-K6A4HMHB.js +510 -0
- package/dist/agent-heartbeat-LCDXWFVB.js +510 -0
- package/dist/agent-heartbeat-P7HZCZAQ.js +510 -0
- package/dist/agent-heartbeat-PUIRSNIO.js +510 -0
- package/dist/agent-heartbeat-SN5ILQ6Y.js +510 -0
- package/dist/agent-heartbeat-TW5YTDYC.js +510 -0
- package/dist/agent-heartbeat-Z2QQXROL.js +510 -0
- package/dist/agent-notify-OEQBCZLN.js +43 -0
- package/dist/{agent-tools-263HM5QU.js → agent-tools-3W7XLUYA.js} +1 -1
- package/dist/agent-tools-4QK7LLNP.js +9 -0
- package/dist/agent-tools-54VZGT6L.js +9 -0
- package/dist/{agent-tools-AT4D276V.js → agent-tools-AYYDPO27.js} +7 -7
- package/dist/{agent-tools-MSTAPX2I.js → agent-tools-F2X47FKF.js} +7 -7
- package/dist/{agent-tools-FA26SY5O.js → agent-tools-O6W3QAZL.js} +11 -6
- package/dist/agent-tools-OAWVZBMW.js +9 -0
- package/dist/agent-tools-QCCU74PN.js +13949 -0
- package/dist/chunk-2LHUARN6.js +4929 -0
- package/dist/chunk-2WVCNCYC.js +5087 -0
- package/dist/{chunk-6PWDS7KY.js → chunk-3FM6YQUK.js} +20 -20
- package/dist/chunk-3UAFHUEC.js +212 -0
- package/dist/{chunk-WJO57PMO.js → chunk-46GOWZT4.js} +20 -20
- package/dist/{chunk-BNRE7TSX.js → chunk-5KYJAUZV.js} +3 -3
- package/dist/chunk-6C5PKREN.js +467 -0
- package/dist/{chunk-447MTPZF.js → chunk-6ZMLNEHB.js} +3 -3
- package/dist/chunk-BPZQT5N5.js +25652 -0
- package/dist/chunk-BQM7MBPS.js +1380 -0
- package/dist/{chunk-ZRFKGPIU.js → chunk-C52OQNNY.js} +20 -20
- package/dist/chunk-C7HGQF4Y.js +25652 -0
- package/dist/chunk-CAHNZGGK.js +25656 -0
- package/dist/{chunk-FL3CH3ET.js → chunk-CK7R6UHE.js} +51 -27
- package/dist/chunk-D36RPWB7.js +25652 -0
- package/dist/{chunk-36NM2B4C.js → chunk-DJK2UPFH.js} +63 -93
- package/dist/chunk-DM7FTF7W.js +4929 -0
- package/dist/chunk-DMD24UFZ.js +5101 -0
- package/dist/{chunk-36XNMIHA.js → chunk-DXZGPUAF.js} +20 -20
- package/dist/chunk-F46WB5IL.js +5087 -0
- package/dist/chunk-F5QG5SQH.js +5087 -0
- package/dist/{chunk-JGEVQZDR.js → chunk-FLQ5FLHW.js} +13 -16
- package/dist/chunk-H7GP733U.js +5087 -0
- package/dist/{chunk-OZSQLOV6.js → chunk-HHBXWB5U.js} +415 -19
- package/dist/{chunk-D24JY75H.js → chunk-IMXS4N6W.js} +3 -3
- package/dist/{chunk-6PVBV6ZP.js → chunk-JNMDD7JY.js} +3 -3
- package/dist/chunk-JTV5LA47.js +1519 -0
- package/dist/chunk-KV6G7NZX.js +1519 -0
- package/dist/chunk-MU5MEBIK.js +1519 -0
- package/dist/chunk-NLT5MC7X.js +465 -0
- package/dist/{chunk-GTFZZUXX.js → chunk-NVLYIM4J.js} +51 -27
- package/dist/{chunk-6G5SXLXC.js → chunk-NZY2BIZH.js} +63 -93
- package/dist/chunk-O42L6G67.js +1519 -0
- package/dist/chunk-OCNERGGM.js +4891 -0
- package/dist/chunk-OJSNHONE.js +1519 -0
- package/dist/{chunk-2TAZJWJN.js → chunk-OWL3QVH7.js} +18 -0
- package/dist/{chunk-P3HVY2HS.js → chunk-OWTLNV4Q.js} +382 -7
- package/dist/chunk-PCNYEP6T.js +4891 -0
- package/dist/{chunk-YL3Z5KPR.js → chunk-PI4AQ4Z6.js} +438 -15
- package/dist/chunk-PN3EGTCA.js +194 -0
- package/dist/chunk-Q37UKNRC.js +1519 -0
- package/dist/chunk-QXTC6J7H.js +5087 -0
- package/dist/{chunk-SPBQVNDI.js → chunk-RKERL5LZ.js} +25 -21
- package/dist/chunk-RVBK2IOX.js +25652 -0
- package/dist/chunk-SAKODCZ5.js +4891 -0
- package/dist/{chunk-XV4TU65E.js → chunk-SALGFC5L.js} +51 -27
- package/dist/chunk-STGWZ2MS.js +1519 -0
- package/dist/chunk-UY3ZVQDP.js +25652 -0
- package/dist/chunk-V6OSD62M.js +5087 -0
- package/dist/chunk-VP6YAHX4.js +1519 -0
- package/dist/chunk-WDYJOEAI.js +5087 -0
- package/dist/chunk-WEAFQNOS.js +195 -0
- package/dist/chunk-XKUSAZGP.js +5087 -0
- package/dist/chunk-Z6K5FKAB.js +548 -0
- package/dist/chunk-ZGE3XAXY.js +1519 -0
- package/dist/chunk-ZGYVXYQQ.js +3296 -0
- package/dist/cli-agent-7TB2BWS6.js +2370 -0
- package/dist/cli-agent-AKXFFST2.js +2370 -0
- package/dist/cli-agent-DZTKLITB.js +2357 -0
- package/dist/cli-agent-FOF7PFEP.js +2357 -0
- package/dist/cli-agent-H74M2ZYN.js +2357 -0
- package/dist/cli-agent-HORWVPHB.js +2370 -0
- package/dist/cli-agent-HSZT6SKF.js +2423 -0
- package/dist/cli-agent-JLUQ4ZU6.js +2424 -0
- package/dist/cli-agent-MVCDH4HV.js +2370 -0
- package/dist/cli-agent-NZXOEPJ2.js +2357 -0
- package/dist/cli-agent-PADN3QRC.js +2357 -0
- package/dist/cli-agent-QAYEX3BE.js +2441 -0
- package/dist/cli-agent-QT64DT5J.js +2370 -0
- package/dist/cli-agent-TFL2M6UK.js +2424 -0
- package/dist/cli-agent-UIKXATTD.js +2357 -0
- package/dist/cli-agent-UJN6FYTO.js +2370 -0
- package/dist/cli-agent-VIQAYVY4.js +2357 -0
- package/dist/cli-agent-WNWFVOFM.js +2370 -0
- package/dist/cli-agent-XBQX67VJ.js +2423 -0
- package/dist/cli-agent-ZLSC6FF4.js +2357 -0
- package/dist/cli-serve-2IL5DTEY.js +153 -0
- package/dist/cli-serve-47N5UKKW.js +153 -0
- package/dist/cli-serve-4XGZFUV2.js +140 -0
- package/dist/cli-serve-6OT3UEAN.js +140 -0
- package/dist/cli-serve-7L6EY5UH.js +153 -0
- package/dist/cli-serve-BDGOOOKQ.js +260 -0
- package/dist/cli-serve-BFNIW2LF.js +153 -0
- package/dist/cli-serve-C7MN6U5Q.js +153 -0
- package/dist/cli-serve-CR3OY3IM.js +153 -0
- package/dist/cli-serve-DAJFRWQ7.js +153 -0
- package/dist/cli-serve-FW6FHFW4.js +153 -0
- package/dist/cli-serve-GEEOQS77.js +153 -0
- package/dist/cli-serve-H562I3ZK.js +153 -0
- package/dist/cli-serve-HDQZF4C4.js +153 -0
- package/dist/cli-serve-LICAOMEB.js +140 -0
- package/dist/cli-serve-LLGYLWFS.js +153 -0
- package/dist/cli-serve-N3OISDNB.js +153 -0
- package/dist/cli-serve-TIZ27EVR.js +153 -0
- package/dist/cli-serve-TUNI2RCN.js +153 -0
- package/dist/cli-serve-WNOZMAWD.js +153 -0
- package/dist/cli-validate-Z726VJCN.js +150 -0
- package/dist/cli.js +4 -4
- package/dist/connection-manager-KAWEUWUR.js +9 -0
- package/dist/dashboard/app.js +9 -3
- package/dist/dashboard/components/knowledge-link.js +15 -0
- package/dist/dashboard/components/settings-help.js +4 -2
- package/dist/dashboard/docs/agent-deployment.html +33 -1
- package/dist/dashboard/docs/settings-network.html +321 -0
- package/dist/dashboard/docs/settings-security.html +347 -0
- package/dist/dashboard/docs/settings-tool-security.html +176 -0
- package/dist/dashboard/docs/settings.html +36 -16
- package/dist/dashboard/pages/agent-detail/deployment.js +39 -6
- package/dist/dashboard/pages/agent-detail/tools.js +10 -0
- package/dist/dashboard/pages/database-access.js +4 -3
- package/dist/dashboard/pages/settings.js +174 -37
- package/dist/dashboard/pages/task-pipeline.js +400 -843
- package/dist/db-adapter-2T56ORSD.js +7 -0
- package/dist/db-adapter-IRHOUMVC.js +7 -0
- package/dist/index.js +41 -41
- package/dist/microsoft-VREAZ7M2.js +3955 -0
- package/dist/routes-3MMLQTB6.js +90 -0
- package/dist/routes-4ZUIJ4HE.js +90 -0
- package/dist/routes-5MXHKKH4.js +90 -0
- package/dist/routes-64NJFK3B.js +90 -0
- package/dist/routes-6AKQ2LBV.js +90 -0
- package/dist/routes-CRRBUDO4.js +90 -0
- package/dist/routes-DIAF3MC3.js +90 -0
- package/dist/routes-KMUNU6CY.js +90 -0
- package/dist/routes-LRRLXIZR.js +90 -0
- package/dist/routes-N647AJYG.js +90 -0
- package/dist/routes-SSSELAAR.js +90 -0
- package/dist/routes-STERVGKJ.js +90 -0
- package/dist/routes-ZEZZACZP.js +90 -0
- package/dist/runtime-5EQN4GFM.js +45 -0
- package/dist/runtime-5LP7PUD4.js +45 -0
- package/dist/runtime-6BULDBR3.js +45 -0
- package/dist/runtime-6YEENDN3.js +45 -0
- package/dist/runtime-7LQFRG3B.js +45 -0
- package/dist/runtime-AMXJU2MB.js +45 -0
- package/dist/runtime-D6WSE7FG.js +45 -0
- package/dist/runtime-EYVN7NFJ.js +45 -0
- package/dist/runtime-F6RPWQVW.js +45 -0
- package/dist/runtime-FYMJURFC.js +45 -0
- package/dist/runtime-JRNBL4O4.js +45 -0
- package/dist/runtime-OM2NIBMI.js +45 -0
- package/dist/runtime-QWPVD7CY.js +45 -0
- package/dist/runtime-YLIIPTE4.js +45 -0
- package/dist/runtime-YU6P22CG.js +45 -0
- package/dist/screen-unlock-4RPZBHOI.js +118 -0
- package/dist/server-AMCSXINC.js +28 -0
- package/dist/server-CU6LVQS4.js +28 -0
- package/dist/server-DFYGH2CV.js +28 -0
- package/dist/server-EELWOC3X.js +28 -0
- package/dist/server-EN5E2OWQ.js +28 -0
- package/dist/server-GW2HYJYI.js +28 -0
- package/dist/server-J25NCRWJ.js +28 -0
- package/dist/server-JDGNOTFV.js +28 -0
- package/dist/server-NE5HD5DJ.js +28 -0
- package/dist/server-NQOT7W77.js +28 -0
- package/dist/server-PWE5PQTR.js +28 -0
- package/dist/server-Q2Q32H2B.js +28 -0
- package/dist/server-Q77ME7TL.js +28 -0
- package/dist/server-WLLH4WST.js +28 -0
- package/dist/server-WTUJ2O3F.js +28 -0
- package/dist/server-X4CJTHHF.js +28 -0
- package/dist/server-XK3ILCJC.js +28 -0
- package/dist/server-ZRD3NDJE.js +28 -0
- package/dist/setup-44VBAO4J.js +20 -0
- package/dist/setup-4ONNQBWB.js +20 -0
- package/dist/setup-4OSBXSCL.js +20 -0
- package/dist/setup-4QFGRBLZ.js +20 -0
- package/dist/setup-6766SGAR.js +20 -0
- package/dist/setup-AYY24DKM.js +20 -0
- package/dist/setup-B34N4HPU.js +20 -0
- package/dist/setup-E2YLC2EY.js +20 -0
- package/dist/setup-ER6NXTY5.js +20 -0
- package/dist/setup-H2AGCBW5.js +20 -0
- package/dist/setup-ICOZRKCX.js +20 -0
- package/dist/setup-JFTJH7UF.js +20 -0
- package/dist/setup-PRFNI6YW.js +20 -0
- package/dist/setup-RAHBMYHE.js +20 -0
- package/dist/setup-TXPR5UQX.js +20 -0
- package/dist/setup-XCJMELVU.js +20 -0
- package/dist/setup-XIYEIFVK.js +20 -0
- package/dist/setup-Z4PZSHBI.js +20 -0
- package/dist/skills-FR7I5V7H.js +16 -0
- package/dist/skills-HCVBA6PK.js +16 -0
- package/dist/system-prompts-TM7OA32C.js +913 -0
- package/dist/task-queue-O7IVZYUO.js +9 -0
- package/dist/transport-encryption-2T7PIXKG.js +25 -0
- package/logs/cloudflared-error.log +61 -0
- package/logs/cloudflared-out.log +0 -0
- package/logs/enterprise-error.log +0 -0
- package/logs/enterprise-out.log +3 -0
- package/logs/fola-error.log +0 -0
- package/logs/fola-out.log +0 -0
- package/logs/john-error.log +8 -0
- package/logs/john-out.log +0 -0
- package/package.json +31 -3
- package/src/agent-tools/tool-resolver.ts +50 -61
- package/src/agent-tools/tools/enterprise-database.ts +5 -5
- package/src/agent-tools/tools/local/dependency-manager.ts +2 -2
- package/src/agent-tools/tools/microsoft/graph-api.ts +137 -26
- package/src/agent-tools/tools/microsoft/outlook-mail.ts +392 -100
- package/src/agent-tools/tools/microsoft/teams.ts +267 -48
- package/src/auth/routes.ts +4 -4
- package/src/cli-agent.ts +108 -8
- package/src/cli-serve.ts +140 -0
- package/src/dashboard/app.js +9 -3
- package/src/dashboard/components/knowledge-link.js +15 -0
- package/src/dashboard/components/settings-help.js +4 -2
- package/src/dashboard/docs/agent-deployment.html +33 -1
- package/src/dashboard/docs/settings-network.html +321 -0
- package/src/dashboard/docs/settings-security.html +347 -0
- package/src/dashboard/docs/settings-tool-security.html +176 -0
- package/src/dashboard/docs/settings.html +36 -16
- package/src/dashboard/pages/agent-detail/deployment.js +39 -6
- package/src/dashboard/pages/agent-detail/tools.js +10 -0
- package/src/dashboard/pages/database-access.js +4 -3
- package/src/dashboard/pages/settings.js +174 -37
- package/src/dashboard/pages/task-pipeline.js +400 -843
- package/src/database-access/agent-tools.ts +78 -63
- package/src/database-access/connection-manager.ts +13 -2
- package/src/database-access/routes.ts +13 -1
- package/src/db/adapter.ts +1 -0
- package/src/engine/agent-memory.ts +2 -1
- package/src/engine/agent-notify.ts +50 -0
- package/src/engine/agent-routes.ts +257 -4
- package/src/engine/db-adapter.ts +16 -0
- package/src/engine/lifecycle.ts +4 -0
- package/src/engine/routes.ts +4 -3
- package/src/engine/screen-unlock.ts +136 -0
- package/src/engine/skills/database-access.ts +78 -0
- package/src/engine/skills/index.ts +3 -2
- package/src/engine/skills.ts +2 -0
- package/src/engine/task-queue-routes.ts +18 -0
- package/src/engine/task-queue.ts +15 -2
- package/src/middleware/transport-encryption.ts +1 -4
- package/src/runtime/agent-loop.ts +4 -0
- package/src/runtime/index.ts +15 -6
- package/src/server.ts +14 -1
- package/src/system-prompts/google/index.ts +1 -2
- package/src/system-prompts/index.ts +1 -1
- package/src/system-prompts/microsoft/contacts.ts +34 -0
- package/src/system-prompts/microsoft/excel.ts +52 -0
- package/src/system-prompts/microsoft/index.ts +31 -0
- package/src/system-prompts/microsoft/onedrive.ts +41 -0
- package/src/system-prompts/microsoft/onenote.ts +36 -0
- package/src/system-prompts/microsoft/outlook-calendar.ts +37 -0
- package/src/system-prompts/microsoft/outlook-mail.ts +46 -0
- package/src/system-prompts/microsoft/planner.ts +37 -0
- package/src/system-prompts/microsoft/powerbi.ts +38 -0
- package/src/system-prompts/microsoft/powerpoint.ts +35 -0
- package/src/system-prompts/microsoft/sharepoint.ts +44 -0
- package/src/system-prompts/microsoft/teams.ts +49 -0
- package/src/system-prompts/microsoft/todo.ts +37 -0
- package/src/types/hono-env.ts +4 -0
- package/.github/CODEOWNERS +0 -23
- package/.github/workflows/publish-community-skills.yml +0 -121
- package/.github/workflows/validate-community-skills.yml +0 -172
- package/agriculture_southwest_nigeria_research.txt +0 -10
- package/boa_credit_cards_research.txt +0 -10
- package/customer_support_research_feb2026.txt +0 -10
- package/dist/agent-tools-LRA7PPXG.js +0 -13922
- package/dist/agent-tools-VAU5DOQB.js +0 -13910
- package/dist/agent-tools-VWV7OWXU.js +0 -13922
- package/dist/chunk-2Z7MWTCX.js +0 -4977
- package/dist/chunk-3T4XU3VV.js +0 -5010
- package/dist/chunk-445QM4NX.js +0 -5061
- package/dist/chunk-5TW3Y7DJ.js +0 -1519
- package/dist/chunk-6I7VY3LT.js +0 -5060
- package/dist/chunk-6W5EK3UP.js +0 -4977
- package/dist/chunk-AQMSHJQT.js +0 -5069
- package/dist/chunk-ASSQW7HX.js +0 -5051
- package/dist/chunk-CIN27FGC.js +0 -5037
- package/dist/chunk-CMXY3NUB.js +0 -4977
- package/dist/chunk-DRLMRUDP.js +0 -5052
- package/dist/chunk-EHI7Z446.js +0 -1519
- package/dist/chunk-FEAILFAQ.js +0 -1519
- package/dist/chunk-GA3PYBZL.js +0 -1519
- package/dist/chunk-GWX63G5J.js +0 -1519
- package/dist/chunk-HHMZ4UY6.js +0 -1519
- package/dist/chunk-HVQMNF7E.js +0 -4921
- package/dist/chunk-HXM7F3YN.js +0 -1519
- package/dist/chunk-K6NGOUXG.js +0 -5060
- package/dist/chunk-KPG5WINJ.js +0 -4977
- package/dist/chunk-LBCUBYDL.js +0 -1519
- package/dist/chunk-LIRQSWLR.js +0 -5014
- package/dist/chunk-LRCKO5KE.js +0 -1519
- package/dist/chunk-M7XL3DJD.js +0 -5069
- package/dist/chunk-MHJULEIQ.js +0 -1519
- package/dist/chunk-MJGGW6MC.js +0 -106
- package/dist/chunk-MMYBDHDB.js +0 -4921
- package/dist/chunk-MQT5FXKD.js +0 -1519
- package/dist/chunk-OIMPEQF5.js +0 -4977
- package/dist/chunk-OOU7JUYE.js +0 -542
- package/dist/chunk-OW4GLBHP.js +0 -1519
- package/dist/chunk-Q4K4MMLU.js +0 -4977
- package/dist/chunk-RUK4CRPF.js +0 -1519
- package/dist/chunk-T7H65XQY.js +0 -1519
- package/dist/chunk-TQVFWG57.js +0 -5064
- package/dist/chunk-UEPK3IMC.js +0 -1519
- package/dist/chunk-VUWTXJH6.js +0 -1519
- package/dist/chunk-WCPGGSAD.js +0 -1519
- package/dist/chunk-WO63NZOJ.js +0 -1519
- package/dist/chunk-YPJDRVUM.js +0 -5064
- package/dist/chunk-ZROMH5DL.js +0 -4921
- package/src/dashboard/docs/_template.txt +0 -92
package/dist/chunk-OOU7JUYE.js
DELETED
|
@@ -1,542 +0,0 @@
|
|
|
1
|
-
// src/agent-tools/tools/local/dependency-manager.ts
|
|
2
|
-
import { exec as cpExec } from "child_process";
|
|
3
|
-
import { promisify } from "util";
|
|
4
|
-
import { platform, tmpdir } from "os";
|
|
5
|
-
import { join } from "path";
|
|
6
|
-
import { mkdirSync, existsSync } from "fs";
|
|
7
|
-
var execAsync = promisify(cpExec);
|
|
8
|
-
var DEFAULT_POLICY = {
|
|
9
|
-
mode: "auto",
|
|
10
|
-
allowGlobalInstalls: false,
|
|
11
|
-
allowElevated: false,
|
|
12
|
-
allowedManagers: ["npm", "pip"],
|
|
13
|
-
blockedPackages: [],
|
|
14
|
-
autoCleanup: true
|
|
15
|
-
};
|
|
16
|
-
var sessionInstalls = /* @__PURE__ */ new Map();
|
|
17
|
-
var SESSION_LOCAL_DIR = join(tmpdir(), `agenticmail-deps-${process.pid}`);
|
|
18
|
-
var _activePolicy = { ...DEFAULT_POLICY };
|
|
19
|
-
function setDependencyPolicy(policy) {
|
|
20
|
-
_activePolicy = { ...DEFAULT_POLICY, ...policy };
|
|
21
|
-
}
|
|
22
|
-
function getDependencyPolicy() {
|
|
23
|
-
return { ..._activePolicy };
|
|
24
|
-
}
|
|
25
|
-
var IS_WINDOWS = platform() === "win32";
|
|
26
|
-
var IS_MAC = platform() === "darwin";
|
|
27
|
-
var IS_LINUX = platform() === "linux";
|
|
28
|
-
async function detectPackageManagers() {
|
|
29
|
-
var managers = [];
|
|
30
|
-
var checks = IS_WINDOWS ? [["choco", "choco"], ["winget", "winget"], ["scoop", "scoop"], ["npm", "npm"], ["pip", "pip"]] : IS_MAC ? [["brew", "brew"], ["npm", "npm"], ["pip3", "pip"], ["pip", "pip"]] : [["apt-get", "apt"], ["dnf", "dnf"], ["pacman", "pacman"], ["snap", "snap"], ["brew", "brew"], ["npm", "npm"], ["pip3", "pip"], ["pip", "pip"]];
|
|
31
|
-
await Promise.all(checks.map(async ([cmd, mgr]) => {
|
|
32
|
-
try {
|
|
33
|
-
var which = IS_WINDOWS ? "where" : "which";
|
|
34
|
-
await execAsync(`${which} ${cmd}`, { timeout: 3e3 });
|
|
35
|
-
if (!managers.includes(mgr)) managers.push(mgr);
|
|
36
|
-
} catch {
|
|
37
|
-
}
|
|
38
|
-
}));
|
|
39
|
-
return managers;
|
|
40
|
-
}
|
|
41
|
-
var KNOWN_PACKAGES = {
|
|
42
|
-
ffmpeg: { brew: "ffmpeg", apt: "ffmpeg", dnf: "ffmpeg", pacman: "ffmpeg", choco: "ffmpeg", winget: "Gyan.FFmpeg", scoop: "ffmpeg", description: "Audio/video processing", systemOnly: true },
|
|
43
|
-
ffprobe: { brew: "ffmpeg", apt: "ffmpeg", dnf: "ffmpeg", pacman: "ffmpeg", choco: "ffmpeg", winget: "Gyan.FFmpeg", scoop: "ffmpeg", description: "Audio/video analysis (part of ffmpeg)", systemOnly: true },
|
|
44
|
-
convert: { brew: "imagemagick", apt: "imagemagick", dnf: "ImageMagick", pacman: "imagemagick", choco: "imagemagick", winget: "ImageMagick.ImageMagick", scoop: "imagemagick", description: "Image manipulation (ImageMagick)", systemOnly: true },
|
|
45
|
-
magick: { brew: "imagemagick", apt: "imagemagick", dnf: "ImageMagick", pacman: "imagemagick", choco: "imagemagick", winget: "ImageMagick.ImageMagick", scoop: "imagemagick", description: "Image manipulation (ImageMagick)", systemOnly: true },
|
|
46
|
-
sox: { brew: "sox", apt: "sox", dnf: "sox", pacman: "sox", choco: "sox", description: "Sound processing", systemOnly: true },
|
|
47
|
-
jq: { brew: "jq", apt: "jq", dnf: "jq", pacman: "jq", choco: "jq", scoop: "jq", description: "JSON processor", systemOnly: true },
|
|
48
|
-
curl: { brew: "curl", apt: "curl", dnf: "curl", pacman: "curl", choco: "curl", scoop: "curl", description: "HTTP client", systemOnly: true },
|
|
49
|
-
wget: { brew: "wget", apt: "wget", dnf: "wget", pacman: "wget", choco: "wget", scoop: "wget", description: "File downloader", systemOnly: true },
|
|
50
|
-
"yt-dlp": { brew: "yt-dlp", pip: "yt-dlp", choco: "yt-dlp", scoop: "yt-dlp", description: "Video downloader" },
|
|
51
|
-
yt_dlp: { brew: "yt-dlp", pip: "yt-dlp", choco: "yt-dlp", scoop: "yt-dlp", description: "Video downloader" },
|
|
52
|
-
tesseract: { brew: "tesseract", apt: "tesseract-ocr", dnf: "tesseract", pacman: "tesseract", choco: "tesseract", description: "OCR text recognition", systemOnly: true },
|
|
53
|
-
pdftk: { brew: "pdftk-java", apt: "pdftk", description: "PDF toolkit", systemOnly: true },
|
|
54
|
-
ghostscript: { brew: "ghostscript", apt: "ghostscript", dnf: "ghostscript", pacman: "ghostscript", choco: "ghostscript", description: "PDF/PostScript processor", systemOnly: true },
|
|
55
|
-
gs: { brew: "ghostscript", apt: "ghostscript", dnf: "ghostscript", pacman: "ghostscript", choco: "ghostscript", description: "PDF/PostScript processor", systemOnly: true },
|
|
56
|
-
pandoc: { brew: "pandoc", apt: "pandoc", dnf: "pandoc", pacman: "pandoc", choco: "pandoc", scoop: "pandoc", description: "Document format converter", systemOnly: true },
|
|
57
|
-
graphviz: { brew: "graphviz", apt: "graphviz", dnf: "graphviz", pacman: "graphviz", choco: "graphviz", description: "Graph visualization", systemOnly: true },
|
|
58
|
-
dot: { brew: "graphviz", apt: "graphviz", dnf: "graphviz", pacman: "graphviz", choco: "graphviz", description: "Graph visualization (part of graphviz)", systemOnly: true },
|
|
59
|
-
gifsicle: { brew: "gifsicle", apt: "gifsicle", npm: "gifsicle", description: "GIF optimizer" },
|
|
60
|
-
optipng: { brew: "optipng", apt: "optipng", dnf: "optipng", choco: "optipng", description: "PNG optimizer", systemOnly: true },
|
|
61
|
-
qrencode: { brew: "qrencode", apt: "qrencode", description: "QR code generator", systemOnly: true },
|
|
62
|
-
tree: { brew: "tree", apt: "tree", dnf: "tree", pacman: "tree", choco: "tree", description: "Directory tree viewer", systemOnly: true },
|
|
63
|
-
ripgrep: { brew: "ripgrep", apt: "ripgrep", dnf: "ripgrep", pacman: "ripgrep", choco: "ripgrep", scoop: "ripgrep", description: "Fast text search (rg)", systemOnly: true },
|
|
64
|
-
rg: { brew: "ripgrep", apt: "ripgrep", dnf: "ripgrep", pacman: "ripgrep", choco: "ripgrep", scoop: "ripgrep", description: "Fast text search", systemOnly: true },
|
|
65
|
-
fd: { brew: "fd", apt: "fd-find", dnf: "fd-find", pacman: "fd", choco: "fd", scoop: "fd", description: "Fast file finder", systemOnly: true },
|
|
66
|
-
bat: { brew: "bat", apt: "bat", dnf: "bat", pacman: "bat", choco: "bat", scoop: "bat", description: "Better cat with syntax highlighting", systemOnly: true },
|
|
67
|
-
htop: { brew: "htop", apt: "htop", dnf: "htop", pacman: "htop", description: "Process monitor", systemOnly: true },
|
|
68
|
-
// npm tools — can be installed locally
|
|
69
|
-
prettier: { npm: "prettier", description: "Code formatter" },
|
|
70
|
-
eslint: { npm: "eslint", description: "JavaScript linter" },
|
|
71
|
-
typescript: { npm: "typescript", description: "TypeScript compiler" },
|
|
72
|
-
tsc: { npm: "typescript", description: "TypeScript compiler" },
|
|
73
|
-
esbuild: { npm: "esbuild", description: "Fast JS bundler" },
|
|
74
|
-
sharp: { npm: "sharp", description: "Image processing library" },
|
|
75
|
-
puppeteer: { npm: "puppeteer", description: "Headless Chrome automation" },
|
|
76
|
-
// pip tools
|
|
77
|
-
whisper: { pip: "openai-whisper", description: "Speech-to-text", systemOnly: true }
|
|
78
|
-
};
|
|
79
|
-
function ensureLocalDir() {
|
|
80
|
-
var npmBin = IS_WINDOWS ? join(SESSION_LOCAL_DIR, "node_modules", ".bin") : join(SESSION_LOCAL_DIR, "node_modules", ".bin");
|
|
81
|
-
var pipBin = join(SESSION_LOCAL_DIR, "pip-bin");
|
|
82
|
-
if (!existsSync(SESSION_LOCAL_DIR)) {
|
|
83
|
-
mkdirSync(SESSION_LOCAL_DIR, { recursive: true });
|
|
84
|
-
mkdirSync(join(SESSION_LOCAL_DIR, "node_modules"), { recursive: true });
|
|
85
|
-
mkdirSync(pipBin, { recursive: true });
|
|
86
|
-
}
|
|
87
|
-
return { root: SESSION_LOCAL_DIR, npmBin, pipBin };
|
|
88
|
-
}
|
|
89
|
-
function localPath() {
|
|
90
|
-
var dirs = ensureLocalDir();
|
|
91
|
-
var sep = IS_WINDOWS ? ";" : ":";
|
|
92
|
-
return `${dirs.npmBin}${sep}${dirs.pipBin}${sep}${process.env.PATH || ""}`;
|
|
93
|
-
}
|
|
94
|
-
var _elevationTool = null;
|
|
95
|
-
async function detectElevationTool() {
|
|
96
|
-
if (_elevationTool !== null) return _elevationTool || null;
|
|
97
|
-
if (IS_WINDOWS) {
|
|
98
|
-
_elevationTool = "runas";
|
|
99
|
-
return _elevationTool;
|
|
100
|
-
}
|
|
101
|
-
for (var tool of ["sudo", "doas"]) {
|
|
102
|
-
try {
|
|
103
|
-
await execAsync(`which ${tool}`, { timeout: 2e3 });
|
|
104
|
-
_elevationTool = tool;
|
|
105
|
-
return tool;
|
|
106
|
-
} catch {
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
_elevationTool = "";
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
async function runCommand(cmd, opts) {
|
|
113
|
-
var timeout = opts?.timeout || 3e5;
|
|
114
|
-
var env = {
|
|
115
|
-
...process.env,
|
|
116
|
-
PATH: localPath(),
|
|
117
|
-
TERM: "dumb",
|
|
118
|
-
HOMEBREW_NO_AUTO_UPDATE: "1",
|
|
119
|
-
HOMEBREW_NO_INSTALL_UPGRADE: "1",
|
|
120
|
-
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: "1"
|
|
121
|
-
};
|
|
122
|
-
if (IS_LINUX || IS_MAC) env.DEBIAN_FRONTEND = "noninteractive";
|
|
123
|
-
if (opts?.sudo) {
|
|
124
|
-
if (IS_WINDOWS) {
|
|
125
|
-
return execAsync(cmd, { timeout, maxBuffer: 4 * 1024 * 1024, env });
|
|
126
|
-
}
|
|
127
|
-
var elevTool = await detectElevationTool();
|
|
128
|
-
if (!elevTool) {
|
|
129
|
-
throw new Error("No elevation tool found (sudo/doas not installed). Cannot run elevated commands.");
|
|
130
|
-
}
|
|
131
|
-
var sudoPwd = _activePolicy.sudoPassword;
|
|
132
|
-
if (sudoPwd) {
|
|
133
|
-
if (elevTool === "sudo") {
|
|
134
|
-
var escaped = sudoPwd.replace(/'/g, "'\\''");
|
|
135
|
-
var fullCmd = `echo '${escaped}' | sudo -S ${cmd}`;
|
|
136
|
-
return execAsync(fullCmd, { timeout, maxBuffer: 4 * 1024 * 1024, env });
|
|
137
|
-
} else if (elevTool === "doas") {
|
|
138
|
-
return execAsync(`doas ${cmd}`, { timeout, maxBuffer: 4 * 1024 * 1024, env });
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (elevTool === "sudo") {
|
|
142
|
-
return execAsync(`sudo -n ${cmd}`, { timeout, maxBuffer: 4 * 1024 * 1024, env });
|
|
143
|
-
} else {
|
|
144
|
-
return execAsync(`doas ${cmd}`, { timeout, maxBuffer: 4 * 1024 * 1024, env });
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return execAsync(cmd, { timeout, maxBuffer: 4 * 1024 * 1024, env });
|
|
148
|
-
}
|
|
149
|
-
async function commandExists(cmd) {
|
|
150
|
-
try {
|
|
151
|
-
var which = IS_WINDOWS ? "where" : "which";
|
|
152
|
-
var { stdout: whichOut } = await execAsync(`${which} ${cmd}`, {
|
|
153
|
-
timeout: 3e3,
|
|
154
|
-
env: { ...process.env, PATH: localPath(), TERM: "dumb" }
|
|
155
|
-
});
|
|
156
|
-
var cmdPath = whichOut.trim().split("\n")[0].split("\r")[0];
|
|
157
|
-
var version = "";
|
|
158
|
-
try {
|
|
159
|
-
var { stdout: verOut } = await execAsync(`${cmd} --version 2>&1`, {
|
|
160
|
-
timeout: 5e3,
|
|
161
|
-
env: { ...process.env, PATH: localPath(), TERM: "dumb" }
|
|
162
|
-
});
|
|
163
|
-
version = verOut.trim().split("\n")[0].slice(0, 200);
|
|
164
|
-
} catch {
|
|
165
|
-
try {
|
|
166
|
-
var { stdout: verOut2 } = await execAsync(`${cmd} -version 2>&1`, { timeout: 3e3, env: { ...process.env, PATH: localPath(), TERM: "dumb" } });
|
|
167
|
-
version = verOut2.trim().split("\n")[0].slice(0, 200);
|
|
168
|
-
} catch {
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return { exists: true, path: cmdPath, version };
|
|
172
|
-
} catch {
|
|
173
|
-
return { exists: false };
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
function buildInstallCommand(mgr, pkg) {
|
|
177
|
-
var dirs = ensureLocalDir();
|
|
178
|
-
switch (mgr) {
|
|
179
|
-
case "brew":
|
|
180
|
-
return { cmd: `brew install ${pkg}`, needsElevation: false, isLocal: false };
|
|
181
|
-
case "apt":
|
|
182
|
-
return { cmd: `apt-get install -y ${pkg}`, needsElevation: true, isLocal: false };
|
|
183
|
-
case "dnf":
|
|
184
|
-
return { cmd: `dnf install -y ${pkg}`, needsElevation: true, isLocal: false };
|
|
185
|
-
case "pacman":
|
|
186
|
-
return { cmd: `pacman -S --noconfirm ${pkg}`, needsElevation: true, isLocal: false };
|
|
187
|
-
case "snap":
|
|
188
|
-
return { cmd: `snap install ${pkg}`, needsElevation: true, isLocal: false };
|
|
189
|
-
case "choco":
|
|
190
|
-
return { cmd: `choco install ${pkg} -y`, needsElevation: false, isLocal: false };
|
|
191
|
-
case "winget":
|
|
192
|
-
return { cmd: `winget install --accept-source-agreements --accept-package-agreements ${pkg}`, needsElevation: false, isLocal: false };
|
|
193
|
-
case "scoop":
|
|
194
|
-
return { cmd: `scoop install ${pkg}`, needsElevation: false, isLocal: false };
|
|
195
|
-
case "npm":
|
|
196
|
-
return { cmd: `npm install --prefix "${dirs.root}" ${pkg}`, needsElevation: false, isLocal: true };
|
|
197
|
-
case "pip":
|
|
198
|
-
return { cmd: `pip install --target "${dirs.pipBin}" ${pkg}`, needsElevation: false, isLocal: true };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
async function pickManager(cmd, forceMethod) {
|
|
202
|
-
var known = KNOWN_PACKAGES[cmd];
|
|
203
|
-
if (forceMethod && forceMethod !== "auto") {
|
|
204
|
-
var mgr = forceMethod;
|
|
205
|
-
var pkg = known?.[mgr] || cmd;
|
|
206
|
-
return { mgr, pkg, isLocal: mgr === "npm" || mgr === "pip" };
|
|
207
|
-
}
|
|
208
|
-
if (known?.npm && !known?.systemOnly) return { mgr: "npm", pkg: known.npm, isLocal: true };
|
|
209
|
-
if (known?.pip && !known?.systemOnly) return { mgr: "pip", pkg: known.pip, isLocal: true };
|
|
210
|
-
var available = await detectPackageManagers();
|
|
211
|
-
if (IS_MAC && known?.brew && available.includes("brew")) return { mgr: "brew", pkg: known.brew, isLocal: false };
|
|
212
|
-
if (IS_WINDOWS) {
|
|
213
|
-
if (known?.scoop && available.includes("scoop")) return { mgr: "scoop", pkg: known.scoop, isLocal: false };
|
|
214
|
-
if (known?.choco && available.includes("choco")) return { mgr: "choco", pkg: known.choco, isLocal: false };
|
|
215
|
-
if (known?.winget && available.includes("winget")) return { mgr: "winget", pkg: known.winget, isLocal: false };
|
|
216
|
-
}
|
|
217
|
-
if (IS_LINUX) {
|
|
218
|
-
if (known?.apt && available.includes("apt")) return { mgr: "apt", pkg: known.apt, isLocal: false };
|
|
219
|
-
if (known?.dnf && available.includes("dnf")) return { mgr: "dnf", pkg: known.dnf, isLocal: false };
|
|
220
|
-
if (known?.pacman && available.includes("pacman")) return { mgr: "pacman", pkg: known.pacman, isLocal: false };
|
|
221
|
-
if (known?.snap && available.includes("snap")) return { mgr: "snap", pkg: known.snap, isLocal: false };
|
|
222
|
-
}
|
|
223
|
-
if (known?.pip && available.includes("pip")) return { mgr: "pip", pkg: known.pip, isLocal: false };
|
|
224
|
-
for (var m of available) {
|
|
225
|
-
if (m !== "npm" && m !== "pip") return { mgr: m, pkg: cmd, isLocal: false };
|
|
226
|
-
}
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
function createDependencyManagerTools() {
|
|
230
|
-
return [
|
|
231
|
-
{
|
|
232
|
-
name: "check_dependency",
|
|
233
|
-
description: `Check if command-line tools are available. Returns availability, version, path, and install instructions if missing. Safe \u2014 changes nothing. Use before running commands that need specific tools.`,
|
|
234
|
-
input_schema: {
|
|
235
|
-
type: "object",
|
|
236
|
-
properties: {
|
|
237
|
-
command: { type: "string", description: 'Command to check (e.g. "ffmpeg")' },
|
|
238
|
-
commands: { type: "array", items: { type: "string" }, description: "Check multiple commands at once" }
|
|
239
|
-
},
|
|
240
|
-
required: []
|
|
241
|
-
},
|
|
242
|
-
execute: async (input) => {
|
|
243
|
-
var cmds = input.commands || (input.command ? [input.command.trim()] : []);
|
|
244
|
-
if (!cmds.length) return { error: 'Provide "command" or "commands".' };
|
|
245
|
-
var results = {};
|
|
246
|
-
for (var cmd of cmds) {
|
|
247
|
-
var check = await commandExists(cmd);
|
|
248
|
-
if (check.exists) {
|
|
249
|
-
results[cmd] = { available: true, path: check.path, version: check.version };
|
|
250
|
-
} else {
|
|
251
|
-
var mgr = await pickManager(cmd);
|
|
252
|
-
var policy = _activePolicy;
|
|
253
|
-
results[cmd] = {
|
|
254
|
-
available: false,
|
|
255
|
-
description: KNOWN_PACKAGES[cmd]?.description || "Unknown tool",
|
|
256
|
-
installable: !!mgr,
|
|
257
|
-
method: mgr?.mgr,
|
|
258
|
-
local: mgr?.isLocal ?? false,
|
|
259
|
-
policyAllows: policy.mode !== "deny" && (mgr?.isLocal || policy.allowGlobalInstalls) && (!mgr || policy.allowedManagers.includes(mgr.mgr)) && !policy.blockedPackages.includes(mgr?.pkg || cmd),
|
|
260
|
-
suggestion: mgr ? mgr.isLocal ? `install_dependency will install locally (no global changes)` : `install_dependency will use ${mgr.mgr} (global install)` : "Unknown package \u2014 specify package name and method manually"
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
return cmds.length === 1 ? results[cmds[0]] : results;
|
|
265
|
-
}
|
|
266
|
-
},
|
|
267
|
-
{
|
|
268
|
-
name: "install_dependency",
|
|
269
|
-
description: `Install a missing tool. Respects the agent's dependency policy (set in Permissions dashboard).
|
|
270
|
-
- npm/pip: installed to a SESSION-LOCAL directory \u2014 no global changes
|
|
271
|
-
- brew/apt/choco/winget/scoop: global installs \u2014 only if policy allows
|
|
272
|
-
- sudo: only if policy allows elevated, password piped via stdin (never in args)
|
|
273
|
-
- NEVER modifies/upgrades existing tools
|
|
274
|
-
- Cross-platform: macOS, Linux (all distros), Windows, Raspberry Pi`,
|
|
275
|
-
input_schema: {
|
|
276
|
-
type: "object",
|
|
277
|
-
properties: {
|
|
278
|
-
command: { type: "string", description: 'Tool name to install (e.g. "ffmpeg", "prettier")' },
|
|
279
|
-
package: { type: "string", description: "Override package name if different from command" },
|
|
280
|
-
method: { type: "string", enum: ["brew", "apt", "dnf", "pacman", "snap", "choco", "winget", "scoop", "npm", "pip", "auto"], description: "Package manager (default: auto-detect)" }
|
|
281
|
-
},
|
|
282
|
-
required: ["command"]
|
|
283
|
-
},
|
|
284
|
-
execute: async (input) => {
|
|
285
|
-
var cmd = input.command.trim();
|
|
286
|
-
var policy = _activePolicy;
|
|
287
|
-
if (policy.mode === "deny") {
|
|
288
|
-
return {
|
|
289
|
-
ok: false,
|
|
290
|
-
command: cmd,
|
|
291
|
-
error: "Dependency installation is disabled for this agent. Change the dependency policy in the Permissions dashboard to allow installations.",
|
|
292
|
-
policyMode: "deny"
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
var existing = await commandExists(cmd);
|
|
296
|
-
if (existing.exists) {
|
|
297
|
-
var records = sessionInstalls.get("global") || [];
|
|
298
|
-
if (!records.find((r2) => r2.command === cmd)) {
|
|
299
|
-
records.push({ package: cmd, command: cmd, method: "existing", wasAlreadyInstalled: true, timestamp: Date.now() });
|
|
300
|
-
sessionInstalls.set("global", records);
|
|
301
|
-
}
|
|
302
|
-
return { ok: true, alreadyInstalled: true, command: cmd, path: existing.path, version: existing.version, note: `"${cmd}" is already installed at ${existing.path}. No changes made.` };
|
|
303
|
-
}
|
|
304
|
-
var resolved = await pickManager(cmd, input.method !== "auto" ? input.method : void 0);
|
|
305
|
-
if (input.package) {
|
|
306
|
-
if (resolved) resolved.pkg = input.package;
|
|
307
|
-
else {
|
|
308
|
-
var mgrs = await detectPackageManagers();
|
|
309
|
-
var fallback = IS_WINDOWS ? mgrs.includes("choco") ? "choco" : mgrs.includes("winget") ? "winget" : "npm" : IS_MAC ? "brew" : mgrs.includes("apt") ? "apt" : "npm";
|
|
310
|
-
resolved = { mgr: fallback, pkg: input.package, isLocal: fallback === "npm" || fallback === "pip" };
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
if (!resolved) {
|
|
314
|
-
return { ok: false, command: cmd, error: `No package manager found for "${cmd}". Specify method and package name manually.` };
|
|
315
|
-
}
|
|
316
|
-
if (policy.blockedPackages.includes(resolved.pkg)) {
|
|
317
|
-
return { ok: false, command: cmd, error: `Package "${resolved.pkg}" is blocked by policy.` };
|
|
318
|
-
}
|
|
319
|
-
if (!resolved.isLocal && !policy.allowGlobalInstalls) {
|
|
320
|
-
return { ok: false, command: cmd, error: `Global installs (${resolved.mgr}) not allowed by policy. Only local npm/pip installs are permitted. Change "Allow Global Installs" in the Permissions dashboard.`, method: resolved.mgr };
|
|
321
|
-
}
|
|
322
|
-
if (policy.allowedManagers.length > 0 && !policy.allowedManagers.includes(resolved.mgr)) {
|
|
323
|
-
return { ok: false, command: cmd, error: `Package manager "${resolved.mgr}" not in allowed list: [${policy.allowedManagers.join(", ")}]. Update allowed managers in the Permissions dashboard.` };
|
|
324
|
-
}
|
|
325
|
-
var installInfo = buildInstallCommand(resolved.mgr, resolved.pkg);
|
|
326
|
-
if (installInfo.needsElevation && !policy.allowElevated) {
|
|
327
|
-
return { ok: false, command: cmd, error: `"${resolved.mgr}" requires elevated/sudo privileges, which are disabled by policy. Enable "Allow Elevated" in the Permissions dashboard, or provide a sudo password.`, method: resolved.mgr };
|
|
328
|
-
}
|
|
329
|
-
if (policy.mode === "ask_manager") {
|
|
330
|
-
return {
|
|
331
|
-
ok: false,
|
|
332
|
-
needsApproval: true,
|
|
333
|
-
command: cmd,
|
|
334
|
-
package: resolved.pkg,
|
|
335
|
-
method: resolved.mgr,
|
|
336
|
-
installCommand: installInfo.cmd,
|
|
337
|
-
global: !resolved.isLocal,
|
|
338
|
-
needsElevation: installInfo.needsElevation,
|
|
339
|
-
message: `Agent needs approval to install "${resolved.pkg}" via ${resolved.mgr}. ${!resolved.isLocal ? "(global install)" : "(local install)"} ${installInfo.needsElevation ? "(requires elevated privileges)" : ""}`
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
console.log(`[dep-manager] Installing: ${installInfo.cmd} (local=${installInfo.isLocal}, elevated=${installInfo.needsElevation})`);
|
|
343
|
-
try {
|
|
344
|
-
var r = await runCommand(installInfo.cmd, { sudo: installInfo.needsElevation, timeout: 3e5 });
|
|
345
|
-
var records2 = sessionInstalls.get("global") || [];
|
|
346
|
-
records2.push({ package: resolved.pkg, command: cmd, method: resolved.mgr, localPath: installInfo.isLocal ? SESSION_LOCAL_DIR : void 0, wasAlreadyInstalled: false, timestamp: Date.now() });
|
|
347
|
-
sessionInstalls.set("global", records2);
|
|
348
|
-
var verify = await commandExists(cmd);
|
|
349
|
-
if (verify.exists) {
|
|
350
|
-
return {
|
|
351
|
-
ok: true,
|
|
352
|
-
command: cmd,
|
|
353
|
-
package: resolved.pkg,
|
|
354
|
-
method: resolved.mgr,
|
|
355
|
-
local: installInfo.isLocal,
|
|
356
|
-
path: verify.path,
|
|
357
|
-
note: installInfo.isLocal ? `Installed "${resolved.pkg}" locally. Available as "${cmd}" for this session.${policy.autoCleanup ? " Will be cleaned up automatically." : ""}` : `Installed "${resolved.pkg}" globally via ${resolved.mgr}. "${cmd}" is now available at ${verify.path}.`
|
|
358
|
-
};
|
|
359
|
-
} else {
|
|
360
|
-
return {
|
|
361
|
-
ok: true,
|
|
362
|
-
command: cmd,
|
|
363
|
-
package: resolved.pkg,
|
|
364
|
-
method: resolved.mgr,
|
|
365
|
-
warning: `Package installed but "${cmd}" not found in PATH. The binary might have a different name.`,
|
|
366
|
-
stdout: (r.stdout || "").slice(-1e3)
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
} catch (err) {
|
|
370
|
-
var errMsg = (err.stderr || err.message || "").slice(0, 3e3);
|
|
371
|
-
var hint = "";
|
|
372
|
-
if (errMsg.includes("Permission denied") || errMsg.includes("EACCES") || errMsg.includes("not permitted")) {
|
|
373
|
-
hint = 'Permission denied. Enable "Allow Elevated" in agent permissions and optionally provide a sudo password.';
|
|
374
|
-
} else if (errMsg.includes("No such formula") || errMsg.includes("Unable to locate package") || errMsg.includes("not found")) {
|
|
375
|
-
hint = `Package "${resolved.pkg}" not found in ${resolved.mgr}. Try a different package name.`;
|
|
376
|
-
} else if (errMsg.includes("already installed")) {
|
|
377
|
-
hint = "Already installed \u2014 try running the command directly.";
|
|
378
|
-
} else if (errMsg.includes("password") || errMsg.includes("sudo")) {
|
|
379
|
-
hint = "Sudo password required. Set it in the agent's Permissions dashboard \u2192 Dependency Policy \u2192 Sudo Password.";
|
|
380
|
-
}
|
|
381
|
-
return { ok: false, command: cmd, package: resolved.pkg, method: resolved.mgr, error: errMsg, hint: hint || "Installation failed." };
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
name: "check_environment",
|
|
387
|
-
description: "Survey the system: OS, architecture, package managers, common tool availability, disk space, and current dependency policy. Use at the start of complex tasks.",
|
|
388
|
-
input_schema: { type: "object", properties: {}, required: [] },
|
|
389
|
-
execute: async () => {
|
|
390
|
-
var commonTools = ["ffmpeg", "convert", "jq", "curl", "wget", "pandoc", "tesseract", "yt-dlp", "rg", "node", "python3", "git", "docker"];
|
|
391
|
-
if (IS_WINDOWS) commonTools.push("powershell", "wsl");
|
|
392
|
-
var checks = {};
|
|
393
|
-
await Promise.all(commonTools.map(async (tool) => {
|
|
394
|
-
checks[tool] = (await commandExists(tool)).exists;
|
|
395
|
-
}));
|
|
396
|
-
var managers = await detectPackageManagers();
|
|
397
|
-
var diskSpace = "";
|
|
398
|
-
try {
|
|
399
|
-
var dfCmd = IS_WINDOWS ? "wmic logicaldisk get size,freespace,caption" : "df -h / | tail -1";
|
|
400
|
-
diskSpace = (await execAsync(dfCmd, { timeout: 3e3 })).stdout.trim();
|
|
401
|
-
} catch {
|
|
402
|
-
}
|
|
403
|
-
var nodeVer = "";
|
|
404
|
-
try {
|
|
405
|
-
nodeVer = (await execAsync("node --version", { timeout: 2e3 })).stdout.trim();
|
|
406
|
-
} catch {
|
|
407
|
-
}
|
|
408
|
-
var installed = sessionInstalls.get("global") || [];
|
|
409
|
-
return {
|
|
410
|
-
os: platform(),
|
|
411
|
-
arch: process.arch,
|
|
412
|
-
isWindows: IS_WINDOWS,
|
|
413
|
-
isMac: IS_MAC,
|
|
414
|
-
isLinux: IS_LINUX,
|
|
415
|
-
packageManagers: managers,
|
|
416
|
-
nodeVersion: nodeVer,
|
|
417
|
-
diskSpace,
|
|
418
|
-
tools: checks,
|
|
419
|
-
missingTools: Object.entries(checks).filter(([, v]) => !v).map(([k]) => k),
|
|
420
|
-
availableTools: Object.entries(checks).filter(([, v]) => v).map(([k]) => k),
|
|
421
|
-
dependencyPolicy: {
|
|
422
|
-
mode: _activePolicy.mode,
|
|
423
|
-
allowGlobalInstalls: _activePolicy.allowGlobalInstalls,
|
|
424
|
-
allowElevated: _activePolicy.allowElevated,
|
|
425
|
-
hasSudoPassword: !!_activePolicy.sudoPassword,
|
|
426
|
-
allowedManagers: _activePolicy.allowedManagers,
|
|
427
|
-
autoCleanup: _activePolicy.autoCleanup
|
|
428
|
-
},
|
|
429
|
-
sessionInstalls: {
|
|
430
|
-
count: installed.filter((r) => !r.wasAlreadyInstalled).length,
|
|
431
|
-
packages: installed.filter((r) => !r.wasAlreadyInstalled).map((r) => ({ package: r.package, method: r.method, local: !!r.localPath }))
|
|
432
|
-
}
|
|
433
|
-
};
|
|
434
|
-
}
|
|
435
|
-
},
|
|
436
|
-
{
|
|
437
|
-
name: "cleanup_installed",
|
|
438
|
-
description: `List or remove packages installed this session. Only removes what the agent installed \u2014 never touches pre-existing packages. Use "list" to see, "cleanup" to remove, "keep" to clear tracking.`,
|
|
439
|
-
input_schema: {
|
|
440
|
-
type: "object",
|
|
441
|
-
properties: {
|
|
442
|
-
action: { type: "string", enum: ["list", "cleanup", "keep"], description: "Action to take" },
|
|
443
|
-
packages: { type: "array", items: { type: "string" }, description: "Specific packages to remove (default: all)" }
|
|
444
|
-
},
|
|
445
|
-
required: ["action"]
|
|
446
|
-
},
|
|
447
|
-
execute: async (input) => {
|
|
448
|
-
var records = sessionInstalls.get("global") || [];
|
|
449
|
-
var agentInstalled = records.filter((r) => !r.wasAlreadyInstalled);
|
|
450
|
-
var preExisting = records.filter((r) => r.wasAlreadyInstalled);
|
|
451
|
-
if (input.action === "list") {
|
|
452
|
-
return {
|
|
453
|
-
agentInstalled: agentInstalled.map((r) => ({
|
|
454
|
-
package: r.package,
|
|
455
|
-
command: r.command,
|
|
456
|
-
method: r.method,
|
|
457
|
-
local: !!r.localPath,
|
|
458
|
-
installedAt: new Date(r.timestamp).toISOString()
|
|
459
|
-
})),
|
|
460
|
-
preExisting: preExisting.map((r) => ({ command: r.command, note: "Pre-existing \u2014 will NOT be removed" })),
|
|
461
|
-
localDir: existsSync(SESSION_LOCAL_DIR) ? SESSION_LOCAL_DIR : null
|
|
462
|
-
};
|
|
463
|
-
}
|
|
464
|
-
if (input.action === "keep") {
|
|
465
|
-
sessionInstalls.delete("global");
|
|
466
|
-
return { ok: true, message: "Tracking cleared. All packages remain installed.", kept: agentInstalled.map((r) => r.package) };
|
|
467
|
-
}
|
|
468
|
-
if (input.action === "cleanup") {
|
|
469
|
-
var toRemove = input.packages ? agentInstalled.filter((r) => input.packages.includes(r.package) || input.packages.includes(r.command)) : agentInstalled;
|
|
470
|
-
var results = [];
|
|
471
|
-
var localPkgs = toRemove.filter((r) => !!r.localPath);
|
|
472
|
-
if (localPkgs.length > 0 && existsSync(SESSION_LOCAL_DIR)) {
|
|
473
|
-
try {
|
|
474
|
-
var rmCmd = IS_WINDOWS ? `rmdir /s /q "${SESSION_LOCAL_DIR}"` : `rm -rf "${SESSION_LOCAL_DIR}"`;
|
|
475
|
-
await execAsync(rmCmd, { timeout: 1e4 });
|
|
476
|
-
for (var lp of localPkgs) results.push({ package: lp.package, removed: true, method: "local-dir-deleted" });
|
|
477
|
-
} catch (err) {
|
|
478
|
-
for (var lp2 of localPkgs) results.push({ package: lp2.package, removed: false, error: err.message?.slice(0, 200) });
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
var globalPkgs = toRemove.filter((r) => !r.localPath);
|
|
482
|
-
for (var gp of globalPkgs) {
|
|
483
|
-
try {
|
|
484
|
-
var uninstallCmd = "";
|
|
485
|
-
var needsElev = false;
|
|
486
|
-
switch (gp.method) {
|
|
487
|
-
case "brew":
|
|
488
|
-
uninstallCmd = `brew uninstall --ignore-dependencies ${gp.package}`;
|
|
489
|
-
break;
|
|
490
|
-
case "apt":
|
|
491
|
-
uninstallCmd = `apt-get remove -y ${gp.package}`;
|
|
492
|
-
needsElev = true;
|
|
493
|
-
break;
|
|
494
|
-
case "dnf":
|
|
495
|
-
uninstallCmd = `dnf remove -y ${gp.package}`;
|
|
496
|
-
needsElev = true;
|
|
497
|
-
break;
|
|
498
|
-
case "pacman":
|
|
499
|
-
uninstallCmd = `pacman -R --noconfirm ${gp.package}`;
|
|
500
|
-
needsElev = true;
|
|
501
|
-
break;
|
|
502
|
-
case "snap":
|
|
503
|
-
uninstallCmd = `snap remove ${gp.package}`;
|
|
504
|
-
needsElev = true;
|
|
505
|
-
break;
|
|
506
|
-
case "choco":
|
|
507
|
-
uninstallCmd = `choco uninstall ${gp.package} -y`;
|
|
508
|
-
break;
|
|
509
|
-
case "winget":
|
|
510
|
-
uninstallCmd = `winget uninstall ${gp.package}`;
|
|
511
|
-
break;
|
|
512
|
-
case "scoop":
|
|
513
|
-
uninstallCmd = `scoop uninstall ${gp.package}`;
|
|
514
|
-
break;
|
|
515
|
-
case "pip":
|
|
516
|
-
uninstallCmd = `pip uninstall -y ${gp.package}`;
|
|
517
|
-
break;
|
|
518
|
-
}
|
|
519
|
-
if (uninstallCmd) {
|
|
520
|
-
await runCommand(uninstallCmd, { sudo: needsElev, timeout: 6e4 });
|
|
521
|
-
results.push({ package: gp.package, removed: true, method: gp.method });
|
|
522
|
-
}
|
|
523
|
-
} catch (err) {
|
|
524
|
-
results.push({ package: gp.package, removed: false, error: (err.message || "").slice(0, 200) });
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
var removedPkgs = new Set(results.filter((r) => r.removed).map((r) => r.package));
|
|
528
|
-
var remaining = records.filter((r) => !removedPkgs.has(r.package));
|
|
529
|
-
sessionInstalls.set("global", remaining);
|
|
530
|
-
return { results, remaining: remaining.filter((r) => !r.wasAlreadyInstalled).map((r) => r.package), preExistingUntouched: preExisting.map((r) => r.command) };
|
|
531
|
-
}
|
|
532
|
-
return { error: 'Unknown action. Use "list", "cleanup", or "keep".' };
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
];
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
export {
|
|
539
|
-
setDependencyPolicy,
|
|
540
|
-
getDependencyPolicy,
|
|
541
|
-
createDependencyManagerTools
|
|
542
|
-
};
|