@praxis.guard/auditor-cli 0.0.32 → 0.0.34

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 (125) hide show
  1. package/dist/approval/argv-fingerprint.d.ts +10 -1
  2. package/dist/approval/argv-fingerprint.d.ts.map +1 -1
  3. package/dist/approval/argv-fingerprint.js +10 -1
  4. package/dist/approval/argv-fingerprint.js.map +1 -1
  5. package/dist/approval/hook-inline-approval.d.ts +2 -0
  6. package/dist/approval/hook-inline-approval.d.ts.map +1 -1
  7. package/dist/approval/hook-inline-approval.js +6 -2
  8. package/dist/approval/hook-inline-approval.js.map +1 -1
  9. package/dist/approval/mcp-flow.d.ts +4 -2
  10. package/dist/approval/mcp-flow.d.ts.map +1 -1
  11. package/dist/approval/mcp-flow.js +9 -3
  12. package/dist/approval/mcp-flow.js.map +1 -1
  13. package/dist/approval/redeem.d.ts +2 -0
  14. package/dist/approval/redeem.d.ts.map +1 -1
  15. package/dist/approval/redeem.js +7 -2
  16. package/dist/approval/redeem.js.map +1 -1
  17. package/dist/bridge/execution-ticket.d.ts +3 -0
  18. package/dist/bridge/execution-ticket.d.ts.map +1 -1
  19. package/dist/bridge/execution-ticket.js +38 -9
  20. package/dist/bridge/execution-ticket.js.map +1 -1
  21. package/dist/bridge/shell-approval-bridge.d.ts +14 -5
  22. package/dist/bridge/shell-approval-bridge.d.ts.map +1 -1
  23. package/dist/bridge/shell-approval-bridge.js +47 -24
  24. package/dist/bridge/shell-approval-bridge.js.map +1 -1
  25. package/dist/hooks/before-mcp-argv.d.ts +17 -0
  26. package/dist/hooks/before-mcp-argv.d.ts.map +1 -0
  27. package/dist/hooks/before-mcp-argv.js +67 -0
  28. package/dist/hooks/before-mcp-argv.js.map +1 -0
  29. package/dist/hooks/before-mcp-mutate.d.ts +23 -0
  30. package/dist/hooks/before-mcp-mutate.d.ts.map +1 -0
  31. package/dist/hooks/before-mcp-mutate.js +76 -0
  32. package/dist/hooks/before-mcp-mutate.js.map +1 -0
  33. package/dist/hooks/before-mcp-skipped.d.ts +14 -0
  34. package/dist/hooks/before-mcp-skipped.d.ts.map +1 -0
  35. package/dist/hooks/before-mcp-skipped.js +56 -0
  36. package/dist/hooks/before-mcp-skipped.js.map +1 -0
  37. package/dist/hooks/before-mcp-types.d.ts +15 -0
  38. package/dist/hooks/before-mcp-types.d.ts.map +1 -0
  39. package/dist/hooks/before-mcp-types.js +2 -0
  40. package/dist/hooks/before-mcp-types.js.map +1 -0
  41. package/dist/hooks/before-shell-io.d.ts +3 -0
  42. package/dist/hooks/before-shell-io.d.ts.map +1 -0
  43. package/dist/hooks/before-shell-io.js +26 -0
  44. package/dist/hooks/before-shell-io.js.map +1 -0
  45. package/dist/hooks/before-shell-mutate.d.ts +23 -0
  46. package/dist/hooks/before-shell-mutate.d.ts.map +1 -0
  47. package/dist/hooks/before-shell-mutate.js +74 -0
  48. package/dist/hooks/before-shell-mutate.js.map +1 -0
  49. package/dist/hooks/before-shell-skipped.d.ts +11 -0
  50. package/dist/hooks/before-shell-skipped.d.ts.map +1 -0
  51. package/dist/hooks/before-shell-skipped.js +49 -0
  52. package/dist/hooks/before-shell-skipped.js.map +1 -0
  53. package/dist/hooks/before-shell-types.d.ts +12 -0
  54. package/dist/hooks/before-shell-types.d.ts.map +1 -0
  55. package/dist/hooks/before-shell-types.js +2 -0
  56. package/dist/hooks/before-shell-types.js.map +1 -0
  57. package/dist/hooks/run-before-mcp.d.ts +3 -27
  58. package/dist/hooks/run-before-mcp.d.ts.map +1 -1
  59. package/dist/hooks/run-before-mcp.js +57 -195
  60. package/dist/hooks/run-before-mcp.js.map +1 -1
  61. package/dist/hooks/run-before-shell.d.ts +2 -10
  62. package/dist/hooks/run-before-shell.d.ts.map +1 -1
  63. package/dist/hooks/run-before-shell.js +63 -142
  64. package/dist/hooks/run-before-shell.js.map +1 -1
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/mcp/evaluate-guard.d.ts +11 -0
  70. package/dist/mcp/evaluate-guard.d.ts.map +1 -0
  71. package/dist/mcp/evaluate-guard.js +159 -0
  72. package/dist/mcp/evaluate-guard.js.map +1 -0
  73. package/dist/mcp/guard-approval-block.d.ts +27 -0
  74. package/dist/mcp/guard-approval-block.d.ts.map +1 -0
  75. package/dist/mcp/guard-approval-block.js +155 -0
  76. package/dist/mcp/guard-approval-block.js.map +1 -0
  77. package/dist/mcp/guard-heartbeat.d.ts +6 -0
  78. package/dist/mcp/guard-heartbeat.d.ts.map +1 -0
  79. package/dist/mcp/guard-heartbeat.js +68 -0
  80. package/dist/mcp/guard-heartbeat.js.map +1 -0
  81. package/dist/mcp/guard-schemas.d.ts +42 -0
  82. package/dist/mcp/guard-schemas.d.ts.map +1 -0
  83. package/dist/mcp/guard-schemas.js +39 -0
  84. package/dist/mcp/guard-schemas.js.map +1 -0
  85. package/dist/mcp/server.d.ts.map +1 -1
  86. package/dist/mcp/server.js +4 -327
  87. package/dist/mcp/server.js.map +1 -1
  88. package/dist/policies.v1.json +4 -0
  89. package/dist/policy/index.d.ts +4 -0
  90. package/dist/policy/index.d.ts.map +1 -1
  91. package/dist/policy/index.js +6 -0
  92. package/dist/policy/index.js.map +1 -1
  93. package/dist/shell/analyze-command-aggregate.d.ts +16 -0
  94. package/dist/shell/analyze-command-aggregate.d.ts.map +1 -0
  95. package/dist/shell/analyze-command-aggregate.js +89 -0
  96. package/dist/shell/analyze-command-aggregate.js.map +1 -0
  97. package/dist/shell/analyze-command-invocations.d.ts +11 -0
  98. package/dist/shell/analyze-command-invocations.d.ts.map +1 -0
  99. package/dist/shell/analyze-command-invocations.js +113 -0
  100. package/dist/shell/analyze-command-invocations.js.map +1 -0
  101. package/dist/shell/analyze-command.d.ts +7 -0
  102. package/dist/shell/analyze-command.d.ts.map +1 -0
  103. package/dist/shell/analyze-command.js +46 -0
  104. package/dist/shell/analyze-command.js.map +1 -0
  105. package/dist/shell/analyze-command.types.d.ts +38 -0
  106. package/dist/shell/analyze-command.types.d.ts.map +1 -0
  107. package/dist/shell/analyze-command.types.js +2 -0
  108. package/dist/shell/analyze-command.types.js.map +1 -0
  109. package/dist/shell/evaluate.d.ts +15 -18
  110. package/dist/shell/evaluate.d.ts.map +1 -1
  111. package/dist/shell/evaluate.js +57 -47
  112. package/dist/shell/evaluate.js.map +1 -1
  113. package/dist/shell/governed-tools.d.ts +18 -1
  114. package/dist/shell/governed-tools.d.ts.map +1 -1
  115. package/dist/shell/governed-tools.js +60 -1
  116. package/dist/shell/governed-tools.js.map +1 -1
  117. package/dist/shell/guard-eval.d.ts +15 -0
  118. package/dist/shell/guard-eval.d.ts.map +1 -0
  119. package/dist/shell/guard-eval.js +35 -0
  120. package/dist/shell/guard-eval.js.map +1 -0
  121. package/dist/shell/parse-segments.d.ts +14 -0
  122. package/dist/shell/parse-segments.d.ts.map +1 -0
  123. package/dist/shell/parse-segments.js +41 -0
  124. package/dist/shell/parse-segments.js.map +1 -0
  125. package/package.json +1 -1
