@praxis.guard/auditor-cli 0.0.1

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.
Files changed (131) hide show
  1. package/README.md +46 -0
  2. package/dist/audit/jsonl.d.ts +7 -0
  3. package/dist/audit/jsonl.d.ts.map +1 -0
  4. package/dist/audit/jsonl.js +16 -0
  5. package/dist/audit/jsonl.js.map +1 -0
  6. package/dist/bridge/shell-approval-bridge.d.ts +28 -0
  7. package/dist/bridge/shell-approval-bridge.d.ts.map +1 -0
  8. package/dist/bridge/shell-approval-bridge.js +63 -0
  9. package/dist/bridge/shell-approval-bridge.js.map +1 -0
  10. package/dist/cli/callable-fetch.d.ts +8 -0
  11. package/dist/cli/callable-fetch.d.ts.map +1 -0
  12. package/dist/cli/callable-fetch.js +30 -0
  13. package/dist/cli/callable-fetch.js.map +1 -0
  14. package/dist/cli/credentials.d.ts +10 -0
  15. package/dist/cli/credentials.d.ts.map +1 -0
  16. package/dist/cli/credentials.js +53 -0
  17. package/dist/cli/credentials.js.map +1 -0
  18. package/dist/cli/cursor-config.d.ts +16 -0
  19. package/dist/cli/cursor-config.d.ts.map +1 -0
  20. package/dist/cli/cursor-config.js +153 -0
  21. package/dist/cli/cursor-config.js.map +1 -0
  22. package/dist/cli/doctor.d.ts +2 -0
  23. package/dist/cli/doctor.d.ts.map +1 -0
  24. package/dist/cli/doctor.js +83 -0
  25. package/dist/cli/doctor.js.map +1 -0
  26. package/dist/cli/firebase-targets.d.ts +7 -0
  27. package/dist/cli/firebase-targets.d.ts.map +1 -0
  28. package/dist/cli/firebase-targets.js +49 -0
  29. package/dist/cli/firebase-targets.js.map +1 -0
  30. package/dist/cli/function-url.d.ts +8 -0
  31. package/dist/cli/function-url.d.ts.map +1 -0
  32. package/dist/cli/function-url.js +20 -0
  33. package/dist/cli/function-url.js.map +1 -0
  34. package/dist/cli/http-fetch.d.ts +7 -0
  35. package/dist/cli/http-fetch.d.ts.map +1 -0
  36. package/dist/cli/http-fetch.js +21 -0
  37. package/dist/cli/http-fetch.js.map +1 -0
  38. package/dist/cli/install-id.d.ts +6 -0
  39. package/dist/cli/install-id.d.ts.map +1 -0
  40. package/dist/cli/install-id.js +30 -0
  41. package/dist/cli/install-id.js.map +1 -0
  42. package/dist/cli/login.d.ts +2 -0
  43. package/dist/cli/login.d.ts.map +1 -0
  44. package/dist/cli/login.js +76 -0
  45. package/dist/cli/login.js.map +1 -0
  46. package/dist/cli/logout.d.ts +2 -0
  47. package/dist/cli/logout.d.ts.map +1 -0
  48. package/dist/cli/logout.js +51 -0
  49. package/dist/cli/logout.js.map +1 -0
  50. package/dist/cli/main.d.ts +2 -0
  51. package/dist/cli/main.d.ts.map +1 -0
  52. package/dist/cli/main.js +158 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/policies-callable-url.d.ts +24 -0
  55. package/dist/cli/policies-callable-url.d.ts.map +1 -0
  56. package/dist/cli/policies-callable-url.js +66 -0
  57. package/dist/cli/policies-callable-url.js.map +1 -0
  58. package/dist/cli/policies-meta.d.ts +6 -0
  59. package/dist/cli/policies-meta.d.ts.map +1 -0
  60. package/dist/cli/policies-meta.js +18 -0
  61. package/dist/cli/policies-meta.js.map +1 -0
  62. package/dist/cli/policies-sync.d.ts +2 -0
  63. package/dist/cli/policies-sync.d.ts.map +1 -0
  64. package/dist/cli/policies-sync.js +40 -0
  65. package/dist/cli/policies-sync.js.map +1 -0
  66. package/dist/cli/setup-all.d.ts +9 -0
  67. package/dist/cli/setup-all.d.ts.map +1 -0
  68. package/dist/cli/setup-all.js +43 -0
  69. package/dist/cli/setup-all.js.map +1 -0
  70. package/dist/cli/setup-doctor.d.ts +8 -0
  71. package/dist/cli/setup-doctor.d.ts.map +1 -0
  72. package/dist/cli/setup-doctor.js +42 -0
  73. package/dist/cli/setup-doctor.js.map +1 -0
  74. package/dist/cli/setup-hook.d.ts +8 -0
  75. package/dist/cli/setup-hook.d.ts.map +1 -0
  76. package/dist/cli/setup-hook.js +30 -0
  77. package/dist/cli/setup-hook.js.map +1 -0
  78. package/dist/cli/setup-mcp.d.ts +8 -0
  79. package/dist/cli/setup-mcp.d.ts.map +1 -0
  80. package/dist/cli/setup-mcp.js +30 -0
  81. package/dist/cli/setup-mcp.js.map +1 -0
  82. package/dist/cli/touch-last-seen.d.ts +6 -0
  83. package/dist/cli/touch-last-seen.d.ts.map +1 -0
  84. package/dist/cli/touch-last-seen.js +46 -0
  85. package/dist/cli/touch-last-seen.js.map +1 -0
  86. package/dist/cli/version.d.ts +2 -0
  87. package/dist/cli/version.d.ts.map +1 -0
  88. package/dist/cli/version.js +19 -0
  89. package/dist/cli/version.js.map +1 -0
  90. package/dist/cli/whoami.d.ts +2 -0
  91. package/dist/cli/whoami.d.ts.map +1 -0
  92. package/dist/cli/whoami.js +36 -0
  93. package/dist/cli/whoami.js.map +1 -0
  94. package/dist/cli.d.ts +3 -0
  95. package/dist/cli.d.ts.map +1 -0
  96. package/dist/cli.js +19 -0
  97. package/dist/cli.js.map +1 -0
  98. package/dist/hooks/run-before-shell.d.ts +16 -0
  99. package/dist/hooks/run-before-shell.d.ts.map +1 -0
  100. package/dist/hooks/run-before-shell.js +132 -0
  101. package/dist/hooks/run-before-shell.js.map +1 -0
  102. package/dist/index.d.ts +7 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +6 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/mcp/server.d.ts +3 -0
  107. package/dist/mcp/server.d.ts.map +1 -0
  108. package/dist/mcp/server.js +252 -0
  109. package/dist/mcp/server.js.map +1 -0
  110. package/dist/policies.v1.json +502 -0
  111. package/dist/policy/index.d.ts +47 -0
  112. package/dist/policy/index.d.ts.map +1 -0
  113. package/dist/policy/index.js +170 -0
  114. package/dist/policy/index.js.map +1 -0
  115. package/dist/shell/evaluate.d.ts +37 -0
  116. package/dist/shell/evaluate.d.ts.map +1 -0
  117. package/dist/shell/evaluate.js +81 -0
  118. package/dist/shell/evaluate.js.map +1 -0
  119. package/dist/shell/governed-tools.d.ts +3 -0
  120. package/dist/shell/governed-tools.d.ts.map +1 -0
  121. package/dist/shell/governed-tools.js +3 -0
  122. package/dist/shell/governed-tools.js.map +1 -0
  123. package/dist/shell/parse.d.ts +2 -0
  124. package/dist/shell/parse.d.ts.map +1 -0
  125. package/dist/shell/parse.js +7 -0
  126. package/dist/shell/parse.js.map +1 -0
  127. package/dist/telemetry/guard-events.d.ts +9 -0
  128. package/dist/telemetry/guard-events.d.ts.map +1 -0
  129. package/dist/telemetry/guard-events.js +86 -0
  130. package/dist/telemetry/guard-events.js.map +1 -0
  131. package/package.json +40 -0
