@praxis.guard/auditor-cli 0.0.54 → 0.0.56

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 (89) hide show
  1. package/dist/adapters/cursor.d.ts.map +1 -1
  2. package/dist/adapters/cursor.js +2 -1
  3. package/dist/adapters/cursor.js.map +1 -1
  4. package/dist/adapters/types.d.ts +2 -0
  5. package/dist/adapters/types.d.ts.map +1 -1
  6. package/dist/cli/cursor-config/hooks-config.d.ts.map +1 -1
  7. package/dist/cli/cursor-config/hooks-config.js +27 -8
  8. package/dist/cli/cursor-config/hooks-config.js.map +1 -1
  9. package/dist/cli/cursor-config/mcp-config.d.ts +1 -1
  10. package/dist/cli/cursor-config/mcp-config.d.ts.map +1 -1
  11. package/dist/cli/cursor-config/mcp-config.js +10 -5
  12. package/dist/cli/cursor-config/mcp-config.js.map +1 -1
  13. package/dist/cli/cursor-config/types.d.ts +1 -0
  14. package/dist/cli/cursor-config/types.d.ts.map +1 -1
  15. package/dist/cli/daemon.d.ts +2 -0
  16. package/dist/cli/daemon.d.ts.map +1 -0
  17. package/dist/cli/daemon.js +35 -0
  18. package/dist/cli/daemon.js.map +1 -0
  19. package/dist/cli/dispatch-setup.d.ts.map +1 -1
  20. package/dist/cli/dispatch-setup.js +7 -0
  21. package/dist/cli/dispatch-setup.js.map +1 -1
  22. package/dist/cli/help.d.ts.map +1 -1
  23. package/dist/cli/help.js +15 -3
  24. package/dist/cli/help.js.map +1 -1
  25. package/dist/cli/main.d.ts.map +1 -1
  26. package/dist/cli/main.js +12 -0
  27. package/dist/cli/main.js.map +1 -1
  28. package/dist/cli/setup-all.d.ts +1 -0
  29. package/dist/cli/setup-all.d.ts.map +1 -1
  30. package/dist/cli/setup-all.js +11 -1
  31. package/dist/cli/setup-all.js.map +1 -1
  32. package/dist/cli/setup-doctor.d.ts.map +1 -1
  33. package/dist/cli/setup-doctor.js +3 -0
  34. package/dist/cli/setup-doctor.js.map +1 -1
  35. package/dist/cli/setup-gateway.d.ts +11 -0
  36. package/dist/cli/setup-gateway.d.ts.map +1 -0
  37. package/dist/cli/setup-gateway.js +220 -0
  38. package/dist/cli/setup-gateway.js.map +1 -0
  39. package/dist/cli/setup-hook.d.ts +1 -0
  40. package/dist/cli/setup-hook.d.ts.map +1 -1
  41. package/dist/cli/setup-hook.js +10 -1
  42. package/dist/cli/setup-hook.js.map +1 -1
  43. package/dist/cli/setup-mcp.d.ts +1 -0
  44. package/dist/cli/setup-mcp.d.ts.map +1 -1
  45. package/dist/cli/setup-mcp.js +10 -1
  46. package/dist/cli/setup-mcp.js.map +1 -1
  47. package/dist/daemon/client.d.ts +15 -0
  48. package/dist/daemon/client.d.ts.map +1 -0
  49. package/dist/daemon/client.js +80 -0
  50. package/dist/daemon/client.js.map +1 -0
  51. package/dist/daemon/lifecycle.d.ts +4 -0
  52. package/dist/daemon/lifecycle.d.ts.map +1 -0
  53. package/dist/daemon/lifecycle.js +52 -0
  54. package/dist/daemon/lifecycle.js.map +1 -0
  55. package/dist/daemon/paths.d.ts +6 -0
  56. package/dist/daemon/paths.d.ts.map +1 -0
  57. package/dist/daemon/paths.js +41 -0
  58. package/dist/daemon/paths.js.map +1 -0
  59. package/dist/daemon/protocol.d.ts +41 -0
  60. package/dist/daemon/protocol.d.ts.map +1 -0
  61. package/dist/daemon/protocol.js +2 -0
  62. package/dist/daemon/protocol.js.map +1 -0
  63. package/dist/daemon/service.d.ts +3 -0
  64. package/dist/daemon/service.d.ts.map +1 -0
  65. package/dist/daemon/service.js +83 -0
  66. package/dist/daemon/service.js.map +1 -0
  67. package/dist/mcp/evaluate-guard.d.ts.map +1 -1
  68. package/dist/mcp/evaluate-guard.js +34 -2
  69. package/dist/mcp/evaluate-guard.js.map +1 -1
  70. package/dist/mcp/gateway-config.d.ts +12 -0
  71. package/dist/mcp/gateway-config.d.ts.map +1 -1
  72. package/dist/mcp/gateway-config.js +1 -1
  73. package/dist/mcp/gateway-config.js.map +1 -1
  74. package/dist/mcp/gateway.d.ts +7 -0
  75. package/dist/mcp/gateway.d.ts.map +1 -1
  76. package/dist/mcp/gateway.js +48 -4
  77. package/dist/mcp/gateway.js.map +1 -1
  78. package/dist/mcp/server.d.ts.map +1 -1
  79. package/dist/mcp/server.js +32 -6
  80. package/dist/mcp/server.js.map +1 -1
  81. package/native/darwin-amd64/praxis-guard-daemon +0 -0
  82. package/native/darwin-amd64/praxis-guard-hook +0 -0
  83. package/native/darwin-arm64/praxis-guard-daemon +0 -0
  84. package/native/darwin-arm64/praxis-guard-hook +0 -0
  85. package/native/linux-amd64/praxis-guard-daemon +0 -0
  86. package/native/linux-amd64/praxis-guard-hook +0 -0
  87. package/native/linux-arm64/praxis-guard-daemon +0 -0
  88. package/native/linux-arm64/praxis-guard-hook +0 -0
  89. package/package.json +5 -2
