@praxis.guard/auditor-cli 0.0.57 → 0.0.59

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 (82) hide show
  1. package/dist/approval/hook-inline-approval.d.ts.map +1 -1
  2. package/dist/approval/hook-inline-approval.js +9 -0
  3. package/dist/approval/hook-inline-approval.js.map +1 -1
  4. package/dist/approval/mcp-flow.d.ts.map +1 -1
  5. package/dist/approval/mcp-flow.js +16 -1
  6. package/dist/approval/mcp-flow.js.map +1 -1
  7. package/dist/approval/redeem-storage-root.d.ts +7 -0
  8. package/dist/approval/redeem-storage-root.d.ts.map +1 -0
  9. package/dist/approval/redeem-storage-root.js +25 -0
  10. package/dist/approval/redeem-storage-root.js.map +1 -0
  11. package/dist/approval/redeem.d.ts +1 -1
  12. package/dist/approval/redeem.d.ts.map +1 -1
  13. package/dist/approval/redeem.js +66 -50
  14. package/dist/approval/redeem.js.map +1 -1
  15. package/dist/bridge/execution-ticket-consume.d.ts +1 -0
  16. package/dist/bridge/execution-ticket-consume.d.ts.map +1 -1
  17. package/dist/bridge/execution-ticket-consume.js +4 -94
  18. package/dist/bridge/execution-ticket-consume.js.map +1 -1
  19. package/dist/bridge/execution-ticket-files.d.ts +11 -0
  20. package/dist/bridge/execution-ticket-files.d.ts.map +1 -0
  21. package/dist/bridge/execution-ticket-files.js +86 -0
  22. package/dist/bridge/execution-ticket-files.js.map +1 -0
  23. package/dist/bridge/execution-ticket-record.d.ts +8 -9
  24. package/dist/bridge/execution-ticket-record.d.ts.map +1 -1
  25. package/dist/bridge/execution-ticket-record.js +32 -31
  26. package/dist/bridge/execution-ticket-record.js.map +1 -1
  27. package/dist/bridge/execution-ticket-scan.d.ts +7 -0
  28. package/dist/bridge/execution-ticket-scan.d.ts.map +1 -0
  29. package/dist/bridge/execution-ticket-scan.js +43 -0
  30. package/dist/bridge/execution-ticket-scan.js.map +1 -0
  31. package/dist/bridge/execution-ticket-token.d.ts +10 -0
  32. package/dist/bridge/execution-ticket-token.d.ts.map +1 -0
  33. package/dist/bridge/execution-ticket-token.js +57 -0
  34. package/dist/bridge/execution-ticket-token.js.map +1 -0
  35. package/dist/bridge/guard-storage-root.d.ts +3 -0
  36. package/dist/bridge/guard-storage-root.d.ts.map +1 -1
  37. package/dist/bridge/guard-storage-root.js +16 -6
  38. package/dist/bridge/guard-storage-root.js.map +1 -1
  39. package/dist/bridge/guard-workspace-session.d.ts +9 -0
  40. package/dist/bridge/guard-workspace-session.d.ts.map +1 -1
  41. package/dist/bridge/guard-workspace-session.js +38 -7
  42. package/dist/bridge/guard-workspace-session.js.map +1 -1
  43. package/dist/bridge/request-binding-index.d.ts +20 -0
  44. package/dist/bridge/request-binding-index.d.ts.map +1 -0
  45. package/dist/bridge/request-binding-index.js +100 -0
  46. package/dist/bridge/request-binding-index.js.map +1 -0
  47. package/dist/bridge/request-binding-write.d.ts +10 -0
  48. package/dist/bridge/request-binding-write.d.ts.map +1 -0
  49. package/dist/bridge/request-binding-write.js +21 -0
  50. package/dist/bridge/request-binding-write.js.map +1 -0
  51. package/dist/cli/doctor.d.ts.map +1 -1
  52. package/dist/cli/doctor.js +9 -0
  53. package/dist/cli/doctor.js.map +1 -1
  54. package/dist/hooks/agent-message.d.ts +2 -0
  55. package/dist/hooks/agent-message.d.ts.map +1 -1
  56. package/dist/hooks/agent-message.js +9 -46
  57. package/dist/hooks/agent-message.js.map +1 -1
  58. package/dist/hooks/mutate-deny-messages.d.ts +15 -0
  59. package/dist/hooks/mutate-deny-messages.d.ts.map +1 -0
  60. package/dist/hooks/mutate-deny-messages.js +57 -0
  61. package/dist/hooks/mutate-deny-messages.js.map +1 -0
  62. package/dist/hooks/run-before-mcp.d.ts.map +1 -1
  63. package/dist/hooks/run-before-mcp.js +3 -1
  64. package/dist/hooks/run-before-mcp.js.map +1 -1
  65. package/dist/hooks/run-before-shell.d.ts.map +1 -1
  66. package/dist/hooks/run-before-shell.js +3 -1
  67. package/dist/hooks/run-before-shell.js.map +1 -1
  68. package/dist/mcp/evaluate-guard.d.ts.map +1 -1
  69. package/dist/mcp/evaluate-guard.js +2 -1
  70. package/dist/mcp/evaluate-guard.js.map +1 -1
  71. package/dist/mcp/guard-schemas.d.ts.map +1 -1
  72. package/dist/mcp/guard-schemas.js +13 -7
  73. package/dist/mcp/guard-schemas.js.map +1 -1
  74. package/native/darwin-amd64/praxis-guard-daemon +0 -0
  75. package/native/darwin-amd64/praxis-guard-hook +0 -0
  76. package/native/darwin-arm64/praxis-guard-daemon +0 -0
  77. package/native/darwin-arm64/praxis-guard-hook +0 -0
  78. package/native/linux-amd64/praxis-guard-daemon +0 -0
  79. package/native/linux-amd64/praxis-guard-hook +0 -0
  80. package/native/linux-arm64/praxis-guard-daemon +0 -0
  81. package/native/linux-arm64/praxis-guard-hook +0 -0
  82. package/package.json +1 -1
