@praxis.guard/auditor-cli 0.0.54 → 0.0.55
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/dist/cli/dispatch-setup.d.ts.map +1 -1
- package/dist/cli/dispatch-setup.js +7 -0
- package/dist/cli/dispatch-setup.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/setup-gateway.d.ts +11 -0
- package/dist/cli/setup-gateway.d.ts.map +1 -0
- package/dist/cli/setup-gateway.js +220 -0
- package/dist/cli/setup-gateway.js.map +1 -0
- package/dist/mcp/gateway-config.d.ts +12 -0
- package/dist/mcp/gateway-config.d.ts.map +1 -1
- package/dist/mcp/gateway-config.js +1 -1
- package/dist/mcp/gateway-config.js.map +1 -1
- package/dist/mcp/gateway.d.ts +7 -0
- package/dist/mcp/gateway.d.ts.map +1 -1
- package/dist/mcp/gateway.js +48 -4
- package/dist/mcp/gateway.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-setup.d.ts","sourceRoot":"","sources":["../../src/cli/dispatch-setup.ts"],"names":[],"mappings":"AAAA,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"dispatch-setup.d.ts","sourceRoot":"","sources":["../../src/cli/dispatch-setup.ts"],"names":[],"mappings":"AAAA,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCjG"}
|
|
@@ -29,6 +29,13 @@ export async function dispatchSetupCommand(sub, args) {
|
|
|
29
29
|
await runSetupCodex(args);
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
+
if (sub === "gateway") {
|
|
33
|
+
// Desktop-scoped (Phase 2b): rewrites claude_desktop_config.json only.
|
|
34
|
+
// Kept OUT of `setup all` on purpose.
|
|
35
|
+
const { runSetupGateway } = await import("./setup-gateway.js");
|
|
36
|
+
await runSetupGateway(args);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
32
39
|
throw new Error(`Unknown setup command: ${sub ?? "(missing)"}`);
|
|
33
40
|
}
|
|
34
41
|
//# sourceMappingURL=dispatch-setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-setup.js","sourceRoot":"","sources":["../../src/cli/dispatch-setup.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAuB,EAAE,IAAc;IAChF,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC7D,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,IAAI,WAAW,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
1
|
+
{"version":3,"file":"dispatch-setup.js","sourceRoot":"","sources":["../../src/cli/dispatch-setup.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAuB,EAAE,IAAc;IAChF,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC7D,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,uEAAuE;QACvE,sCAAsC;QACtC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC/D,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,IAAI,WAAW,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/cli/help.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AA8DA,wBAAgB,SAAS,IAAI,IAAI,CAEhC"}
|
package/dist/cli/help.js
CHANGED
|
@@ -9,6 +9,8 @@ Usage:
|
|
|
9
9
|
auditor setup doctor Validate configured agent setup, including project-local Codex
|
|
10
10
|
auditor setup codex Configure repo-local .codex MCP + hooks (--project, --dry-run)
|
|
11
11
|
auditor setup codex doctor Validate repo-local Codex setup
|
|
12
|
+
auditor setup gateway Route Claude Desktop connectors through the Praxis gateway
|
|
13
|
+
(dry-run by default; --apply to write, --revert --apply to undo)
|
|
12
14
|
auditor login Authenticate this CLI with your Praxis account (device code flow)
|
|
13
15
|
auditor logout [--revoke] Remove saved credentials (and optionally revoke token server-side)
|
|
14
16
|
auditor token create Generate a new bearer token (for Cloud Agents, CI, etc.)
|
package/dist/cli/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,SAAS,GAAG
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DjB,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type GatewayOptions = {
|
|
2
|
+
apply: boolean;
|
|
3
|
+
revert: boolean;
|
|
4
|
+
force: boolean;
|
|
5
|
+
desktopPath?: string;
|
|
6
|
+
gatewayPath?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function parseSetupGatewayOptions(args: string[]): GatewayOptions;
|
|
9
|
+
export declare function runSetupGateway(args: string[]): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=setup-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-gateway.d.ts","sourceRoot":"","sources":["../../src/cli/setup-gateway.ts"],"names":[],"mappings":"AA2BA,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAIF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAavE;AAsCD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASnE"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { copyFile, readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { claudeDesktopConfigPath } from "../adapters/claude-desktop.js";
|
|
5
|
+
import { readJson, writeJsonAtomic } from "../adapters/claude-code/config-io.js";
|
|
6
|
+
import { gatewayKeyError, resolveGatewayConfigPath } from "../mcp/gateway-config.js";
|
|
7
|
+
/**
|
|
8
|
+
* `auditor setup gateway` — migrate Claude Desktop's other MCP connectors behind
|
|
9
|
+
* the Praxis gateway (Phase 2b; flips Desktop from advisory to enforced).
|
|
10
|
+
*
|
|
11
|
+
* bare dry-run: print the plan, write nothing
|
|
12
|
+
* --apply perform the migration (timestamped backup first)
|
|
13
|
+
* --revert dry-run: show which backup would be restored
|
|
14
|
+
* --revert --apply restore the newest backup (refuses on drift unless --force)
|
|
15
|
+
*
|
|
16
|
+
* The single gateway entry (key `praxis-guard`, `auditor mcp gateway`) replaces
|
|
17
|
+
* the advisory `praxis-guard` entry; every other downstream server moves verbatim
|
|
18
|
+
* into the gateway config (~/.praxis/gateway-servers.json). Because Desktop reads
|
|
19
|
+
* its config at launch, the user must quit and relaunch for changes to take effect.
|
|
20
|
+
*/
|
|
21
|
+
const GATEWAY_KEY = "praxis-guard";
|
|
22
|
+
const AGENT_HOST = "claude-desktop";
|
|
23
|
+
const BACKUP_SUFFIX = ".praxis-bak-";
|
|
24
|
+
export function parseSetupGatewayOptions(args) {
|
|
25
|
+
const opts = { apply: false, revert: false, force: false };
|
|
26
|
+
for (let i = 0; i < args.length; i++) {
|
|
27
|
+
const arg = args[i];
|
|
28
|
+
if (arg === "--apply")
|
|
29
|
+
opts.apply = true;
|
|
30
|
+
else if (arg === "--revert")
|
|
31
|
+
opts.revert = true;
|
|
32
|
+
else if (arg === "--force")
|
|
33
|
+
opts.force = true;
|
|
34
|
+
else if (arg === "--dry-run")
|
|
35
|
+
opts.apply = false;
|
|
36
|
+
else if (arg === "--desktop-config")
|
|
37
|
+
opts.desktopPath = requireValue(args, ++i, arg);
|
|
38
|
+
else if (arg === "--gateway-config")
|
|
39
|
+
opts.gatewayPath = requireValue(args, ++i, arg);
|
|
40
|
+
else
|
|
41
|
+
throw new Error(`Unknown setup gateway option: ${arg}`);
|
|
42
|
+
}
|
|
43
|
+
return opts;
|
|
44
|
+
}
|
|
45
|
+
function requireValue(args, i, flag) {
|
|
46
|
+
const v = args[i];
|
|
47
|
+
if (!v)
|
|
48
|
+
throw new Error(`Missing value for ${flag}`);
|
|
49
|
+
return v;
|
|
50
|
+
}
|
|
51
|
+
function asServerMap(v) {
|
|
52
|
+
if (!v || typeof v !== "object" || Array.isArray(v))
|
|
53
|
+
return {};
|
|
54
|
+
return v;
|
|
55
|
+
}
|
|
56
|
+
/** A movable downstream entry is `{ command:string, args?:string[], env?:Record<string,string> }`. */
|
|
57
|
+
function validateDownstreamEntry(entry) {
|
|
58
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry))
|
|
59
|
+
return { ok: false, reason: "not an object" };
|
|
60
|
+
const e = entry;
|
|
61
|
+
if (typeof e.command !== "string" || !e.command.trim())
|
|
62
|
+
return { ok: false, reason: "missing string 'command'" };
|
|
63
|
+
if (e.args !== undefined && !(Array.isArray(e.args) && e.args.every((a) => typeof a === "string"))) {
|
|
64
|
+
return { ok: false, reason: "'args' must be an array of strings" };
|
|
65
|
+
}
|
|
66
|
+
if (e.env !== undefined && (typeof e.env !== "object" || e.env === null || Array.isArray(e.env))) {
|
|
67
|
+
return { ok: false, reason: "'env' must be an object" };
|
|
68
|
+
}
|
|
69
|
+
const value = { command: e.command };
|
|
70
|
+
if (e.args)
|
|
71
|
+
value.args = e.args;
|
|
72
|
+
if (e.env)
|
|
73
|
+
value.env = e.env;
|
|
74
|
+
return { ok: true, value };
|
|
75
|
+
}
|
|
76
|
+
function gatewayEntry(existingEnv) {
|
|
77
|
+
return { command: "auditor", args: ["mcp", "gateway"], env: { ...existingEnv, PRAXIS_AGENT_HOST: AGENT_HOST } };
|
|
78
|
+
}
|
|
79
|
+
function out(line) {
|
|
80
|
+
process.stdout.write(`${line}\n`);
|
|
81
|
+
}
|
|
82
|
+
export async function runSetupGateway(args) {
|
|
83
|
+
const opts = parseSetupGatewayOptions(args);
|
|
84
|
+
const desktopPath = opts.desktopPath?.trim() || claudeDesktopConfigPath();
|
|
85
|
+
const gatewayPath = opts.gatewayPath?.trim() || resolveGatewayConfigPath();
|
|
86
|
+
if (opts.revert) {
|
|
87
|
+
await revertMigration(desktopPath, opts);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await applyMigration(desktopPath, gatewayPath, opts);
|
|
91
|
+
}
|
|
92
|
+
function buildPlan(desktop, gateway, gatewayPath) {
|
|
93
|
+
const desktopServers = asServerMap(desktop.mcpServers);
|
|
94
|
+
const gatewayServers = asServerMap(gateway.mcpServers);
|
|
95
|
+
const toMove = [];
|
|
96
|
+
const rejected = [];
|
|
97
|
+
const collisions = [];
|
|
98
|
+
for (const [key, entry] of Object.entries(desktopServers)) {
|
|
99
|
+
if (key === GATEWAY_KEY)
|
|
100
|
+
continue; // the advisory/gateway entry; replaced below
|
|
101
|
+
const keyErr = gatewayKeyError(key, gatewayPath);
|
|
102
|
+
if (keyErr) {
|
|
103
|
+
rejected.push({ key, reason: keyErr });
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const v = validateDownstreamEntry(entry);
|
|
107
|
+
if (!v.ok) {
|
|
108
|
+
rejected.push({ key, reason: v.reason });
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (key in gatewayServers) {
|
|
112
|
+
collisions.push(key);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
toMove.push({ key, entry: v.value });
|
|
116
|
+
}
|
|
117
|
+
// New Desktop: keep entries we could not move (rejected/collision stay direct),
|
|
118
|
+
// drop the moved ones, and set the single gateway entry.
|
|
119
|
+
const movedKeys = new Set(toMove.map((m) => m.key));
|
|
120
|
+
const newDesktopServers = {};
|
|
121
|
+
for (const [key, entry] of Object.entries(desktopServers)) {
|
|
122
|
+
if (key === GATEWAY_KEY || movedKeys.has(key))
|
|
123
|
+
continue;
|
|
124
|
+
newDesktopServers[key] = entry;
|
|
125
|
+
}
|
|
126
|
+
const prevGwEnv = desktopServers[GATEWAY_KEY] && typeof desktopServers[GATEWAY_KEY].env === "object" && desktopServers[GATEWAY_KEY].env
|
|
127
|
+
? desktopServers[GATEWAY_KEY].env
|
|
128
|
+
: {};
|
|
129
|
+
newDesktopServers[GATEWAY_KEY] = gatewayEntry(prevGwEnv);
|
|
130
|
+
const newDesktop = { ...desktop, mcpServers: newDesktopServers };
|
|
131
|
+
const newGatewayServers = { ...gatewayServers };
|
|
132
|
+
for (const m of toMove)
|
|
133
|
+
newGatewayServers[m.key] = m.entry;
|
|
134
|
+
const newGateway = { ...gateway, mcpServers: newGatewayServers };
|
|
135
|
+
const changed = JSON.stringify(desktop) !== JSON.stringify(newDesktop);
|
|
136
|
+
return { toMove, rejected, collisions, newDesktop, newGateway, changed };
|
|
137
|
+
}
|
|
138
|
+
function printPlan(plan, desktopPath, gatewayPath) {
|
|
139
|
+
out(`Desktop config: ${desktopPath}`);
|
|
140
|
+
out(`Gateway config: ${gatewayPath}`);
|
|
141
|
+
if (plan.toMove.length === 0)
|
|
142
|
+
out(" servers to migrate: none");
|
|
143
|
+
else
|
|
144
|
+
out(` servers to migrate -> gateway: ${plan.toMove.map((m) => m.key).join(", ")}`);
|
|
145
|
+
out(` gateway entry: ${GATEWAY_KEY} -> auditor mcp gateway`);
|
|
146
|
+
for (const r of plan.rejected)
|
|
147
|
+
out(` LEFT DIRECT (not gated): ${r.key} — ${r.reason}`);
|
|
148
|
+
for (const c of plan.collisions)
|
|
149
|
+
out(` LEFT DIRECT (already in gateway config): ${c}`);
|
|
150
|
+
}
|
|
151
|
+
async function applyMigration(desktopPath, gatewayPath, opts) {
|
|
152
|
+
const existing = await readJson(desktopPath); // throws on malformed JSON -> abort, no write
|
|
153
|
+
const desktop = existing ?? {};
|
|
154
|
+
const gateway = (await readJson(gatewayPath)) ?? {};
|
|
155
|
+
const plan = buildPlan(desktop, gateway, gatewayPath);
|
|
156
|
+
printPlan(plan, desktopPath, gatewayPath);
|
|
157
|
+
if (!plan.changed) {
|
|
158
|
+
out("Already routed through the gateway; nothing to migrate.");
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (!opts.apply) {
|
|
162
|
+
out("Dry run: no files written. Re-run with --apply to migrate.");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (existing) {
|
|
166
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
167
|
+
const backup = `${desktopPath}${BACKUP_SUFFIX}${stamp}`;
|
|
168
|
+
await copyFile(desktopPath, backup);
|
|
169
|
+
out(`Backed up Desktop config to ${backup}`);
|
|
170
|
+
}
|
|
171
|
+
await writeJsonAtomic(gatewayPath, plan.newGateway);
|
|
172
|
+
await writeJsonAtomic(desktopPath, plan.newDesktop);
|
|
173
|
+
out("Migrated. Quit and relaunch Claude Desktop for changes to take effect.");
|
|
174
|
+
}
|
|
175
|
+
/** Migrated shape = the only mcpServers entry is the gateway entry. Anything else = drift. */
|
|
176
|
+
function isMigratedShape(desktop) {
|
|
177
|
+
const servers = asServerMap(desktop?.mcpServers);
|
|
178
|
+
const keys = Object.keys(servers);
|
|
179
|
+
if (keys.length !== 1 || keys[0] !== GATEWAY_KEY)
|
|
180
|
+
return false;
|
|
181
|
+
const args = servers[GATEWAY_KEY].args;
|
|
182
|
+
return Array.isArray(args) && args.length === 2 && args[0] === "mcp" && args[1] === "gateway";
|
|
183
|
+
}
|
|
184
|
+
async function newestBackup(desktopPath) {
|
|
185
|
+
const dir = path.dirname(desktopPath);
|
|
186
|
+
const base = path.basename(desktopPath);
|
|
187
|
+
let names = [];
|
|
188
|
+
try {
|
|
189
|
+
names = await readdir(dir);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
const baks = names.filter((n) => n.startsWith(`${base}${BACKUP_SUFFIX}`)).sort();
|
|
195
|
+
// ISO-8601 stamps sort lexically by time, so the last is the newest.
|
|
196
|
+
return baks.length ? path.join(dir, baks[baks.length - 1]) : null;
|
|
197
|
+
}
|
|
198
|
+
async function revertMigration(desktopPath, opts) {
|
|
199
|
+
const backup = await newestBackup(desktopPath);
|
|
200
|
+
if (!backup) {
|
|
201
|
+
process.stderr.write(`No Praxis backup found beside ${desktopPath}; nothing to revert.\n`);
|
|
202
|
+
process.exitCode = 1;
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const current = await readJson(desktopPath).catch(() => null);
|
|
206
|
+
if (!opts.force && !isMigratedShape(current)) {
|
|
207
|
+
process.stderr.write(`Live Desktop config changed since migration (drift detected): ${desktopPath}\n` +
|
|
208
|
+
`Restoring would discard those changes. Re-run with --force to overwrite anyway.\n`);
|
|
209
|
+
process.exitCode = 1;
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
out(`Would restore ${desktopPath} from ${backup}`);
|
|
213
|
+
if (!opts.apply) {
|
|
214
|
+
out("Dry run: no files written. Re-run with --revert --apply to restore.");
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
await copyFile(backup, desktopPath);
|
|
218
|
+
out(`Restored ${desktopPath}. Quit and relaunch Claude Desktop for changes to take effect.`);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=setup-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-gateway.js","sourceRoot":"","sources":["../../src/cli/setup-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,18 @@ export type GatewayConfigResult = {
|
|
|
15
15
|
/** Non-fatal problems. Surfaced to stderr; never thrown into the request loop. */
|
|
16
16
|
errors: string[];
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Validate a gateway config key (which doubles as the exposed-tool namespace
|
|
20
|
+
* prefix AND the policy identity). Returns a user-facing "skip" reason, or null
|
|
21
|
+
* when the key is usable. Rejections (never silent rewrites):
|
|
22
|
+
* - must match `^[a-zA-Z0-9_-]+$` (valid MCP tool-name chars).
|
|
23
|
+
* - must not contain `__` (the `${id}__${tool}` separator; would make the
|
|
24
|
+
* known-prefix parse ambiguous, e.g. ids "a" and "a__b").
|
|
25
|
+
* - must not be `"stdio"` (the hook-path fallback server id, before-mcp-argv.ts):
|
|
26
|
+
* a key of "stdio" could impersonate that fallback in the ticket store
|
|
27
|
+
* (defense-in-depth alongside the dedicated gateway storage root, decision D9).
|
|
28
|
+
*/
|
|
29
|
+
export declare function gatewayKeyError(key: string, cfgPath: string): string | null;
|
|
18
30
|
export declare function resolveGatewayConfigPath(): string;
|
|
19
31
|
/**
|
|
20
32
|
* Dedicated guard storage root for the gateway process (decision D9).
|
|
@@ -1 +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;
|
|
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;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW3E;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAIlD;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmD3F;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"}
|
|
@@ -33,7 +33,7 @@ const SERVER_ID_RE = /^[a-zA-Z0-9_-]+$/;
|
|
|
33
33
|
* a key of "stdio" could impersonate that fallback in the ticket store
|
|
34
34
|
* (defense-in-depth alongside the dedicated gateway storage root, decision D9).
|
|
35
35
|
*/
|
|
36
|
-
function gatewayKeyError(key, cfgPath) {
|
|
36
|
+
export function gatewayKeyError(key, cfgPath) {
|
|
37
37
|
if (!SERVER_ID_RE.test(key)) {
|
|
38
38
|
return `Skipping server "${key}": name must match [a-zA-Z0-9_-]. Rename it in ${cfgPath}.`;
|
|
39
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-config.js","sourceRoot":"","sources":["../../src/mcp/gateway-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACjD,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC;CACtD,CAAC,CAAC;AAqBH;;;;;GAKG;AACH,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAExC;;;;;;;;;;GAUG;AACH,
|
|
1
|
+
{"version":3,"file":"gateway-config.js","sourceRoot":"","sources":["../../src/mcp/gateway-config.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/gateway.d.ts
CHANGED
|
@@ -11,6 +11,13 @@ export interface GatewayConnection {
|
|
|
11
11
|
callTool(tool: string, args: Record<string, unknown>): Promise<CallToolResult>;
|
|
12
12
|
/** Re-establish the underlying transport after a failure. Returns false if it cannot. */
|
|
13
13
|
reconnect(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Register a callback fired AFTER this connection refreshes its tool slice in
|
|
16
|
+
* response to a downstream `tools/list_changed` (or a reconnect-driven refresh).
|
|
17
|
+
* `createGatewayServer` uses it to re-emit the gateway's own `list_changed`
|
|
18
|
+
* upstream. Optional so in-process test fakes need not implement it.
|
|
19
|
+
*/
|
|
20
|
+
onToolsChanged?(listener: () => void): void;
|
|
14
21
|
}
|
|
15
22
|
/**
|
|
16
23
|
* Build the low-level MCP `Server` that fronts the given downstream connections.
|
|
@@ -1 +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,
|
|
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,EAIL,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,oCAAoC,CAAC;AAuB5C;;;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;IAC9B;;;;;OAKG;IACH,cAAc,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC7C;AAwHD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAyG5E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC9E"}
|
package/dist/mcp/gateway.js
CHANGED
|
@@ -2,7 +2,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
|
2
2
|
import { StdioClientTransport, getDefaultEnvironment, } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
3
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
-
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ToolListChangedNotificationSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
6
6
|
import { mkdirSync } from "node:fs";
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import { AUDITOR_CLI_VERSION } from "../runtime/version.js";
|
|
@@ -26,6 +26,25 @@ function withTimeout(p, ms, label) {
|
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Register the downstream `tools/list_changed` handler on `client` (the CURRENT
|
|
31
|
+
* one; call again after a reconnect with the fresh client). On notification:
|
|
32
|
+
* re-list (bounded), swap the connection's slice, then fire `getListener` so the
|
|
33
|
+
* gateway re-emits list_changed upstream. A failed refresh keeps the prior slice
|
|
34
|
+
* (no crash); the next call's reconnect path heals the connection.
|
|
35
|
+
*/
|
|
36
|
+
function attachListChangedHandler(client, conn, getListener) {
|
|
37
|
+
client.setNotificationHandler(ToolListChangedNotificationSchema, async () => {
|
|
38
|
+
try {
|
|
39
|
+
const re = await withTimeout(client.listTools(), CONNECT_TIMEOUT_MS, `listTools ${conn.id}`);
|
|
40
|
+
conn.tools = re.tools;
|
|
41
|
+
getListener()?.();
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
logErr(`tools/list_changed refresh for "${conn.id}" failed: ${truncErr(e)}`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
29
48
|
/** Real stdio-backed connection to a downstream MCP server. */
|
|
30
49
|
async function connectStdioServer(server) {
|
|
31
50
|
const spawn = () => new StdioClientTransport({
|
|
@@ -34,11 +53,17 @@ async function connectStdioServer(server) {
|
|
|
34
53
|
env: server.env ? { ...getDefaultEnvironment(), ...server.env } : undefined,
|
|
35
54
|
});
|
|
36
55
|
let client = new Client({ name: `praxis-gateway-client-${server.id}`, version: AUDITOR_CLI_VERSION });
|
|
56
|
+
// Set when createGatewayServer wires this connection (re-emits list_changed upstream).
|
|
57
|
+
let toolsChangedListener = null;
|
|
58
|
+
const getListener = () => toolsChangedListener;
|
|
37
59
|
await withTimeout(client.connect(spawn()), CONNECT_TIMEOUT_MS, `connect ${server.id}`);
|
|
38
60
|
const listed = await withTimeout(client.listTools(), CONNECT_TIMEOUT_MS, `listTools ${server.id}`);
|
|
39
61
|
const conn = {
|
|
40
62
|
id: server.id,
|
|
41
63
|
tools: listed.tools,
|
|
64
|
+
onToolsChanged(listener) {
|
|
65
|
+
toolsChangedListener = listener;
|
|
66
|
+
},
|
|
42
67
|
async callTool(tool, args) {
|
|
43
68
|
return (await client.callTool({ name: tool, arguments: args }));
|
|
44
69
|
},
|
|
@@ -54,6 +79,10 @@ async function connectStdioServer(server) {
|
|
|
54
79
|
await withTimeout(client.connect(spawn()), CONNECT_TIMEOUT_MS, `reconnect ${server.id}`);
|
|
55
80
|
const re = await withTimeout(client.listTools(), CONNECT_TIMEOUT_MS, `listTools ${server.id}`);
|
|
56
81
|
conn.tools = re.tools;
|
|
82
|
+
// Fresh client needs its own handler; the tool set may have changed across
|
|
83
|
+
// the gap, so propagate the refreshed slice upstream.
|
|
84
|
+
attachListChangedHandler(client, conn, getListener);
|
|
85
|
+
toolsChangedListener?.();
|
|
57
86
|
return true;
|
|
58
87
|
}
|
|
59
88
|
catch (e) {
|
|
@@ -62,6 +91,7 @@ async function connectStdioServer(server) {
|
|
|
62
91
|
}
|
|
63
92
|
},
|
|
64
93
|
};
|
|
94
|
+
attachListChangedHandler(client, conn, getListener);
|
|
65
95
|
return conn;
|
|
66
96
|
}
|
|
67
97
|
function textResult(text, isError) {
|
|
@@ -90,7 +120,10 @@ function blockedResult(serverId, tool, d) {
|
|
|
90
120
|
export function createGatewayServer(connections) {
|
|
91
121
|
const byId = new Map(connections.map((c) => [c.id, c]));
|
|
92
122
|
const ids = connections.map((c) => c.id);
|
|
93
|
-
const server = new Server({ name: "praxis-guard-gateway", version: AUDITOR_CLI_VERSION },
|
|
123
|
+
const server = new Server({ name: "praxis-guard-gateway", version: AUDITOR_CLI_VERSION },
|
|
124
|
+
// listChanged: true tells the host (Desktop) to listen for tools/list_changed
|
|
125
|
+
// so downstream tools that appear after login (auth-gated) become visible.
|
|
126
|
+
{ capabilities: { tools: { listChanged: true } } });
|
|
94
127
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
95
128
|
const tools = [];
|
|
96
129
|
for (const conn of connections) {
|
|
@@ -100,6 +133,13 @@ export function createGatewayServer(connections) {
|
|
|
100
133
|
}
|
|
101
134
|
return { tools };
|
|
102
135
|
});
|
|
136
|
+
// When any downstream refreshes its tool slice, re-emit the gateway's own
|
|
137
|
+
// list_changed upstream so the host re-fetches the combined namespaced set.
|
|
138
|
+
for (const conn of connections) {
|
|
139
|
+
conn.onToolsChanged?.(() => {
|
|
140
|
+
server.sendToolListChanged().catch((e) => logErr(`sendToolListChanged failed: ${truncErr(e)}`));
|
|
141
|
+
});
|
|
142
|
+
}
|
|
103
143
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
104
144
|
// Fail closed: any unexpected throw in parsing/gating (e.g. a corrupt policy
|
|
105
145
|
// file making evaluateGatewayCall reject) blocks the call rather than letting
|
|
@@ -156,7 +196,10 @@ export function createGatewayServer(connections) {
|
|
|
156
196
|
}
|
|
157
197
|
catch (e) {
|
|
158
198
|
logErr(`gating error for "${request.params?.name}": ${truncErr(e)}`);
|
|
159
|
-
|
|
199
|
+
// Blast-radius escape hatch: the gateway fronts every Desktop connector, so a
|
|
200
|
+
// fail-closed bug blocks all tools. Name the recovery path in the result.
|
|
201
|
+
return textResult("Praxis gateway: guard evaluation failed; blocking this call (fail-closed). " +
|
|
202
|
+
"To restore direct tools: run `auditor setup gateway --revert --apply`, then relaunch Claude Desktop.", true);
|
|
160
203
|
}
|
|
161
204
|
});
|
|
162
205
|
return server;
|
|
@@ -194,7 +237,8 @@ export async function runMcpGateway(explicitConfigPath) {
|
|
|
194
237
|
}
|
|
195
238
|
});
|
|
196
239
|
if (connections.length === 0) {
|
|
197
|
-
logErr("no downstream servers connected; gateway will expose no tools."
|
|
240
|
+
logErr("no downstream servers connected; gateway will expose no tools. " +
|
|
241
|
+
"To restore direct connectors: run `auditor setup gateway --revert --apply`, then relaunch Claude Desktop.");
|
|
198
242
|
}
|
|
199
243
|
const server = createGatewayServer(connections);
|
|
200
244
|
await server.connect(new StdioServerTransport());
|
package/dist/mcp/gateway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/mcp/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/mcp/gateway.ts"],"names":[],"mappings":"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"}
|