@praxis.guard/auditor-cli 0.0.48 → 0.0.50
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 +1 -0
- package/dist/adapters/claude-desktop.d.ts.map +1 -1
- package/dist/adapters/claude-desktop.js +14 -2
- package/dist/adapters/claude-desktop.js.map +1 -1
- package/dist/cli/doctor.d.ts +22 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +21 -4
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +5 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/mcp/gateway-config.d.ts +35 -0
- package/dist/mcp/gateway-config.d.ts.map +1 -0
- package/dist/mcp/gateway-config.js +111 -0
- package/dist/mcp/gateway-config.js.map +1 -0
- package/dist/mcp/gateway-evaluate.d.ts +32 -0
- package/dist/mcp/gateway-evaluate.d.ts.map +1 -0
- package/dist/mcp/gateway-evaluate.js +134 -0
- package/dist/mcp/gateway-evaluate.js.map +1 -0
- package/dist/mcp/gateway.d.ts +29 -0
- package/dist/mcp/gateway.d.ts.map +1 -0
- package/dist/mcp/gateway.js +188 -0
- package/dist/mcp/gateway.js.map +1 -0
- package/dist/mcp/guard-schemas.d.ts.map +1 -1
- package/dist/mcp/guard-schemas.js +13 -7
- package/dist/mcp/guard-schemas.js.map +1 -1
- package/dist/telemetry/guard-events.d.ts.map +1 -1
- package/dist/telemetry/guard-events.js +5 -1
- package/dist/telemetry/guard-events.js.map +1 -1
- package/dist/telemetry/redact-guard-event.d.ts +36 -0
- package/dist/telemetry/redact-guard-event.d.ts.map +1 -0
- package/dist/telemetry/redact-guard-event.js +146 -0
- package/dist/telemetry/redact-guard-event.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -92,6 +92,7 @@ After `pnpm -C packages/auditor-cli build`, the **`auditor`** command is availab
|
|
|
92
92
|
| Command | Purpose |
|
|
93
93
|
|--------|---------|
|
|
94
94
|
| `auditor mcp` | **MCP stdio server** (registers tool `guard`). Use in Cursor `mcp.json` as the server command. |
|
|
95
|
+
| `auditor mcp gateway` | **MCP gateway server** (Phase 2a). Fronts the downstream MCP servers listed in `~/.praxis/gateway-servers.json` (override with `PRAXIS_GATEWAY_CONFIG`), re-exposes their tools namespaced as `<server>__<tool>`, and gates every proxied call through the guard policy before forwarding (READ allow, DESTRUCTIVE block, MUTATE deny + approval link). Additive and dormant: `auditor mcp` is unchanged. |
|
|
95
96
|
| `auditor hook before-shell` | Cursor hook: stdin JSON `{ "command", "cwd?" }` → stdout JSON `{ "permission", ... }` (fail-closed on crash). |
|
|
96
97
|
| `auditor doctor` | Prints resolved policy path, bridge dir, audit log path, `Node` version, and `PRAXIS_GUARD_AUDIT_LOG` status. |
|
|
97
98
|
| `auditor whoami` | Prints `uid`, profile email/display name, and token source via the `guardWhoAmI` callable (requires auth like `policies sync`). |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-desktop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACd,MAAM,YAAY,CAAC;AAOpB;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAchD;AAyCD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,QAAQ,CAAC,EAAE,EAAG,gBAAgB,CAAU;IACxC,QAAQ,CAAC,KAAK,oBAAoB;IAElC,eAAe,IAAI,OAAO;IAQpB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CpD,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-desktop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACd,MAAM,YAAY,CAAC;AAOpB;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAchD;AAyCD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,QAAQ,CAAC,EAAE,EAAG,gBAAgB,CAAU;IACxC,QAAQ,CAAC,KAAK,oBAAoB;IAElC,eAAe,IAAI,OAAO;IAQpB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CpD,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAqBtD"}
|
|
@@ -123,10 +123,22 @@ export class ClaudeDesktopAdapter {
|
|
|
123
123
|
async status(opts) {
|
|
124
124
|
const cfgPath = opts?.mcpConfigPath?.trim() || claudeDesktopConfigPath();
|
|
125
125
|
const config = await readJson(cfgPath).catch(() => null);
|
|
126
|
+
const mcpConfigured = hasConfiguredMcpServer(config);
|
|
127
|
+
// Claude Desktop is MCP-only: it has no pre-tool hook API, so guard is advisory.
|
|
128
|
+
// The model must choose to call it; nothing forces it, and commands routed through
|
|
129
|
+
// other connectors are never seen. Surface this so "configured" is not read as
|
|
130
|
+
// "enforced". Hard enforcement is planned via the MCP gateway (see TODOS.md).
|
|
131
|
+
const warnings = mcpConfigured
|
|
132
|
+
? [
|
|
133
|
+
"Claude Desktop is MCP-only: guard is advisory. The model must choose to call it; " +
|
|
134
|
+
"there is no enforced pre-tool hook. Treat as monitoring, not a hard gate. " +
|
|
135
|
+
"Hard enforcement is planned via the MCP gateway.",
|
|
136
|
+
]
|
|
137
|
+
: [];
|
|
126
138
|
return {
|
|
127
139
|
installed: this.detectInstalled(),
|
|
128
|
-
mcp: { configured:
|
|
129
|
-
warnings
|
|
140
|
+
mcp: { configured: mcpConfigured, path: cfgPath },
|
|
141
|
+
warnings,
|
|
130
142
|
};
|
|
131
143
|
}
|
|
132
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/adapters/claude-desktop.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/adapters/claude-desktop.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -1,2 +1,24 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentStatus } from "../adapters/types.js";
|
|
2
|
+
export type Readiness = {
|
|
3
|
+
ready: boolean;
|
|
4
|
+
readySetup: boolean;
|
|
5
|
+
enforced: boolean;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Compute doctor readiness from adapter statuses + auth.
|
|
9
|
+
*
|
|
10
|
+
* readySetup : at least one adapter has every declared surface configured.
|
|
11
|
+
* enforced : at least one READY adapter declares a pre-tool hook (Cursor /
|
|
12
|
+
* Claude Code / Codex). adapterReady already requires that hook to
|
|
13
|
+
* be configured, so a ready hook-adapter is genuinely enforcing.
|
|
14
|
+
* If the only ready adapters lack upsertHook (Claude Desktop is
|
|
15
|
+
* MCP-only), governance is advisory: the model must choose to call
|
|
16
|
+
* guard and can be bypassed.
|
|
17
|
+
* ready : readySetup AND authenticated.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveReadiness(adapterStatuses: {
|
|
20
|
+
adapter: AgentAdapter;
|
|
21
|
+
status: AgentStatus;
|
|
22
|
+
}[], hasAuth: boolean): Readiness;
|
|
1
23
|
export declare function runDoctor(): Promise<void>;
|
|
2
24
|
//# sourceMappingURL=doctor.d.ts.map
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUtE,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnF;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,EAAE,EACjE,OAAO,EAAE,OAAO,GACf,SAAS,CAOX;AA2DD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG/C"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -10,6 +10,24 @@ import { credentialsPath, readCredentialsFileMode, resolveGuardToken } from "./c
|
|
|
10
10
|
import { getInstallId } from "./install-id.js";
|
|
11
11
|
import { functionsHttpUrl } from "./policies-callable-url.js";
|
|
12
12
|
import { readPoliciesMetaFile } from "./policies-meta.js";
|
|
13
|
+
/**
|
|
14
|
+
* Compute doctor readiness from adapter statuses + auth.
|
|
15
|
+
*
|
|
16
|
+
* readySetup : at least one adapter has every declared surface configured.
|
|
17
|
+
* enforced : at least one READY adapter declares a pre-tool hook (Cursor /
|
|
18
|
+
* Claude Code / Codex). adapterReady already requires that hook to
|
|
19
|
+
* be configured, so a ready hook-adapter is genuinely enforcing.
|
|
20
|
+
* If the only ready adapters lack upsertHook (Claude Desktop is
|
|
21
|
+
* MCP-only), governance is advisory: the model must choose to call
|
|
22
|
+
* guard and can be bypassed.
|
|
23
|
+
* ready : readySetup AND authenticated.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveReadiness(adapterStatuses, hasAuth) {
|
|
26
|
+
const readyAdapters = adapterStatuses.filter(({ adapter, status }) => adapterReady(adapter, status));
|
|
27
|
+
const readySetup = readyAdapters.length > 0;
|
|
28
|
+
const enforced = readyAdapters.some(({ adapter }) => typeof adapter.upsertHook === "function");
|
|
29
|
+
return { ready: readySetup && hasAuth, readySetup, enforced };
|
|
30
|
+
}
|
|
13
31
|
function adapterReady(adapter, status) {
|
|
14
32
|
// For an adapter to count as "ready", every surface it declares MUST be configured.
|
|
15
33
|
// Cursor (hook + mcp + cloud) requires all three; Claude Desktop (mcp only) just needs MCP.
|
|
@@ -131,11 +149,10 @@ export async function runDoctor() {
|
|
|
131
149
|
else {
|
|
132
150
|
lines.push("Remote revision: (skip — not authenticated; run `auditor login`)");
|
|
133
151
|
}
|
|
134
|
-
// "Ready" = at least one adapter has all its declared surfaces configured.
|
|
135
|
-
const readySetup = adapterStatuses.some(({ adapter, status }) => adapterReady(adapter, status));
|
|
136
152
|
const readyAuth = !!token;
|
|
137
|
-
const ready =
|
|
138
|
-
|
|
153
|
+
const { ready, readySetup, enforced } = resolveReadiness(adapterStatuses, readyAuth);
|
|
154
|
+
const modeSuffix = ready ? (enforced ? " (enforced)" : " (advisory only)") : "";
|
|
155
|
+
lines.push(`Ready: ${ready ? "yes" : "no"}${modeSuffix} (setup=${readySetup ? "ok" : "missing"}, auth=${readyAuth ? "ok" : "missing"})`);
|
|
139
156
|
process.stdout.write(`${lines.join("\n")}\n`);
|
|
140
157
|
}
|
|
141
158
|
//# sourceMappingURL=doctor.js.map
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAQA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAQA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuH1D"}
|
package/dist/cli/main.js
CHANGED
|
@@ -92,6 +92,11 @@ export async function runCli(argv) {
|
|
|
92
92
|
return;
|
|
93
93
|
}
|
|
94
94
|
if (a0 === "mcp") {
|
|
95
|
+
if (a1 === "gateway") {
|
|
96
|
+
const { runMcpGateway } = await import("../mcp/gateway.js");
|
|
97
|
+
await runMcpGateway();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
95
100
|
const { runMcpStdioServer } = await import("../mcp/server.js");
|
|
96
101
|
await runMcpStdioServer();
|
|
97
102
|
return;
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type GatewayServer = {
|
|
2
|
+
/**
|
|
3
|
+
* Validated config key. Used BOTH as the exposed-tool namespace prefix
|
|
4
|
+
* (`${id}__${tool}`) AND as the policy identity (argv[1] in `["mcp", id, tool]`).
|
|
5
|
+
* Decision D4: the gateway keys policy on the config key, not a command/URL
|
|
6
|
+
* derivation, so `mcp.<id>.<tool>` rows gate it deterministically.
|
|
7
|
+
*/
|
|
8
|
+
id: string;
|
|
9
|
+
command: string;
|
|
10
|
+
args: string[];
|
|
11
|
+
env: Record<string, string> | undefined;
|
|
12
|
+
};
|
|
13
|
+
export type GatewayConfigResult = {
|
|
14
|
+
servers: GatewayServer[];
|
|
15
|
+
/** Non-fatal problems. Surfaced to stderr; never thrown into the request loop. */
|
|
16
|
+
errors: string[];
|
|
17
|
+
};
|
|
18
|
+
export declare function resolveGatewayConfigPath(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Load + parse + validate the gateway config. Fail-safe by contract: any problem
|
|
21
|
+
* yields `{ servers, errors }` (possibly empty servers) and NEVER throws, so a bad
|
|
22
|
+
* config degrades the gateway to "fronts nothing" rather than crashing it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadGatewayConfig(explicitPath?: string): Promise<GatewayConfigResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Recover `(serverId, tool)` from an exposed `${serverId}__${tool}` name by
|
|
27
|
+
* matching against the KNOWN server ids, longest-first. We never naive-split on
|
|
28
|
+
* `__`, because a downstream tool name may itself contain `__` (decision D3).
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseExposedToolName(exposed: string, serverIds: readonly string[]): {
|
|
31
|
+
serverId: string;
|
|
32
|
+
tool: string;
|
|
33
|
+
} | null;
|
|
34
|
+
export declare function exposedToolName(serverId: string, tool: string): string;
|
|
35
|
+
//# sourceMappingURL=gateway-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-config.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway-config.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;OAKG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,kFAAkF;IAClF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAUF,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6D3F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS3C;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
/**
|
|
6
|
+
* Downstream MCP servers the gateway fronts. Structurally identical to a
|
|
7
|
+
* `claude_desktop_config.json` `mcpServers` entry so the Phase 2b setup
|
|
8
|
+
* migration is a straight move (see docs/designs/claude-desktop-connector-fix-design.md).
|
|
9
|
+
*/
|
|
10
|
+
const GatewayServerSchema = z.object({
|
|
11
|
+
command: z.string().min(1),
|
|
12
|
+
args: z.array(z.string()).optional(),
|
|
13
|
+
env: z.record(z.string(), z.string()).optional(),
|
|
14
|
+
});
|
|
15
|
+
const GatewayConfigFileSchema = z.object({
|
|
16
|
+
mcpServers: z.record(z.string(), GatewayServerSchema),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Exposed tool names and policy keys must be valid MCP tool-name characters and
|
|
20
|
+
* unambiguous. We REJECT (not silently rewrite) an invalid or colliding key so
|
|
21
|
+
* the config key stays identical everywhere it is used (exposed prefix == policy
|
|
22
|
+
* key); the error tells the user exactly what to rename.
|
|
23
|
+
*/
|
|
24
|
+
const SERVER_ID_RE = /^[a-zA-Z0-9_-]+$/;
|
|
25
|
+
export function resolveGatewayConfigPath() {
|
|
26
|
+
const override = process.env.PRAXIS_GATEWAY_CONFIG?.trim();
|
|
27
|
+
if (override)
|
|
28
|
+
return override;
|
|
29
|
+
return path.join(homedir(), ".praxis", "gateway-servers.json");
|
|
30
|
+
}
|
|
31
|
+
function errMsg(e) {
|
|
32
|
+
return e instanceof Error ? e.message : String(e);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load + parse + validate the gateway config. Fail-safe by contract: any problem
|
|
36
|
+
* yields `{ servers, errors }` (possibly empty servers) and NEVER throws, so a bad
|
|
37
|
+
* config degrades the gateway to "fronts nothing" rather than crashing it.
|
|
38
|
+
*/
|
|
39
|
+
export async function loadGatewayConfig(explicitPath) {
|
|
40
|
+
const cfgPath = explicitPath?.trim() || resolveGatewayConfigPath();
|
|
41
|
+
let raw;
|
|
42
|
+
try {
|
|
43
|
+
raw = await readFile(cfgPath, "utf8");
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
if (e.code === "ENOENT") {
|
|
47
|
+
return {
|
|
48
|
+
servers: [],
|
|
49
|
+
errors: [`No gateway config at ${cfgPath}; no downstream servers to proxy.`],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { servers: [], errors: [`Could not read gateway config at ${cfgPath}: ${errMsg(e)}`] };
|
|
53
|
+
}
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = JSON.parse(raw);
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
return { servers: [], errors: [`Invalid JSON in gateway config ${cfgPath}: ${errMsg(e)}`] };
|
|
60
|
+
}
|
|
61
|
+
const result = GatewayConfigFileSchema.safeParse(parsed);
|
|
62
|
+
if (!result.success) {
|
|
63
|
+
return {
|
|
64
|
+
servers: [],
|
|
65
|
+
errors: [`Gateway config ${cfgPath} failed validation: ${result.error.message}`],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const errors = [];
|
|
69
|
+
const servers = [];
|
|
70
|
+
// Note: JSON object keys are already unique by the time Object.entries runs
|
|
71
|
+
// (JSON.parse keeps the last duplicate), so no duplicate-id check is needed here.
|
|
72
|
+
for (const [key, entry] of Object.entries(result.data.mcpServers)) {
|
|
73
|
+
if (!SERVER_ID_RE.test(key)) {
|
|
74
|
+
errors.push(`Skipping server "${key}": name must match [a-zA-Z0-9_-]. Rename it in ${cfgPath}.`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Reject the tool-namespace separator in a server id. Exposed names are
|
|
78
|
+
// `${id}__${tool}` and parsed back by stripping a known id prefix; a `__`
|
|
79
|
+
// inside the id makes that recovery ambiguous (e.g. ids "a" and "a__b").
|
|
80
|
+
if (key.includes("__")) {
|
|
81
|
+
errors.push(`Skipping server "${key}": name must not contain "__" (the tool-namespace separator). Rename it in ${cfgPath}.`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
servers.push({
|
|
85
|
+
id: key,
|
|
86
|
+
command: entry.command,
|
|
87
|
+
args: entry.args ?? [],
|
|
88
|
+
env: entry.env,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return { servers, errors };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Recover `(serverId, tool)` from an exposed `${serverId}__${tool}` name by
|
|
95
|
+
* matching against the KNOWN server ids, longest-first. We never naive-split on
|
|
96
|
+
* `__`, because a downstream tool name may itself contain `__` (decision D3).
|
|
97
|
+
*/
|
|
98
|
+
export function parseExposedToolName(exposed, serverIds) {
|
|
99
|
+
const candidates = [...serverIds].sort((a, b) => b.length - a.length);
|
|
100
|
+
for (const id of candidates) {
|
|
101
|
+
const prefix = `${id}__`;
|
|
102
|
+
if (exposed.startsWith(prefix) && exposed.length > prefix.length) {
|
|
103
|
+
return { serverId: id, tool: exposed.slice(prefix.length) };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
export function exposedToolName(serverId, tool) {
|
|
109
|
+
return `${serverId}__${tool}`;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=gateway-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-config.js","sourceRoot":"","sources":["../../src/mcp/gateway-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type Tier } from "../policy/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Gateway gating decision for one proxied MCP call.
|
|
4
|
+
*
|
|
5
|
+
* This mirrors the orchestration in `hooks/run-before-mcp.ts` (the Cursor /
|
|
6
|
+
* Claude Code `beforeMCPExecution` hook) but returns a structured decision
|
|
7
|
+
* instead of writing the hook stdio contract. It REUSES the same building blocks
|
|
8
|
+
* read-only (`evaluateMcpProposal`, `resolveMutateHookPermission`, audit,
|
|
9
|
+
* telemetry), so MUTATE behaves identically to the hook hosts: deny + retry
|
|
10
|
+
* redemption by `(serverId, tool, tool_input)` fingerprint (decision D1). The
|
|
11
|
+
* ~30 lines of glue are intentionally not extracted from run-before-mcp.ts to
|
|
12
|
+
* avoid modifying that shared hook entrypoint.
|
|
13
|
+
*/
|
|
14
|
+
export type GatewayDecision = {
|
|
15
|
+
/** allow -> forward downstream. block -> synthesize a result, do not forward. */
|
|
16
|
+
decision: "allow" | "block";
|
|
17
|
+
tier: Tier;
|
|
18
|
+
reasons: string[];
|
|
19
|
+
ticketConsumed: boolean;
|
|
20
|
+
/** Present on a MUTATE block: where the human approves, and the request id. */
|
|
21
|
+
inlineApproval: {
|
|
22
|
+
request_id: string;
|
|
23
|
+
open_url: string;
|
|
24
|
+
} | null;
|
|
25
|
+
};
|
|
26
|
+
export declare function evaluateGatewayCall(input: {
|
|
27
|
+
serverId: string;
|
|
28
|
+
tool: string;
|
|
29
|
+
toolInput: unknown;
|
|
30
|
+
cwd?: string;
|
|
31
|
+
}): Promise<GatewayDecision>;
|
|
32
|
+
//# sourceMappingURL=gateway-evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-evaluate.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway-evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAWvF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,iFAAiF;IACjF,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,+EAA+E;IAC/E,cAAc,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACjE,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,eAAe,CAAC,CAiF3B"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { loadPoliciesV1, readPoliciesV1Revision } from "../policy/index.js";
|
|
2
|
+
import { appendAuditJsonl } from "../audit/jsonl.js";
|
|
3
|
+
import { getInstallId } from "../cli/install-id.js";
|
|
4
|
+
import { evaluateMcpProposal } from "../shell/evaluate.js";
|
|
5
|
+
import { resolveGuardStorageRoot } from "../bridge/guard-storage-root.js";
|
|
6
|
+
import { toolInputSha256 } from "../approval/fingerprint.js";
|
|
7
|
+
import { stringifyToolInput } from "../hooks/before-mcp-argv.js";
|
|
8
|
+
import { resolveMutateHookPermission } from "../hooks/before-mcp-mutate.js";
|
|
9
|
+
import { sendGuardEvent } from "../telemetry/guard-events.js";
|
|
10
|
+
export async function evaluateGatewayCall(input) {
|
|
11
|
+
const started = performance.now();
|
|
12
|
+
const argv = ["mcp", input.serverId, input.tool];
|
|
13
|
+
const rawToolName = `${input.serverId}__${input.tool}`;
|
|
14
|
+
const toolInputStr = stringifyToolInput(input.toolInput);
|
|
15
|
+
const [policy, policyRevision] = await Promise.all([loadPoliciesV1(), readPoliciesV1Revision()]);
|
|
16
|
+
const { skipped, evaluation } = evaluateMcpProposal(policy, argv);
|
|
17
|
+
const { tier, classification, flags } = evaluation;
|
|
18
|
+
const reasons = evaluation.reasons.map((r) => r.message);
|
|
19
|
+
const storageRoot = resolveGuardStorageRoot(input.cwd);
|
|
20
|
+
const toolInputHash = toolInputSha256(input.toolInput);
|
|
21
|
+
if (skipped) {
|
|
22
|
+
await emitTelemetry({
|
|
23
|
+
argv,
|
|
24
|
+
rawToolName,
|
|
25
|
+
toolInputStr,
|
|
26
|
+
tier,
|
|
27
|
+
decision: "allow",
|
|
28
|
+
status: "skipped",
|
|
29
|
+
reasons,
|
|
30
|
+
policyRevision,
|
|
31
|
+
storageRoot,
|
|
32
|
+
ticketConsumed: false,
|
|
33
|
+
inlineApproval: null,
|
|
34
|
+
latencyMs: performance.now() - started,
|
|
35
|
+
skipped: true,
|
|
36
|
+
classification,
|
|
37
|
+
flags,
|
|
38
|
+
toolInputHash,
|
|
39
|
+
});
|
|
40
|
+
return { decision: "allow", tier, reasons, ticketConsumed: false, inlineApproval: null };
|
|
41
|
+
}
|
|
42
|
+
let permission = tier === "READ" ? "allow" : "deny";
|
|
43
|
+
let ticketConsumed = false;
|
|
44
|
+
let inlineApproval = null;
|
|
45
|
+
let finalReasons = reasons;
|
|
46
|
+
// MUTATE only: deny + retry redemption. DESTRUCTIVE stays deny -> block.
|
|
47
|
+
if (permission === "deny" && tier === "MUTATE") {
|
|
48
|
+
const mutate = await resolveMutateHookPermission({
|
|
49
|
+
argv,
|
|
50
|
+
tier,
|
|
51
|
+
storageRoot,
|
|
52
|
+
toolInputHash,
|
|
53
|
+
rawToolName,
|
|
54
|
+
toolInputPreview: toolInputStr.slice(0, 200),
|
|
55
|
+
policyRevision,
|
|
56
|
+
initialReasons: reasons,
|
|
57
|
+
});
|
|
58
|
+
// resolveMutateHookPermission's type allows "ask"; for the gateway that is a block.
|
|
59
|
+
permission = mutate.permission === "allow" ? "allow" : "deny";
|
|
60
|
+
ticketConsumed = mutate.ticketConsumed;
|
|
61
|
+
inlineApproval = mutate.inlineApproval;
|
|
62
|
+
finalReasons = mutate.reasons;
|
|
63
|
+
}
|
|
64
|
+
const decision = permission === "allow" ? "allow" : "block";
|
|
65
|
+
await emitTelemetry({
|
|
66
|
+
argv,
|
|
67
|
+
rawToolName,
|
|
68
|
+
toolInputStr,
|
|
69
|
+
tier,
|
|
70
|
+
decision,
|
|
71
|
+
status: decision === "allow" ? "passed" : "blocked",
|
|
72
|
+
reasons: finalReasons,
|
|
73
|
+
policyRevision,
|
|
74
|
+
storageRoot,
|
|
75
|
+
ticketConsumed,
|
|
76
|
+
inlineApproval,
|
|
77
|
+
latencyMs: performance.now() - started,
|
|
78
|
+
skipped: false,
|
|
79
|
+
classification,
|
|
80
|
+
flags,
|
|
81
|
+
toolInputHash,
|
|
82
|
+
});
|
|
83
|
+
return { decision, tier, reasons: finalReasons, ticketConsumed, inlineApproval };
|
|
84
|
+
}
|
|
85
|
+
/** Local audit.jsonl (full fidelity) + redacted egress event. Never throws. */
|
|
86
|
+
async function emitTelemetry(e) {
|
|
87
|
+
try {
|
|
88
|
+
await appendAuditJsonl({
|
|
89
|
+
ts: new Date().toISOString(),
|
|
90
|
+
hook: "mcpGateway",
|
|
91
|
+
tool_name: e.rawToolName,
|
|
92
|
+
bare_tool: e.argv[2] ?? null,
|
|
93
|
+
tool_input: e.toolInputStr.slice(0, 8000),
|
|
94
|
+
argv: e.argv,
|
|
95
|
+
classification: e.classification,
|
|
96
|
+
flags: e.flags,
|
|
97
|
+
tier: e.tier,
|
|
98
|
+
permission: e.decision === "allow" ? "allow" : "deny",
|
|
99
|
+
ticketConsumed: e.ticketConsumed,
|
|
100
|
+
inline_request_id: e.inlineApproval?.request_id ?? null,
|
|
101
|
+
tool_input_sha256: e.toolInputHash,
|
|
102
|
+
reasons: e.reasons,
|
|
103
|
+
status: e.status,
|
|
104
|
+
...(e.skipped ? { skipped: true, skip_reason: "mcp_policy_unmatched" } : {}),
|
|
105
|
+
latency_ms: e.latencyMs,
|
|
106
|
+
}, e.storageRoot);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
process.stderr.write(`[auditor] gateway audit append failed: ${String(err)}\n`);
|
|
110
|
+
}
|
|
111
|
+
await sendGuardEvent({
|
|
112
|
+
ts: new Date().toISOString(),
|
|
113
|
+
status: e.status,
|
|
114
|
+
...(e.skipped ? { skipped: true, skip_reason: "mcp_policy_unmatched" } : {}),
|
|
115
|
+
tool: "auditor-mcp-gateway",
|
|
116
|
+
command_path: e.argv[1] ?? null,
|
|
117
|
+
verb: e.argv[2] ?? null,
|
|
118
|
+
resource: e.toolInputStr ? e.toolInputStr.slice(0, 500) : null,
|
|
119
|
+
reason: e.reasons[0] ?? null,
|
|
120
|
+
cmd: e.rawToolName,
|
|
121
|
+
tier: e.tier,
|
|
122
|
+
decision: e.decision,
|
|
123
|
+
latency_ms: e.latencyMs,
|
|
124
|
+
installId: getInstallId(),
|
|
125
|
+
kind: "mcp",
|
|
126
|
+
...(e.policyRevision !== null ? { policy_revision: e.policyRevision } : {}),
|
|
127
|
+
meta: {
|
|
128
|
+
hook: "mcpGateway",
|
|
129
|
+
ticketConsumed: e.ticketConsumed,
|
|
130
|
+
approval_request_id: e.inlineApproval?.request_id ?? null,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=gateway-evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-evaluate.js","sourceRoot":"","sources":["../../src/mcp/gateway-evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { type CallToolResult, type Tool } from "@modelcontextprotocol/sdk/types.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 advertised by this downstream server (fetched at connect). */
|
|
10
|
+
tools: Tool[];
|
|
11
|
+
callTool(tool: string, args: Record<string, unknown>): Promise<CallToolResult>;
|
|
12
|
+
/** Re-establish the underlying transport after a failure. Returns false if it cannot. */
|
|
13
|
+
reconnect(): Promise<boolean>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build the low-level MCP `Server` that fronts the given downstream connections.
|
|
17
|
+
* Exported for tests (inject fake connections); `runMcpGateway` wires the real ones.
|
|
18
|
+
* Uses the low-level `Server` (not `McpServer`) so downstream JSON Schemas pass
|
|
19
|
+
* through verbatim with no JSON-Schema -> Zod conversion (decision D6).
|
|
20
|
+
*/
|
|
21
|
+
export declare function createGatewayServer(connections: GatewayConnection[]): Server;
|
|
22
|
+
/**
|
|
23
|
+
* Connect to all configured downstream servers in parallel (eager, each bounded
|
|
24
|
+
* by a timeout), skipping and surfacing any that fail so one bad server does not
|
|
25
|
+
* sink the gateway (decision D2). Then serve the combined namespaced tool set on
|
|
26
|
+
* stdio. Blocks until disconnect.
|
|
27
|
+
*/
|
|
28
|
+
export declare function runMcpGateway(explicitConfigPath?: string): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/mcp/gateway.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAkB5C;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,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,yFAAyF;IACzF,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/B;AAqFD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAyF5E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9E"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StdioClientTransport, getDefaultEnvironment, } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
+
import { AUDITOR_CLI_VERSION } from "../runtime/version.js";
|
|
7
|
+
import { exposedToolName, loadGatewayConfig, parseExposedToolName, } from "./gateway-config.js";
|
|
8
|
+
import { evaluateGatewayCall } from "./gateway-evaluate.js";
|
|
9
|
+
const CONNECT_TIMEOUT_MS = 10_000;
|
|
10
|
+
/** stderr only — stdout is the MCP protocol channel. */
|
|
11
|
+
function logErr(line) {
|
|
12
|
+
process.stderr.write(`[auditor-gateway] ${line}\n`);
|
|
13
|
+
}
|
|
14
|
+
function withTimeout(p, ms, label) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const t = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
|
|
17
|
+
p.then((v) => {
|
|
18
|
+
clearTimeout(t);
|
|
19
|
+
resolve(v);
|
|
20
|
+
}, (e) => {
|
|
21
|
+
clearTimeout(t);
|
|
22
|
+
reject(e);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** Real stdio-backed connection to a downstream MCP server. */
|
|
27
|
+
async function connectStdioServer(server) {
|
|
28
|
+
const spawn = () => new StdioClientTransport({
|
|
29
|
+
command: server.command,
|
|
30
|
+
args: server.args,
|
|
31
|
+
env: server.env ? { ...getDefaultEnvironment(), ...server.env } : undefined,
|
|
32
|
+
});
|
|
33
|
+
let client = new Client({ name: `praxis-gateway-client-${server.id}`, version: AUDITOR_CLI_VERSION });
|
|
34
|
+
await withTimeout(client.connect(spawn()), CONNECT_TIMEOUT_MS, `connect ${server.id}`);
|
|
35
|
+
const listed = await withTimeout(client.listTools(), CONNECT_TIMEOUT_MS, `listTools ${server.id}`);
|
|
36
|
+
const conn = {
|
|
37
|
+
id: server.id,
|
|
38
|
+
tools: listed.tools,
|
|
39
|
+
async callTool(tool, args) {
|
|
40
|
+
return (await client.callTool({ name: tool, arguments: args }));
|
|
41
|
+
},
|
|
42
|
+
async reconnect() {
|
|
43
|
+
try {
|
|
44
|
+
// Close the old client first so the dead subprocess + pipes are reaped;
|
|
45
|
+
// otherwise a flapping downstream leaks one child process per failure.
|
|
46
|
+
await client.close().catch(() => { });
|
|
47
|
+
client = new Client({
|
|
48
|
+
name: `praxis-gateway-client-${server.id}`,
|
|
49
|
+
version: AUDITOR_CLI_VERSION,
|
|
50
|
+
});
|
|
51
|
+
await withTimeout(client.connect(spawn()), CONNECT_TIMEOUT_MS, `reconnect ${server.id}`);
|
|
52
|
+
const re = await withTimeout(client.listTools(), CONNECT_TIMEOUT_MS, `listTools ${server.id}`);
|
|
53
|
+
conn.tools = re.tools;
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
logErr(`reconnect to "${server.id}" failed: ${String(e)}`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
return conn;
|
|
63
|
+
}
|
|
64
|
+
function textResult(text, isError) {
|
|
65
|
+
return { content: [{ type: "text", text }], isError };
|
|
66
|
+
}
|
|
67
|
+
/** Bound downstream-supplied error text so a hostile downstream can't flood or spoof the result. */
|
|
68
|
+
function truncErr(e) {
|
|
69
|
+
return String(e).slice(0, 300);
|
|
70
|
+
}
|
|
71
|
+
function blockedResult(serverId, tool, d) {
|
|
72
|
+
const reason = d.reasons[0] ?? "policy";
|
|
73
|
+
if (d.inlineApproval) {
|
|
74
|
+
return textResult(`Praxis guard requires human approval for ${serverId}__${tool} (tier=${d.tier}). ` +
|
|
75
|
+
`Approve at ${d.inlineApproval.open_url} then retry this exact tool call. ` +
|
|
76
|
+
`(request ${d.inlineApproval.request_id})`, true);
|
|
77
|
+
}
|
|
78
|
+
return textResult(`Praxis guard blocked ${serverId}__${tool} (tier=${d.tier}): ${reason}. ` +
|
|
79
|
+
(d.tier === "DESTRUCTIVE" ? "Destructive actions cannot be auto-approved." : ""), true);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build the low-level MCP `Server` that fronts the given downstream connections.
|
|
83
|
+
* Exported for tests (inject fake connections); `runMcpGateway` wires the real ones.
|
|
84
|
+
* Uses the low-level `Server` (not `McpServer`) so downstream JSON Schemas pass
|
|
85
|
+
* through verbatim with no JSON-Schema -> Zod conversion (decision D6).
|
|
86
|
+
*/
|
|
87
|
+
export function createGatewayServer(connections) {
|
|
88
|
+
const byId = new Map(connections.map((c) => [c.id, c]));
|
|
89
|
+
const ids = connections.map((c) => c.id);
|
|
90
|
+
const server = new Server({ name: "praxis-guard-gateway", version: AUDITOR_CLI_VERSION }, { capabilities: { tools: {} } });
|
|
91
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
92
|
+
const tools = [];
|
|
93
|
+
for (const conn of connections) {
|
|
94
|
+
for (const t of conn.tools) {
|
|
95
|
+
tools.push({ ...t, name: exposedToolName(conn.id, t.name) });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { tools };
|
|
99
|
+
});
|
|
100
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
101
|
+
// Fail closed: any unexpected throw in parsing/gating (e.g. a corrupt policy
|
|
102
|
+
// file making evaluateGatewayCall reject) blocks the call rather than letting
|
|
103
|
+
// it slip through. Mirrors the hook's failClosedBeforeMcpHookErrorResponse.
|
|
104
|
+
try {
|
|
105
|
+
const exposed = request.params.name;
|
|
106
|
+
const args = (request.params.arguments ?? {});
|
|
107
|
+
const parsed = parseExposedToolName(exposed, ids);
|
|
108
|
+
if (!parsed) {
|
|
109
|
+
return textResult(`Praxis gateway: unknown tool "${exposed}".`, true);
|
|
110
|
+
}
|
|
111
|
+
const conn = byId.get(parsed.serverId);
|
|
112
|
+
if (!conn) {
|
|
113
|
+
return textResult(`Praxis gateway: downstream "${parsed.serverId}" is not connected.`, true);
|
|
114
|
+
}
|
|
115
|
+
// Only proxy tools the downstream actually advertised. Without this, any
|
|
116
|
+
// `knownServer__anything` would be forwarded (and classified skipped->allow),
|
|
117
|
+
// proxying tools the downstream never listed. The gateway owns this check, not
|
|
118
|
+
// the downstream (found in QA: ISSUE-001).
|
|
119
|
+
if (!conn.tools.some((t) => t.name === parsed.tool)) {
|
|
120
|
+
return textResult(`Praxis gateway: "${parsed.serverId}" does not expose a tool named "${parsed.tool}".`, true);
|
|
121
|
+
}
|
|
122
|
+
const decision = await evaluateGatewayCall({
|
|
123
|
+
serverId: parsed.serverId,
|
|
124
|
+
tool: parsed.tool,
|
|
125
|
+
toolInput: args,
|
|
126
|
+
});
|
|
127
|
+
if (decision.decision === "block") {
|
|
128
|
+
return blockedResult(parsed.serverId, parsed.tool, decision);
|
|
129
|
+
}
|
|
130
|
+
// allow -> forward, returning the downstream result VERBATIM (decision D5).
|
|
131
|
+
try {
|
|
132
|
+
return await conn.callTool(parsed.tool, args);
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
logErr(`downstream "${parsed.serverId}" call failed: ${truncErr(e)}; reconnecting`);
|
|
136
|
+
const ok = await conn.reconnect();
|
|
137
|
+
// Retry ONLY idempotent (READ) calls. A redeemed MUTATE/DESTRUCTIVE must not
|
|
138
|
+
// be auto-replayed: if the first attempt reached the downstream and mutated
|
|
139
|
+
// state before the transport died, a blind retry double-applies it. Reconnect
|
|
140
|
+
// still heals the connection for the next call.
|
|
141
|
+
if (ok && decision.tier === "READ") {
|
|
142
|
+
try {
|
|
143
|
+
return await conn.callTool(parsed.tool, args);
|
|
144
|
+
}
|
|
145
|
+
catch (e2) {
|
|
146
|
+
return textResult(`Praxis gateway: downstream "${parsed.serverId}" error after reconnect: ${truncErr(e2)}`, true);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return textResult(`Praxis gateway: downstream "${parsed.serverId}" call failed` +
|
|
150
|
+
(ok ? " (reconnected; not retried to avoid double-execution)" : " and is unavailable") +
|
|
151
|
+
`: ${truncErr(e)}`, true);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
logErr(`gating error for "${request.params?.name}": ${truncErr(e)}`);
|
|
156
|
+
return textResult("Praxis gateway: guard evaluation failed; blocking this call (fail-closed).", true);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return server;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Connect to all configured downstream servers in parallel (eager, each bounded
|
|
163
|
+
* by a timeout), skipping and surfacing any that fail so one bad server does not
|
|
164
|
+
* sink the gateway (decision D2). Then serve the combined namespaced tool set on
|
|
165
|
+
* stdio. Blocks until disconnect.
|
|
166
|
+
*/
|
|
167
|
+
export async function runMcpGateway(explicitConfigPath) {
|
|
168
|
+
const { servers, errors } = await loadGatewayConfig(explicitConfigPath);
|
|
169
|
+
for (const e of errors)
|
|
170
|
+
logErr(e);
|
|
171
|
+
const settled = await Promise.allSettled(servers.map((s) => connectStdioServer(s)));
|
|
172
|
+
const connections = [];
|
|
173
|
+
settled.forEach((r, i) => {
|
|
174
|
+
if (r.status === "fulfilled") {
|
|
175
|
+
connections.push(r.value);
|
|
176
|
+
logErr(`connected "${servers[i].id}" (${r.value.tools.length} tools)`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
logErr(`skipping "${servers[i].id}": ${String(r.reason)}`);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
if (connections.length === 0) {
|
|
183
|
+
logErr("no downstream servers connected; gateway will expose no tools.");
|
|
184
|
+
}
|
|
185
|
+
const server = createGatewayServer(connections);
|
|
186
|
+
await server.connect(new StdioServerTransport());
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/mcp/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-schemas.d.ts","sourceRoot":"","sources":["../../src/mcp/guard-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;EAAgC,CAAC;AAC7D,eAAO,MAAM,kBAAkB;;;EAA2B,CAAC;AAS3D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqB3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"guard-schemas.d.ts","sourceRoot":"","sources":["../../src/mcp/guard-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;EAAgC,CAAC;AAC7D,eAAO,MAAM,kBAAkB;;;EAA2B,CAAC;AAS3D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqB3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,sBAAsB,QAQwD,CAAC;AAE5F,eAAO,MAAM,2BAA2B,QAKmE,CAAC"}
|
|
@@ -29,11 +29,17 @@ export const GuardInputSchema = z.object({
|
|
|
29
29
|
})
|
|
30
30
|
.optional(),
|
|
31
31
|
});
|
|
32
|
-
export const GUARD_TOOL_DESCRIPTION = "
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
32
|
+
export const GUARD_TOOL_DESCRIPTION = "Praxis policy gatekeeper. Call this BEFORE you run any shell command or state-changing " +
|
|
33
|
+
"action on the user's behalf, including actions you would run via other tools or connectors. " +
|
|
34
|
+
"Pass the exact `argv` you intend to run with `mode: \"enforce\"`. Then obey the response: " +
|
|
35
|
+
"if `decision` is `block`, do NOT run the command; if `require_approval`, call `guard_wait` " +
|
|
36
|
+
"and wait for it to resolve; only proceed when `decision` is `allow`. " +
|
|
37
|
+
"(`mode: \"shadow\"` is a dry-run whose `decision` is always `allow`; the real verdict is in the " +
|
|
38
|
+
"`shadow` field. Use `enforce` for actual gating.) " +
|
|
39
|
+
"For a MUTATE after approval, pass `context.approval.request_id` (and optional `grant`).";
|
|
40
|
+
export const GUARD_WAIT_TOOL_DESCRIPTION = "Wait for a MUTATE approval, redeem the grant, and record a signed execution ticket. Uses enforce " +
|
|
41
|
+
"semantics. When `guard` returns `require_approval`, you MUST call `guard_wait` (not `guard` again) " +
|
|
42
|
+
"with the same `proposal`, `context.wait_ms` (e.g. 120000), and `context.approval.request_id` from " +
|
|
43
|
+
"the response. If it returns `require_approval`, call `guard_wait` again until it resolves. Direct the " +
|
|
44
|
+
"human to `approval.open_url` when shown. Do not run the command until `guard_wait` resolves to `allow`.";
|
|
39
45
|
//# sourceMappingURL=guard-schemas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-schemas.js","sourceRoot":"","sources":["../../src/mcp/guard-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAE3D,MAAM,qBAAqB,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,QAAQ,EAAE,CAAC;AAEd,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC;IACF,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,QAAQ,EAAE,qBAAqB;QAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QAClD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;KACpD,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GACjC,
|
|
1
|
+
{"version":3,"file":"guard-schemas.js","sourceRoot":"","sources":["../../src/mcp/guard-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAE3D,MAAM,qBAAqB,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,QAAQ,EAAE,CAAC;AAEd,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC;IACF,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,QAAQ,EAAE,qBAAqB;QAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QAClD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;KACpD,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GACjC,yFAAyF;IACzF,8FAA8F;IAC9F,4FAA4F;IAC5F,6FAA6F;IAC7F,uEAAuE;IACvE,kGAAkG;IAClG,oDAAoD;IACpD,yFAAyF,CAAC;AAE5F,MAAM,CAAC,MAAM,2BAA2B,GACtC,mGAAmG;IACnG,qGAAqG;IACrG,oGAAoG;IACpG,wGAAwG;IACxG,yGAAyG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-events.d.ts","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"guard-events.d.ts","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA2BjD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE9E"}
|
|
@@ -4,6 +4,7 @@ import { getInstallId } from "../cli/install-id.js";
|
|
|
4
4
|
import { prodFunctionUrl } from "../cli/function-url.js";
|
|
5
5
|
import { AUDITOR_CLI_VERSION } from "../runtime/version.js";
|
|
6
6
|
import { resolveAgentHost } from "./agent-host.js";
|
|
7
|
+
import { redactGuardEventPayload } from "./redact-guard-event.js";
|
|
7
8
|
function getGuardEventUrl() {
|
|
8
9
|
if (process.env.PRAXIS_GUARD_EVENT_URL)
|
|
9
10
|
return process.env.PRAXIS_GUARD_EVENT_URL;
|
|
@@ -54,8 +55,11 @@ export async function sendGuardEvent(payload) {
|
|
|
54
55
|
const installId = typeof payload.installId === "string" && payload.installId.trim().length > 0
|
|
55
56
|
? payload.installId.trim()
|
|
56
57
|
: getInstallId();
|
|
58
|
+
// Redact secret-bearing fields at the egress boundary (single chokepoint for
|
|
59
|
+
// all callers). Omits on skip events, best-effort scrubs on governed events.
|
|
60
|
+
const redacted = redactGuardEventPayload(payload);
|
|
57
61
|
const body = {
|
|
58
|
-
...
|
|
62
|
+
...redacted,
|
|
59
63
|
installId,
|
|
60
64
|
agent: typeof payload.agent === "string" ? payload.agent : resolveAgentHost(),
|
|
61
65
|
version: AUDITOR_CLI_VERSION,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-events.js","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"guard-events.js","sourceRoot":"","sources":["../../src/telemetry/guard-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Egress redaction for guard telemetry.
|
|
3
|
+
*
|
|
4
|
+
* Every guard event funnels through `sendGuardEvent` (the single network sink).
|
|
5
|
+
* Command lines and tool inputs can carry secrets (Authorization headers,
|
|
6
|
+
* exported tokens, connection strings). This is a security product, so customer
|
|
7
|
+
* secrets must not be exfiltrated into our own telemetry pipeline.
|
|
8
|
+
*
|
|
9
|
+
* Two modes, keyed off the event's governance signal:
|
|
10
|
+
*
|
|
11
|
+
* ungoverned-skip event ──▶ OMIT the secret-bearing fields entirely
|
|
12
|
+
* (skipped===true || (we don't need them; omitting beats scrubbing)
|
|
13
|
+
* governed===false)
|
|
14
|
+
*
|
|
15
|
+
* governed event ──▶ best-effort SCRUB of known secret patterns
|
|
16
|
+
* (neither signal set: (keep the audit detail, minus the secrets)
|
|
17
|
+
* the governed shell/mcp
|
|
18
|
+
* hook senders set no
|
|
19
|
+
* skip signal, so the
|
|
20
|
+
* DEFAULT is scrub, not
|
|
21
|
+
* omit)
|
|
22
|
+
*
|
|
23
|
+
* This is best-effort scrubbing, NOT a secrets boundary. Pattern redaction
|
|
24
|
+
* misses positional secrets (`mysql -u root hunter2`), base64 blobs, custom
|
|
25
|
+
* `--header` values, heredocs, and env-substituted values. Defense-in-depth.
|
|
26
|
+
*
|
|
27
|
+
* Never throws: telemetry must not break guard. Any internal error degrades to
|
|
28
|
+
* dropping the risky fields rather than sending them raw.
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* Return a copy of the payload with secret-bearing fields omitted (skip events)
|
|
32
|
+
* or scrubbed (governed events). Never throws; on internal error, drops the
|
|
33
|
+
* secret fields so nothing raw escapes.
|
|
34
|
+
*/
|
|
35
|
+
export declare function redactGuardEventPayload(payload: Record<string, unknown>): Record<string, unknown>;
|
|
36
|
+
//# sourceMappingURL=redact-guard-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact-guard-event.d.ts","sourceRoot":"","sources":["../../src/telemetry/redact-guard-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA8FH;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Egress redaction for guard telemetry.
|
|
3
|
+
*
|
|
4
|
+
* Every guard event funnels through `sendGuardEvent` (the single network sink).
|
|
5
|
+
* Command lines and tool inputs can carry secrets (Authorization headers,
|
|
6
|
+
* exported tokens, connection strings). This is a security product, so customer
|
|
7
|
+
* secrets must not be exfiltrated into our own telemetry pipeline.
|
|
8
|
+
*
|
|
9
|
+
* Two modes, keyed off the event's governance signal:
|
|
10
|
+
*
|
|
11
|
+
* ungoverned-skip event ──▶ OMIT the secret-bearing fields entirely
|
|
12
|
+
* (skipped===true || (we don't need them; omitting beats scrubbing)
|
|
13
|
+
* governed===false)
|
|
14
|
+
*
|
|
15
|
+
* governed event ──▶ best-effort SCRUB of known secret patterns
|
|
16
|
+
* (neither signal set: (keep the audit detail, minus the secrets)
|
|
17
|
+
* the governed shell/mcp
|
|
18
|
+
* hook senders set no
|
|
19
|
+
* skip signal, so the
|
|
20
|
+
* DEFAULT is scrub, not
|
|
21
|
+
* omit)
|
|
22
|
+
*
|
|
23
|
+
* This is best-effort scrubbing, NOT a secrets boundary. Pattern redaction
|
|
24
|
+
* misses positional secrets (`mysql -u root hunter2`), base64 blobs, custom
|
|
25
|
+
* `--header` values, heredocs, and env-substituted values. Defense-in-depth.
|
|
26
|
+
*
|
|
27
|
+
* Never throws: telemetry must not break guard. Any internal error degrades to
|
|
28
|
+
* dropping the risky fields rather than sending them raw.
|
|
29
|
+
*/
|
|
30
|
+
/** Fields that can carry secrets across the 8 sendGuardEvent callers. */
|
|
31
|
+
const SECRET_FIELDS = [
|
|
32
|
+
"cmd",
|
|
33
|
+
"argv",
|
|
34
|
+
"governed_argv",
|
|
35
|
+
"resource",
|
|
36
|
+
"tool_input",
|
|
37
|
+
"toolInputPreview",
|
|
38
|
+
];
|
|
39
|
+
/** Cap field size before regex to avoid catastrophic backtracking / huge payloads. */
|
|
40
|
+
const MAX_FIELD_LEN = 8192;
|
|
41
|
+
/** Bound recursion into nested tool_input objects. */
|
|
42
|
+
const MAX_DEPTH = 6;
|
|
43
|
+
/**
|
|
44
|
+
* Sensitive identifier matcher, used for two structured cases that inline string
|
|
45
|
+
* scrubbing cannot reach:
|
|
46
|
+
* - object keys: `{ GITHUB_TOKEN: "secret" }` (key and value are separate)
|
|
47
|
+
* - argv flags: `["--with-token", "ghp_..."]` (flag and value are separate elements)
|
|
48
|
+
* "key" only matches as a standalone word or _/- suffix so "monkey" / "keyboard" don't trip it.
|
|
49
|
+
*/
|
|
50
|
+
const SENSITIVE_KEY_RE = /(?:password|passwd|pwd|token|secret|credential|api[-_]?key|auth|(?:^|[_-])key)/i;
|
|
51
|
+
const SCRUB_PATTERNS = [
|
|
52
|
+
// Bearer / token auth headers
|
|
53
|
+
[/\bbearer\s+[A-Za-z0-9._~+/-]+=*/gi, "Bearer [REDACTED]"],
|
|
54
|
+
// --password=x, --token x, --secret=x, --key x, --api-key x (flag + value)
|
|
55
|
+
[
|
|
56
|
+
/(--?(?:password|passwd|pwd|token|secret|api[-_]?key|key|auth)[=\s]+)(\S+)/gi,
|
|
57
|
+
"$1[REDACTED]",
|
|
58
|
+
],
|
|
59
|
+
// KEY=VALUE for sensitive-looking env keys
|
|
60
|
+
[
|
|
61
|
+
/\b([A-Za-z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|PWD|CREDENTIAL)[A-Za-z0-9_]*)=(\S+)/g,
|
|
62
|
+
"$1=[REDACTED]",
|
|
63
|
+
],
|
|
64
|
+
// credentials embedded in a URL: scheme://user:pass@host
|
|
65
|
+
[/([a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)([^\s@]+)(@)/gi, "$1[REDACTED]$3"],
|
|
66
|
+
];
|
|
67
|
+
function scrubString(value) {
|
|
68
|
+
let out = value.length > MAX_FIELD_LEN ? value.slice(0, MAX_FIELD_LEN) : value;
|
|
69
|
+
for (const [pattern, replacement] of SCRUB_PATTERNS) {
|
|
70
|
+
out = out.replace(pattern, replacement);
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
/** True for an argv element that names a secret (`--token`, `--with-token`, `--api-key`). */
|
|
75
|
+
function isSensitiveFlag(element) {
|
|
76
|
+
if (typeof element !== "string" || !element.startsWith("-"))
|
|
77
|
+
return false;
|
|
78
|
+
return SENSITIVE_KEY_RE.test(element.replace(/^--?/, ""));
|
|
79
|
+
}
|
|
80
|
+
/** Scrub an array: scrub each element, then redact the value AFTER a sensitive flag. */
|
|
81
|
+
function scrubArray(arr, depth) {
|
|
82
|
+
const out = arr.map((v) => scrubValue(v, depth + 1));
|
|
83
|
+
for (let i = 0; i < arr.length - 1; i++) {
|
|
84
|
+
if (isSensitiveFlag(arr[i]))
|
|
85
|
+
out[i + 1] = "[REDACTED]";
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Recursively scrub string leaves of strings / arrays / plain objects.
|
|
91
|
+
* `keyHint` is the enclosing object key (if any): when it names a secret, the
|
|
92
|
+
* whole string value is replaced rather than pattern-scrubbed.
|
|
93
|
+
*/
|
|
94
|
+
function scrubValue(value, depth, keyHint) {
|
|
95
|
+
if (typeof value === "string") {
|
|
96
|
+
if (keyHint && SENSITIVE_KEY_RE.test(keyHint))
|
|
97
|
+
return "[REDACTED]";
|
|
98
|
+
return scrubString(value);
|
|
99
|
+
}
|
|
100
|
+
if (depth >= MAX_DEPTH)
|
|
101
|
+
return value;
|
|
102
|
+
if (Array.isArray(value))
|
|
103
|
+
return scrubArray(value, depth);
|
|
104
|
+
if (value && typeof value === "object") {
|
|
105
|
+
const out = {};
|
|
106
|
+
for (const [k, v] of Object.entries(value)) {
|
|
107
|
+
out[k] = scrubValue(v, depth + 1, k);
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
/** True when the event is an explicit ungoverned/skip event. */
|
|
114
|
+
function isUngovernedSkip(payload) {
|
|
115
|
+
return payload.skipped === true || payload.governed === false;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Return a copy of the payload with secret-bearing fields omitted (skip events)
|
|
119
|
+
* or scrubbed (governed events). Never throws; on internal error, drops the
|
|
120
|
+
* secret fields so nothing raw escapes.
|
|
121
|
+
*/
|
|
122
|
+
export function redactGuardEventPayload(payload) {
|
|
123
|
+
try {
|
|
124
|
+
const out = { ...payload };
|
|
125
|
+
const omit = isUngovernedSkip(payload);
|
|
126
|
+
for (const field of SECRET_FIELDS) {
|
|
127
|
+
if (!(field in out))
|
|
128
|
+
continue;
|
|
129
|
+
if (omit) {
|
|
130
|
+
delete out[field];
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
out[field] = scrubValue(out[field], 0);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Fail safe: never send raw secret fields if redaction itself failed.
|
|
140
|
+
const safe = { ...payload };
|
|
141
|
+
for (const field of SECRET_FIELDS)
|
|
142
|
+
delete safe[field];
|
|
143
|
+
return safe;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=redact-guard-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact-guard-event.js","sourceRoot":"","sources":["../../src/telemetry/redact-guard-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,yEAAyE;AACzE,MAAM,aAAa,GAAG;IACpB,KAAK;IACL,MAAM;IACN,eAAe;IACf,UAAU;IACV,YAAY;IACZ,kBAAkB;CACV,CAAC;AAEX,sFAAsF;AACtF,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,sDAAsD;AACtD,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB;;;;;;GAMG;AACH,MAAM,gBAAgB,GACpB,iFAAiF,CAAC;AAEpF,MAAM,cAAc,GAA6C;IAC/D,8BAA8B;IAC9B,CAAC,mCAAmC,EAAE,mBAAmB,CAAC;IAC1D,2EAA2E;IAC3E;QACE,6EAA6E;QAC7E,cAAc;KACf;IACD,2CAA2C;IAC3C;QACE,0FAA0F;QAC1F,eAAe;KAChB;IACD,yDAAyD;IACzD,CAAC,kDAAkD,EAAE,gBAAgB,CAAC;CACvE,CAAC;AAEF,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/E,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,cAAc,EAAE,CAAC;QACpD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6FAA6F;AAC7F,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1E,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,wFAAwF;AACxF,SAAS,UAAU,CAAC,GAAc,EAAE,KAAa;IAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAc,EAAE,KAAa,EAAE,OAAgB;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,YAAY,CAAC;QACnE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gEAAgE;AAChE,SAAS,gBAAgB,CAAC,OAAgC;IACxD,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,GAAG,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC;gBAAE,SAAS;YAC9B,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,MAAM,IAAI,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAC;QACrD,KAAK,MAAM,KAAK,IAAI,aAAa;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|