@@ -8,44 +8,45 @@ import { shellApprovalId } from "./execution-ticket-match.js";
8
8
  function executionTicketDir(storageRoot) {
9
9
  return guardSubpath("tickets", storageRoot);
10
10
  }
11
+ function ticketExpiryMs(ticket) {
12
+ const claims = verifyExecutionTicket(ticket);
13
+ return claims ? claims.exp * 1000 : Date.now() + 10 * 60 * 1000;
14
+ }
15
+ function buildTicketRecord(ticket, argv, expMs, resolvedRoot, opts, claims, includeFingerprint) {
16
+ return JSON.stringify({
17
+ exp: expMs,
18
+ argv: [...argv],
19
+ fingerprint: includeFingerprint ? (opts?.approval_fingerprint ?? undefined) : undefined,
20
+ ticket,
21
+ kind: opts?.kind ?? claims?.kind ?? "shell",
22
+ storage_root: resolvedRoot,
23
+ request_id: opts?.request_id ?? claims?.request_id,
24
+ argv_sha256: opts?.argv_sha256 ?? claims?.argv_sha256,
25
+ });
26
+ }
27
+ async function writeTicketFile(dir, id, content) {
28
+ await writeFile(path.join(dir, `${id}_${randomUUID()}.json`), content, "utf8");
29
+ }
30
+ async function writeArgvAliasTicket(dir, argv, primaryId, aliasContent) {
31
+ const argvId = shellArgvApprovalId(argv);
32
+ if (argvId === primaryId)
33
+ return;
34
+ await writeTicketFile(dir, argvId, aliasContent);
35
+ }
11
36
  /**
12
37
  * After redeem, persist a signed execution ticket for hook verification (dual-write with bridge).
13
- *
14
- * When a fingerprint is provided the primary file is indexed by the fingerprint hash.
15
- * We also write an argv-hash alias so hooks that lack fingerprint context (e.g. the
16
- * Claude Code PreToolUse hook) can find and consume the ticket by argv alone.
17
38
  */