@@ -0,0 +1,132 @@
1
+ import { classifyArgv, loadPoliciesV1, readPoliciesV1Revision } from "../policy/index.js";
2
+ import { appendAuditJsonl } from "../audit/jsonl.js";
3
+ import { getInstallId } from "../cli/install-id.js";
4
+ import { DEFAULT_GOVERNED_SHELL_TOOLS } from "../shell/governed-tools.js";
5
+ import { parseCommandToArgv } from "../shell/parse.js";
6
+ import { tryConsumeShellApprovalBridge } from "../bridge/shell-approval-bridge.js";
7
+ import { sendGuardEvent } from "../telemetry/guard-events.js";
8
+ function tierToPermission(tier) {
9
+ if (tier === "READ")
10
+ return "allow";
11
+ return "deny";
12
+ }
13
+ async function readStdinJson() {
14
+ return await new Promise((resolve, reject) => {
15
+ let data = "";
16
+ process.stdin.setEncoding("utf8");
17
+ process.stdin.on("data", (chunk) => (data += chunk));
18
+ process.stdin.on("end", () => {
19
+ try {
20
+ resolve(JSON.parse(data));
21
+ }
22
+ catch (e) {
23
+ reject(e);
24
+ }
25
+ });
26
+ });
27
+ }
28
+ async function tryAppendAuditEvent(evt, auditLogRoot) {
29
+ try {
30
+ await appendAuditJsonl(evt, auditLogRoot);
31
+ }
32
+ catch (e) {
33
+ const msg = e instanceof Error ? e.message : String(e);
34
+ process.stderr.write(`[auditor] audit log append failed: ${msg}\n`);
35
+ }
36
+ }
37
+ /**
38
+ * Cursor `beforeShellExecution` contract: read one JSON object from stdin, write one JSON object to stdout.
39
+ */
40
+ export async function runBeforeShellHookFromStdin() {
41
+ const payload = await readStdinJson();
42
+ const argv = parseCommandToArgv(payload.command);
43
+ const rawMetacharacters = /(;|&&|\|\||\||`|>|<|\$\()/.test(payload.command);
44
+ const tool = argv[0];
45
+ if (!tool || !DEFAULT_GOVERNED_SHELL_TOOLS.includes(tool)) {
46
+ const response = { permission: "allow" };
47
+ process.stdout.write(JSON.stringify(response, null, 2));
48
+ return;
49
+ }
50
+ const policy = await loadPoliciesV1();
51
+ const policyRevision = await readPoliciesV1Revision();
52
+ const { classification, flags } = classifyArgv(policy, argv);
53
+ let tier = classification.tier;
54
+ const reasons = [];
55
+ if (!classification.matched)
56
+ reasons.push("unknown_command(default_deny)");
57
+ if (flags.metacharacters || rawMetacharacters)
58
+ reasons.push("metacharacters");
59
+ if (flags.dangerous_flags)
60
+ reasons.push("dangerous_flags");
61
+ if ((flags.metacharacters || rawMetacharacters) && tier === "READ")
62
+ tier = "MUTATE";
63
+ if (flags.dangerous_flags)
64
+ tier = "DESTRUCTIVE";
65
+ let permission = tierToPermission(tier);
66
+ let bridgeConsumed = false;
67
+ if (permission === "deny" && tier === "MUTATE") {
68
+ bridgeConsumed = await tryConsumeShellApprovalBridge(argv, { cwd: payload.cwd });
69
+ if (bridgeConsumed) {
70
+ permission = "allow";
71
+ }
72
+ }
73
+ const response = permission === "allow"
74
+ ? {
75
+ permission,
76
+ ...(bridgeConsumed
77
+ ? {
78
+ agent_message: "Allowed via shell approval bridge (MCP guard token redeemed for this argv; one-shot consumed).",
79
+ }
80
+ : {}),
81
+ }
82
+ : {
83
+ permission,
84
+ user_message: `Shell command blocked by guard (tier=${tier}).`,
85
+ agent_message: `Blocked by guard. tier=${tier} reasons=${reasons.join(",") || "policy"}. argv=${JSON.stringify(argv)}`,
86
+ };
87
+ const auditLogRoot = typeof payload.cwd === "string" && payload.cwd.trim() ? payload.cwd.trim() : undefined;
88
+ await tryAppendAuditEvent({
89
+ ts: new Date().toISOString(),
90
+ hook: "beforeShellExecution",
91
+ cwd: payload.cwd,
92
+ command: payload.command,
93
+ argv,
94
+ classification,
95
+ flags,
96
+ tier,
97
+ permission,
98
+ bridgeConsumed,
99
+ reasons,
100
+ }, auditLogRoot);
101
+ // Write stdout immediately so Cursor gets the response without waiting for network.
102
+ process.stdout.write(JSON.stringify(response, null, 2));
103
+ // Upload event to backend (keep process alive until done).
104
+ const status = permission === "allow" ? "passed" : "blocked";
105
+ await sendGuardEvent({
106
+ ts: new Date().toISOString(),
107
+ status,
108
+ tool: "auditor-hook",
109
+ command_path: argv[0] ?? null,
110
+ verb: argv[1] ?? null,
111
+ resource: argv.length > 2 ? argv.slice(2).join(" ") : null,
112
+ reason: reasons[0] ?? null,
113
+ cmd: payload.command,
114
+ tier,
115
+ decision: permission === "allow" ? "allow" : "block",
116
+ installId: getInstallId(),
117
+ kind: "shell",
118
+ ...(policyRevision !== null ? { policy_revision: policyRevision } : {}),
119
+ meta: {
120
+ hook: "beforeShellExecution",
121
+ bridgeConsumed,
122
+ },
123
+ });
124
+ }
125
+ export function failClosedHookErrorResponse(err) {
126
+ return {
127
+ permission: "deny",
128
+ user_message: "Guard hook crashed; blocking shell command (failClosed).",
129
+ agent_message: `Guard hook crashed: ${String(err)}`,
130
+ };
131
+ }
132
+ //# sourceMappingURL=run-before-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-before-shell.js","sourceRoot":"","sources":["../../src/hooks/run-before-shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { loadPoliciesV1 } from "./policy/index.js";
2
+ export type { PoliciesV1, Tier, Classification } from "./policy/index.js";
3
+ export { appendAuditJsonl } from "./audit/jsonl.js";
4
+ export { DEFAULT_SHELL_BRIDGE_TTL_MS, recordShellApprovalBridge, shellArgvApprovalId, shellBridgeDir, shouldRecordShellBridge, tryConsumeShellApprovalBridge, } from "./bridge/shell-approval-bridge.js";
5
+ export { DEFAULT_GOVERNED_SHELL_TOOLS, evaluateArgv, evaluateShellProposal, gateShellCommand, parseCommandToArgv, type GuardEvaluation, type GuardReason, type ShellGateDecision, } from "./shell/evaluate.js";
6
+ export { failClosedHookErrorResponse, runBeforeShellHookFromStdin, type BeforeShellExecutionPayload, type BeforeShellExecutionResponse, } from "./hooks/run-before-shell.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GAClC,MAAM,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { loadPoliciesV1 } from "./policy/index.js";
2
+ export { appendAuditJsonl } from "./audit/jsonl.js";
3
+ export { DEFAULT_SHELL_BRIDGE_TTL_MS, recordShellApprovalBridge, shellArgvApprovalId, shellBridgeDir, shouldRecordShellBridge, tryConsumeShellApprovalBridge, } from "./bridge/shell-approval-bridge.js";
4
+ export { DEFAULT_GOVERNED_SHELL_TOOLS, evaluateArgv, evaluateShellProposal, gateShellCommand, parseCommandToArgv, } from "./shell/evaluate.js";
5
+ export { failClosedHookErrorResponse, runBeforeShellHookFromStdin, } from "./hooks/run-before-shell.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GAInB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAG5B,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Start the Praxis `guard` MCP server on stdio (blocks until disconnect). */
2
+ export declare function runMcpStdioServer(): Promise<void>;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAmJA,8EAA8E;AAC9E,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqJvD"}
@@ -0,0 +1,252 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { z } from "zod";
4
+ import { v4 as uuidv4 } from "uuid";
5
+ import { loadPoliciesV1, readPoliciesV1Revision } from "../policy/index.js";
6
+ import { resolveGuardToken } from "../cli/credentials.js";
7
+ import { getInstallId } from "../cli/install-id.js";
8
+ import { recordShellApprovalBridge, shouldRecordShellBridge } from "../bridge/shell-approval-bridge.js";
9
+ import { evaluateArgv, evaluateShellProposal, parseCommandToArgv, } from "../shell/evaluate.js";
10
+ import { sendGuardEvent } from "../telemetry/guard-events.js";
11
+ const GuardModeSchema = z.enum(["shadow", "enforce"]);
12
+ const ProposalKindSchema = z.enum(["shell", "mcp"]);
13
+ const GuardInputSchema = z.object({
14
+ mode: GuardModeSchema,
15
+ proposal: z.object({
16
+ kind: ProposalKindSchema,
17
+ argv: z.array(z.string()).min(1),
18
+ cwd: z.string().optional(),
19
+ raw_command: z.string().optional(),
20
+ }),
21
+ context: z
22
+ .object({
23
+ provider: z.string().optional(),
24
+ session_id: z.string().optional(),
25
+ trace_id: z.string().optional(),
26
+ agent_id: z.string().optional(),
27
+ user_id: z.string().optional(),
28
+ environment: z.string().optional(),
29
+ approval: z.object({ token: z.string().nullable().optional() }).optional(),
30
+ })
31
+ .optional(),
32
+ });
33
+ function tierToDecision(tier) {
34
+ if (tier === "READ")
35
+ return "allow";
36
+ if (tier === "MUTATE")
37
+ return "require_approval";
38
+ return "block";
39
+ }
40
+ function argvFingerprint(argv) {
41
+ return JSON.stringify(argv);
42
+ }
43
+ /** One-time tokens from prior `require_approval` (same Node process). Not persisted. */
44
+ const pendingApprovalByToken = new Map();
45
+ const MCP_SERVER_VERSION = "0.0.1";
46
+ function pruneExpiredApprovals() {
47
+ const now = Date.now();
48
+ for (const [token, row] of pendingApprovalByToken) {
49
+ if (now > row.expiresAt)
50
+ pendingApprovalByToken.delete(token);
51
+ }
52
+ }
53
+ import { prodFunctionUrl } from "../cli/function-url.js";
54
+ const DEFAULT_HEARTBEAT_URL = prodFunctionUrl("guardHeartbeat");
55
+ const HEARTBEAT_BASE_INTERVAL_MS = 5 * 60 * 1000;
56
+ const HEARTBEAT_MAX_INTERVAL_MS = 30 * 60 * 1000;
57
+ let heartbeatTimer = null;
58
+ let consecutiveIdleHeartbeats = 0;
59
+ function getNextHeartbeatInterval() {
60
+ if (consecutiveIdleHeartbeats < 3)
61
+ return HEARTBEAT_BASE_INTERVAL_MS;
62
+ return Math.min(HEARTBEAT_BASE_INTERVAL_MS * Math.pow(1.5, consecutiveIdleHeartbeats - 2), HEARTBEAT_MAX_INTERVAL_MS);
63
+ }
64
+ function scheduleNextHeartbeat() {
65
+ if (heartbeatTimer)
66
+ clearTimeout(heartbeatTimer);
67
+ heartbeatTimer = setTimeout(async () => {
68
+ consecutiveIdleHeartbeats++;
69
+ await sendGuardHeartbeat();
70
+ scheduleNextHeartbeat();
71
+ }, getNextHeartbeatInterval());
72
+ }
73
+ function resetHeartbeatIdle() {
74
+ consecutiveIdleHeartbeats = 0;
75
+ }
76
+ async function sendGuardHeartbeat() {
77
+ const heartbeatUrl = process.env.PRAXIS_GUARD_HEARTBEAT_URL || DEFAULT_HEARTBEAT_URL;
78
+ const token = resolveGuardToken();
79
+ if (!token)
80
+ return;
81
+ const payload = {
82
+ installId: getInstallId(),
83
+ kind: "auditor-mcp",
84
+ version: MCP_SERVER_VERSION,
85
+ status: "running",
86
+ client: {
87
+ os: process.platform,
88
+ arch: process.arch,
89
+ node: process.version,
90
+ },
91
+ };
92
+ try {
93
+ const res = await fetch(heartbeatUrl, {
94
+ method: "POST",
95
+ headers: {
96
+ Authorization: `Bearer ${token}`,
97
+ "Content-Type": "application/json",
98
+ },
99
+ body: JSON.stringify(payload),
100
+ signal: AbortSignal.timeout(3000),
101
+ });
102
+ if (!res.ok) {
103
+ process.stderr.write(`[auditor:mcp] heartbeat failed (${res.status}).\n`);
104
+ }
105
+ }
106
+ catch (err) {
107
+ const msg = err instanceof Error ? err.message : String(err);
108
+ process.stderr.write(`[auditor:mcp] heartbeat error: ${msg}\n`);
109
+ }
110
+ }
111
+ function tryRedeemApprovalToken(token, fingerprint, tier) {
112
+ if (!token || tier !== "MUTATE")
113
+ return false;
114
+ const row = pendingApprovalByToken.get(token);
115
+ if (!row || Date.now() > row.expiresAt) {
116
+ if (row)
117
+ pendingApprovalByToken.delete(token);
118
+ return false;
119
+ }
120
+ if (row.fingerprint !== fingerprint)
121
+ return false;
122
+ pendingApprovalByToken.delete(token);
123
+ return true;
124
+ }
125
+ /** Start the Praxis `guard` MCP server on stdio (blocks until disconnect). */
126
+ export async function runMcpStdioServer() {
127
+ const policy = await loadPoliciesV1();
128
+ const policyRevision = await readPoliciesV1Revision();
129
+ await sendGuardHeartbeat();
130
+ scheduleNextHeartbeat();
131
+ const server = new McpServer({
132
+ name: "praxis-guard",
133
+ version: MCP_SERVER_VERSION,
134
+ });
135
+ server.registerTool("guard", {
136
+ description: "Policy gatekeeper for agent actions. Evaluates a proposal argv against policies.v1.json; returns allow/block/require_approval with reasons.",
137
+ inputSchema: GuardInputSchema,
138
+ }, async (input) => {
139
+ const startedAt = Date.now();
140
+ const event_id = uuidv4();
141
+ pruneExpiredApprovals();
142
+ resetHeartbeatIdle();
143
+ const argv = input.proposal.raw_command
144
+ ? parseCommandToArgv(input.proposal.raw_command)
145
+ : input.proposal.argv;
146
+ const { skipped, evaluation } = input.proposal.kind === "shell"
147
+ ? evaluateShellProposal(policy, argv)
148
+ : { skipped: false, evaluation: evaluateArgv(policy, argv) };
149
+ const tier = evaluation.tier;
150
+ const reasons = [...evaluation.reasons];
151
+ const fingerprint = argvFingerprint(argv);
152
+ const submittedToken = input.context?.approval?.token ?? null;
153
+ const redeemed = !skipped && tryRedeemApprovalToken(submittedToken, fingerprint, tier);
154
+ if (redeemed) {
155
+ reasons.push({
156
+ code: "approval_redeemed",
157
+ message: "context.approval.token matched a pending approval for this argv; allowing once.",
158
+ });
159
+ }
160
+ let decision;
161
+ if (skipped || redeemed)
162
+ decision = "allow";
163
+ else if (tier === "DESTRUCTIVE")
164
+ decision = "block";
165
+ else
166
+ decision = tierToDecision(tier);
167
+ const issueToken = decision === "require_approval";
168
+ const newToken = issueToken ? `apr_${event_id}` : null;
169
+ if (issueToken && newToken) {
170
+ pendingApprovalByToken.set(newToken, {
171
+ fingerprint,
172
+ expiresAt: Date.now() + 10 * 60 * 1000,
173
+ });
174
+ }
175
+ const response = {
176
+ decision,
177
+ skipped,
178
+ tier,
179
+ risk_score: skipped ? 0 : tier === "READ" ? 0 : tier === "MUTATE" ? 60 : 95,
180
+ reasons,
181
+ shadow: {
182
+ decision,
183
+ tier,
184
+ reasons: [],
185
+ },
186
+ approval: {
187
+ required: decision === "require_approval",
188
+ token: newToken,
189
+ expires_at: issueToken ? new Date(Date.now() + 10 * 60 * 1000).toISOString() : null,
190
+ instructions: decision === "require_approval"
191
+ ? "Re-run the same proposal with context.approval.token set to the token value above (MUTATE only; DESTRUCTIVE cannot be approved this way)."
192
+ : redeemed
193
+ ? "Token consumed; this argv is cleared for one execution."
194
+ : null,
195
+ },
196
+ audit: {
197
+ event_id,
198
+ timestamp: new Date().toISOString(),
199
+ latency_ms: Date.now() - startedAt,
200
+ },
201
+ execution: {
202
+ attempted: false,
203
+ result: null,
204
+ },
205
+ };
206
+ const firstReason = reasons.find((r) => typeof r?.message === "string")?.message ??
207
+ reasons.find((r) => typeof r?.code === "string")?.code ??
208
+ null;
209
+ const actionVerb = argv[1] ?? null;
210
+ const actionResource = argv.length > 2 ? argv.slice(2).join(" ") : null;
211
+ const status = decision === "allow" ? "passed" : decision === "block" ? "blocked" : "needs_approval";
212
+ void sendGuardEvent({
213
+ ts: new Date().toISOString(),
214
+ status,
215
+ tool: "auditor-mcp",
216
+ command_path: argv[0] ?? null,
217
+ verb: actionVerb,
218
+ resource: actionResource,
219
+ reason: firstReason,
220
+ cmd: argv.join(" "),
221
+ tier,
222
+ decision,
223
+ latency_ms: Date.now() - startedAt,
224
+ event_id,
225
+ installId: getInstallId(),
226
+ kind: input.proposal.kind,
227
+ ...(policyRevision !== null ? { policy_revision: policyRevision } : {}),
228
+ });
229
+ if (input.proposal.kind === "shell" &&
230
+ shouldRecordShellBridge({ decision, skipped, tier })) {
231
+ try {
232
+ await recordShellApprovalBridge(argv, { cwd: input.proposal.cwd });
233
+ reasons.push({
234
+ code: "shell_bridge_recorded",
235
+ message: "Recorded one-shot shell approval bridge for beforeShellExecution (same argv within TTL).",
236
+ });
237
+ }
238
+ catch {
239
+ reasons.push({
240
+ code: "shell_bridge_record_failed",
241
+ message: "Could not write shell approval bridge file; hook may still deny MUTATE.",
242
+ });
243
+ }
244
+ }
245
+ return {
246
+ content: [{ type: "text", text: JSON.stringify(response, null, 2) }],
247
+ };
248
+ });
249
+ const transport = new StdioServerTransport();
250
+ await server.connect(transport);
251
+ }
252
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}