atabey 0.0.14 → 0.0.16
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/LICENSE +672 -21
- package/PRIVACY.md +8 -14
- package/README.md +183 -25
- package/bin/cli.js +72 -5
- package/dist/framework-mcp/src/index.js +145 -13
- package/dist/framework-mcp/src/index.js.map +1 -1
- package/dist/framework-mcp/src/tools/control_plane/registry.d.ts +1 -1
- package/dist/framework-mcp/src/tools/control_plane/registry.js +52 -4
- package/dist/framework-mcp/src/tools/control_plane/registry.js.map +1 -1
- package/dist/framework-mcp/src/tools/definitions.js +1 -1
- package/dist/framework-mcp/src/tools/file_system/read_file.js +5 -0
- package/dist/framework-mcp/src/tools/file_system/read_file.js.map +1 -1
- package/dist/framework-mcp/src/tools/messaging/approve_operation.d.ts +10 -8
- package/dist/framework-mcp/src/tools/messaging/approve_operation.js +12 -12
- package/dist/framework-mcp/src/tools/messaging/approve_operation.js.map +1 -1
- package/dist/framework-mcp/src/tools/messaging/ask_human.d.ts +8 -8
- package/dist/framework-mcp/src/tools/messaging/ask_human.js +8 -8
- package/dist/framework-mcp/src/tools/messaging/send_message.js +19 -3
- package/dist/framework-mcp/src/tools/messaging/send_message.js.map +1 -1
- package/dist/framework-mcp/src/tools/observability/check_ports.d.ts +1 -0
- package/dist/framework-mcp/src/tools/observability/check_ports.js +21 -7
- package/dist/framework-mcp/src/tools/observability/check_ports.js.map +1 -1
- package/dist/framework-mcp/src/tools/schemas.d.ts +4 -4
- package/dist/framework-mcp/src/tools/search/grep_search.js +11 -4
- package/dist/framework-mcp/src/tools/search/grep_search.js.map +1 -1
- package/dist/framework-mcp/src/tools/search/list_dir.js +3 -0
- package/dist/framework-mcp/src/tools/search/list_dir.js.map +1 -1
- package/dist/framework-mcp/src/tools/shell/run_command.js +185 -93
- package/dist/framework-mcp/src/tools/shell/run_command.js.map +1 -1
- package/dist/framework-mcp/src/utils/auth.d.ts +26 -2
- package/dist/framework-mcp/src/utils/auth.js +74 -7
- package/dist/framework-mcp/src/utils/auth.js.map +1 -1
- package/dist/framework-mcp/src/utils/compliance.js +45 -13
- package/dist/framework-mcp/src/utils/compliance.js.map +1 -1
- package/dist/framework-mcp/src/utils/discipline.d.ts +1 -0
- package/dist/framework-mcp/src/utils/discipline.js +42 -3
- package/dist/framework-mcp/src/utils/discipline.js.map +1 -1
- package/dist/framework-mcp/src/utils/human-in-loop.d.ts +35 -2
- package/dist/framework-mcp/src/utils/human-in-loop.js +114 -10
- package/dist/framework-mcp/src/utils/human-in-loop.js.map +1 -1
- package/dist/framework-mcp/src/utils/loop-detector.js +3 -3
- package/dist/framework-mcp/src/utils/loop-detector.js.map +1 -1
- package/dist/framework-mcp/src/utils/permissions.d.ts +67 -3
- package/dist/framework-mcp/src/utils/permissions.js +179 -43
- package/dist/framework-mcp/src/utils/permissions.js.map +1 -1
- package/dist/framework-mcp/src/utils/prompt-injection.d.ts +20 -0
- package/dist/framework-mcp/src/utils/prompt-injection.js +64 -0
- package/dist/framework-mcp/src/utils/prompt-injection.js.map +1 -0
- package/dist/framework-mcp/src/utils/quality.js +4 -3
- package/dist/framework-mcp/src/utils/quality.js.map +1 -1
- package/dist/framework-mcp/src/utils/silent-router.d.ts +4 -2
- package/dist/framework-mcp/src/utils/silent-router.js +35 -9
- package/dist/framework-mcp/src/utils/silent-router.js.map +1 -1
- package/dist/framework-mcp/tests/tools/file_system/permissions.test.js +174 -71
- package/dist/framework-mcp/tests/tools/file_system/permissions.test.js.map +1 -1
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js +36 -30
- package/dist/framework-mcp/tests/tools/messaging/send_message.test.js.map +1 -1
- package/dist/framework-mcp/tests/tools/observability/check_ports.test.js +26 -12
- package/dist/framework-mcp/tests/tools/observability/check_ports.test.js.map +1 -1
- package/dist/framework-mcp/tests/tools/shell/run_command.test.js +38 -15
- package/dist/framework-mcp/tests/tools/shell/run_command.test.js.map +1 -1
- package/dist/framework-mcp/tests/utils/human-in-loop.test.js +152 -4
- package/dist/framework-mcp/tests/utils/human-in-loop.test.js.map +1 -1
- package/dist/framework-mcp/tests/utils/loop-detector.test.js +0 -2
- package/dist/framework-mcp/tests/utils/loop-detector.test.js.map +1 -1
- package/dist/framework-mcp/tests/utils/prompt-injection.test.d.ts +1 -0
- package/dist/framework-mcp/tests/utils/prompt-injection.test.js +43 -0
- package/dist/framework-mcp/tests/utils/prompt-injection.test.js.map +1 -0
- package/dist/src/cli/commands/dashboard.js +167 -2
- package/dist/src/cli/commands/dashboard.js.map +1 -1
- package/dist/src/cli/commands/init/scaffold-standards.js +1 -1
- package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -1
- package/dist/src/cli/commands/init.js +14 -7
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/log.js +8 -5
- package/dist/src/cli/commands/log.js.map +1 -1
- package/dist/src/cli/commands/mcp.js +3 -1
- package/dist/src/cli/commands/mcp.js.map +1 -1
- package/dist/src/cli/commands/orchestrate.d.ts +4 -4
- package/dist/src/cli/commands/orchestrate.js +14 -2
- package/dist/src/cli/commands/orchestrate.js.map +1 -1
- package/dist/src/cli/commands/script.js +8 -1
- package/dist/src/cli/commands/script.js.map +1 -1
- package/dist/src/cli/commands/status.js +21 -1
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/utils/memory.js +6 -5
- package/dist/src/cli/utils/memory.js.map +1 -1
- package/dist/src/cli/utils/schemas.d.ts +2 -2
- package/dist/src/contracts/tasks.d.ts +4 -4
- package/dist/src/modules/contracts/api.d.ts +6 -6
- package/dist/src/modules/engines/agent-executor.js +41 -20
- package/dist/src/modules/engines/agent-executor.js.map +1 -1
- package/dist/src/modules/engines/agent-loop.d.ts +5 -5
- package/dist/src/modules/engines/agent-loop.js +5 -5
- package/dist/src/modules/engines/evaluation-engine.d.ts +9 -2
- package/dist/src/modules/engines/evaluation-engine.js +77 -9
- package/dist/src/modules/engines/evaluation-engine.js.map +1 -1
- package/dist/src/modules/engines/quality-gate.js +4 -2
- package/dist/src/modules/engines/quality-gate.js.map +1 -1
- package/dist/src/modules/engines/risk-engine.d.ts +17 -1
- package/dist/src/modules/engines/risk-engine.js +98 -3
- package/dist/src/modules/engines/risk-engine.js.map +1 -1
- package/dist/src/modules/engines/routing-engine.d.ts +26 -1
- package/dist/src/modules/engines/routing-engine.js +97 -1
- package/dist/src/modules/engines/routing-engine.js.map +1 -1
- package/dist/src/modules/providers/shared.js +2 -3
- package/dist/src/modules/providers/shared.js.map +1 -1
- package/dist/src/shared/pii.js +1 -1
- package/dist/src/shared/pii.js.map +1 -1
- package/dist/src/shared/storage.d.ts +60 -0
- package/dist/src/shared/storage.js +77 -3
- package/dist/src/shared/storage.js.map +1 -1
- package/dist/tests/cli/commands/dashboard-coverage.test.js +3 -1
- package/dist/tests/cli/commands/dashboard-coverage.test.js.map +1 -1
- package/dist/tests/modules/engines/agent-executor.test.js +1 -1
- package/dist/tests/modules/engines/agent-executor.test.js.map +1 -1
- package/dist/tests/modules/engines/evaluation-engine.test.js +2 -2
- package/dist/tests/modules/engines/evaluation-engine.test.js.map +1 -1
- package/dist/tests/status-cost.test.js +2 -0
- package/dist/tests/status-cost.test.js.map +1 -1
- package/dist/tests/storage-operations.test.js +31 -4
- package/dist/tests/storage-operations.test.js.map +1 -1
- package/dist/vitest.config.js +6 -4
- package/dist/vitest.config.js.map +1 -1
- package/framework-mcp/README.md +18 -32
- package/framework-mcp/dist/dashboard/assets/index-B-Eu7_J9.js +1260 -0
- package/framework-mcp/dist/dashboard/index.html +1 -1
- package/framework-mcp/dist/framework-mcp/src/index.js +145 -13
- package/framework-mcp/dist/framework-mcp/src/tools/control_plane/registry.js +52 -4
- package/framework-mcp/dist/framework-mcp/src/tools/definitions.js +1 -1
- package/framework-mcp/dist/framework-mcp/src/tools/file_system/read_file.js +5 -0
- package/framework-mcp/dist/framework-mcp/src/tools/messaging/approve_operation.js +12 -12
- package/framework-mcp/dist/framework-mcp/src/tools/messaging/ask_human.js +8 -8
- package/framework-mcp/dist/framework-mcp/src/tools/messaging/send_message.js +19 -3
- package/framework-mcp/dist/framework-mcp/src/tools/observability/check_ports.js +21 -7
- package/framework-mcp/dist/framework-mcp/src/tools/search/grep_search.js +11 -4
- package/framework-mcp/dist/framework-mcp/src/tools/search/list_dir.js +3 -0
- package/framework-mcp/dist/framework-mcp/src/tools/shell/run_command.js +185 -93
- package/framework-mcp/dist/framework-mcp/src/utils/auth.js +74 -7
- package/framework-mcp/dist/framework-mcp/src/utils/compliance.js +45 -13
- package/framework-mcp/dist/framework-mcp/src/utils/discipline.js +42 -3
- package/framework-mcp/dist/framework-mcp/src/utils/human-in-loop.js +114 -10
- package/framework-mcp/dist/framework-mcp/src/utils/loop-detector.js +3 -3
- package/framework-mcp/dist/framework-mcp/src/utils/permissions.js +179 -43
- package/framework-mcp/dist/framework-mcp/src/utils/prompt-injection.js +63 -0
- package/framework-mcp/dist/framework-mcp/src/utils/quality.js +4 -3
- package/framework-mcp/dist/framework-mcp/src/utils/silent-router.js +35 -9
- package/framework-mcp/dist/src/cli/utils/memory.js +6 -5
- package/framework-mcp/dist/src/modules/engines/evaluation-engine.js +170 -0
- package/framework-mcp/dist/src/modules/engines/quality-gate.js +4 -2
- package/framework-mcp/dist/src/modules/engines/risk-engine.js +98 -3
- package/framework-mcp/dist/src/modules/engines/routing-engine.js +97 -1
- package/framework-mcp/dist/src/modules/providers/shared.js +2 -3
- package/framework-mcp/dist/src/shared/pii.js +1 -1
- package/framework-mcp/dist/src/shared/storage.js +77 -3
- package/framework-mcp/package.json +21 -18
- package/mcp.json +3 -2
- package/package.json +4 -5
- package/framework-mcp/dist/dashboard/assets/index-B2mYld0c.js +0 -1221
|
@@ -1,102 +1,175 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
2
|
import { Metrics } from "../../utils/metrics.js";
|
|
3
|
+
import { resolveActiveAgent, getAgentTier } from "../../utils/permissions.js";
|
|
4
|
+
import { resolveFrameworkDir } from "../../utils/security.js";
|
|
5
|
+
import path from "path";
|
|
6
|
+
// Each entry defines the executable and its allowed args prefix
|
|
3
7
|
const COMMAND_ALLOW_LIST = [
|
|
4
8
|
// Package managers
|
|
5
|
-
"npm test",
|
|
6
|
-
"npm run",
|
|
7
|
-
"npm install",
|
|
8
|
-
"npm ci",
|
|
9
|
-
"npm audit",
|
|
10
|
-
"npx vitest",
|
|
11
|
-
"npx tsc",
|
|
12
|
-
"npx eslint",
|
|
13
|
-
"yarn test",
|
|
14
|
-
"yarn run",
|
|
15
|
-
"yarn install",
|
|
16
|
-
"pnpm test",
|
|
17
|
-
"pnpm run",
|
|
18
|
-
"pnpm install",
|
|
9
|
+
{ cmd: "npm", args: ["test"] },
|
|
10
|
+
{ cmd: "npm", args: ["run"] },
|
|
11
|
+
{ cmd: "npm", args: ["install"] },
|
|
12
|
+
{ cmd: "npm", args: ["ci"] },
|
|
13
|
+
{ cmd: "npm", args: ["audit"] },
|
|
14
|
+
{ cmd: "npx", args: ["vitest"] },
|
|
15
|
+
{ cmd: "npx", args: ["tsc"] },
|
|
16
|
+
{ cmd: "npx", args: ["eslint"] },
|
|
17
|
+
{ cmd: "yarn", args: ["test"] },
|
|
18
|
+
{ cmd: "yarn", args: ["run"] },
|
|
19
|
+
{ cmd: "yarn", args: ["install"] },
|
|
20
|
+
{ cmd: "pnpm", args: ["test"] },
|
|
21
|
+
{ cmd: "pnpm", args: ["run"] },
|
|
22
|
+
{ cmd: "pnpm", args: ["install"] },
|
|
19
23
|
// Git
|
|
20
|
-
"git status",
|
|
21
|
-
"git diff",
|
|
22
|
-
"git log",
|
|
23
|
-
"git branch",
|
|
24
|
-
"git stash",
|
|
25
|
-
"git add",
|
|
26
|
-
"git commit",
|
|
27
|
-
"git push",
|
|
28
|
-
"git pull",
|
|
29
|
-
"git fetch",
|
|
30
|
-
"git merge",
|
|
31
|
-
"git rebase",
|
|
32
|
-
"git checkout",
|
|
33
|
-
"git reset",
|
|
24
|
+
{ cmd: "git", args: ["status"] },
|
|
25
|
+
{ cmd: "git", args: ["diff"] },
|
|
26
|
+
{ cmd: "git", args: ["log"] },
|
|
27
|
+
{ cmd: "git", args: ["branch"] },
|
|
28
|
+
{ cmd: "git", args: ["stash"] },
|
|
29
|
+
{ cmd: "git", args: ["add"] },
|
|
30
|
+
{ cmd: "git", args: ["commit"] },
|
|
31
|
+
{ cmd: "git", args: ["push"] },
|
|
32
|
+
{ cmd: "git", args: ["pull"] },
|
|
33
|
+
{ cmd: "git", args: ["fetch"] },
|
|
34
|
+
{ cmd: "git", args: ["merge"] },
|
|
35
|
+
{ cmd: "git", args: ["rebase"] },
|
|
36
|
+
{ cmd: "git", args: ["checkout"] },
|
|
37
|
+
{ cmd: "git", args: ["reset"] },
|
|
34
38
|
// Build tools
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"uniq",
|
|
79
|
-
"echo",
|
|
80
|
-
"pwd",
|
|
81
|
-
"which",
|
|
82
|
-
"file",
|
|
83
|
-
"du",
|
|
84
|
-
"df",
|
|
39
|
+
{ cmd: "make" },
|
|
40
|
+
{ cmd: "cmake" },
|
|
41
|
+
{ cmd: "dotnet", args: ["test"] },
|
|
42
|
+
{ cmd: "dotnet", args: ["format"] },
|
|
43
|
+
{ cmd: "dotnet", args: ["build"] },
|
|
44
|
+
{ cmd: "dotnet", args: ["run"] },
|
|
45
|
+
{ cmd: "dotnet", args: ["restore"] },
|
|
46
|
+
{ cmd: "go", args: ["test"] },
|
|
47
|
+
{ cmd: "go", args: ["fmt"] },
|
|
48
|
+
{ cmd: "go", args: ["build"] },
|
|
49
|
+
{ cmd: "go", args: ["run"] },
|
|
50
|
+
{ cmd: "go", args: ["vet"] },
|
|
51
|
+
{ cmd: "go", args: ["mod"] },
|
|
52
|
+
{ cmd: "pytest" },
|
|
53
|
+
{ cmd: "ruff", args: ["check"] },
|
|
54
|
+
{ cmd: "ruff", args: ["format"] },
|
|
55
|
+
{ cmd: "mvn" },
|
|
56
|
+
{ cmd: "./gradlew" },
|
|
57
|
+
{ cmd: "cargo", args: ["test"] },
|
|
58
|
+
{ cmd: "cargo", args: ["build"] },
|
|
59
|
+
{ cmd: "cargo", args: ["check"] },
|
|
60
|
+
{ cmd: "cargo", args: ["fmt"] },
|
|
61
|
+
// File operations (safe) — spawn prevents shell injection
|
|
62
|
+
{ cmd: "mkdir" },
|
|
63
|
+
{ cmd: "cp" },
|
|
64
|
+
{ cmd: "mv" },
|
|
65
|
+
{ cmd: "rmdir" },
|
|
66
|
+
{ cmd: "cat" },
|
|
67
|
+
{ cmd: "ls" },
|
|
68
|
+
{ cmd: "touch" },
|
|
69
|
+
{ cmd: "head" },
|
|
70
|
+
{ cmd: "tail" },
|
|
71
|
+
{ cmd: "wc" },
|
|
72
|
+
{ cmd: "grep" },
|
|
73
|
+
{ cmd: "find" },
|
|
74
|
+
{ cmd: "sort" },
|
|
75
|
+
{ cmd: "uniq" },
|
|
76
|
+
{ cmd: "echo" },
|
|
77
|
+
{ cmd: "pwd" },
|
|
78
|
+
{ cmd: "which" },
|
|
79
|
+
{ cmd: "file" },
|
|
80
|
+
{ cmd: "du" },
|
|
81
|
+
{ cmd: "df" },
|
|
85
82
|
];
|
|
86
|
-
const TIMEOUT =
|
|
83
|
+
const TIMEOUT = parseInt(process.env.MCP_COMMAND_TIMEOUT_MS || "30000", 10);
|
|
84
|
+
/**
|
|
85
|
+
* Checks if a parsed command represents a state-mutating (write) operation.
|
|
86
|
+
*/
|
|
87
|
+
function isWriteCommand(parsed) {
|
|
88
|
+
const cmd = parsed.cmd;
|
|
89
|
+
const firstArg = parsed.args[0] || "";
|
|
90
|
+
const writeCmds = ["mkdir", "cp", "mv", "rmdir", "touch", "make", "cmake", "./gradlew", "mvn"];
|
|
91
|
+
if (writeCmds.includes(cmd))
|
|
92
|
+
return true;
|
|
93
|
+
if (cmd === "npm" && ["install", "ci", "audit", "run"].includes(firstArg))
|
|
94
|
+
return true;
|
|
95
|
+
if (cmd === "yarn" && ["install", "run"].includes(firstArg))
|
|
96
|
+
return true;
|
|
97
|
+
if (cmd === "pnpm" && ["install", "run"].includes(firstArg))
|
|
98
|
+
return true;
|
|
99
|
+
if (cmd === "git" && ["add", "commit", "push", "pull", "merge", "rebase", "checkout", "reset"].includes(firstArg))
|
|
100
|
+
return true;
|
|
101
|
+
if (cmd === "dotnet" && ["build", "run", "restore"].includes(firstArg))
|
|
102
|
+
return true;
|
|
103
|
+
if (cmd === "go" && ["build", "run", "mod"].includes(firstArg))
|
|
104
|
+
return true;
|
|
105
|
+
if (cmd === "cargo" && ["build", "check"].includes(firstArg))
|
|
106
|
+
return true;
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse a command string into executable + args array.
|
|
111
|
+
* Uses spawn for safety (no shell injection).
|
|
112
|
+
*/
|
|
113
|
+
function parseCommand(cmdString) {
|
|
114
|
+
const parts = cmdString.trim().split(/\s+/);
|
|
115
|
+
if (parts.length === 0)
|
|
116
|
+
return null;
|
|
117
|
+
return { cmd: parts[0], args: parts.slice(1) };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check if a parsed command matches the allow list.
|
|
121
|
+
*/
|
|
122
|
+
function isAllowed(parsed) {
|
|
123
|
+
return COMMAND_ALLOW_LIST.some(entry => {
|
|
124
|
+
if (entry.cmd !== parsed.cmd)
|
|
125
|
+
return false;
|
|
126
|
+
if (!entry.args)
|
|
127
|
+
return true; // Any args allowed for this cmd
|
|
128
|
+
if (!parsed.args || parsed.args.length < entry.args.length)
|
|
129
|
+
return false;
|
|
130
|
+
// Check that args start with the allowed prefix
|
|
131
|
+
return entry.args.every((arg, i) => parsed.args[i] === arg);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
87
134
|
export function handleRunCommand(projectRoot, args) {
|
|
88
135
|
const command = args.command;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
136
|
+
// Parse command into executable + args
|
|
137
|
+
const parsed = parseCommand(command);
|
|
138
|
+
if (!parsed) {
|
|
139
|
+
return Promise.resolve({
|
|
140
|
+
content: [{ type: "text", text: "ERROR: Empty command." }],
|
|
141
|
+
isError: true,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Resolve active agent and tier to check command permission
|
|
145
|
+
const frameworkDir = resolveFrameworkDir(projectRoot);
|
|
146
|
+
const absoluteFrameworkPath = path.isAbsolute(frameworkDir)
|
|
147
|
+
? frameworkDir
|
|
148
|
+
: path.resolve(projectRoot, frameworkDir);
|
|
149
|
+
const activeAgent = resolveActiveAgent(absoluteFrameworkPath);
|
|
150
|
+
if (activeAgent) {
|
|
151
|
+
const tier = getAgentTier(activeAgent);
|
|
152
|
+
if (tier === "recon" && isWriteCommand(parsed)) {
|
|
153
|
+
return Promise.resolve({
|
|
154
|
+
isError: true,
|
|
155
|
+
content: [{
|
|
156
|
+
type: "text",
|
|
157
|
+
text: `[RBAC] Permission Denied: Agent ${activeAgent} (tier: recon) is not allowed to run write/build command "${command}". Recon agents are restricted to read-only commands.`
|
|
158
|
+
}]
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!isAllowed(parsed)) {
|
|
163
|
+
const allowedList = COMMAND_ALLOW_LIST.map(e => e.args ? `${e.cmd} ${e.args.join(" ")}` : e.cmd);
|
|
164
|
+
const errorMsg = `Command not allowed: "${command}". Only the following are allowed: ${allowedList.join(", ")}`;
|
|
92
165
|
Metrics.logError(projectRoot, "@mcp", `run_shell_command: ${command} (denied)`, errorMsg);
|
|
93
166
|
return Promise.resolve({
|
|
94
167
|
content: [{ type: "text", text: `ERROR: ${errorMsg}` }],
|
|
95
168
|
isError: true,
|
|
96
169
|
});
|
|
97
170
|
}
|
|
98
|
-
//
|
|
99
|
-
const hasShellMetacharacters = /[;&|><$`\n\r]/.test(
|
|
171
|
+
// Reject any args containing shell metacharacters
|
|
172
|
+
const hasShellMetacharacters = parsed.args.some(a => /[;&|><$`\n\r]/.test(a));
|
|
100
173
|
if (hasShellMetacharacters) {
|
|
101
174
|
const errorMsg = "Command rejected: Shell metacharacters are forbidden to prevent command injection.";
|
|
102
175
|
Metrics.logError(projectRoot, "@mcp", `run_shell_command: ${command} (denied: metacharacters)`, errorMsg);
|
|
@@ -106,12 +179,30 @@ export function handleRunCommand(projectRoot, args) {
|
|
|
106
179
|
});
|
|
107
180
|
}
|
|
108
181
|
return new Promise((resolve) => {
|
|
109
|
-
|
|
182
|
+
const child = spawn(parsed.cmd, parsed.args, {
|
|
183
|
+
cwd: projectRoot,
|
|
184
|
+
timeout: TIMEOUT,
|
|
185
|
+
shell: false,
|
|
186
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
187
|
+
});
|
|
188
|
+
let stdout = "";
|
|
189
|
+
let stderr = "";
|
|
190
|
+
child.stdout.on("data", (data) => { stdout += data.toString(); });
|
|
191
|
+
child.stderr.on("data", (data) => { stderr += data.toString(); });
|
|
192
|
+
child.on("error", (err) => {
|
|
193
|
+
const errorMsg = `Failed to start command: ${err.message}`;
|
|
194
|
+
Metrics.logError(projectRoot, "@mcp", `run_shell_command: ${command}`, errorMsg);
|
|
195
|
+
resolve({
|
|
196
|
+
content: [{ type: "text", text: `ERROR: ${errorMsg}` }],
|
|
197
|
+
isError: true,
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
child.on("close", (code) => {
|
|
110
201
|
const output = stdout + stderr;
|
|
111
202
|
const tokens = Metrics.estimateTokens(output);
|
|
112
203
|
Metrics.logUsage(projectRoot, "@mcp", `run_shell_command: ${command}`, tokens);
|
|
113
|
-
if (
|
|
114
|
-
const errorMsg = `Command failed with exit code ${
|
|
204
|
+
if (code !== 0) {
|
|
205
|
+
const errorMsg = `Command failed with exit code ${code}.`;
|
|
115
206
|
Metrics.logError(projectRoot, "@mcp", `run_shell_command: ${command}`, errorMsg);
|
|
116
207
|
resolve({
|
|
117
208
|
content: [{ type: "text", text: `ERROR: ${errorMsg}. Output: ${output}` }],
|
|
@@ -121,11 +212,12 @@ export function handleRunCommand(projectRoot, args) {
|
|
|
121
212
|
}
|
|
122
213
|
// Truncate long outputs
|
|
123
214
|
const MAX_OUTPUT_LENGTH = 5000;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
215
|
+
const truncatedOutput = output.length > MAX_OUTPUT_LENGTH
|
|
216
|
+
? output.substring(0, MAX_OUTPUT_LENGTH) + "... [TRUNCATED] ..."
|
|
217
|
+
: output;
|
|
218
|
+
resolve({
|
|
219
|
+
content: [{ type: "text", text: truncatedOutput }],
|
|
220
|
+
});
|
|
129
221
|
});
|
|
130
222
|
});
|
|
131
223
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_command.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/shell/run_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run_command.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/shell/run_command.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,18 @@
|
|
|
5
5
|
* When MCP_AUTH_TOKEN is set, all MCP and API requests require
|
|
6
6
|
* Authorization: Bearer <token> header.
|
|
7
7
|
*
|
|
8
|
+
* Supports multi-user setup via MCP_AUTH_USERS:
|
|
9
|
+
* MCP_AUTH_USERS=alice:key1,bob:key2,cmdr:key3
|
|
10
|
+
*
|
|
11
|
+
* Each user gets their own API key. Tool calls and audit logs
|
|
12
|
+
* are tagged with the authenticated user's name.
|
|
13
|
+
*
|
|
8
14
|
* Environment Variables:
|
|
9
|
-
* MCP_AUTH_TOKEN - API key for
|
|
15
|
+
* MCP_AUTH_TOKEN - Master API key for admin access (optional)
|
|
10
16
|
* MCP_AUTH_USERS - Comma-separated list of user:token pairs (optional)
|
|
11
17
|
* Example: "alice:key1,bob:key2"
|
|
12
18
|
*
|
|
13
|
-
* If neither is set, authentication is disabled (open access).
|
|
19
|
+
* If neither is set, authentication is disabled (open access / anonymous).
|
|
14
20
|
*/
|
|
15
21
|
/**
|
|
16
22
|
* Initialize authentication from environment variables.
|
|
@@ -26,6 +32,20 @@ export declare function authenticate(req: {
|
|
|
26
32
|
authenticated: boolean;
|
|
27
33
|
user: string;
|
|
28
34
|
};
|
|
35
|
+
/**
|
|
36
|
+
* Authenticate using a raw token string (for MCP stdio mode).
|
|
37
|
+
* In stdio mode, the user identity is set via environment.
|
|
38
|
+
*/
|
|
39
|
+
export declare function authenticateToken(token: string): {
|
|
40
|
+
authenticated: boolean;
|
|
41
|
+
user: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Get the current authenticated user identity for stdio mode.
|
|
45
|
+
* Reads from environment or returns "anonymous".
|
|
46
|
+
* For HTTP/SSE mode, use authenticate() on the request.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getCurrentUser(): string;
|
|
29
49
|
/**
|
|
30
50
|
* Generate authentication headers for MCP client configuration.
|
|
31
51
|
*/
|
|
@@ -34,3 +54,7 @@ export declare function getAuthHeader(user: string, token: string): string;
|
|
|
34
54
|
* Check if authentication is enabled.
|
|
35
55
|
*/
|
|
36
56
|
export declare function isAuthEnabled(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get list of configured users (without tokens).
|
|
59
|
+
*/
|
|
60
|
+
export declare function getConfiguredUsers(): string[];
|
|
@@ -5,12 +5,18 @@
|
|
|
5
5
|
* When MCP_AUTH_TOKEN is set, all MCP and API requests require
|
|
6
6
|
* Authorization: Bearer <token> header.
|
|
7
7
|
*
|
|
8
|
+
* Supports multi-user setup via MCP_AUTH_USERS:
|
|
9
|
+
* MCP_AUTH_USERS=alice:key1,bob:key2,cmdr:key3
|
|
10
|
+
*
|
|
11
|
+
* Each user gets their own API key. Tool calls and audit logs
|
|
12
|
+
* are tagged with the authenticated user's name.
|
|
13
|
+
*
|
|
8
14
|
* Environment Variables:
|
|
9
|
-
* MCP_AUTH_TOKEN - API key for
|
|
15
|
+
* MCP_AUTH_TOKEN - Master API key for admin access (optional)
|
|
10
16
|
* MCP_AUTH_USERS - Comma-separated list of user:token pairs (optional)
|
|
11
17
|
* Example: "alice:key1,bob:key2"
|
|
12
18
|
*
|
|
13
|
-
* If neither is set, authentication is disabled (open access).
|
|
19
|
+
* If neither is set, authentication is disabled (open access / anonymous).
|
|
14
20
|
*/
|
|
15
21
|
let authUsers = [];
|
|
16
22
|
let masterToken = null;
|
|
@@ -27,14 +33,14 @@ export function initAuth() {
|
|
|
27
33
|
}).filter(u => u.token);
|
|
28
34
|
}
|
|
29
35
|
if (masterToken) {
|
|
30
|
-
|
|
36
|
+
process.stderr.write(`[AUTH] Master token configured (${masterToken.length} chars)\n`);
|
|
31
37
|
}
|
|
32
38
|
if (authUsers.length > 0) {
|
|
33
|
-
|
|
39
|
+
process.stderr.write(`[AUTH] ${authUsers.length} user(s) configured: ${authUsers.map(u => u.name).join(", ")}\n`);
|
|
34
40
|
}
|
|
35
41
|
if (!masterToken && authUsers.length === 0) {
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
process.stderr.write("[AUTH] No authentication configured - OPEN ACCESS (anonymous users)\n");
|
|
43
|
+
process.stderr.write("[AUTH] Set MCP_AUTH_TOKEN=<key> or MCP_AUTH_USERS=user1:key1,user2:key2 to enable\n");
|
|
38
44
|
}
|
|
39
45
|
}
|
|
40
46
|
/**
|
|
@@ -43,7 +49,7 @@ export function initAuth() {
|
|
|
43
49
|
*/
|
|
44
50
|
export function authenticate(req) {
|
|
45
51
|
if (!masterToken && authUsers.length === 0) {
|
|
46
|
-
// Auth disabled - allow all
|
|
52
|
+
// Auth disabled - allow all as anonymous
|
|
47
53
|
return { authenticated: true, user: "anonymous" };
|
|
48
54
|
}
|
|
49
55
|
const authHeader = req.headers["authorization"];
|
|
@@ -64,6 +70,53 @@ export function authenticate(req) {
|
|
|
64
70
|
}
|
|
65
71
|
return { authenticated: false, user: "" };
|
|
66
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Authenticate using a raw token string (for MCP stdio mode).
|
|
75
|
+
* In stdio mode, the user identity is set via environment.
|
|
76
|
+
*/
|
|
77
|
+
export function authenticateToken(token) {
|
|
78
|
+
if (!masterToken && authUsers.length === 0) {
|
|
79
|
+
return { authenticated: true, user: "anonymous" };
|
|
80
|
+
}
|
|
81
|
+
// Check master token
|
|
82
|
+
if (masterToken && token === masterToken) {
|
|
83
|
+
return { authenticated: true, user: "admin" };
|
|
84
|
+
}
|
|
85
|
+
// Check user tokens
|
|
86
|
+
for (const user of authUsers) {
|
|
87
|
+
if (token === user.token) {
|
|
88
|
+
return { authenticated: true, user: user.name };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return { authenticated: false, user: "" };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the current authenticated user identity for stdio mode.
|
|
95
|
+
* Reads from environment or returns "anonymous".
|
|
96
|
+
* For HTTP/SSE mode, use authenticate() on the request.
|
|
97
|
+
*/
|
|
98
|
+
export function getCurrentUser() {
|
|
99
|
+
// Stdio mode: user identity comes from env or git config
|
|
100
|
+
const envUser = process.env.MCP_USER;
|
|
101
|
+
if (envUser)
|
|
102
|
+
return envUser;
|
|
103
|
+
// Try to get from git config
|
|
104
|
+
try {
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
106
|
+
const { execSync } = require("child_process");
|
|
107
|
+
const gitUser = execSync("git config user.name", { encoding: "utf8" }).trim();
|
|
108
|
+
if (gitUser)
|
|
109
|
+
return gitUser;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// git not available
|
|
113
|
+
}
|
|
114
|
+
// Try system user
|
|
115
|
+
const systemUser = process.env.USER || process.env.USERNAME;
|
|
116
|
+
if (systemUser)
|
|
117
|
+
return systemUser;
|
|
118
|
+
return "anonymous";
|
|
119
|
+
}
|
|
67
120
|
/**
|
|
68
121
|
* Generate authentication headers for MCP client configuration.
|
|
69
122
|
*/
|
|
@@ -76,4 +129,18 @@ export function getAuthHeader(user, token) {
|
|
|
76
129
|
export function isAuthEnabled() {
|
|
77
130
|
return !!masterToken || authUsers.length > 0;
|
|
78
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Get list of configured users (without tokens).
|
|
134
|
+
*/
|
|
135
|
+
export function getConfiguredUsers() {
|
|
136
|
+
if (authUsers.length > 0) {
|
|
137
|
+
return authUsers.map(u => u.name);
|
|
138
|
+
}
|
|
139
|
+
if (masterToken) {
|
|
140
|
+
return ["admin"];
|
|
141
|
+
}
|
|
142
|
+
return ["anonymous"];
|
|
143
|
+
}
|
|
144
|
+
// Auto-initialize on load
|
|
145
|
+
initAuth();
|
|
79
146
|
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../framework-mcp/src/utils/auth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../framework-mcp/src/utils/auth.ts"],"names":[],"mappings":"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"}
|