18
39
  export async function recordExecutionTicket(ticket, argv, opts) {
19
40
  const id = shellApprovalId(argv, opts?.approval_fingerprint);
20
- const dir = executionTicketDir(opts?.storageRoot);
41
+ const resolvedRoot = opts?.storageRoot ? path.resolve(opts.storageRoot) : undefined;
42
+ const dir = executionTicketDir(resolvedRoot);
21
43
  await mkdir(dir, { recursive: true });
22
44
  const claims = verifyExecutionTicket(ticket);
23
- const expMs = claims ? claims.exp * 1000 : Date.now() + 10 * 60 * 1000;
24
- const content = JSON.stringify({
25
- exp: expMs,
26
- argv: [...argv],
27
- fingerprint: opts?.approval_fingerprint ?? undefined,
28
- ticket,
29
- kind: opts?.kind ?? claims?.kind ?? "shell",
30
- });
31
- const file = path.join(dir, `${id}_${randomUUID()}.json`);
32
- await writeFile(file, content, "utf8");
33
- // When stored by fingerprint hash, also write an argv-hash alias so hooks
34
- // without fingerprint context (e.g. claude-code PreToolUse) can find it.
35
- // The alias omits the fingerprint so tryConsumeTicketToken hashes by argv,
36
- // matching the argv_sha256 the server put in the JWT.
37
- if (opts?.approval_fingerprint && (opts?.kind ?? claims?.kind ?? "shell") === "shell") {
38
- const argvId = shellArgvApprovalId(argv);
39
- if (argvId !== id) {
40
- const aliasContent = JSON.stringify({
41
- exp: expMs,
42
- argv: [...argv],
43
- ticket,
44
- kind: opts?.kind ?? claims?.kind ?? "shell",
45
- });
46
- const aliasFile = path.join(dir, `${argvId}_${randomUUID()}.json`);
47
- await writeFile(aliasFile, aliasContent, "utf8");
48
- }
45
+ const expMs = ticketExpiryMs(ticket);
46
+ const kind = opts?.kind ?? claims?.kind ?? "shell";
47
+ await writeTicketFile(dir, id, buildTicketRecord(ticket, argv, expMs, resolvedRoot, opts, claims, true));
48
+ if (opts?.approval_fingerprint && kind === "shell") {
49
+ await writeArgvAliasTicket(dir, argv, id, buildTicketRecord(ticket, argv, expMs, resolvedRoot, opts, claims, false));
49
50
  }
50
51
  }
51
52
  //# sourceMappingURL=execution-ticket-record.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"execution-ticket-record.js","sourceRoot":"","sources":["../../src/bridge/execution-ticket-record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,SAAS,kBAAkB,CAAC,WAAoB;IAC9C,OAAO,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,IAAuB,EACvB,IAIC;IAED,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QACf,WAAW,EAAE,IAAI,EAAE,oBAAoB,IAAI,SAAS;QACpD,MAAM;QACN,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,OAAO;KAC5C,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEvC,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,sDAAsD;IACtD,IAAI,IAAI,EAAE,oBAAoB,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;gBAClC,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;gBACf,MAAM;gBACN,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,OAAO;aAC5C,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,UAAU,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"execution-ticket-record.js","sourceRoot":"","sources":["../../src/bridge/execution-ticket-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Scan bound repo tickets after already_redeemed when JWT is unavailable. */
2
+ export declare function findExistingExecutionTicket(input: {
3
+ storageRoot: string;
4
+ request_id: string;
5
+ argv_sha256: string;
6
+ }): Promise<boolean>;
7
+ //# sourceMappingURL=execution-ticket-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-ticket-scan.d.ts","sourceRoot":"","sources":["../../src/bridge/execution-ticket-scan.ts"],"names":[],"mappings":"AAMA,8EAA8E;AAC9E,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkCnB"}
@@ -0,0 +1,43 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { verifyExecutionTicket } from "../approval/grant.js";
4
+ import { guardSubpath } from "./guard-storage-root.js";
5
+ /** Scan bound repo tickets after already_redeemed when JWT is unavailable. */
6
+ export async function findExistingExecutionTicket(input) {
7
+ const dir = guardSubpath("tickets", input.storageRoot);
8
+ let names = [];
9
+ try {
10
+ names = await readdir(dir);
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ const now = Date.now();
16
+ for (const name of names) {
17
+ if (!name.endsWith(".json"))
18
+ continue;
19
+ const file = path.join(dir, name);
20
+ try {
21
+ const raw = await readFile(file, "utf8");
22
+ const row = JSON.parse(raw);
23
+ if (typeof row.exp !== "number" || row.exp < now)
24
+ continue;
25
+ const matchesRequest = row.request_id === input.request_id;
26
+ const matchesHash = row.argv_sha256 === input.argv_sha256;
27
+ if (!matchesRequest && !matchesHash)
28
+ continue;
29
+ const ticket = typeof row.ticket === "string" ? row.ticket.trim() : "";
30
+ if (!ticket)
31
+ continue;
32
+ if (verifyExecutionTicket(ticket))
33
+ return true;
34
+ if (matchesRequest || matchesHash)
35
+ return true;
36
+ }
37
+ catch {
38
+ continue;
39
+ }
40
+ }
41
+ return false;
42
+ }
43
+ //# sourceMappingURL=execution-ticket-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-ticket-scan.js","sourceRoot":"","sources":["../../src/bridge/execution-ticket-scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,KAIjD;IACC,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAKzB,CAAC;YACF,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG;gBAAE,SAAS;YAC3D,MAAM,cAAc,GAAG,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC;YAC3D,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,CAAC;YAC1D,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW;gBAAE,SAAS;YAC9C,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,IAAI,qBAAqB,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/C,IAAI,cAAc,IAAI,WAAW;gBAAE,OAAO,IAAI,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ShellApprovalFingerprintPayload } from "../shell/analyze-command.js";
2
+ export type TicketTokenConsumeOpts = {
3
+ kind?: "shell" | "mcp";
4
+ tool_input_sha256?: string | null;
5
+ approved_argv?: readonly string[];
6
+ approval_fingerprint?: ShellApprovalFingerprintPayload | null;
7
+ approved_fingerprint?: ShellApprovalFingerprintPayload | null;
8
+ };
9
+ export declare function tryConsumeTicketToken(ticket: string, argv: readonly string[], opts?: TicketTokenConsumeOpts): boolean;
10
+ //# sourceMappingURL=execution-ticket-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-ticket-token.d.ts","sourceRoot":"","sources":["../../src/bridge/execution-ticket-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAGnF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,oBAAoB,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;IAC9D,oBAAoB,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;CAC/D,CAAC;AA8EF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,CAAC,EAAE,sBAAsB,GAC5B,OAAO,CAST"}
@@ -0,0 +1,57 @@
1
+ import { getInstallId } from "../cli/install-id.js";
2
+ import { verifyExecutionTicket } from "../approval/grant.js";
3
+ import { resolveShellApprovalHash } from "../approval/argv-fingerprint.js";
4
+ import { argvMatchesApproval } from "./execution-ticket-match.js";
5
+ function verifyTicketToolInputHash(opts, claims) {
6
+ const expectedToolHash = opts?.tool_input_sha256?.trim() || null;
7
+ const claimToolHash = typeof claims.tool_input_sha256 === "string" ? claims.tool_input_sha256.trim() : null;
8
+ if (claimToolHash && expectedToolHash && claimToolHash !== expectedToolHash)
9
+ return false;
10
+ if (claimToolHash && !expectedToolHash)
11
+ return false;
12
+ return true;
13
+ }
14
+ function verifyClaimsInstallAndKind(claims, opts) {
15
+ if (claims.install_id !== getInstallId())
16
+ return false;
17
+ if (opts?.kind && claims.kind !== opts.kind)
18
+ return false;
19
+ return verifyTicketToolInputHash(opts, claims);
20
+ }
21
+ function verifyWithoutJwtClaims(argv, opts) {
22
+ return argvMatchesApproval(opts?.approved_argv, argv, opts?.kind, opts?.approved_fingerprint, opts?.approval_fingerprint);
23
+ }
24
+ function verifyApprovedArgvClaims(claims, argv, approvedArgv, opts) {
25
+ const approvedHash = resolveShellApprovalHash({
26
+ kind: opts?.kind ?? claims.kind ?? "shell",
27
+ argv: approvedArgv,
28
+ approval_fingerprint: opts?.approved_fingerprint ?? opts?.approval_fingerprint,
29
+ });
30
+ if (claims.argv_sha256 !== approvedHash)
31
+ return false;
32
+ if (!argvMatchesApproval(approvedArgv, argv, opts?.kind ?? claims.kind, opts?.approved_fingerprint, opts?.approval_fingerprint)) {
33
+ return false;
34
+ }
35
+ return verifyClaimsInstallAndKind(claims, opts);
36
+ }
37
+ function verifyDirectArgvClaims(claims, argv, opts) {
38
+ const expectedHash = resolveShellApprovalHash({
39
+ kind: opts?.kind ?? "shell",
40
+ argv,
41
+ approval_fingerprint: opts?.approval_fingerprint,
42
+ });
43
+ if (claims.argv_sha256 !== expectedHash)
44
+ return false;
45
+ return verifyClaimsInstallAndKind(claims, opts);
46
+ }
47
+ export function tryConsumeTicketToken(ticket, argv, opts) {
48
+ const claims = verifyExecutionTicket(ticket);
49
+ if (!claims)
50
+ return verifyWithoutJwtClaims(argv, opts);
51
+ const approvedArgv = opts?.approved_argv;
52
+ if (approvedArgv) {
53
+ return verifyApprovedArgvClaims(claims, argv, approvedArgv, opts);
54
+ }
55
+ return verifyDirectArgvClaims(claims, argv, opts);
56
+ }
57
+ //# sourceMappingURL=execution-ticket-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-ticket-token.js","sourceRoot":"","sources":["../../src/bridge/execution-ticket-token.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type WorkspaceHints } from "./guard-workspace-session.js";
2
+ export { isEphemeralWorkspacePath, isReliableWorkspaceRoot, readActiveWorkspaceFromSession, } from "./guard-workspace-session.js";
2
3
  /** Canonical (IDE-neutral) subdir for guard runtime state under a workspace root. */
3
4
  export declare const GUARD_DIR = ".praxis/guard";
4
5
  /** Legacy Cursor-only subdir. Read for back-compat; new writes go to GUARD_DIR. */
@@ -17,6 +18,8 @@ export declare const LEGACY_GUARD_DIR = ".cursor/guard";
17
18
  export declare function resolveGuardStorageRoot(preferredCwd?: string): string;
18
19
  /** Resolve guard storage from hook/MCP workspace hints (shared by hooks and guard MCP). */
19
20
  export declare function resolveGuardStorageRootFromHints(hints?: WorkspaceHints): string;
21
+ /** Persist a resolved repo root so MCP guard writes tickets where hooks read them. */
22
+ export declare function rememberResolvedWorkspaceRoot(resolvedRoot: string): void;
20
23
  /** Persist the active workspace so MCP guard can align tickets with hook cwd. */
21
24
  export declare function rememberActiveWorkspace(hints?: WorkspaceHints): void;
22
25
  /** Absolute path to the guard storage dir for a given preferred cwd. */
@@ -1 +1 @@
1
- {"version":3,"file":"guard-storage-root.d.ts","sourceRoot":"","sources":["../../src/bridge/guard-storage-root.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AAEtC,qFAAqF;AACrF,eAAO,MAAM,SAAS,kBAAkB,CAAC;AAEzC,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAWhD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBrE;AAED,2FAA2F;AAC3F,wBAAgB,gCAAgC,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,CAE/E;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,CAQpE;AA4BD,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"guard-storage-root.d.ts","sourceRoot":"","sources":["../../src/bridge/guard-storage-root.ts"],"names":[],"mappings":"AAIA,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC;AAEtC,qFAAqF;AACrF,eAAO,MAAM,SAAS,kBAAkB,CAAC;AAEzC,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAWhD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAsBrE;AAED,2FAA2F;AAC3F,wBAAgB,gCAAgC,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,CAE/E;AAED,sFAAsF;AACtF,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAGxE;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,CAKpE;AA4BD,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { existsSync, mkdirSync, renameSync } from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
- import { pickWorkspaceHint, resolvePreferredWorkspaceCwd, writeActiveWorkspaceSession, } from "./guard-workspace-session.js";
4
+ import { pickWorkspaceHint, readActiveWorkspaceFromSession, resolvePreferredWorkspaceCwd, isReliableWorkspaceRoot, writeActiveWorkspaceSession, } from "./guard-workspace-session.js";
5
+ export { isEphemeralWorkspacePath, isReliableWorkspaceRoot, readActiveWorkspaceFromSession, } from "./guard-workspace-session.js";
5
6
  /** Canonical (IDE-neutral) subdir for guard runtime state under a workspace root. */
6
7
  export const GUARD_DIR = ".praxis/guard";
7
8
  /** Legacy Cursor-only subdir. Read for back-compat; new writes go to GUARD_DIR. */
@@ -41,21 +42,30 @@ export function resolveGuardStorageRoot(preferredCwd) {
41
42
  break;
42
43
  dir = path.dirname(dir);
43
44
  }
44
- return preferredCwd?.trim() ? path.resolve(preferredCwd.trim()) : process.cwd();
45
+ const fallback = preferredCwd?.trim() ? path.resolve(preferredCwd.trim()) : process.cwd();
46
+ if (isReliableWorkspaceRoot(fallback))
47
+ return fallback;
48
+ const cached = readActiveWorkspaceFromSession();
49
+ if (cached)
50
+ return cached;
51
+ return fallback;
45
52
  }
46
53
  /** Resolve guard storage from hook/MCP workspace hints (shared by hooks and guard MCP). */
47
54
  export function resolveGuardStorageRootFromHints(hints) {
48
55
  return resolveGuardStorageRoot(resolvePreferredWorkspaceCwd(hints));
49
56
  }
57
+ /** Persist a resolved repo root so MCP guard writes tickets where hooks read them. */
58
+ export function rememberResolvedWorkspaceRoot(resolvedRoot) {
59
+ if (!isReliableWorkspaceRoot(resolvedRoot))
60
+ return;
61
+ writeActiveWorkspaceSession(resolvedRoot);
62
+ }
50
63
  /** Persist the active workspace so MCP guard can align tickets with hook cwd. */
51
64
  export function rememberActiveWorkspace(hints) {
52
65
  const preferred = pickWorkspaceHint(hints);
53
66
  if (!preferred)
54
67
  return;
55
- const root = resolveGuardStorageRoot(preferred);
56
- if (isGlobalHomePraxisMarker(root))
57
- return;
58
- writeActiveWorkspaceSession(root);
68
+ rememberResolvedWorkspaceRoot(resolveGuardStorageRoot(preferred));
59
69
  }
60
70
  const migratedRoots = new Set();
61
71
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"guard-storage-root.js","sourceRoot":"","sources":["../../src/bridge/guard-storage-root.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guard-storage-root.js","sourceRoot":"","sources":["../../src/bridge/guard-storage-root.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,17 @@
1
+ /**
2
+ * Hook/MCP scratch dirs under tmp (e.g. auditor-hook-*) must not anchor tickets.
3
+ * Nested project paths under tmp (…/Projects/Praxis) remain valid for tests and CI.
4
+ */
5
+ export declare function isEphemeralWorkspacePath(resolved: string): boolean;
6
+ /** Repo-like roots where hooks and MCP should read/write guard state. */
7
+ export declare function isReliableWorkspaceRoot(resolved: string): boolean;
1
8
  export type WorkspaceHints = {
2
9
  cwd?: string | null;
3
10
  workspaceRoot?: string | null;
4
11
  workspaceRoots?: readonly string[] | null;
5
12
  };
13
+ /** Last hook-fired workspace; ignored when ephemeral or no longer on disk. */
14
+ export declare function readActiveWorkspaceFromSession(): string | undefined;
6
15
  export declare function pickWorkspaceHint(hints?: WorkspaceHints): string | undefined;
7
16
  /** Best cwd hint for workspace-scoped guard state (hooks, MCP guard, tickets). */
8
17
  export declare function resolvePreferredWorkspaceCwd(hints?: WorkspaceHints): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"guard-workspace-session.d.ts","sourceRoot":"","sources":["../../src/bridge/guard-workspace-session.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAC3C,CAAC;AA4CF,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,kFAAkF;AAClF,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAavE"}
1
+ {"version":3,"file":"guard-workspace-session.d.ts","sourceRoot":"","sources":["../../src/bridge/guard-workspace-session.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYlE;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CASjE;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAC3C,CAAC;AAsBF,8EAA8E;AAC9E,wBAAgB,8BAA8B,IAAI,MAAM,GAAG,SAAS,CAcnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,kFAAkF;AAClF,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAavE"}
@@ -4,6 +4,39 @@ import path from "node:path";
4
4
  function activeWorkspaceFile() {
5
5
  return path.join(os.homedir(), ".praxis", "guard", "active-workspace.json");
6
6
  }
7
+ function isUserHomeDir(dir) {
8
+ return path.resolve(dir) === path.resolve(os.homedir());
9
+ }
10
+ /**
11
+ * Hook/MCP scratch dirs under tmp (e.g. auditor-hook-*) must not anchor tickets.
12
+ * Nested project paths under tmp (…/Projects/Praxis) remain valid for tests and CI.
13
+ */
14
+ export function isEphemeralWorkspacePath(resolved) {
15
+ const normalized = path.resolve(resolved);
16
+ const base = path.basename(normalized);
17
+ if (/^auditor-hook-/.test(base))
18
+ return true;
19
+ const tmp = path.resolve(os.tmpdir());
20
+ if (normalized !== tmp && !normalized.startsWith(`${tmp}${path.sep}`))
21
+ return false;
22
+ const relative = path.relative(tmp, normalized);
23
+ if (!relative || relative.startsWith(".."))
24
+ return false;
25
+ if (relative.includes(path.sep))
26
+ return false;
27
+ return !existsSync(path.join(normalized, ".git"));
28
+ }
29
+ /** Repo-like roots where hooks and MCP should read/write guard state. */
30
+ export function isReliableWorkspaceRoot(resolved) {
31
+ const normalized = path.resolve(resolved);
32
+ if (isEphemeralWorkspacePath(normalized))
33
+ return false;
34
+ if (isUserHomeDir(normalized) && existsSync(path.join(normalized, ".praxis")))
35
+ return false;
36
+ return (existsSync(path.join(normalized, ".git")) ||
37
+ existsSync(path.join(normalized, ".praxis")) ||
38
+ existsSync(path.join(normalized, ".cursor", "hooks.json")));
39
+ }
7
40
  function pickExplicitWorkspaceHint(hints) {
8
41
  const envRoot = process.env.PRAXIS_GUARD_WORKSPACE_ROOT?.trim();
9
42
  if (envRoot)
@@ -23,7 +56,8 @@ function pickExplicitWorkspaceHint(hints) {
23
56
  }
24
57
  return undefined;
25
58
  }
26
- function readActiveWorkspaceFromSession() {
59
+ /** Last hook-fired workspace; ignored when ephemeral or no longer on disk. */
60
+ export function readActiveWorkspaceFromSession() {
27
61
  try {
28
62
  const raw = readFileSync(activeWorkspaceFile(), "utf8");
29
63
  const parsed = JSON.parse(raw);
@@ -33,16 +67,13 @@ function readActiveWorkspaceFromSession() {
33
67
  const root = path.resolve(parsed.workspace_root.trim());
34
68
  if (!existsSync(root))
35
69
  return undefined;
36
- if (existsSync(path.join(root, ".git")) ||
37
- existsSync(path.join(root, ".praxis")) ||
38
- existsSync(path.join(root, ".cursor", "hooks.json"))) {
39
- return root;
40
- }
70
+ if (!isReliableWorkspaceRoot(root))
71
+ return undefined;
72
+ return root;
41
73
  }
42
74
  catch {
43
75
  return undefined;
44
76
  }
45
- return undefined;
46
77
  }
47
78
  export function pickWorkspaceHint(hints) {
48
79
  return pickExplicitWorkspaceHint(hints);
@@ -1 +1 @@
1
- {"version":3,"file":"guard-workspace-session.js","sourceRoot":"","sources":["../../src/bridge/guard-workspace-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guard-workspace-session.js","sourceRoot":"","sources":["../../src/bridge/guard-workspace-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export type RequestBindingRecord = {
2
+ request_id: string;
3
+ storage_root: string;
4
+ argv_sha256: string;
5
+ argv: string[];
6
+ kind: "shell" | "mcp";
7
+ install_id: string;
8
+ created_at: string;
9
+ expires_at: string;
10
+ };
11
+ export type RequestBindingIndexHealth = {
12
+ bindingCount: number;
13
+ lastBinding: RequestBindingRecord | null;
14
+ legacyHomeTicketsDir: boolean;
15
+ };
16
+ export declare function writeRequestBinding(entry: RequestBindingRecord): void;
17
+ export declare function readRequestBinding(requestId: string): RequestBindingRecord | null;
18
+ export declare function deleteRequestBinding(requestId: string): void;
19
+ export declare function inspectRequestBindingIndex(): RequestBindingIndexHealth;
20
+ //# sourceMappingURL=request-binding-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-binding-index.d.ts","sourceRoot":"","sources":["../../src/bridge/request-binding-index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACzC,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAyCF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAOrE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAajF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAM5D;AAED,wBAAgB,0BAA0B,IAAI,yBAAyB,CA6BtE"}
@@ -0,0 +1,100 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ function requestBindingsDir() {
5
+ return path.join(os.homedir(), ".praxis", "guard", "request-bindings");
6
+ }
7
+ function bindingPath(requestId) {
8
+ return path.join(requestBindingsDir(), `${requestId}.json`);
9
+ }
10
+ function isBindingExpired(record) {
11
+ const expires = Date.parse(record.expires_at);
12
+ return Number.isFinite(expires) && expires < Date.now();
13
+ }
14
+ function nonEmptyString(value) {
15
+ return typeof value === "string" && value.trim().length > 0;
16
+ }
17
+ function hasValidBindingShape(record) {
18
+ return (nonEmptyString(record.storage_root) &&
19
+ nonEmptyString(record.argv_sha256) &&
20
+ Array.isArray(record.argv) &&
21
+ (record.kind === "shell" || record.kind === "mcp") &&
22
+ nonEmptyString(record.install_id) &&
23
+ nonEmptyString(record.expires_at));
24
+ }
25
+ function parseValidBindingRecord(parsed, requestId) {
26
+ if (!parsed || typeof parsed !== "object")
27
+ return null;
28
+ const record = parsed;
29
+ if (record.request_id !== requestId || !hasValidBindingShape(record))
30
+ return null;
31
+ if (isBindingExpired(record))
32
+ return null;
33
+ return {
34
+ ...record,
35
+ storage_root: path.resolve(record.storage_root.trim()),
36
+ };
37
+ }
38
+ export function writeRequestBinding(entry) {
39
+ const dir = requestBindingsDir();
40
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
41
+ writeFileSync(bindingPath(entry.request_id), `${JSON.stringify(entry, null, 2)}\n`, {
42
+ encoding: "utf8",
43
+ mode: 0o600,
44
+ });
45
+ }
46
+ export function readRequestBinding(requestId) {
47
+ try {
48
+ const raw = readFileSync(bindingPath(requestId), "utf8");
49
+ const parsed = JSON.parse(raw);
50
+ const record = parseValidBindingRecord(parsed, requestId);
51
+ if (record)
52
+ return record;
53
+ if (parsed && typeof parsed === "object" && isBindingExpired(parsed)) {
54
+ deleteRequestBinding(requestId);
55
+ }
56
+ return null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ export function deleteRequestBinding(requestId) {
63
+ try {
64
+ unlinkSync(bindingPath(requestId));
65
+ }
66
+ catch {
67
+ // best-effort
68
+ }
69
+ }
70
+ export function inspectRequestBindingIndex() {
71
+ const dir = requestBindingsDir();
72
+ const legacyHomeTicketsDir = existsSync(path.join(os.homedir(), ".praxis", "guard", "tickets"));
73
+ let bindingCount = 0;
74
+ let lastBinding = null;
75
+ let lastMtime = 0;
76
+ if (!existsSync(dir)) {
77
+ return { bindingCount: 0, lastBinding: null, legacyHomeTicketsDir };
78
+ }
79
+ for (const name of readdirSync(dir)) {
80
+ if (!name.endsWith(".json"))
81
+ continue;
82
+ const requestId = name.slice(0, -".json".length);
83
+ const record = readRequestBinding(requestId);
84
+ if (!record)
85
+ continue;
86
+ bindingCount += 1;
87
+ try {
88
+ const mtime = statSync(bindingPath(requestId)).mtimeMs;
89
+ if (mtime >= lastMtime) {
90
+ lastMtime = mtime;
91
+ lastBinding = record;
92
+ }
93
+ }
94
+ catch {
95
+ lastBinding = record;
96
+ }
97
+ }
98
+ return { bindingCount, lastBinding, legacyHomeTicketsDir };
99
+ }
100
+ //# sourceMappingURL=request-binding-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-binding-index.js","sourceRoot":"","sources":["../../src/bridge/request-binding-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ShellApprovalFingerprintPayload } from "../shell/analyze-command.js";
2
+ export declare function recordRequestBinding(input: {
3
+ request_id: string;
4
+ storage_root: string;
5
+ argv: readonly string[];
6
+ kind: "shell" | "mcp";
7
+ expires_at: string;
8
+ approval_fingerprint?: ShellApprovalFingerprintPayload | null;
9
+ }): void;
10
+ //# sourceMappingURL=request-binding-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-binding-write.d.ts","sourceRoot":"","sources":["../../src/bridge/request-binding-write.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAGnF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,+BAA+B,GAAG,IAAI,CAAC;CAC/D,GAAG,IAAI,CAgBP"}
@@ -0,0 +1,21 @@
1
+ import { getInstallId } from "../cli/install-id.js";
2
+ import { resolveShellApprovalHash } from "../approval/argv-fingerprint.js";
3
+ import { writeRequestBinding } from "./request-binding-index.js";
4
+ export function recordRequestBinding(input) {
5
+ const entry = {
6
+ request_id: input.request_id,
7
+ storage_root: input.storage_root,
8
+ argv_sha256: resolveShellApprovalHash({
9
+ kind: input.kind,
10
+ argv: input.argv,
11
+ approval_fingerprint: input.approval_fingerprint,
12
+ }),
13
+ argv: [...input.argv],
14
+ kind: input.kind,
15
+ install_id: getInstallId(),
16
+ created_at: new Date().toISOString(),
17
+ expires_at: input.expires_at,
18
+ };
19
+ writeRequestBinding(entry);
20
+ }
21
+ //# sourceMappingURL=request-binding-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-binding-write.js","sourceRoot":"","sources":["../../src/bridge/request-binding-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,EAAE,mBAAmB,EAA6B,MAAM,4BAA4B,CAAC;AAE5F,MAAM,UAAU,oBAAoB,CAAC,KAOpC;IACC,MAAM,KAAK,GAAyB;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,wBAAwB,CAAC;YACpC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;SACjD,CAAC;QACF,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,YAAY,EAAE;QAC1B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IACF,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
@@ -1 +1 @@
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;AA6DD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG/C"}
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;AAWtE,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;AA6DD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA8G/C"}