atabey 0.0.15 → 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/README.md +20 -11
- package/dist/framework-mcp/src/index.js +69 -10
- 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 +2 -0
- package/dist/framework-mcp/src/tools/messaging/approve_operation.js +1 -1
- package/dist/framework-mcp/src/tools/messaging/approve_operation.js.map +1 -1
- 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/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 +47 -1
- 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 +71 -4
- 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 +41 -2
- 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 +113 -9
- package/dist/framework-mcp/src/utils/human-in-loop.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/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/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/log.js +8 -5
- package/dist/src/cli/commands/log.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/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 +30 -19
- package/dist/src/modules/engines/agent-executor.js.map +1 -1
- package/dist/src/modules/engines/evaluation-engine.d.ts +0 -3
- package/dist/src/modules/engines/evaluation-engine.js +17 -16
- 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/storage.d.ts +17 -0
- package/dist/src/shared/storage.js +76 -2
- 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/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 +69 -10
- 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 +1 -1
- package/framework-mcp/dist/framework-mcp/src/tools/messaging/send_message.js +19 -3
- 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 +47 -1
- package/framework-mcp/dist/framework-mcp/src/utils/auth.js +71 -4
- package/framework-mcp/dist/framework-mcp/src/utils/compliance.js +45 -13
- package/framework-mcp/dist/framework-mcp/src/utils/discipline.js +41 -2
- package/framework-mcp/dist/framework-mcp/src/utils/human-in-loop.js +113 -9
- 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/src/cli/utils/memory.js +6 -5
- package/framework-mcp/dist/src/modules/engines/evaluation-engine.js +17 -16
- 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/storage.js +76 -2
- package/framework-mcp/package.json +21 -18
- package/package.json +3 -3
- package/framework-mcp/dist/dashboard/assets/index-B_rK57vi.js +0 -1221
|
@@ -2,15 +2,31 @@ import fs from "fs";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { resolveFrameworkDir } from "../../utils/security.js";
|
|
4
4
|
import { Metrics } from "../../utils/metrics.js";
|
|
5
|
+
import { verifyMessagingPermission, resolveActiveAgent } from "../../utils/permissions.js";
|
|
5
6
|
export async function handleSendAgentMessage(projectRoot, args) {
|
|
6
7
|
const { to, category, content, traceId, parentId, requiresApproval } = args;
|
|
7
|
-
const
|
|
8
|
+
const frameworkDir = resolveFrameworkDir(projectRoot);
|
|
9
|
+
const absoluteFrameworkPath = path.isAbsolute(frameworkDir)
|
|
10
|
+
? frameworkDir
|
|
11
|
+
: path.resolve(projectRoot, frameworkDir);
|
|
12
|
+
const activeAgent = resolveActiveAgent(absoluteFrameworkPath);
|
|
13
|
+
const from = activeAgent || args.from || "@mcp";
|
|
8
14
|
if (!to || !category || !content || !traceId) {
|
|
9
15
|
const err = "Missing required messaging arguments (to, category, content, or traceId).";
|
|
10
16
|
Metrics.logError(projectRoot, from, "send_agent_message", err);
|
|
11
17
|
return { isError: true, content: [{ type: "text", text: `[ERROR] ${err}` }] };
|
|
12
18
|
}
|
|
13
|
-
|
|
19
|
+
// ENFORCE AGENT TIER MESSAGING RBAC
|
|
20
|
+
// Prevents core agents from delegating to recon agents, bypassing the quality gate.
|
|
21
|
+
// This is the AI Governance enforcement point for Claude Code, Gemini CLI, Cursor.
|
|
22
|
+
try {
|
|
23
|
+
verifyMessagingPermission(from, to);
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
const err = String(e instanceof Error ? e.message : e);
|
|
27
|
+
Metrics.logError(projectRoot, from, "send_agent_message", err);
|
|
28
|
+
return { isError: true, content: [{ type: "text", text: `[ERROR] ${err}` }] };
|
|
29
|
+
}
|
|
14
30
|
const messagesDir = path.join(projectRoot, frameworkDir, "messages");
|
|
15
31
|
const agentName = to.replace("@", "");
|
|
16
32
|
const messagePath = path.join(messagesDir, `${agentName}.json`);
|
|
@@ -23,7 +39,7 @@ export async function handleSendAgentMessage(projectRoot, args) {
|
|
|
23
39
|
if (fs.existsSync(lockPath)) {
|
|
24
40
|
try {
|
|
25
41
|
const stats = fs.statSync(lockPath);
|
|
26
|
-
if (Date.now() - stats.mtimeMs >
|
|
42
|
+
if (Date.now() - stats.mtimeMs > 15000) {
|
|
27
43
|
const tempLockPath = `${lockPath}.${Math.random().toString(36).substring(2)}.old`;
|
|
28
44
|
fs.renameSync(lockPath, tempLockPath);
|
|
29
45
|
fs.unlinkSync(tempLockPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send_message.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/messaging/send_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"send_message.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/messaging/send_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAE3F,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAmB,EAAE,IAA0B;IACxF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAE5E,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QACvD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;IAEhD,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,2EAA2E,CAAC;QACxF,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,oCAAoC;IACpC,oFAAoF;IACpF,mFAAmF;IACnF,IAAI,CAAC;QACD,yBAAyB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;IAE7D,wDAAwD;IACxD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,OAAO,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC;YACD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACpC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;wBACrC,MAAM,YAAY,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;wBAClF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;wBACtC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;oBAChC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACL,6CAA6C;gBACjD,CAAC;YACL,CAAC;YACD,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/F,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM;QACV,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,GAA0C,CAAC;YACzD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC;gBACV,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBACd,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8CAA8C,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC9I,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,6BAA6B,EAAE,wBAAwB,CAAC;QACpE,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAClF,CAAC;IAED,IAAI,CAAC;QACD,MAAM,eAAe,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5F,MAAM,qBAAqB,GAAG,gBAAgB,KAAK,SAAS;YACxD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;QAE3B,MAAM,OAAO,GAAG;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI;YACJ,EAAE;YACF,QAAQ;YACR,OAAO;YACP,QAAQ;YACR,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,eAAe;YAC1C,MAAM,EAAE,SAAS;YACjB,gBAAgB,EAAE,qBAAqB;SAC1C,CAAC;QAEF,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,4BAA4B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;YAAS,CAAC;QACP,IAAI,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBACD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -285,11 +285,11 @@ export declare const DeleteKnowledgeSchema: z.ZodObject<{
|
|
|
285
285
|
id: z.ZodOptional<z.ZodString>;
|
|
286
286
|
category: z.ZodOptional<z.ZodEnum<["ARCHITECTURE", "DECISION", "CODE_SNIPPET", "RULE", "TASK_HISTORY"]>>;
|
|
287
287
|
}, "strict", z.ZodTypeAny, {
|
|
288
|
-
id?: string | undefined;
|
|
289
288
|
category?: "ARCHITECTURE" | "DECISION" | "CODE_SNIPPET" | "RULE" | "TASK_HISTORY" | undefined;
|
|
290
|
-
}, {
|
|
291
289
|
id?: string | undefined;
|
|
290
|
+
}, {
|
|
292
291
|
category?: "ARCHITECTURE" | "DECISION" | "CODE_SNIPPET" | "RULE" | "TASK_HISTORY" | undefined;
|
|
292
|
+
id?: string | undefined;
|
|
293
293
|
}>;
|
|
294
294
|
export declare const SendAgentMessageSchema: z.ZodObject<{
|
|
295
295
|
from: z.ZodString;
|
|
@@ -303,7 +303,7 @@ export declare const SendAgentMessageSchema: z.ZodObject<{
|
|
|
303
303
|
}, "strict", z.ZodTypeAny, {
|
|
304
304
|
traceId: string;
|
|
305
305
|
from: string;
|
|
306
|
-
priority: "NORMAL" | "
|
|
306
|
+
priority: "NORMAL" | "LOW" | "HIGH";
|
|
307
307
|
to: string;
|
|
308
308
|
category: "ALERT" | "DELEGATION" | "ACTION" | "SUBTASK" | "REPLY";
|
|
309
309
|
content: string;
|
|
@@ -315,7 +315,7 @@ export declare const SendAgentMessageSchema: z.ZodObject<{
|
|
|
315
315
|
to: string;
|
|
316
316
|
category: "ALERT" | "DELEGATION" | "ACTION" | "SUBTASK" | "REPLY";
|
|
317
317
|
content: string;
|
|
318
|
-
priority?: "NORMAL" | "
|
|
318
|
+
priority?: "NORMAL" | "LOW" | "HIGH" | undefined;
|
|
319
319
|
parentId?: string | undefined;
|
|
320
320
|
requiresApproval?: boolean | undefined;
|
|
321
321
|
}>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { Metrics } from "../../utils/metrics.js";
|
|
4
|
+
import { verifyReadPermission } from "../../utils/permissions.js";
|
|
4
5
|
/**
|
|
5
6
|
* Searches for a regex pattern within files in the project.
|
|
6
7
|
*/
|
|
@@ -42,12 +43,18 @@ export function handleGrepSearch(projectRoot, args) {
|
|
|
42
43
|
if (includePattern && !filePath.endsWith(includePattern)) {
|
|
43
44
|
continue;
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
try {
|
|
47
|
+
verifyReadPermission(projectRoot, filePath);
|
|
48
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
49
|
+
if (new RegExp(pattern).test(content)) {
|
|
50
|
+
if (results.length < 30) {
|
|
51
|
+
results.push(filePath);
|
|
52
|
+
}
|
|
49
53
|
}
|
|
50
54
|
}
|
|
55
|
+
catch {
|
|
56
|
+
// Silently skip files without read permissions
|
|
57
|
+
}
|
|
51
58
|
}
|
|
52
59
|
}
|
|
53
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep_search.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/search/grep_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"grep_search.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/search/grep_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAoB;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAwB,IAAI,EAAE,CAAC,CAAC,cAAc;IAC1E,MAAM,cAAc,GAAG,IAAI,CAAC,cAAwB,IAAI,cAAc,CAAC;IAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,6BAA6B,CAAC;QAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,0BAA0B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QACzB,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;YAAE,OAAO;QACjC,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;oBAAE,OAAO;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,IAAI,cAAc,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBACtD,SAAS;gBACb,CAAC;gBACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACrB,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnB,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;oBACvB,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;wBACvD,SAAS;oBACb,CAAC;oBACD,IAAI,CAAC;wBACD,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;wBAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAClD,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;4BACpC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gCACtB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;4BAC3B,CAAC;wBACL,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACL,+CAA+C;oBACnD,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,yCAAyC;QAC7C,CAAC;IACL,CAAC,CAAC;IACF,IAAI,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,kBAAkB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC7D,CAAC,CAAC,mBAAmB,CAAC;IAE1B,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACvB,YAAY,IAAI,oIAAoI,CAAC;IACzJ,CAAC;IAED,OAAO;QACH,OAAO,EAAE,CAAC;gBACN,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY;aACrB,CAAC;KACL,CAAC;AACN,CAAC"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { safePath } from "../../utils/security.js";
|
|
4
|
+
import { verifyReadPermission } from "../../utils/permissions.js";
|
|
4
5
|
/**
|
|
5
6
|
* Lists the contents of a directory.
|
|
6
7
|
*/
|
|
7
8
|
export function handleListDir(projectRoot, args) {
|
|
8
9
|
const dirPath = safePath(projectRoot, args.path || ".");
|
|
10
|
+
// ENFORCE READ PERMISSION MATRIX FOR DIRECTORY
|
|
11
|
+
verifyReadPermission(projectRoot, path.join(args.path || ".", "placeholder"));
|
|
9
12
|
if (!fs.existsSync(dirPath)) {
|
|
10
13
|
throw new Error(`Directory not found: ${args.path}`);
|
|
11
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list_dir.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/search/list_dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"list_dir.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/search/list_dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,IAAiB;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IAExD,+CAA+C;IAC/C,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;IAE9E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,OAAO,EAAE,CAAC;gBACN,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,yBAAyB,IAAI,CAAC,IAAI,IAAI,GAAG,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC9E,CAAC;KACL,CAAC;AACN,CAAC"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
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";
|
|
3
6
|
// Each entry defines the executable and its allowed args prefix
|
|
4
7
|
const COMMAND_ALLOW_LIST = [
|
|
5
8
|
// Package managers
|
|
@@ -77,7 +80,32 @@ const COMMAND_ALLOW_LIST = [
|
|
|
77
80
|
{ cmd: "du" },
|
|
78
81
|
{ cmd: "df" },
|
|
79
82
|
];
|
|
80
|
-
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
|
+
}
|
|
81
109
|
/**
|
|
82
110
|
* Parse a command string into executable + args array.
|
|
83
111
|
* Uses spawn for safety (no shell injection).
|
|
@@ -113,6 +141,24 @@ export function handleRunCommand(projectRoot, args) {
|
|
|
113
141
|
isError: true,
|
|
114
142
|
});
|
|
115
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
|
+
}
|
|
116
162
|
if (!isAllowed(parsed)) {
|
|
117
163
|
const allowedList = COMMAND_ALLOW_LIST.map(e => e.args ? `${e.cmd} ${e.args.join(" ")}` : e.cmd);
|
|
118
164
|
const errorMsg = `Command not allowed: "${command}". Only the following are allowed: ${allowedList.join(", ")}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_command.js","sourceRoot":"","sources":["../../../../../framework-mcp/src/tools/shell/run_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
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;
|
|
@@ -33,7 +39,7 @@ export function initAuth() {
|
|
|
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
|
-
process.stderr.write("[AUTH] No authentication configured - OPEN ACCESS\n");
|
|
42
|
+
process.stderr.write("[AUTH] No authentication configured - OPEN ACCESS (anonymous users)\n");
|
|
37
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
|
}
|
|
@@ -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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"}
|
|
@@ -2,6 +2,8 @@ import ts from "typescript";
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { resolveFrameworkDir } from "./security.js";
|
|
5
|
+
import { resolveActiveAgent } from "./permissions.js";
|
|
6
|
+
import { createApprovalRequest, getApprovalStatus } from "./human-in-loop.js";
|
|
5
7
|
/**
|
|
6
8
|
* Enterprise Compliance Guardrail
|
|
7
9
|
* Checks content against corporate standards using AST analysis before allowing file mutations.
|
|
@@ -57,7 +59,7 @@ export function verifyCorporateCompliance(content, filePath) {
|
|
|
57
59
|
filePath.includes("shared/fs.ts") ||
|
|
58
60
|
filePath.includes("shared/lock.ts") ||
|
|
59
61
|
filePath.includes("quality-gate.ts") ||
|
|
60
|
-
filePath.includes("
|
|
62
|
+
filePath.includes("shell/run_command.ts");
|
|
61
63
|
if (!isExempt) {
|
|
62
64
|
errors.push(`[ERROR] Corporate Compliance Breach: Direct 'child_process' usage is forbidden at line ${sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1}. Use secure framework APIs.`);
|
|
63
65
|
}
|
|
@@ -85,7 +87,10 @@ export function verifyCorporateCompliance(content, filePath) {
|
|
|
85
87
|
// Lock files, core atomic fs wrapper, and mcp configs are exempt
|
|
86
88
|
const args = node.arguments;
|
|
87
89
|
const firstArgText = args.length > 0 ? args[0].getText(sourceFile).toLowerCase() : "";
|
|
88
|
-
const isExemptFile = filePath.includes("shared/fs.ts") ||
|
|
90
|
+
const isExemptFile = filePath.includes("shared/fs.ts") ||
|
|
91
|
+
filePath.includes("src/cli/commands/mcp.ts") ||
|
|
92
|
+
filePath.includes("utils/compliance.ts") ||
|
|
93
|
+
filePath.includes("tools/messaging/send_message.ts");
|
|
89
94
|
if (!firstArgText.includes("lock") && !isExemptFile) {
|
|
90
95
|
errors.push(`[ERROR] Corporate Compliance Breach: Raw 'fs.${prop.name.text}' mutation detected at line ${sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1}. Use atomic utilities instead.`);
|
|
91
96
|
}
|
|
@@ -204,7 +209,9 @@ export async function verifyRiskAndAwaitApproval(projectRoot, content, filePath)
|
|
|
204
209
|
const statePath = path.join(absoluteFrameworkPath, "memory", "state.json");
|
|
205
210
|
const messagesDir = path.join(absoluteFrameworkPath, "messages");
|
|
206
211
|
const managerMsgPath = path.join(messagesDir, "manager.json");
|
|
207
|
-
|
|
212
|
+
const activeAgent = resolveActiveAgent(absoluteFrameworkPath);
|
|
213
|
+
if (!activeAgent)
|
|
214
|
+
throw new Error(`Security Exception: High-risk operation blocked. ${assessment.reason}.`);
|
|
208
215
|
let traceId = "UNKNOWN";
|
|
209
216
|
if (fs.existsSync(statePath)) {
|
|
210
217
|
try {
|
|
@@ -214,21 +221,25 @@ export async function verifyRiskAndAwaitApproval(projectRoot, content, filePath)
|
|
|
214
221
|
}
|
|
215
222
|
catch { /* ignore */ }
|
|
216
223
|
}
|
|
224
|
+
// Check if already approved via human-in-loop
|
|
225
|
+
const existingStatus = getApprovalStatus(traceId);
|
|
226
|
+
if (existingStatus?.status === "APPROVED") {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (existingStatus?.status === "REJECTED" || existingStatus?.status === "EXPIRED") {
|
|
230
|
+
throw new Error(`Security Exception: High-risk operation was ${existingStatus.status}.`);
|
|
231
|
+
}
|
|
232
|
+
// Register in human-in-loop if not already present
|
|
233
|
+
if (!existingStatus) {
|
|
234
|
+
createApprovalRequest(traceId, "file_mutation", activeAgent, 80, assessment.reason || "High-risk operation detected", { filePath });
|
|
235
|
+
}
|
|
217
236
|
let statusData = {};
|
|
218
237
|
if (fs.existsSync(statusPath)) {
|
|
219
238
|
try {
|
|
220
239
|
statusData = JSON.parse(fs.readFileSync(statusPath, "utf8"));
|
|
221
|
-
for (const [agentName, info] of Object.entries(statusData)) {
|
|
222
|
-
if (info.state === "EXECUTING") {
|
|
223
|
-
activeAgent = agentName.startsWith("@") ? agentName : `@${agentName}`;
|
|
224
|
-
break;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
240
|
}
|
|
228
241
|
catch { /* ignore */ }
|
|
229
242
|
}
|
|
230
|
-
if (!activeAgent)
|
|
231
|
-
throw new Error(`Security Exception: High-risk operation blocked. ${assessment.reason}.`);
|
|
232
243
|
const statusKey = activeAgent.replace("@", "");
|
|
233
244
|
const originalTask = statusData[statusKey]?.task || "Executing task";
|
|
234
245
|
statusData[statusKey] = {
|
|
@@ -253,12 +264,16 @@ export async function verifyRiskAndAwaitApproval(projectRoot, content, filePath)
|
|
|
253
264
|
requiresApproval: true,
|
|
254
265
|
action: `MUTATION:${filePath}`
|
|
255
266
|
};
|
|
267
|
+
// Append to managerMsgPath for backward compatibility / legacy alerts
|
|
256
268
|
try {
|
|
257
269
|
fs.appendFileSync(managerMsgPath, JSON.stringify(alertMsg) + "\n");
|
|
258
270
|
}
|
|
259
271
|
catch (err) {
|
|
260
272
|
statusData[statusKey] = { state: "EXECUTING", task: originalTask };
|
|
261
|
-
|
|
273
|
+
try {
|
|
274
|
+
fs.writeFileSync(statusPath, JSON.stringify(statusData, null, 2));
|
|
275
|
+
}
|
|
276
|
+
catch { /* ignore */ }
|
|
262
277
|
throw new Error("Security Exception: Failed to queue approval request.", { cause: err });
|
|
263
278
|
}
|
|
264
279
|
const pollIntervalMs = 500;
|
|
@@ -266,6 +281,20 @@ export async function verifyRiskAndAwaitApproval(projectRoot, content, filePath)
|
|
|
266
281
|
const start = Date.now();
|
|
267
282
|
while (Date.now() - start < timeoutMs) {
|
|
268
283
|
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
284
|
+
// Check if approved via human-in-loop (e.g. approve_operation tool call)
|
|
285
|
+
const checkStatus = getApprovalStatus(traceId);
|
|
286
|
+
if (checkStatus?.status === "APPROVED") {
|
|
287
|
+
statusData[statusKey] = { state: "EXECUTING", task: originalTask };
|
|
288
|
+
try {
|
|
289
|
+
fs.writeFileSync(statusPath, JSON.stringify(statusData, null, 2));
|
|
290
|
+
}
|
|
291
|
+
catch { /* ignore */ }
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
else if (checkStatus?.status === "REJECTED" || checkStatus?.status === "EXPIRED") {
|
|
295
|
+
throw new Error(`Security Exception: High-risk operation was explicitly ${checkStatus.status}.`);
|
|
296
|
+
}
|
|
297
|
+
// Check legacy managerMsgPath approval
|
|
269
298
|
if (fs.existsSync(managerMsgPath)) {
|
|
270
299
|
try {
|
|
271
300
|
const lines = fs.readFileSync(managerMsgPath, "utf8").trim().split("\n");
|
|
@@ -276,7 +305,10 @@ export async function verifyRiskAndAwaitApproval(projectRoot, content, filePath)
|
|
|
276
305
|
if (parsed.traceId === traceId && parsed.category === "ALERT" && parsed.action === `MUTATION:${filePath}`) {
|
|
277
306
|
if (parsed.status === "APPROVED") {
|
|
278
307
|
statusData[statusKey] = { state: "EXECUTING", task: originalTask };
|
|
279
|
-
|
|
308
|
+
try {
|
|
309
|
+
fs.writeFileSync(statusPath, JSON.stringify(statusData, null, 2));
|
|
310
|
+
}
|
|
311
|
+
catch { /* ignore */ }
|
|
280
312
|
return;
|
|
281
313
|
}
|
|
282
314
|
else if (parsed.status === "PROCESSED" || parsed.status === "DENIED") {
|