@praxis.guard/auditor-cli 0.0.62 → 0.0.64
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/README.md +19 -0
- package/dist/adapters/claude-code/adapter.d.ts +3 -1
- package/dist/adapters/claude-code/adapter.d.ts.map +1 -1
- package/dist/adapters/claude-code/adapter.js +68 -0
- package/dist/adapters/claude-code/adapter.js.map +1 -1
- package/dist/adapters/claude-desktop.d.ts +2 -1
- package/dist/adapters/claude-desktop.d.ts.map +1 -1
- package/dist/adapters/claude-desktop.js +24 -0
- package/dist/adapters/claude-desktop.js.map +1 -1
- package/dist/adapters/codex.d.ts +3 -1
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +7 -1
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/copilot-cli/adapter.d.ts +3 -1
- package/dist/adapters/copilot-cli/adapter.d.ts.map +1 -1
- package/dist/adapters/copilot-cli/adapter.js +57 -1
- package/dist/adapters/copilot-cli/adapter.js.map +1 -1
- package/dist/adapters/copilot-cli/config.d.ts +6 -0
- package/dist/adapters/copilot-cli/config.d.ts.map +1 -1
- package/dist/adapters/copilot-cli/config.js +23 -0
- package/dist/adapters/copilot-cli/config.js.map +1 -1
- package/dist/adapters/cursor.d.ts +4 -1
- package/dist/adapters/cursor.d.ts.map +1 -1
- package/dist/adapters/cursor.js +15 -1
- package/dist/adapters/cursor.js.map +1 -1
- package/dist/adapters/remove-helpers.d.ts +23 -0
- package/dist/adapters/remove-helpers.d.ts.map +1 -0
- package/dist/adapters/remove-helpers.js +40 -0
- package/dist/adapters/remove-helpers.js.map +1 -0
- package/dist/adapters/select-targets.d.ts +10 -0
- package/dist/adapters/select-targets.d.ts.map +1 -1
- package/dist/adapters/select-targets.js +23 -1
- package/dist/adapters/select-targets.js.map +1 -1
- package/dist/adapters/types.d.ts +29 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/vscode.d.ts +2 -1
- package/dist/adapters/vscode.d.ts.map +1 -1
- package/dist/adapters/vscode.js +38 -6
- package/dist/adapters/vscode.js.map +1 -1
- package/dist/approval/mcp-flow-create.d.ts +3 -0
- package/dist/approval/mcp-flow-create.d.ts.map +1 -0
- package/dist/approval/mcp-flow-create.js +76 -0
- package/dist/approval/mcp-flow-create.js.map +1 -0
- package/dist/approval/mcp-flow-existing.d.ts +14 -0
- package/dist/approval/mcp-flow-existing.d.ts.map +1 -0
- package/dist/approval/mcp-flow-existing.js +43 -0
- package/dist/approval/mcp-flow-existing.js.map +1 -0
- package/dist/approval/mcp-flow-outcome.d.ts +5 -0
- package/dist/approval/mcp-flow-outcome.d.ts.map +1 -0
- package/dist/approval/mcp-flow-outcome.js +19 -0
- package/dist/approval/mcp-flow-outcome.js.map +1 -0
- package/dist/approval/mcp-flow-pending.d.ts +7 -0
- package/dist/approval/mcp-flow-pending.d.ts.map +1 -0
- package/dist/approval/mcp-flow-pending.js +25 -0
- package/dist/approval/mcp-flow-pending.js.map +1 -0
- package/dist/approval/mcp-flow-redeem.d.ts +13 -0
- package/dist/approval/mcp-flow-redeem.d.ts.map +1 -0
- package/dist/approval/mcp-flow-redeem.js +20 -0
- package/dist/approval/mcp-flow-redeem.js.map +1 -0
- package/dist/approval/mcp-flow.d.ts +6 -28
- package/dist/approval/mcp-flow.d.ts.map +1 -1
- package/dist/approval/mcp-flow.js +21 -129
- package/dist/approval/mcp-flow.js.map +1 -1
- package/dist/approval/mcp-flow.types.d.ts +42 -0
- package/dist/approval/mcp-flow.types.d.ts.map +1 -0
- package/dist/approval/mcp-flow.types.js +2 -0
- package/dist/approval/mcp-flow.types.js.map +1 -0
- package/dist/cli/cursor-config/environment-config.d.ts +8 -0
- package/dist/cli/cursor-config/environment-config.d.ts.map +1 -1
- package/dist/cli/cursor-config/environment-config.js +45 -1
- package/dist/cli/cursor-config/environment-config.js.map +1 -1
- package/dist/cli/cursor-config/hooks-config.d.ts +13 -0
- package/dist/cli/cursor-config/hooks-config.d.ts.map +1 -1
- package/dist/cli/cursor-config/hooks-config.js +64 -0
- package/dist/cli/cursor-config/hooks-config.js.map +1 -1
- package/dist/cli/cursor-config/index.d.ts +3 -3
- package/dist/cli/cursor-config/index.d.ts.map +1 -1
- package/dist/cli/cursor-config/index.js +3 -3
- package/dist/cli/cursor-config/index.js.map +1 -1
- package/dist/cli/cursor-config/json-io.d.ts +2 -0
- package/dist/cli/cursor-config/json-io.d.ts.map +1 -1
- package/dist/cli/cursor-config/json-io.js +5 -1
- package/dist/cli/cursor-config/json-io.js.map +1 -1
- package/dist/cli/cursor-config/mcp-config.d.ts +5 -0
- package/dist/cli/cursor-config/mcp-config.d.ts.map +1 -1
- package/dist/cli/cursor-config/mcp-config.js +37 -0
- package/dist/cli/cursor-config/mcp-config.js.map +1 -1
- package/dist/cli/cursor-config.d.ts +1 -1
- package/dist/cli/cursor-config.d.ts.map +1 -1
- package/dist/cli/cursor-config.js +1 -1
- package/dist/cli/cursor-config.js.map +1 -1
- package/dist/cli/dispatch-uninstall.d.ts +6 -0
- package/dist/cli/dispatch-uninstall.d.ts.map +1 -0
- package/dist/cli/dispatch-uninstall.js +10 -0
- package/dist/cli/dispatch-uninstall.js.map +1 -0
- package/dist/cli/doctor-adapter-lines.d.ts +4 -0
- package/dist/cli/doctor-adapter-lines.d.ts.map +1 -0
- package/dist/cli/doctor-adapter-lines.js +47 -0
- package/dist/cli/doctor-adapter-lines.js.map +1 -0
- package/dist/cli/doctor-notifications.d.ts +5 -0
- package/dist/cli/doctor-notifications.d.ts.map +1 -0
- package/dist/cli/doctor-notifications.js +10 -0
- package/dist/cli/doctor-notifications.js.map +1 -0
- package/dist/cli/doctor-remote.d.ts +3 -0
- package/dist/cli/doctor-remote.d.ts.map +1 -0
- package/dist/cli/doctor-remote.js +48 -0
- package/dist/cli/doctor-remote.js.map +1 -0
- package/dist/cli/doctor.d.ts +1 -22
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +46 -142
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +3 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +12 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/setup-gateway.d.ts +13 -0
- package/dist/cli/setup-gateway.d.ts.map +1 -1
- package/dist/cli/setup-gateway.js +24 -0
- package/dist/cli/setup-gateway.js.map +1 -1
- package/dist/cli/uninstall-all.d.ts +24 -0
- package/dist/cli/uninstall-all.d.ts.map +1 -0
- package/dist/cli/uninstall-all.js +249 -0
- package/dist/cli/uninstall-all.js.map +1 -0
- package/dist/codex/config-hooks.d.ts +7 -0
- package/dist/codex/config-hooks.d.ts.map +1 -1
- package/dist/codex/config-hooks.js +28 -0
- package/dist/codex/config-hooks.js.map +1 -1
- package/dist/codex/config-io.d.ts +1 -0
- package/dist/codex/config-io.d.ts.map +1 -1
- package/dist/codex/config-io.js +4 -1
- package/dist/codex/config-io.js.map +1 -1
- package/dist/codex/config-toml.d.ts +7 -0
- package/dist/codex/config-toml.d.ts.map +1 -1
- package/dist/codex/config-toml.js +50 -0
- package/dist/codex/config-toml.js.map +1 -1
- package/dist/codex/config.d.ts +2 -0
- package/dist/codex/config.d.ts.map +1 -1
- package/dist/codex/config.js +52 -3
- package/dist/codex/config.js.map +1 -1
- package/dist/mcp/evaluate-guard-approval.d.ts +47 -0
- package/dist/mcp/evaluate-guard-approval.d.ts.map +1 -0
- package/dist/mcp/evaluate-guard-approval.js +80 -0
- package/dist/mcp/evaluate-guard-approval.js.map +1 -0
- package/dist/mcp/evaluate-guard-policy.d.ts +3 -0
- package/dist/mcp/evaluate-guard-policy.d.ts.map +1 -0
- package/dist/mcp/evaluate-guard-policy.js +6 -0
- package/dist/mcp/evaluate-guard-policy.js.map +1 -0
- package/dist/mcp/evaluate-guard-proposal.d.ts +16 -0
- package/dist/mcp/evaluate-guard-proposal.d.ts.map +1 -0
- package/dist/mcp/evaluate-guard-proposal.js +57 -0
- package/dist/mcp/evaluate-guard-proposal.js.map +1 -0
- package/dist/mcp/evaluate-guard-run.d.ts +23 -0
- package/dist/mcp/evaluate-guard-run.d.ts.map +1 -0
- package/dist/mcp/evaluate-guard-run.js +75 -0
- package/dist/mcp/evaluate-guard-run.js.map +1 -0
- package/dist/mcp/evaluate-guard-telemetry.d.ts +22 -0
- package/dist/mcp/evaluate-guard-telemetry.d.ts.map +1 -0
- package/dist/mcp/evaluate-guard-telemetry.js +38 -0
- package/dist/mcp/evaluate-guard-telemetry.js.map +1 -0
- package/dist/mcp/evaluate-guard-tier.d.ts +18 -0
- package/dist/mcp/evaluate-guard-tier.d.ts.map +1 -0
- package/dist/mcp/evaluate-guard-tier.js +42 -0
- package/dist/mcp/evaluate-guard-tier.js.map +1 -0
- package/dist/mcp/evaluate-guard.d.ts +2 -5
- package/dist/mcp/evaluate-guard.d.ts.map +1 -1
- package/dist/mcp/evaluate-guard.js +18 -195
- package/dist/mcp/evaluate-guard.js.map +1 -1
- package/dist/mcp/gateway-call-handler.d.ts +9 -0
- package/dist/mcp/gateway-call-handler.d.ts.map +1 -0
- package/dist/mcp/gateway-call-handler.js +61 -0
- package/dist/mcp/gateway-call-handler.js.map +1 -0
- package/dist/mcp/gateway-call-results.d.ts +5 -0
- package/dist/mcp/gateway-call-results.d.ts.map +1 -0
- package/dist/mcp/gateway-call-results.js +14 -0
- package/dist/mcp/gateway-call-results.js.map +1 -0
- package/dist/mcp/gateway-connection-lib.d.ts +54 -0
- package/dist/mcp/gateway-connection-lib.d.ts.map +1 -0
- package/dist/mcp/gateway-connection-lib.js +39 -0
- package/dist/mcp/gateway-connection-lib.js.map +1 -0
- package/dist/mcp/gateway-connection.d.ts +16 -0
- package/dist/mcp/gateway-connection.d.ts.map +1 -0
- package/dist/mcp/gateway-connection.js +54 -0
- package/dist/mcp/gateway-connection.js.map +1 -0
- package/dist/mcp/gateway-log.d.ts +5 -0
- package/dist/mcp/gateway-log.d.ts.map +1 -0
- package/dist/mcp/gateway-log.js +9 -0
- package/dist/mcp/gateway-log.js.map +1 -0
- package/dist/mcp/gateway.d.ts +2 -20
- package/dist/mcp/gateway.d.ts.map +1 -1
- package/dist/mcp/gateway.js +18 -186
- package/dist/mcp/gateway.js.map +1 -1
- package/dist/policies.v1.json +6 -0
- package/native/darwin-amd64/praxis-guard-daemon +0 -0
- package/native/darwin-amd64/praxis-guard-hook +0 -0
- package/native/darwin-arm64/praxis-guard-daemon +0 -0
- package/native/darwin-arm64/praxis-guard-hook +0 -0
- package/native/linux-amd64/praxis-guard-daemon +0 -0
- package/native/linux-amd64/praxis-guard-hook +0 -0
- package/native/linux-arm64/praxis-guard-daemon +0 -0
- package/native/linux-arm64/praxis-guard-hook +0 -0
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defaultApprovalBlock } from "./guard-approval-block.js";
|
|
2
|
+
import { tierToPolicyDecision } from "./guard-mode.js";
|
|
3
|
+
export function riskScore(skipped, tier) {
|
|
4
|
+
if (skipped)
|
|
5
|
+
return 0;
|
|
6
|
+
if (tier === "READ")
|
|
7
|
+
return 0;
|
|
8
|
+
if (tier === "MUTATE")
|
|
9
|
+
return 60;
|
|
10
|
+
return 95;
|
|
11
|
+
}
|
|
12
|
+
export function resolveTierDecision(input) {
|
|
13
|
+
const { mode, skipped, tier } = input;
|
|
14
|
+
let enforceDecision = tierToPolicyDecision(tier, skipped);
|
|
15
|
+
const approvalBlock = defaultApprovalBlock();
|
|
16
|
+
if (skipped) {
|
|
17
|
+
return { enforceDecision: "allow", approvalBlock };
|
|
18
|
+
}
|
|
19
|
+
if (tier === "DESTRUCTIVE") {
|
|
20
|
+
return {
|
|
21
|
+
enforceDecision: "block",
|
|
22
|
+
approvalBlock: {
|
|
23
|
+
...approvalBlock,
|
|
24
|
+
instructions: "DESTRUCTIVE actions cannot be approved via guard. Escalate outside the agent loop.",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (tier === "READ") {
|
|
29
|
+
return { enforceDecision: "allow", approvalBlock };
|
|
30
|
+
}
|
|
31
|
+
if (mode === "shadow") {
|
|
32
|
+
return {
|
|
33
|
+
enforceDecision: "require_approval",
|
|
34
|
+
approvalBlock: {
|
|
35
|
+
...approvalBlock,
|
|
36
|
+
instructions: "Shadow mode: no approval request created. Re-call with mode enforce to coordinate human approval.",
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return { enforceDecision, approvalBlock };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=evaluate-guard-tier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-guard-tier.js","sourceRoot":"","sources":["../../src/mcp/evaluate-guard-tier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAsB,MAAM,iBAAiB,CAAC;AAQ3E,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,IAAU;IACpD,IAAI,OAAO;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAInC;IACC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACtC,IAAI,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;IAE7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO;YACL,eAAe,EAAE,OAAO;YACxB,aAAa,EAAE;gBACb,GAAG,aAAa;gBAChB,YAAY,EACV,oFAAoF;aACvF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO;YACL,eAAe,EAAE,kBAAkB;YACnC,aAAa,EAAE;gBACb,GAAG,aAAa;gBAChB,YAAY,EACV,mGAAmG;aACtG;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import { loadPoliciesV1 } from "../policy/index.js";
|
|
2
1
|
import type { GuardInput } from "./guard-schemas.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
policyRevision: number | null;
|
|
6
|
-
};
|
|
2
|
+
import type { PolicyState } from "./evaluate-guard-tier.js";
|
|
3
|
+
export type { PolicyState } from "./evaluate-guard-tier.js";
|
|
7
4
|
export declare function evaluateGuard(input: GuardInput, policyState: PolicyState): Promise<{
|
|
8
5
|
response: Record<string, unknown>;
|
|
9
6
|
startedAt: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate-guard.d.ts","sourceRoot":"","sources":["../../src/mcp/evaluate-guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"evaluate-guard.d.ts","sourceRoot":"","sources":["../../src/mcp/evaluate-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,wBAAsB,aAAa,CACjC,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBnE"}
|
|
@@ -1,201 +1,24 @@
|
|
|
1
|
-
import { v4 as uuidv4 } from "uuid";
|
|
2
|
-
import { loadPoliciesV1, readPoliciesV1Revision } from "../policy/index.js";
|
|
3
|
-
import { rememberResolvedWorkspaceRoot, resolveGuardStorageRootFromHints, } from "../bridge/guard-storage-root.js";
|
|
4
|
-
import { evaluateMcpProposal, evaluateShellProposal } from "../shell/evaluate.js";
|
|
5
|
-
import { sendGuardEvent } from "../telemetry/guard-events.js";
|
|
6
|
-
import { getInstallId } from "../cli/install-id.js";
|
|
7
|
-
import { evaluatePolicyWithDaemon } from "../daemon/client.js";
|
|
8
|
-
import { daemonModeEnabled } from "../daemon/paths.js";
|
|
9
|
-
import { resolveGuardAuditStatus } from "./guard-audit-status.js";
|
|
10
|
-
import { applyGuardMode, tierToPolicyDecision } from "./guard-mode.js";
|
|
11
1
|
import { resetHeartbeatIdle } from "./guard-heartbeat.js";
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
if (skipped)
|
|
15
|
-
return 0;
|
|
16
|
-
if (tier === "READ")
|
|
17
|
-
return 0;
|
|
18
|
-
if (tier === "MUTATE")
|
|
19
|
-
return 60;
|
|
20
|
-
return 95;
|
|
21
|
-
}
|
|
22
|
-
function resolveTierDecision(input) {
|
|
23
|
-
const { mode, skipped, tier } = input;
|
|
24
|
-
let enforceDecision = tierToPolicyDecision(tier, skipped);
|
|
25
|
-
const approvalBlock = defaultApprovalBlock();
|
|
26
|
-
if (skipped) {
|
|
27
|
-
return { enforceDecision: "allow", approvalBlock };
|
|
28
|
-
}
|
|
29
|
-
if (tier === "DESTRUCTIVE") {
|
|
30
|
-
return {
|
|
31
|
-
enforceDecision: "block",
|
|
32
|
-
approvalBlock: {
|
|
33
|
-
...approvalBlock,
|
|
34
|
-
instructions: "DESTRUCTIVE actions cannot be approved via guard. Escalate outside the agent loop.",
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
if (tier === "READ") {
|
|
39
|
-
return { enforceDecision: "allow", approvalBlock };
|
|
40
|
-
}
|
|
41
|
-
if (mode === "shadow") {
|
|
42
|
-
return {
|
|
43
|
-
enforceDecision: "require_approval",
|
|
44
|
-
approvalBlock: {
|
|
45
|
-
...approvalBlock,
|
|
46
|
-
instructions: "Shadow mode: no approval request created. Re-call with mode enforce to coordinate human approval.",
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return { enforceDecision, approvalBlock };
|
|
51
|
-
}
|
|
2
|
+
import { emitGuardEvaluationTelemetry } from "./evaluate-guard-telemetry.js";
|
|
3
|
+
import { buildGuardResponse, runGuardEvaluation } from "./evaluate-guard-run.js";
|
|
52
4
|
export async function evaluateGuard(input, policyState) {
|
|
53
|
-
const startedAt = performance.now();
|
|
54
|
-
const event_id = uuidv4();
|
|
55
5
|
resetHeartbeatIdle();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
:
|
|
70
|
-
|
|
71
|
-
? evaluateMcpProposal(policyState.policy, input.proposal.argv)
|
|
72
|
-
: null;
|
|
73
|
-
let skipped = shellResult?.skipped ?? mcpResult?.skipped ?? true;
|
|
74
|
-
let evaluation = shellResult?.evaluation ?? mcpResult.evaluation;
|
|
75
|
-
const analysis = shellResult?.analysis;
|
|
76
|
-
const argv = evaluation.argv;
|
|
77
|
-
if (daemonModeEnabled()) {
|
|
78
|
-
try {
|
|
79
|
-
const daemonEvaluation = await evaluatePolicyWithDaemon(argv);
|
|
80
|
-
skipped = daemonEvaluation.skipped;
|
|
81
|
-
evaluation = {
|
|
82
|
-
...evaluation,
|
|
83
|
-
tier: daemonEvaluation.tier,
|
|
84
|
-
classification: daemonEvaluation.classification,
|
|
85
|
-
flags: daemonEvaluation.flags,
|
|
86
|
-
reasons: daemonEvaluation.skipped
|
|
87
|
-
? [{ code: "skipped", message: "No policy entry matched in the native daemon." }]
|
|
88
|
-
: [
|
|
89
|
-
{
|
|
90
|
-
code: "policy_match",
|
|
91
|
-
message: "Matched policy entry in the native daemon.",
|
|
92
|
-
details: {
|
|
93
|
-
tool: daemonEvaluation.classification.tool,
|
|
94
|
-
command_path: daemonEvaluation.classification.command_path,
|
|
95
|
-
verb: daemonEvaluation.classification.verb,
|
|
96
|
-
tier: daemonEvaluation.tier,
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
if (process.env.PRAXIS_GUARD_SPAWN_FALLBACK !== "1")
|
|
104
|
-
throw error;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const tier = evaluation.tier;
|
|
108
|
-
const reasons = [...evaluation.reasons];
|
|
109
|
-
const policyReasons = [...evaluation.reasons];
|
|
110
|
-
let { enforceDecision, approvalBlock } = resolveTierDecision({
|
|
111
|
-
mode: input.mode,
|
|
112
|
-
skipped,
|
|
113
|
-
tier,
|
|
114
|
-
});
|
|
115
|
-
let approvalRequestId = null;
|
|
116
|
-
const hookApprovalRequestId = input.context?.approval?.request_id?.trim() || null;
|
|
117
|
-
const hookWaitMs = input.context?.wait_ms ?? 0;
|
|
118
|
-
const redeemHookApproval = !skipped &&
|
|
119
|
-
tier !== "DESTRUCTIVE" &&
|
|
120
|
-
input.mode === "enforce" &&
|
|
121
|
-
hookApprovalRequestId !== null &&
|
|
122
|
-
hookWaitMs > 0;
|
|
123
|
-
if (redeemHookApproval ||
|
|
124
|
-
(!skipped && tier !== "DESTRUCTIVE" && tier !== "READ" && input.mode === "enforce")) {
|
|
125
|
-
const mutate = await resolveEnforceMutateApproval({
|
|
126
|
-
guardInput: input,
|
|
127
|
-
argv,
|
|
128
|
-
storageRoot,
|
|
129
|
-
eventId: event_id,
|
|
130
|
-
policyRevision: policyState.policyRevision,
|
|
131
|
-
reasons,
|
|
132
|
-
approval_fingerprint: analysis?.approval_fingerprint_payload ?? null,
|
|
133
|
-
});
|
|
134
|
-
enforceDecision = mutate.enforceDecision;
|
|
135
|
-
approvalBlock = mutate.approvalBlock;
|
|
136
|
-
approvalRequestId = mutate.approvalRequestId;
|
|
137
|
-
}
|
|
138
|
-
const { decision, shadow } = applyGuardMode({
|
|
139
|
-
mode: input.mode,
|
|
140
|
-
skipped,
|
|
141
|
-
tier,
|
|
142
|
-
policyReasons,
|
|
143
|
-
enforceDecision,
|
|
144
|
-
});
|
|
145
|
-
const response = {
|
|
146
|
-
mode: input.mode,
|
|
147
|
-
decision,
|
|
148
|
-
skipped,
|
|
149
|
-
tier,
|
|
150
|
-
risk_score: riskScore(skipped, tier),
|
|
151
|
-
reasons,
|
|
152
|
-
shadow,
|
|
153
|
-
approval: approvalBlock,
|
|
154
|
-
audit: {
|
|
155
|
-
event_id,
|
|
156
|
-
timestamp: new Date().toISOString(),
|
|
157
|
-
latency_ms: performance.now() - startedAt,
|
|
158
|
-
},
|
|
159
|
-
execution: {
|
|
160
|
-
attempted: false,
|
|
161
|
-
result: null,
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
const firstReason = reasons.find((r) => typeof r?.message === "string")?.message ??
|
|
165
|
-
reasons.find((r) => typeof r?.code === "string")?.code ??
|
|
166
|
-
null;
|
|
167
|
-
const actionVerb = argv[1] ?? null;
|
|
168
|
-
const actionResource = argv.length > 2 ? argv.slice(2).join(" ") : null;
|
|
169
|
-
const status = resolveGuardAuditStatus({ skipped, decision });
|
|
170
|
-
void sendGuardEvent({
|
|
171
|
-
ts: new Date().toISOString(),
|
|
172
|
-
status,
|
|
173
|
-
skipped,
|
|
174
|
-
...(skipped
|
|
175
|
-
? {
|
|
176
|
-
skip_reason: input.proposal.kind === "shell" ? "no_governed_invocation" : "mcp_policy_unmatched",
|
|
177
|
-
}
|
|
178
|
-
: {}),
|
|
179
|
-
tool: "auditor-mcp",
|
|
180
|
-
command_path: argv[0] ?? null,
|
|
181
|
-
verb: actionVerb,
|
|
182
|
-
resource: actionResource,
|
|
183
|
-
reason: firstReason,
|
|
184
|
-
cmd: shellCommand ?? argv.join(" "),
|
|
185
|
-
tier,
|
|
186
|
-
decision,
|
|
187
|
-
latency_ms: performance.now() - startedAt,
|
|
188
|
-
event_id,
|
|
189
|
-
installId: getInstallId(),
|
|
190
|
-
kind: input.proposal.kind,
|
|
191
|
-
...(policyState.policyRevision !== null
|
|
192
|
-
? { policy_revision: policyState.policyRevision }
|
|
193
|
-
: {}),
|
|
194
|
-
...(approvalRequestId ? { approval_request_id: approvalRequestId } : {}),
|
|
195
|
-
meta: {
|
|
196
|
-
invocation_count: analysis?.invocations.length ?? null,
|
|
197
|
-
},
|
|
6
|
+
const result = await runGuardEvaluation(input, policyState);
|
|
7
|
+
const response = buildGuardResponse(input, result);
|
|
8
|
+
emitGuardEvaluationTelemetry({
|
|
9
|
+
guardInput: input,
|
|
10
|
+
policyState,
|
|
11
|
+
startedAt: result.startedAt,
|
|
12
|
+
eventId: result.eventId,
|
|
13
|
+
skipped: result.skipped,
|
|
14
|
+
tier: result.tier,
|
|
15
|
+
decision: result.decision,
|
|
16
|
+
argv: result.evaluation.argv,
|
|
17
|
+
shellCommand: result.proposal.shellCommand,
|
|
18
|
+
reasons: result.reasons,
|
|
19
|
+
approvalRequestId: result.approvalRequestId,
|
|
20
|
+
invocationCount: result.proposal.analysis?.invocations.length ?? null,
|
|
198
21
|
});
|
|
199
|
-
return { response, startedAt };
|
|
22
|
+
return { response, startedAt: result.startedAt };
|
|
200
23
|
}
|
|
201
24
|
//# sourceMappingURL=evaluate-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate-guard.js","sourceRoot":"","sources":["../../src/mcp/evaluate-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"evaluate-guard.js","sourceRoot":"","sources":["../../src/mcp/evaluate-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIjF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAiB,EACjB,WAAwB;IAExB,kBAAkB,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,4BAA4B,CAAC;QAC3B,UAAU,EAAE,KAAK;QACjB,WAAW;QACX,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;QAC5B,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY;QAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,IAAI,IAAI;KACtE,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { GatewayConnection } from "./gateway-connection.js";
|
|
3
|
+
export declare function handleGatewayCallTool(input: {
|
|
4
|
+
exposed: string;
|
|
5
|
+
args: Record<string, unknown>;
|
|
6
|
+
ids: string[];
|
|
7
|
+
byId: Map<string, GatewayConnection>;
|
|
8
|
+
}): Promise<CallToolResult>;
|
|
9
|
+
//# sourceMappingURL=gateway-call-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-call-handler.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway-call-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAKzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAmCjE,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CACtC,GAAG,OAAO,CAAC,cAAc,CAAC,CAyC1B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { parseExposedToolName } from "./gateway-config.js";
|
|
2
|
+
import { evaluateGatewayCall } from "./gateway-evaluate.js";
|
|
3
|
+
import { gatewayBlockedResult, gatewayTextResult } from "./gateway-call-results.js";
|
|
4
|
+
import { logGatewayErr, truncGatewayErr } from "./gateway-log.js";
|
|
5
|
+
async function forwardWithReconnect(input) {
|
|
6
|
+
const { conn, serverId, tool, args, tier } = input;
|
|
7
|
+
try {
|
|
8
|
+
return await conn.callTool(tool, args);
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
logGatewayErr(`downstream "${serverId}" call failed: ${truncGatewayErr(e)}; reconnecting`);
|
|
12
|
+
const ok = await conn.reconnect();
|
|
13
|
+
if (ok && tier === "READ") {
|
|
14
|
+
try {
|
|
15
|
+
return await conn.callTool(tool, args);
|
|
16
|
+
}
|
|
17
|
+
catch (e2) {
|
|
18
|
+
return gatewayTextResult(`Praxis gateway: downstream "${serverId}" error after reconnect: ${truncGatewayErr(e2)}`, true);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return gatewayTextResult(`Praxis gateway: downstream "${serverId}" call failed` +
|
|
22
|
+
(ok ? " (reconnected; not retried to avoid double-execution)" : " and is unavailable") +
|
|
23
|
+
`: ${truncGatewayErr(e)}`, true);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function handleGatewayCallTool(input) {
|
|
27
|
+
try {
|
|
28
|
+
const parsed = parseExposedToolName(input.exposed, input.ids);
|
|
29
|
+
if (!parsed) {
|
|
30
|
+
return gatewayTextResult(`Praxis gateway: unknown tool "${input.exposed}".`, true);
|
|
31
|
+
}
|
|
32
|
+
const conn = input.byId.get(parsed.serverId);
|
|
33
|
+
if (!conn) {
|
|
34
|
+
return gatewayTextResult(`Praxis gateway: downstream "${parsed.serverId}" is not connected.`, true);
|
|
35
|
+
}
|
|
36
|
+
if (!conn.tools.some((t) => t.name === parsed.tool)) {
|
|
37
|
+
return gatewayTextResult(`Praxis gateway: "${parsed.serverId}" does not expose a tool named "${parsed.tool}".`, true);
|
|
38
|
+
}
|
|
39
|
+
const decision = await evaluateGatewayCall({
|
|
40
|
+
serverId: parsed.serverId,
|
|
41
|
+
tool: parsed.tool,
|
|
42
|
+
toolInput: input.args,
|
|
43
|
+
});
|
|
44
|
+
if (decision.decision === "block") {
|
|
45
|
+
return gatewayBlockedResult(parsed.serverId, parsed.tool, decision);
|
|
46
|
+
}
|
|
47
|
+
return forwardWithReconnect({
|
|
48
|
+
conn,
|
|
49
|
+
serverId: parsed.serverId,
|
|
50
|
+
tool: parsed.tool,
|
|
51
|
+
args: input.args,
|
|
52
|
+
tier: decision.tier,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
logGatewayErr(`gating error for "${input.exposed}": ${truncGatewayErr(e)}`);
|
|
57
|
+
return gatewayTextResult("Praxis gateway: guard evaluation failed; blocking this call (fail-closed). " +
|
|
58
|
+
"To restore direct tools: run `auditor setup gateway --revert --apply`, then relaunch Claude Desktop.", true);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=gateway-call-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-call-handler.js","sourceRoot":"","sources":["../../src/mcp/gateway-call-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { evaluateGatewayCall } from "./gateway-evaluate.js";
|
|
3
|
+
export declare function gatewayTextResult(text: string, isError: boolean): CallToolResult;
|
|
4
|
+
export declare function gatewayBlockedResult(serverId: string, tool: string, d: Awaited<ReturnType<typeof evaluateGatewayCall>>): CallToolResult;
|
|
5
|
+
//# sourceMappingURL=gateway-call-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-call-results.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway-call-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,cAAc,CAEhF;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,GACjD,cAAc,CAehB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function gatewayTextResult(text, isError) {
|
|
2
|
+
return { content: [{ type: "text", text }], isError };
|
|
3
|
+
}
|
|
4
|
+
export function gatewayBlockedResult(serverId, tool, d) {
|
|
5
|
+
const reason = d.reasons[0] ?? "policy";
|
|
6
|
+
if (d.inlineApproval) {
|
|
7
|
+
return gatewayTextResult(`Praxis guard requires human approval for ${serverId}__${tool} (tier=${d.tier}). ` +
|
|
8
|
+
`Approve at ${d.inlineApproval.open_url} then retry this exact tool call. ` +
|
|
9
|
+
`(request ${d.inlineApproval.request_id})`, true);
|
|
10
|
+
}
|
|
11
|
+
return gatewayTextResult(`Praxis guard blocked ${serverId}__${tool} (tier=${d.tier}): ${reason}. ` +
|
|
12
|
+
(d.tier === "DESTRUCTIVE" ? "Destructive actions cannot be auto-approved." : ""), true);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=gateway-call-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-call-results.js","sourceRoot":"","sources":["../../src/mcp/gateway-call-results.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAgB;IAC9D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,IAAY,EACZ,CAAkD;IAElD,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IACxC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;QACrB,OAAO,iBAAiB,CACtB,4CAA4C,QAAQ,KAAK,IAAI,UAAU,CAAC,CAAC,IAAI,KAAK;YAChF,cAAc,CAAC,CAAC,cAAc,CAAC,QAAQ,oCAAoC;YAC3E,YAAY,CAAC,CAAC,cAAc,CAAC,UAAU,GAAG,EAC5C,IAAI,CACL,CAAC;IACJ,CAAC;IACD,OAAO,iBAAiB,CACtB,wBAAwB,QAAQ,KAAK,IAAI,UAAU,CAAC,CAAC,IAAI,MAAM,MAAM,IAAI;QACvE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,EAAE,CAAC,EAClF,IAAI,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import type { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
+
import type { GatewayServer } from "./gateway-config.js";
|
|
4
|
+
import type { GatewayConnection } from "./gateway-connection.js";
|
|
5
|
+
export declare const GATEWAY_CONNECT_TIMEOUT_MS = 10000;
|
|
6
|
+
export declare function listToolsWithTimeout(client: Client, serverId: string): Promise<{
|
|
7
|
+
[x: string]: unknown;
|
|
8
|
+
tools: {
|
|
9
|
+
inputSchema: {
|
|
10
|
+
[x: string]: unknown;
|
|
11
|
+
type: "object";
|
|
12
|
+
properties?: Record<string, object> | undefined;
|
|
13
|
+
required?: string[] | undefined;
|
|
14
|
+
};
|
|
15
|
+
name: string;
|
|
16
|
+
description?: string | undefined;
|
|
17
|
+
outputSchema?: {
|
|
18
|
+
[x: string]: unknown;
|
|
19
|
+
type: "object";
|
|
20
|
+
properties?: Record<string, object> | undefined;
|
|
21
|
+
required?: string[] | undefined;
|
|
22
|
+
} | undefined;
|
|
23
|
+
annotations?: {
|
|
24
|
+
title?: string | undefined;
|
|
25
|
+
readOnlyHint?: boolean | undefined;
|
|
26
|
+
destructiveHint?: boolean | undefined;
|
|
27
|
+
idempotentHint?: boolean | undefined;
|
|
28
|
+
openWorldHint?: boolean | undefined;
|
|
29
|
+
} | undefined;
|
|
30
|
+
execution?: {
|
|
31
|
+
taskSupport?: "optional" | "required" | "forbidden" | undefined;
|
|
32
|
+
} | undefined;
|
|
33
|
+
_meta?: Record<string, unknown> | undefined;
|
|
34
|
+
icons?: {
|
|
35
|
+
src: string;
|
|
36
|
+
mimeType?: string | undefined;
|
|
37
|
+
sizes?: string[] | undefined;
|
|
38
|
+
theme?: "light" | "dark" | undefined;
|
|
39
|
+
}[] | undefined;
|
|
40
|
+
title?: string | undefined;
|
|
41
|
+
}[];
|
|
42
|
+
_meta?: {
|
|
43
|
+
[x: string]: unknown;
|
|
44
|
+
progressToken?: string | number | undefined;
|
|
45
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
46
|
+
taskId: string;
|
|
47
|
+
} | undefined;
|
|
48
|
+
} | undefined;
|
|
49
|
+
nextCursor?: string | undefined;
|
|
50
|
+
}>;
|
|
51
|
+
export declare function connectClientWithTimeout(client: Client, spawn: () => StdioClientTransport, serverId: string, label: string): Promise<void>;
|
|
52
|
+
export declare function newGatewayClient(server: GatewayServer): Client;
|
|
53
|
+
export declare function refreshGatewayConnection(server: GatewayServer, spawn: () => StdioClientTransport, conn: GatewayConnection, attachListChanged: (client: Client) => void, notifyToolsChanged: () => void): Promise<Client | null>;
|
|
54
|
+
//# sourceMappingURL=gateway-connection-lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-connection-lib.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway-connection-lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAkBjD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;sBAoC44lB,CAAC;oBAA8D,CAAC;;;mBAAwF,CAAC;oBAA8C,CAAC;;;sBAAoG,CAAC;oBAA8D,CAAC;;mBAA0E,CAAC;iBAAyB,CAAC;wBAAkD,CAAC;2BAAsD,CAAC;0BAAqD,CAAC;yBAAoD,CAAC;;iBAAuE,CAAC;uBAA+B,CAAC;;aAAiG,CAAC;aAAwD,CAAC;;oBAAyD,CAAC;iBAA2C,CAAC;iBAA6C,CAAC;;aAA8E,CAAC;;;;qBAAgH,CAAC;8CAAiF,CAAC;;;;;GAlCryoB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,oBAAoB,EACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE9D;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,oBAAoB,EACjC,IAAI,EAAE,iBAAiB,EACvB,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAC3C,kBAAkB,EAAE,MAAM,IAAI,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { AUDITOR_CLI_VERSION } from "../runtime/version.js";
|
|
3
|
+
export const GATEWAY_CONNECT_TIMEOUT_MS = 10_000;
|
|
4
|
+
function withTimeout(p, ms, label) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const t = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
|
|
7
|
+
p.then((v) => {
|
|
8
|
+
clearTimeout(t);
|
|
9
|
+
resolve(v);
|
|
10
|
+
}, (e) => {
|
|
11
|
+
clearTimeout(t);
|
|
12
|
+
reject(e);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export async function listToolsWithTimeout(client, serverId) {
|
|
17
|
+
return withTimeout(client.listTools(), GATEWAY_CONNECT_TIMEOUT_MS, `listTools ${serverId}`);
|
|
18
|
+
}
|
|
19
|
+
export async function connectClientWithTimeout(client, spawn, serverId, label) {
|
|
20
|
+
await withTimeout(client.connect(spawn()), GATEWAY_CONNECT_TIMEOUT_MS, `${label} ${serverId}`);
|
|
21
|
+
}
|
|
22
|
+
export function newGatewayClient(server) {
|
|
23
|
+
return new Client({ name: `praxis-gateway-client-${server.id}`, version: AUDITOR_CLI_VERSION });
|
|
24
|
+
}
|
|
25
|
+
export async function refreshGatewayConnection(server, spawn, conn, attachListChanged, notifyToolsChanged) {
|
|
26
|
+
const client = newGatewayClient(server);
|
|
27
|
+
try {
|
|
28
|
+
await connectClientWithTimeout(client, spawn, server.id, "reconnect");
|
|
29
|
+
const listed = await listToolsWithTimeout(client, server.id);
|
|
30
|
+
conn.tools = listed.tools;
|
|
31
|
+
attachListChanged(client);
|
|
32
|
+
notifyToolsChanged();
|
|
33
|
+
return client;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=gateway-connection-lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-connection-lib.js","sourceRoot":"","sources":["../../src/mcp/gateway-connection-lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAEjD,SAAS,WAAW,CAAI,CAAa,EAAE,EAAU,EAAE,KAAa;IAC9D,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,EAAE,EAAE;YACJ,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;YACJ,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,QAAgB;IACzE,OAAO,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,0BAA0B,EAAE,aAAa,QAAQ,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,KAAiC,EACjC,QAAgB,EAChB,KAAa;IAEb,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,0BAA0B,EAAE,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,yBAAyB,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAqB,EACrB,KAAiC,EACjC,IAAuB,EACvB,iBAA2C,EAC3C,kBAA8B;IAE9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,kBAAkB,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type CallToolResult, type Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { GatewayServer } from "./gateway-config.js";
|
|
3
|
+
/**
|
|
4
|
+
* One downstream MCP server, abstracted so tests can inject fakes without
|
|
5
|
+
* spawning real subprocesses. The real implementation is `connectStdioServer`.
|
|
6
|
+
*/
|
|
7
|
+
export interface GatewayConnection {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
tools: Tool[];
|
|
10
|
+
callTool(tool: string, args: Record<string, unknown>): Promise<CallToolResult>;
|
|
11
|
+
reconnect(): Promise<boolean>;
|
|
12
|
+
onToolsChanged?(listener: () => void): void;
|
|
13
|
+
}
|
|
14
|
+
/** Real stdio-backed connection to a downstream MCP server. */
|
|
15
|
+
export declare function connectStdioServer(server: GatewayServer): Promise<GatewayConnection>;
|
|
16
|
+
//# sourceMappingURL=gateway-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-connection.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway-connection.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASzD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/E,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,cAAc,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC7C;AAkBD,+DAA+D;AAC/D,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8C1F"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { StdioClientTransport, getDefaultEnvironment, } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
2
|
+
import { ToolListChangedNotificationSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { logGatewayErr, truncGatewayErr } from "./gateway-log.js";
|
|
4
|
+
import { connectClientWithTimeout, listToolsWithTimeout, newGatewayClient, refreshGatewayConnection, } from "./gateway-connection-lib.js";
|
|
5
|
+
function attachListChangedHandler(client, conn, getListener) {
|
|
6
|
+
client.setNotificationHandler(ToolListChangedNotificationSchema, async () => {
|
|
7
|
+
try {
|
|
8
|
+
const re = await listToolsWithTimeout(client, conn.id);
|
|
9
|
+
conn.tools = re.tools;
|
|
10
|
+
getListener()?.();
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
logGatewayErr(`tools/list_changed refresh for "${conn.id}" failed: ${truncGatewayErr(e)}`);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/** Real stdio-backed connection to a downstream MCP server. */
|
|
18
|
+
export async function connectStdioServer(server) {
|
|
19
|
+
const spawn = () => new StdioClientTransport({
|
|
20
|
+
command: server.command,
|
|
21
|
+
args: server.args,
|
|
22
|
+
env: server.env ? { ...getDefaultEnvironment(), ...server.env } : undefined,
|
|
23
|
+
});
|
|
24
|
+
let client = newGatewayClient(server);
|
|
25
|
+
let toolsChangedListener = null;
|
|
26
|
+
const getListener = () => toolsChangedListener;
|
|
27
|
+
await connectClientWithTimeout(client, spawn, server.id, "connect");
|
|
28
|
+
const listed = await listToolsWithTimeout(client, server.id);
|
|
29
|
+
let conn;
|
|
30
|
+
const wireListChanged = (fresh) => attachListChangedHandler(fresh, conn, getListener);
|
|
31
|
+
conn = {
|
|
32
|
+
id: server.id,
|
|
33
|
+
tools: listed.tools,
|
|
34
|
+
onToolsChanged(listener) {
|
|
35
|
+
toolsChangedListener = listener;
|
|
36
|
+
},
|
|
37
|
+
async callTool(tool, args) {
|
|
38
|
+
return (await client.callTool({ name: tool, arguments: args }));
|
|
39
|
+
},
|
|
40
|
+
async reconnect() {
|
|
41
|
+
await client.close().catch(() => { });
|
|
42
|
+
const next = await refreshGatewayConnection(server, spawn, conn, wireListChanged, () => toolsChangedListener?.());
|
|
43
|
+
if (!next) {
|
|
44
|
+
logGatewayErr(`reconnect to "${server.id}" failed`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
client = next;
|
|
48
|
+
return true;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
wireListChanged(client);
|
|
52
|
+
return conn;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=gateway-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-connection.js","sourceRoot":"","sources":["../../src/mcp/gateway-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** stderr only — stdout is the MCP protocol channel. */
|
|
2
|
+
export declare function logGatewayErr(line: string): void;
|
|
3
|
+
/** Bound downstream-supplied error text so a hostile downstream can't flood or spoof the result. */
|
|
4
|
+
export declare function truncGatewayErr(e: unknown): string;
|
|
5
|
+
//# sourceMappingURL=gateway-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-log.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway-log.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** stderr only — stdout is the MCP protocol channel. */
|
|
2
|
+
export function logGatewayErr(line) {
|
|
3
|
+
process.stderr.write(`[auditor-gateway] ${line}\n`);
|
|
4
|
+
}
|
|
5
|
+
/** Bound downstream-supplied error text so a hostile downstream can't flood or spoof the result. */
|
|
6
|
+
export function truncGatewayErr(e) {
|
|
7
|
+
return String(e).slice(0, 300);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=gateway-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-log.js","sourceRoot":"","sources":["../../src/mcp/gateway-log.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC"}
|