@@ -0,0 +1,11 @@
1
+ type GatewayOptions = {
2
+ apply: boolean;
3
+ revert: boolean;
4
+ force: boolean;
5
+ desktopPath?: string;
6
+ gatewayPath?: string;
7
+ };
8
+ export declare function parseSetupGatewayOptions(args: string[]): GatewayOptions;
9
+ export declare function runSetupGateway(args: string[]): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=setup-gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-gateway.d.ts","sourceRoot":"","sources":["../../src/cli/setup-gateway.ts"],"names":[],"mappings":"AA2BA,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAIF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAavE;AAsCD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASnE"}
@@ -0,0 +1,220 @@
1
+ import { copyFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { claudeDesktopConfigPath } from "../adapters/claude-desktop.js";
5
+ import { readJson, writeJsonAtomic } from "../adapters/claude-code/config-io.js";
6
+ import { gatewayKeyError, resolveGatewayConfigPath } from "../mcp/gateway-config.js";
7
+ /**
8
+ * `auditor setup gateway` — migrate Claude Desktop's other MCP connectors behind
9
+ * the Praxis gateway (Phase 2b; flips Desktop from advisory to enforced).
10
+ *
11
+ * bare dry-run: print the plan, write nothing
12
+ * --apply perform the migration (timestamped backup first)
13
+ * --revert dry-run: show which backup would be restored
14
+ * --revert --apply restore the newest backup (refuses on drift unless --force)
15
+ *
16
+ * The single gateway entry (key `praxis-guard`, `auditor mcp gateway`) replaces
17
+ * the advisory `praxis-guard` entry; every other downstream server moves verbatim
18
+ * into the gateway config (~/.praxis/gateway-servers.json). Because Desktop reads
19
+ * its config at launch, the user must quit and relaunch for changes to take effect.
20
+ */
21
+ const GATEWAY_KEY = "praxis-guard";
22
+ const AGENT_HOST = "claude-desktop";
23
+ const BACKUP_SUFFIX = ".praxis-bak-";
24
+ export function parseSetupGatewayOptions(args) {
25
+ const opts = { apply: false, revert: false, force: false };
26
+ for (let i = 0; i < args.length; i++) {
27
+ const arg = args[i];
28
+ if (arg === "--apply")
29
+ opts.apply = true;
30
+ else if (arg === "--revert")
31
+ opts.revert = true;
32
+ else if (arg === "--force")
33
+ opts.force = true;
34
+ else if (arg === "--dry-run")
35
+ opts.apply = false;
36
+ else if (arg === "--desktop-config")
37
+ opts.desktopPath = requireValue(args, ++i, arg);
38
+ else if (arg === "--gateway-config")
39
+ opts.gatewayPath = requireValue(args, ++i, arg);
40
+ else
41
+ throw new Error(`Unknown setup gateway option: ${arg}`);
42
+ }
43
+ return opts;
44
+ }
45
+ function requireValue(args, i, flag) {
46
+ const v = args[i];
47
+ if (!v)
48
+ throw new Error(`Missing value for ${flag}`);
49
+ return v;
50
+ }
51
+ function asServerMap(v) {
52
+ if (!v || typeof v !== "object" || Array.isArray(v))
53
+ return {};
54
+ return v;
55
+ }
56
+ /** A movable downstream entry is `{ command:string, args?:string[], env?:Record<string,string> }`. */
57
+ function validateDownstreamEntry(entry) {
58
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
59
+ return { ok: false, reason: "not an object" };
60
+ const e = entry;
61
+ if (typeof e.command !== "string" || !e.command.trim())
62
+ return { ok: false, reason: "missing string 'command'" };
63
+ if (e.args !== undefined && !(Array.isArray(e.args) && e.args.every((a) => typeof a === "string"))) {
64
+ return { ok: false, reason: "'args' must be an array of strings" };
65
+ }
66
+ if (e.env !== undefined && (typeof e.env !== "object" || e.env === null || Array.isArray(e.env))) {
67
+ return { ok: false, reason: "'env' must be an object" };
68
+ }
69
+ const value = { command: e.command };
70
+ if (e.args)
71
+ value.args = e.args;
72
+ if (e.env)
73
+ value.env = e.env;
74
+ return { ok: true, value };
75
+ }
76
+ function gatewayEntry(existingEnv) {
77
+ return { command: "auditor", args: ["mcp", "gateway"], env: { ...existingEnv, PRAXIS_AGENT_HOST: AGENT_HOST } };
78
+ }
79
+ function out(line) {
80
+ process.stdout.write(`${line}\n`);
81
+ }
82
+ export async function runSetupGateway(args) {
83
+ const opts = parseSetupGatewayOptions(args);
84
+ const desktopPath = opts.desktopPath?.trim() || claudeDesktopConfigPath();
85
+ const gatewayPath = opts.gatewayPath?.trim() || resolveGatewayConfigPath();
86
+ if (opts.revert) {
87
+ await revertMigration(desktopPath, opts);
88
+ return;
89
+ }
90
+ await applyMigration(desktopPath, gatewayPath, opts);
91
+ }
92
+ function buildPlan(desktop, gateway, gatewayPath) {
93
+ const desktopServers = asServerMap(desktop.mcpServers);
94
+ const gatewayServers = asServerMap(gateway.mcpServers);
95
+ const toMove = [];
96
+ const rejected = [];
97
+ const collisions = [];
98
+ for (const [key, entry] of Object.entries(desktopServers)) {
99
+ if (key === GATEWAY_KEY)
100
+ continue; // the advisory/gateway entry; replaced below
101
+ const keyErr = gatewayKeyError(key, gatewayPath);
102
+ if (keyErr) {
103
+ rejected.push({ key, reason: keyErr });
104
+ continue;
105
+ }
106
+ const v = validateDownstreamEntry(entry);
107
+ if (!v.ok) {
108
+ rejected.push({ key, reason: v.reason });
109
+ continue;
110
+ }
111
+ if (key in gatewayServers) {
112
+ collisions.push(key);
113
+ continue;
114
+ }
115
+ toMove.push({ key, entry: v.value });
116
+ }
117
+ // New Desktop: keep entries we could not move (rejected/collision stay direct),
118
+ // drop the moved ones, and set the single gateway entry.
119
+ const movedKeys = new Set(toMove.map((m) => m.key));
120
+ const newDesktopServers = {};
121
+ for (const [key, entry] of Object.entries(desktopServers)) {
122
+ if (key === GATEWAY_KEY || movedKeys.has(key))
123
+ continue;
124
+ newDesktopServers[key] = entry;
125
+ }
126
+ const prevGwEnv = desktopServers[GATEWAY_KEY] && typeof desktopServers[GATEWAY_KEY].env === "object" && desktopServers[GATEWAY_KEY].env
127
+ ? desktopServers[GATEWAY_KEY].env
128
+ : {};
129
+ newDesktopServers[GATEWAY_KEY] = gatewayEntry(prevGwEnv);
130
+ const newDesktop = { ...desktop, mcpServers: newDesktopServers };
131
+ const newGatewayServers = { ...gatewayServers };
132
+ for (const m of toMove)
133
+ newGatewayServers[m.key] = m.entry;
134
+ const newGateway = { ...gateway, mcpServers: newGatewayServers };
135
+ const changed = JSON.stringify(desktop) !== JSON.stringify(newDesktop);
136
+ return { toMove, rejected, collisions, newDesktop, newGateway, changed };
137
+ }
138
+ function printPlan(plan, desktopPath, gatewayPath) {
139
+ out(`Desktop config: ${desktopPath}`);
140
+ out(`Gateway config: ${gatewayPath}`);
141
+ if (plan.toMove.length === 0)
142
+ out(" servers to migrate: none");
143
+ else
144
+ out(` servers to migrate -> gateway: ${plan.toMove.map((m) => m.key).join(", ")}`);
145
+ out(` gateway entry: ${GATEWAY_KEY} -> auditor mcp gateway`);
146
+ for (const r of plan.rejected)
147
+ out(` LEFT DIRECT (not gated): ${r.key} — ${r.reason}`);
148
+ for (const c of plan.collisions)
149
+ out(` LEFT DIRECT (already in gateway config): ${c}`);
150
+ }
151
+ async function applyMigration(desktopPath, gatewayPath, opts) {
152
+ const existing = await readJson(desktopPath); // throws on malformed JSON -> abort, no write
153
+ const desktop = existing ?? {};
154
+ const gateway = (await readJson(gatewayPath)) ?? {};
155
+ const plan = buildPlan(desktop, gateway, gatewayPath);
156
+ printPlan(plan, desktopPath, gatewayPath);
157
+ if (!plan.changed) {
158
+ out("Already routed through the gateway; nothing to migrate.");
159
+ return;
160
+ }
161
+ if (!opts.apply) {
162
+ out("Dry run: no files written. Re-run with --apply to migrate.");
163
+ return;
164
+ }
165
+ if (existing) {
166
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
167
+ const backup = `${desktopPath}${BACKUP_SUFFIX}${stamp}`;
168
+ await copyFile(desktopPath, backup);
169
+ out(`Backed up Desktop config to ${backup}`);
170
+ }
171
+ await writeJsonAtomic(gatewayPath, plan.newGateway);
172
+ await writeJsonAtomic(desktopPath, plan.newDesktop);
173
+ out("Migrated. Quit and relaunch Claude Desktop for changes to take effect.");
174
+ }
175
+ /** Migrated shape = the only mcpServers entry is the gateway entry. Anything else = drift. */
176
+ function isMigratedShape(desktop) {
177
+ const servers = asServerMap(desktop?.mcpServers);
178
+ const keys = Object.keys(servers);
179
+ if (keys.length !== 1 || keys[0] !== GATEWAY_KEY)
180
+ return false;
181
+ const args = servers[GATEWAY_KEY].args;
182
+ return Array.isArray(args) && args.length === 2 && args[0] === "mcp" && args[1] === "gateway";
183
+ }
184
+ async function newestBackup(desktopPath) {
185
+ const dir = path.dirname(desktopPath);
186
+ const base = path.basename(desktopPath);
187
+ let names = [];
188
+ try {
189
+ names = await readdir(dir);
190
+ }
191
+ catch {
192
+ return null;
193
+ }
194
+ const baks = names.filter((n) => n.startsWith(`${base}${BACKUP_SUFFIX}`)).sort();
195
+ // ISO-8601 stamps sort lexically by time, so the last is the newest.
196
+ return baks.length ? path.join(dir, baks[baks.length - 1]) : null;
197
+ }
198
+ async function revertMigration(desktopPath, opts) {
199
+ const backup = await newestBackup(desktopPath);
200
+ if (!backup) {
201
+ process.stderr.write(`No Praxis backup found beside ${desktopPath}; nothing to revert.\n`);
202
+ process.exitCode = 1;
203
+ return;
204
+ }
205
+ const current = await readJson(desktopPath).catch(() => null);
206
+ if (!opts.force && !isMigratedShape(current)) {
207
+ process.stderr.write(`Live Desktop config changed since migration (drift detected): ${desktopPath}\n` +
208
+ `Restoring would discard those changes. Re-run with --force to overwrite anyway.\n`);
209
+ process.exitCode = 1;
210
+ return;
211
+ }
212
+ out(`Would restore ${desktopPath} from ${backup}`);
213
+ if (!opts.apply) {
214
+ out("Dry run: no files written. Re-run with --revert --apply to restore.");
215
+ return;
216
+ }
217
+ await copyFile(backup, desktopPath);
218
+ out(`Restored ${desktopPath}. Quit and relaunch Claude Desktop for changes to take effect.`);
219
+ }
220
+ //# sourceMappingURL=setup-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-gateway.js","sourceRoot":"","sources":["../../src/cli/setup-gateway.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export type HookSetupOptions = {
5
5
  explicitHooksPath?: string;
6
6
  dryRun: boolean;
7
7
  forIds: AgentId[];
8
+ nativeHooks: boolean;
8
9
  };