@@ -3,77 +3,13 @@ import { appendAuditJsonl } from "../audit/jsonl.js";
3
3
  import { getInstallId } from "../cli/install-id.js";
4
4
  import { evaluateMcpProposal } from "../shell/evaluate.js";
5
5
  import { resolveGuardStorageRoot } from "../bridge/guard-storage-root.js";
6
- import { tryConsumeExecutionTicket } from "../bridge/execution-ticket.js";
7
- import { tryHookInlineApprovalRequest } from "../approval/hook-inline-approval.js";
8
- import { readPendingApprovalIndex } from "../bridge/pending-approval-index.js";
9
- import { argvSha256 } from "../approval/argv-fingerprint.js";
10
6
  import { toolInputSha256 } from "../approval/fingerprint.js";
11
- import { resolveMutateApproval } from "../approval/mcp-flow.js";
12
7
  import { formatHookAllowViaCredentialMessage, formatHookDenyMessages, } from "./agent-message.js";
13
- import { randomUUID } from "node:crypto";
14
8
  import { sendGuardEvent } from "../telemetry/guard-events.js";
15
- function tierToPermission(tier) {
16
- if (tier === "READ")
17
- return "allow";
18
- return "deny";
19
- }
20
- function stringifyToolInput(raw) {
21
- if (raw === undefined || raw === null)
22
- return "";
23
- if (typeof raw === "string")
24
- return raw;
25
- try {
26
- return JSON.stringify(raw);
27
- }
28
- catch {
29
- return String(raw);
30
- }
31
- }
32
- /**
33
- * When Cursor encodes MCP tools as `MCP:<server>:<tool>` (see Cursor hooks docs / preToolUse), split into
34
- * server + bare tool name for policy rows under `policies.mcp.<server>.<tool>`.
35
- */
36
- export function splitMcpToolName(raw) {
37
- const t = raw.trim();
38
- if (!t)
39
- return { serverGuess: null, tool: "_" };
40
- if (t.startsWith("MCP:")) {
41
- const body = t.slice(4).trim();
42
- const idx = body.lastIndexOf(":");
43
- if (idx !== -1) {
44
- const serverPart = body.slice(0, idx).trim();
45
- const toolPart = body.slice(idx + 1).trim();
46
- if (serverPart && toolPart)
47
- return { serverGuess: serverPart, tool: toolPart };
48
- }
49
- }
50
- return { serverGuess: null, tool: t };
51
- }
52
- /**
53
- * Maps hook payload → argv for `policies.v1.json` under tool key `mcp`.
54
- * Omits raw `tool_input` from argv tokens so JSON metacharacters do not trip shell metachar heuristics.
55
- */
56
- export function mcpHookArgvFromPayload(payload) {
57
- const rawName = typeof payload.tool_name === "string" ? payload.tool_name.trim() : "";
58
- const { serverGuess, tool } = splitMcpToolName(rawName);
59
- let server = "stdio";
60
- if (typeof payload.url === "string" && payload.url.trim()) {
61
- const u = payload.url.trim();
62
- try {
63
- server = new URL(u).host || u;
64
- }
65
- catch {
66
- server = u;
67
- }
68
- }
69
- else if (serverGuess) {
70
- server = serverGuess;
71
- }
72
- else if (typeof payload.command === "string" && payload.command.trim()) {
73
- server = payload.command.trim().slice(0, 400);
74
- }
75
- return ["mcp", server, tool || "_"];
76
- }
9
+ import { mcpHookArgvFromPayload, preferredHookCwd, stringifyToolInput, } from "./before-mcp-argv.js";
10
+ import { resolveMutateHookPermission } from "./before-mcp-mutate.js";
11
+ import { handleSkippedMcpHook } from "./before-mcp-skipped.js";
12
+ export { mcpHookArgvFromPayload, splitMcpToolName } from "./before-mcp-argv.js";
77
13
  async function readStdinJson() {
78
14
  return await new Promise((resolve, reject) => {
79
15
  let data = "";
@@ -89,14 +25,10 @@ async function readStdinJson() {
89
25
  });
90
26
  });