9
10
  export declare function parseSetupHookOptions(args: string[]): HookSetupOptions;
10
11
  export declare function runSetupHook(args: string[]): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"setup-hook.d.ts","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAMF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAqCtE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhE"}
1
+ {"version":3,"file":"setup-hook.d.ts","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAMF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA0CtE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhE"}
@@ -10,12 +10,17 @@ export function parseSetupHookOptions(args) {
10
10
  let projectDir = process.cwd();
11
11
  let explicitHooksPath;
12
12
  let dryRun = false;
13
+ let nativeHooks = false;
13
14
  for (let i = 0; i < rest.length; i++) {
14
15
  const arg = rest[i];
15
16
  if (arg === "--dry-run") {
16
17
  dryRun = true;
17
18
  continue;
18
19
  }
20
+ if (arg === "--native-hooks") {
21
+ nativeHooks = true;
22
+ continue;
23
+ }
19
24
  if (arg === "--hooks-config") {
20
25
  const value = rest[i + 1];
21
26
  if (!value)
@@ -38,11 +43,14 @@ export function parseSetupHookOptions(args) {
38
43
  if (explicitHooksPath && scope === "project") {
39
44
  throw new Error("Use either --project or --hooks-config, not both.");
40
45
  }
41
- return { scope, projectDir, explicitHooksPath, dryRun, forIds };
46
+ return { scope, projectDir, explicitHooksPath, dryRun, forIds, nativeHooks };
42
47
  }
43
48
  export async function runSetupHook(args) {
44
49
  const opts = parseSetupHookOptions(args);
45
50
  const targets = selectTargetAdapters(opts.forIds);
51
+ if (opts.nativeHooks && targets.some((adapter) => adapter.id !== "cursor")) {
52
+ throw new Error("--native-hooks currently supports Cursor only; pass --for=cursor");
53
+ }
46
54
  process.stdout.write(`setup hook (${targets.map((a) => a.id).join(", ")}):\n`);
47
55
  for (const adapter of targets) {
48
56
  if (!adapter.upsertHook) {
@@ -54,6 +62,7 @@ export async function runSetupHook(args) {
54
62
  projectDir: opts.projectDir,
55
63
  explicitPath: opts.explicitHooksPath,
56
64
  dryRun: opts.dryRun,
65
+ nativeHooks: opts.nativeHooks,
57
66
  });
58
67
  process.stdout.write(` ${adapter.id}: ${result.message}\n`);
59
68
  process.stdout.write(` path: ${result.path}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"setup-hook.js","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAUzD,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,KAAK,GAAc,QAAQ,CAAC;IAChC,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,iBAAqC,CAAC;IAC1C,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAChE,iBAAiB,GAAG,KAAK,CAAC;YAC1B,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,KAAK,GAAG,SAAS,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,UAAU,GAAG,KAAK,CAAC;gBACnB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,iBAAiB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EAAE,sDAAsD,CAAC,CAAC;YAC5F,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,iBAAiB;YACpC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACnD,MAAM,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"setup-hook.js","sourceRoot":"","sources":["../../src/cli/setup-hook.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ type McpOptions = {
4
4
  projectDir: string;
5
5
  dryRun: boolean;
6
6
  forIds: AgentId[];
7
+ nativeDaemon: boolean;
7
8
  };
8
9
  export declare function parseSetupMcpOptions(args: string[]): McpOptions;
9
10
  export declare function runSetupMcp(args: string[]): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"setup-mcp.d.ts","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,KAAK,UAAU,GAAG;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA8B/D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/D"}
1
+ {"version":3,"file":"setup-mcp.d.ts","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,KAAK,UAAU,GAAG;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmC/D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/D"}
@@ -6,12 +6,17 @@ export function parseSetupMcpOptions(args) {
6
6
  let userConfigPath;
7
7
  let projectDir = process.cwd();
8
8
  let dryRun = false;
9
+ let nativeDaemon = false;
9
10
  for (let i = 0; i < rest.length; i++) {
10
11
  const arg = rest[i];
11
12
  if (arg === "--dry-run") {
12
13
  dryRun = true;
13
14
  continue;
14
15
  }
16
+ if (arg === "--native-daemon") {
17
+ nativeDaemon = true;
18
+ continue;
19
+ }
15
20
  if (arg === "--user-config") {
16
21
  const value = rest[i + 1];
17
22
  if (!value)
@@ -30,11 +35,14 @@ export function parseSetupMcpOptions(args) {
30
35
  }
31
36
  throw new Error(`Unknown setup mcp option: ${arg}`);
32
37
  }
33
- return { userConfigPath, projectDir, dryRun, forIds };
38
+ return { userConfigPath, projectDir, dryRun, forIds, nativeDaemon };
34
39
  }
35
40
  export async function runSetupMcp(args) {
36
41
  const opts = parseSetupMcpOptions(args);
37
42
  const targets = selectTargetAdapters(opts.forIds);
43
+ if (opts.nativeDaemon && targets.some((adapter) => adapter.id !== "cursor")) {
44
+ throw new Error("--native-daemon currently supports Cursor only; pass --for=cursor");
45
+ }
38
46
  // --user-config only applies to Cursor (it overrides ~/.cursor/mcp.json).
39
47
  // Pass it through only when Cursor is among the targets.
40
48
  process.stdout.write(`setup mcp (${targets.map((a) => a.id).join(", ")}):\n`);
@@ -44,6 +52,7 @@ export async function runSetupMcp(args) {
44
52
  explicitPath,
45
53
  projectDir: opts.projectDir,
46
54
  dryRun: opts.dryRun,
55
+ nativeDaemon: opts.nativeDaemon,
47
56
  });
48
57
  process.stdout.write(` ${adapter.id}: ${result.message}\n`);
49
58
  process.stdout.write(` path: ${result.path}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AASzD,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,cAAkC,CAAC;IACvC,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC/D,cAAc,GAAG,KAAK,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC3D,UAAU,GAAG,KAAK,CAAC;YACnB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,0EAA0E;IAC1E,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9E,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC;YACrC,YAAY;YACZ,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACnD,MAAM,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/cli/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAUzD,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,cAAkC,CAAC;IACvC,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC/D,cAAc,GAAG,KAAK,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC3D,UAAU,GAAG,KAAK,CAAC;YACnB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,0EAA0E;IAC1E,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9E,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC;YACrC,YAAY;YACZ,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACnD,MAAM,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type DaemonEvaluation, type DaemonHealth } from "./protocol.js";
2
+ export declare class GuardDaemonError extends Error {
3
+ readonly code: string;
4
+ constructor(message: string, code?: string);
5
+ }
6
+ export declare function callGuardDaemon<T>(method: string, params?: unknown, opts?: {
7
+ timeoutMs?: number;
8
+ socketPath?: string;
9
+ }): Promise<T>;
10
+ export declare function evaluatePolicyWithDaemon(argv: string[]): Promise<DaemonEvaluation>;
11
+ export declare function pingGuardDaemon(opts?: {
12
+ timeoutMs?: number;
13
+ socketPath?: string;
14
+ }): Promise<DaemonHealth>;
15
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAGlB,MAAM,eAAe,CAAC;AAEvB,qBAAa,gBAAiB,SAAQ,KAAK;IAGvC,QAAQ,CAAC,IAAI;gBADb,OAAO,EAAE,MAAM,EACN,IAAI,SAAiB;CAKjC;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,CAAC,CAAC,CAYZ;AA0DD,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAExF;AAED,wBAAsB,eAAe,CAAC,IAAI,CAAC,EAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,YAAY,CAAC,CAExB"}
@@ -0,0 +1,80 @@
1
+ import net from "node:net";
2
+ import { randomUUID } from "node:crypto";
3
+ import { guardDaemonSocketPath } from "./paths.js";
4
+ import { GUARD_DAEMON_PROTOCOL_VERSION, } from "./protocol.js";
5
+ export class GuardDaemonError extends Error {
6
+ code;
7
+ constructor(message, code = "daemon_error") {
8
+ super(message);
9
+ this.code = code;
10
+ this.name = "GuardDaemonError";
11
+ }
12
+ }
13
+ export async function callGuardDaemon(method, params, opts) {
14
+ const request = {
15
+ protocol_version: GUARD_DAEMON_PROTOCOL_VERSION,
16
+ request_id: randomUUID(),
17
+ method,
18
+ ...(params === undefined ? {} : { params }),
19
+ };
20
+ const timeoutMs = opts?.timeoutMs ?? 250;
21
+ const socketPath = opts?.socketPath ?? guardDaemonSocketPath();
22
+ const raw = await exchangeDaemonLine(socketPath, request, timeoutMs);
23
+ return parseDaemonResponse(raw, request.request_id);
24
+ }
25
+ async function exchangeDaemonLine(socketPath, request, timeoutMs) {
26
+ return await new Promise((resolve, reject) => {
27
+ const socket = net.createConnection(socketPath);
28
+ let settled = false;
29
+ let buffer = "";
30
+ const finish = (error, value) => {
31
+ if (settled)
32
+ return;
33
+ settled = true;
34
+ socket.destroy();
35
+ if (error)
36
+ reject(error);
37
+ else
38
+ resolve(value);
39
+ };
40
+ socket.setEncoding("utf8");
41
+ socket.setTimeout(timeoutMs, () => finish(new GuardDaemonError(`daemon timed out after ${timeoutMs}ms`, "timeout")));
42
+ socket.on("error", (error) => finish(new GuardDaemonError(error.message, "unavailable")));
43
+ socket.on("connect", () => socket.write(`${JSON.stringify(request)}\n`));
44
+ socket.on("data", (chunk) => {
45
+ buffer += chunk;
46
+ const newline = buffer.indexOf("\n");
47
+ if (newline < 0)
48
+ return;
49
+ finish(undefined, buffer.slice(0, newline));
50
+ });
51
+ });
52
+ }
53
+ function parseDaemonResponse(raw, requestId) {
54
+ let response;
55
+ try {
56
+ response = JSON.parse(raw);
57
+ }
58
+ catch (error) {
59
+ throw new GuardDaemonError(error instanceof Error ? error.message : String(error), "invalid_response");
60
+ }
61
+ if (response.protocol_version !== GUARD_DAEMON_PROTOCOL_VERSION) {
62
+ throw new GuardDaemonError("daemon protocol mismatch", "protocol_mismatch");
63
+ }
64
+ if (response.request_id !== requestId) {
65
+ throw new GuardDaemonError("daemon request id mismatch", "request_mismatch");
66
+ }
67
+ if (response.error)
68
+ throw new GuardDaemonError(response.error.message, response.error.code);
69
+ if (response.result === undefined) {
70
+ throw new GuardDaemonError("daemon returned no result", "invalid_response");
71
+ }
72
+ return response.result;
73
+ }
74
+ export async function evaluatePolicyWithDaemon(argv) {
75
+ return await callGuardDaemon("policy.evaluate", { argv });
76
+ }
77
+ export async function pingGuardDaemon(opts) {
78
+ return await callGuardDaemon("health.ping", undefined, opts);
79
+ }
80
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function daemonStatus(): Promise<Record<string, unknown>>;
2
+ export declare function startDaemon(): Promise<void>;
3
+ export declare function stopDaemon(): Promise<void>;
4
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/daemon/lifecycle.ts"],"names":[],"mappings":"AAYA,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWrE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAYjD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD"}
@@ -0,0 +1,52 @@
1
+ import { spawn } from "node:child_process";
2
+ import { access, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { constants } from "node:fs";
4
+ import path from "node:path";
5
+ import { pingGuardDaemon } from "./client.js";
6
+ import { guardDaemonBinaryPath, guardDaemonPidPath, guardDaemonSocketPath, } from "./paths.js";
7
+ export async function daemonStatus() {
8
+ try {
9
+ const health = await pingGuardDaemon({ timeoutMs: 500 });
10
+ return { running: true, socket: guardDaemonSocketPath(), ...health };
11
+ }
12
+ catch (error) {
13
+ return {
14
+ running: false,
15
+ socket: guardDaemonSocketPath(),
16
+ error: error instanceof Error ? error.message : String(error),
17
+ };
18
+ }
19
+ }
20
+ export async function startDaemon() {
21
+ const current = await daemonStatus();
22
+ if (current.running)
23
+ return;
24
+ const binary = guardDaemonBinaryPath();
25
+ await access(binary, constants.X_OK).catch(() => {
26
+ throw new Error(`Native daemon binary is missing or not executable: ${binary}`);
27
+ });
28
+ const child = spawn(binary, [], { detached: true, stdio: "ignore" });
29
+ child.unref();
30
+ await mkdir(path.dirname(guardDaemonPidPath()), { recursive: true });
31
+ await writeFile(guardDaemonPidPath(), `${child.pid}\n`, { mode: 0o600 });
32
+ await waitUntilReady();
33
+ }
34
+ export async function stopDaemon() {
35
+ const raw = await readFile(guardDaemonPidPath(), "utf8");
36
+ const pid = Number(raw.trim());
37
+ if (!Number.isInteger(pid) || pid <= 0)
38
+ throw new Error("Invalid daemon pid file");
39
+ process.kill(pid, "SIGTERM");
40
+ await rm(guardDaemonPidPath(), { force: true });
41
+ }
42
+ async function waitUntilReady() {
43
+ const deadline = Date.now() + 3000;
44
+ while (Date.now() < deadline) {
45
+ const status = await daemonStatus();
46
+ if (status.running)
47
+ return;
48
+ await new Promise((resolve) => setTimeout(resolve, 50));
49
+ }
50
+ throw new Error("Praxis Guard daemon did not become ready within 3 seconds");
51
+ }
52
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/daemon/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,qBAAqB,EAAE;YAC/B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO;IAC5B,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QAC9C,MAAM,IAAI,KAAK,CAAC,sDAAsD,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,SAAS,CAAC,kBAAkB,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACnF,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,kBAAkB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAC3B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function guardDaemonSocketPath(): string;
2
+ export declare function guardDaemonPidPath(): string;
3
+ export declare function guardDaemonBinaryPath(): string;
4
+ export declare function guardHookBinaryPath(): string;
5
+ export declare function daemonModeEnabled(): boolean;
6
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/daemon/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAU9C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
@@ -0,0 +1,41 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { existsSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ export function guardDaemonSocketPath() {
6
+ const override = process.env.PRAXIS_GUARD_SOCKET?.trim();
7
+ if (override)
8
+ return override;
9
+ return path.join(os.homedir(), ".praxis", "guard", "daemon.sock");
10
+ }
11
+ export function guardDaemonPidPath() {
12
+ return path.join(os.homedir(), ".praxis", "guard", "daemon.pid");
13
+ }
14
+ export function guardDaemonBinaryPath() {
15
+ const override = process.env.PRAXIS_GUARD_DAEMON_BINARY?.trim();
16
+ if (override)
17
+ return override;
18
+ const platform = `${process.platform}-${process.arch}`;
19
+ const here = path.dirname(fileURLToPath(import.meta.url));
20
+ const candidates = [
21
+ path.resolve(here, `../native/${platform}/praxis-guard-daemon`),
22
+ path.resolve(here, `../../native/${platform}/praxis-guard-daemon`),
23
+ ];
24
+ return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
25
+ }
26
+ export function guardHookBinaryPath() {
27
+ const override = process.env.PRAXIS_GUARD_HOOK_BINARY?.trim();
28
+ if (override)
29
+ return override;
30
+ const platform = `${process.platform}-${process.arch}`;
31
+ const here = path.dirname(fileURLToPath(import.meta.url));
32
+ const candidates = [
33
+ path.resolve(here, `../native/${platform}/praxis-guard-hook`),
34
+ path.resolve(here, `../../native/${platform}/praxis-guard-hook`),
35
+ ];
36
+ return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
37
+ }
38
+ export function daemonModeEnabled() {
39
+ return process.env.PRAXIS_GUARD_DAEMON === "1";
40
+ }
41
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/daemon/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;IACzD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,CAAC;IAChE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,QAAQ,sBAAsB,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,QAAQ,sBAAsB,CAAC;KACnE,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IAC9D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,QAAQ,oBAAoB,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,QAAQ,oBAAoB,CAAC;KACjE,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC;AACjD,CAAC"}