91
27
  }
92
- async function tryAppendAuditEvent(evt, auditLogRoot) {
93
- try {
94
- await appendAuditJsonl(evt, auditLogRoot);
95
- }
96
- catch (e) {
97
- const msg = e instanceof Error ? e.message : String(e);
98
- process.stderr.write(`[auditor] audit log append failed: ${msg}\n`);
99
- }
28
+ function tierToPermission(tier) {
29
+ if (tier === "READ")
30
+ return "allow";
31
+ return "deny";
100
32
  }
101
33
  /**
102
34
  * Cursor `beforeMCPExecution`: stdin JSON → stdout JSON (`permission` only contract).
@@ -119,121 +51,45 @@ export async function runBeforeMcpHookFromStdin() {
119
51
  const [policy, policyRevision] = await Promise.all([loadPoliciesV1(), readPoliciesV1Revision()]);
120
52
  const { skipped, evaluation } = evaluateMcpProposal(policy, argv);
121
53
  const { classification, flags, tier } = evaluation;
122
- const reasons = evaluation.reasons.map((r) => r.message);
123
- const preferredCwd = typeof payload.cwd === "string"
124
- ? payload.cwd
125
- : Array.isArray(payload.workspace_roots) &&
126
- typeof payload.workspace_roots[0] === "string"
127
- ? payload.workspace_roots[0]
128
- : undefined;
129
- const storageRoot = resolveGuardStorageRoot(preferredCwd);
54
+ const initialReasons = evaluation.reasons.map((r) => r.message);
55
+ const storageRoot = resolveGuardStorageRoot(preferredHookCwd(payload));
130
56
  const auditLogRoot = storageRoot;
131
57
  const toolInputHash = toolInputSha256(payload.tool_input);
132
58
  if (skipped) {
133
- const latency_ms = performance.now() - decisionStarted;
134
- const toolInputStr = stringifyToolInput(payload.tool_input);
135
- await tryAppendAuditEvent({
136
- ts: new Date().toISOString(),
137
- hook: "beforeMCPExecution",
138
- tool_name: rawToolName,
139
- bare_tool: bareTool,
140
- tool_input: toolInputStr.slice(0, 8000),
59
+ await handleSkippedMcpHook({
60
+ payload,
61
+ rawToolName,
62
+ bareTool,
141
63
  argv,
142
- status: "skipped",
143
- skipped: true,
144
- skip_reason: "mcp_policy_unmatched",
145
- tier,
146
- permission: "allow",
147
- ticketConsumed: false,
148
- reasons,
149
- latency_ms,
150
- }, auditLogRoot);
151
- const skipResponse = { permission: "allow" };
152
- process.stdout.write(JSON.stringify(skipResponse, null, 2));
153
- await sendGuardEvent({
154
- ts: new Date().toISOString(),
155
- status: "skipped",
156
- skipped: true,
157
- skip_reason: "mcp_policy_unmatched",
158
- tool: "auditor-hook-mcp",
159
- command_path: argv[1] ?? null,
160
- verb: argv[2] ?? null,
161
- resource: toolInputStr ? toolInputStr.slice(0, 500) : null,
162
- reason: reasons[0] ?? "mcp_policy_unmatched",
163
- cmd: `${rawToolName}`,
164
64
  tier,
165
- decision: "allow",
166
- latency_ms,
167
- installId: getInstallId(),
168
- kind: "mcp",
169
- ...(policyRevision !== null ? { policy_revision: policyRevision } : {}),
170
- meta: {
171
- hook: "beforeMCPExecution",
172
- ticketConsumed: false,
173
- },
65
+ reasons: initialReasons,
66
+ policyRevision,
67
+ auditLogRoot,
68
+ decisionStarted,
174
69
  });
175
70
  return;
176
71
  }
177
72
  let permission = tierToPermission(tier);
178
73
  let ticketConsumed = false;
74
+ let inlineApproval = null;
179
75
  let approvalFlowSignal = null;
76
+ let reasons = initialReasons;
180
77
  if (permission === "deny" && tier === "MUTATE") {
181
- ticketConsumed = await tryConsumeExecutionTicket(argv, {
78
+ const mutate = await resolveMutateHookPermission({
79
+ argv,
80
+ tier,
182
81
  storageRoot,
183
- kind: "mcp",
184
- tool_input_sha256: toolInputHash,
82
+ toolInputHash,
83
+ rawToolName,
84
+ toolInputPreview: stringifyToolInput(payload.tool_input).slice(0, 200),
85
+ policyRevision,
86
+ initialReasons,
185
87
  });
186
- if (ticketConsumed)
187
- permission = "allow";
188
- }
189
- let inlineApproval = null;
190
- if (permission === "deny" && tier === "MUTATE") {
191
- const hash = argvSha256(argv);
192
- const pending = await readPendingApprovalIndex(hash, { storageRoot });
193
- if (pending) {
194
- const autoRedeem = await resolveMutateApproval({
195
- argv: [...argv],
196
- proposalKind: "mcp",
197
- storageRoot,
198
- rawDisplay: `${rawToolName} ${stringifyToolInput(payload.tool_input).slice(0, 200)}`,
199
- eventId: randomUUID(),
200
- policyRevision,
201
- reasons,
202
- approval: { request_id: pending.request_id },
203
- waitMs: 0,
204
- tool_input_sha256: toolInputHash,
205
- });
206
- if (autoRedeem.kind === "allow" && autoRedeem.ticketRecorded) {
207
- ticketConsumed = await tryConsumeExecutionTicket(argv, {
208
- storageRoot,
209
- kind: "mcp",
210
- tool_input_sha256: toolInputHash,
211
- });
212
- if (ticketConsumed) {
213
- permission = "allow";
214
- }
215
- }
216
- if (permission === "deny") {
217
- approvalFlowSignal = "retry_without_guard_wait_resolve";
218
- reasons.push("retry_without_guard_wait_resolve");
219
- inlineApproval = { request_id: pending.request_id, open_url: pending.open_url };
220
- }
221
- }
222
- else {
223
- const created = await tryHookInlineApprovalRequest({
224
- argv: [...argv],
225
- kind: "mcp",
226
- rawDisplay: `${rawToolName} ${stringifyToolInput(payload.tool_input).slice(0, 200)}`,
227
- policyRevision,
228
- reasons,
229
- eventId: randomUUID(),
230
- storageRoot,
231
- tool_input_sha256: toolInputHash,
232
- });
233
- if (created) {
234
- inlineApproval = { request_id: created.request_id, open_url: created.open_url };
235
- }
236
- }
88
+ permission = mutate.permission;
89
+ ticketConsumed = mutate.ticketConsumed;
90
+ inlineApproval = mutate.inlineApproval;
91
+ approvalFlowSignal = mutate.approvalFlowSignal;
92
+ reasons = mutate.reasons;
237
93
  }
238
94
  const latency_ms = performance.now() - decisionStarted;
239
95
  const toolInputStr = stringifyToolInput(payload.tool_input);
@@ -258,24 +114,30 @@ export async function runBeforeMcpHookFromStdin() {
258
114
  user_message: denyMessages.user_message,
259
115
  agent_message: denyMessages.agent_message,
260
116
  };
261
- await tryAppendAuditEvent({
262
- ts: new Date().toISOString(),
263
- hook: "beforeMCPExecution",
264
- tool_name: rawToolName,
265
- bare_tool: bareTool,
266
- tool_input: toolInputStr.slice(0, 8000),
267
- argv,
268
- classification,
269
- flags,
270
- tier,
271
- permission,
272
- ticketConsumed,
273
- inline_request_id: inlineApproval?.request_id ?? null,
274
- tool_input_sha256: toolInputHash,
275
- reasons,
276
- approval_flow_signal: approvalFlowSignal,
277
- latency_ms,
278
- }, auditLogRoot);
117
+ try {
118
+ await appendAuditJsonl({
119
+ ts: new Date().toISOString(),
120
+ hook: "beforeMCPExecution",
121
+ tool_name: rawToolName,
122
+ bare_tool: bareTool,
123
+ tool_input: toolInputStr.slice(0, 8000),
124
+ argv,
125
+ classification,
126
+ flags,
127
+ tier,
128
+ permission,
129
+ ticketConsumed,
130
+ inline_request_id: inlineApproval?.request_id ?? null,
131
+ tool_input_sha256: toolInputHash,
132
+ reasons,
133
+ approval_flow_signal: approvalFlowSignal,
134
+ latency_ms,
135
+ }, auditLogRoot);
136
+ }
137
+ catch (e) {
138
+ const msg = e instanceof Error ? e.message : String(e);
139
+ process.stderr.write(`[auditor] audit log append failed: ${msg}\n`);
140
+ }
279
141
  process.stdout.write(JSON.stringify(response, null, 2));
280
142
  const status = permission === "allow" ? "passed" : "blocked";
281
143
  await sendGuardEvent({
@@ -1 +1 @@
1
- {"version":3,"file":"run-before-mcp.js","sourceRoot":"","sources":["../../src/hooks/run-before-mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-before-mcp.js","sourceRoot":"","sources":["../../src/hooks/run-before-mcp.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,5 @@
1
- export type BeforeShellExecutionPayload = {
2
- command: string;
3
- cwd?: string;
4
- sandbox?: boolean;
5
- };
6
- export type BeforeShellExecutionResponse = {
7
- permission: "allow" | "deny" | "ask";
8
- user_message?: string;
9
- agent_message?: string;
10
- };
1
+ import type { BeforeShellExecutionResponse } from "./before-shell-types.js";
2
+ export type { BeforeShellExecutionPayload, BeforeShellExecutionResponse } from "./before-shell-types.js";
11
3
  /**
12
4
  * Cursor `beforeShellExecution` contract: read one JSON object from stdin, write one JSON object to stdout.
13
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"run-before-shell.d.ts","sourceRoot":"","sources":["../../src/hooks/run-before-shell.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA+BF;;GAEG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAyMjE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,4BAA4B,CAMtF"}
1
+ {"version":3,"file":"run-before-shell.d.ts","sourceRoot":"","sources":["../../src/hooks/run-before-shell.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAA+B,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEzG,YAAY,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAOzG;;GAEG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAsJjE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,4BAA4B,CAMtF"}
@@ -1,168 +1,87 @@
1
- import { classifyArgv, loadPoliciesV1, readPoliciesV1Revision } from "../policy/index.js";
2
- import { appendAuditJsonl } from "../audit/jsonl.js";
1
+ import { loadPoliciesV1, readPoliciesV1Revision } from "../policy/index.js";
3
2
  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 { stripTrailingBenignShellRedirectsForMetacharCheck } from "../shell/strip-trailing-benign-shell-redirs.js";
3
+ import { analyzeShellCommand } from "../shell/analyze-command.js";
4
+ import { commandMayContainGovernedTool } from "../shell/governed-tools.js";
7
5
  import { resolveGuardStorageRoot } from "../bridge/guard-storage-root.js";
8
- import { tryConsumeExecutionTicket } from "../bridge/execution-ticket.js";
9
- import { tryHookInlineApprovalRequest } from "../approval/hook-inline-approval.js";
10
- import { readPendingApprovalIndex } from "../bridge/pending-approval-index.js";
11
- import { argvSha256 } from "../approval/argv-fingerprint.js";
12
- import { resolveMutateApproval } from "../approval/mcp-flow.js";
13
- import { formatHookAllowViaCredentialMessage, formatHookDenyMessages, } from "./agent-message.js";
14
- import { randomUUID } from "node:crypto";
15
6
  import { sendGuardEvent } from "../telemetry/guard-events.js";
7
+ import { resolveShellMutateHookPermission } from "./before-shell-mutate.js";
8
+ import { readStdinJson, tryAppendAuditEvent } from "./before-shell-io.js";
9
+ import { handleSkippedShellHook } from "./before-shell-skipped.js";
10
+ import { formatHookAllowViaCredentialMessage, formatHookDenyMessages, } from "./agent-message.js";
16
11
  function tierToPermission(tier) {
17
12
  if (tier === "READ")
18
13
  return "allow";
19
14
  return "deny";
20
15
  }
21
- async function readStdinJson() {
22
- return await new Promise((resolve, reject) => {
23
- let data = "";
24
- process.stdin.setEncoding("utf8");
25
- process.stdin.on("data", (chunk) => (data += chunk));
26
- process.stdin.on("end", () => {
27
- try {
28
- resolve(JSON.parse(data));
29
- }
30
- catch (e) {
31
- reject(e);
32
- }
33
- });
34
- });
35
- }
36
- async function tryAppendAuditEvent(evt, auditLogRoot) {
37
- try {
38
- await appendAuditJsonl(evt, auditLogRoot);
39
- }
40
- catch (e) {
41
- const msg = e instanceof Error ? e.message : String(e);
42
- process.stderr.write(`[auditor] audit log append failed: ${msg}\n`);
43
- }
44
- }
45
16
  /**
46
17
  * Cursor `beforeShellExecution` contract: read one JSON object from stdin, write one JSON object to stdout.
47
18
  */
48
19
  export async function runBeforeShellHookFromStdin() {
49
20
  const payload = await readStdinJson();
50
21
  const decisionStarted = performance.now();
51
- const argv = parseCommandToArgv(payload.command);
52
- const commandForRawMeta = stripTrailingBenignShellRedirectsForMetacharCheck(payload.command);
53
- const rawMetacharacters = /(;|&&|\|\||\||`|>|<|\$\()/.test(commandForRawMeta);
54
- const tool = argv[0];
55
- if (!tool || !DEFAULT_GOVERNED_SHELL_TOOLS.includes(tool)) {
56
- const skipReason = !tool ? "no_command" : "ungoverned_shell_tool";
22
+ const command = payload.command;
23
+ if (!commandMayContainGovernedTool(command)) {
24
+ const skipReason = command.trim() ? "no_governed_invocation" : "no_command";
57
25
  const auditLogRoot = typeof payload.cwd === "string" && payload.cwd.trim() ? payload.cwd.trim() : undefined;
58
- // Decision is known here; do not await policy meta read before NET decision latency.
59
- const latency_ms = performance.now() - decisionStarted;
60
- await tryAppendAuditEvent({
61
- ts: new Date().toISOString(),
62
- hook: "beforeShellExecution",
63
- cwd: payload.cwd,
64
- command: payload.command,
65
- argv,
66
- status: "skipped",
67
- skipped: true,
68
- skip_reason: skipReason,
69
- tier: "READ",
70
- permission: "allow",
71
- ticketConsumed: false,
72
- reasons: [`${skipReason}(policy_not_evaluated)`],
73
- latency_ms,
74
- }, auditLogRoot);
75
- const response = { permission: "allow" };
76
- process.stdout.write(JSON.stringify(response, null, 2));
77
26
  const policyRevision = await readPoliciesV1Revision();
78
- await sendGuardEvent({
79
- ts: new Date().toISOString(),
80
- status: "skipped",
81
- skipped: true,
82
- skip_reason: skipReason,
83
- tool: "auditor-hook",
84
- command_path: argv[0] ?? null,
85
- verb: argv[1] ?? null,
86
- resource: argv.length > 2 ? argv.slice(2).join(" ") : null,
87
- reason: skipReason,
88
- cmd: payload.command,
89
- tier: "READ",
90
- decision: "allow",
91
- latency_ms,
92
- installId: getInstallId(),
93
- kind: "shell",
94
- ...(policyRevision !== null ? { policy_revision: policyRevision } : {}),
95
- meta: {
96
- hook: "beforeShellExecution",
97
- ticketConsumed: false,
98
- },
27
+ await handleSkippedShellHook({
28
+ payload,
29
+ skipReason,
30
+ policyRevision,
31
+ auditLogRoot: auditLogRoot ?? "",
32
+ decisionStarted,
99
33
  });
100
34
  return;
101
35
  }
102
36
  const [policy, policyRevision] = await Promise.all([loadPoliciesV1(), readPoliciesV1Revision()]);
103
- const { classification, flags } = classifyArgv(policy, argv);
104
- let tier = classification.tier;
37
+ const analysis = analyzeShellCommand(command, policy);
38
+ const storageRoot = resolveGuardStorageRoot(typeof payload.cwd === "string" ? payload.cwd : undefined);
39
+ if (analysis.skipped) {
40
+ await handleSkippedShellHook({
41
+ payload,
42
+ skipReason: "no_governed_invocation",
43
+ policyRevision,
44
+ auditLogRoot: storageRoot,
45
+ decisionStarted,
46
+ analysis,
47
+ });
48
+ return;
49
+ }
50
+ const argv = analysis.primary.canonical_argv;
51
+ const evaluation = analysis.primary.evaluation;
52
+ const tier = analysis.tier;
105
53
  const reasons = [];
106
- if (!classification.matched)
54
+ if (!evaluation.classification.matched)
107
55
  reasons.push("unknown_command(default_deny)");
108
- if (flags.metacharacters || rawMetacharacters)
56
+ if (evaluation.flags.metacharacters || analysis.raw_metacharacters)
109
57
  reasons.push("metacharacters");
110
- if (flags.dangerous_flags)
58
+ if (evaluation.flags.dangerous_flags)
111
59
  reasons.push("dangerous_flags");
112
- if ((flags.metacharacters || rawMetacharacters) && tier === "READ")
113
- tier = "MUTATE";
114
- if (flags.dangerous_flags)
115
- tier = "DESTRUCTIVE";
116
- const storageRoot = resolveGuardStorageRoot(typeof payload.cwd === "string" ? payload.cwd : undefined);
60
+ if (analysis.fail_closed)
61
+ reasons.push("unparseable(fail_closed)");
62
+ if (analysis.invocations.length > 1) {
63
+ reasons.push(`multiple_governed_invocations(${analysis.invocations.length})`);
64
+ }
117
65
  let permission = tierToPermission(tier);
118
66
  let ticketConsumed = false;
119
67
  let approvalFlowSignal = null;
120
- if (permission === "deny" && tier === "MUTATE") {
121
- ticketConsumed = await tryConsumeExecutionTicket(argv, { storageRoot, kind: "shell" });
122
- if (ticketConsumed)
123
- permission = "allow";
124
- }
125
68
  let inlineApproval = null;
126
69
  if (permission === "deny" && tier === "MUTATE") {
127
- const pending = await readPendingApprovalIndex(argvSha256(argv), { storageRoot });
128
- if (pending) {
129
- const autoRedeem = await resolveMutateApproval({
130
- argv: [...argv],
131
- proposalKind: "shell",
132
- storageRoot,
133
- rawDisplay: payload.command,
134
- eventId: randomUUID(),
135
- policyRevision,
136
- reasons,
137
- approval: { request_id: pending.request_id },
138
- waitMs: 0,
139
- });
140
- if (autoRedeem.kind === "allow" && autoRedeem.ticketRecorded) {
141
- ticketConsumed = await tryConsumeExecutionTicket(argv, { storageRoot, kind: "shell" });
142
- if (ticketConsumed) {
143
- permission = "allow";
144
- }
145
- }
146
- if (permission === "deny") {
147
- approvalFlowSignal = "retry_without_guard_wait_resolve";
148
- reasons.push("retry_without_guard_wait_resolve");
149
- inlineApproval = { request_id: pending.request_id, open_url: pending.open_url };
150
- }
151
- }
152
- else {
153
- const created = await tryHookInlineApprovalRequest({
154
- argv: [...argv],
155
- kind: "shell",
156
- rawDisplay: payload.command,
157
- policyRevision,
158
- reasons,
159
- eventId: randomUUID(),
160
- storageRoot,
161
- });
162
- if (created) {
163
- inlineApproval = { request_id: created.request_id, open_url: created.open_url };
164
- }
165
- }
70
+ const mutate = await resolveShellMutateHookPermission({
71
+ tier,
72
+ argv,
73
+ analysis,
74
+ storageRoot,
75
+ rawDisplay: payload.command,
76
+ policyRevision,
77
+ initialReasons: reasons,
78
+ });
79
+ permission = mutate.permission;
80
+ ticketConsumed = mutate.ticketConsumed;
81
+ approvalFlowSignal = mutate.approvalFlowSignal;
82
+ inlineApproval = mutate.inlineApproval;
83
+ reasons.length = 0;
84
+ reasons.push(...mutate.reasons);
166
85
  }
167
86
  const allowMessage = formatHookAllowViaCredentialMessage({ ticketConsumed });
168
87
  const denyMessages = permission === "deny"
@@ -184,7 +103,6 @@ export async function runBeforeShellHookFromStdin() {
184
103
  user_message: denyMessages.user_message,
185
104
  agent_message: denyMessages.agent_message,
186
105
  };
187
- const auditLogRoot = storageRoot;
188
106
  const latency_ms = performance.now() - decisionStarted;
189
107
  await tryAppendAuditEvent({
190
108
  ts: new Date().toISOString(),
@@ -192,8 +110,12 @@ export async function runBeforeShellHookFromStdin() {
192
110
  cwd: payload.cwd,
193
111
  command: payload.command,
194
112
  argv,
195
- classification,
196
- flags,
113
+ governed_argv: argv,
114
+ invocation_count: analysis.invocations.length,
115
+ segments: analysis.segments,
116
+ operators: analysis.operators,
117
+ classification: evaluation.classification,
118
+ flags: evaluation.flags,
197
119
  tier,
198
120
  permission,
199
121
  ticketConsumed,
@@ -201,10 +123,8 @@ export async function runBeforeShellHookFromStdin() {
201
123
  reasons,
202
124
  approval_flow_signal: approvalFlowSignal,
203
125
  latency_ms,
204
- }, auditLogRoot);
205
- // Write stdout immediately so Cursor gets the response without waiting for network.
126
+ }, storageRoot);
206
127
  process.stdout.write(JSON.stringify(response, null, 2));
207
- // Upload event to backend (keep process alive until done).
208
128
  const status = permission === "allow" ? "passed" : "blocked";
209
129
  await sendGuardEvent({
210
130
  ts: new Date().toISOString(),
@@ -226,6 +146,7 @@ export async function runBeforeShellHookFromStdin() {
226
146
  ticketConsumed,
227
147
  approval_request_id: inlineApproval?.request_id ?? null,
228
148
  approval_flow_signal: approvalFlowSignal,
149
+ invocation_count: analysis.invocations.length,
229
150
  },
230
151
  });
231
152
  }