@panguard-ai/panguard 1.6.0 → 1.7.0

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 (69) hide show
  1. package/CHANGELOG.md +124 -0
  2. package/dist/cli/commands/audit.d.ts.map +1 -1
  3. package/dist/cli/commands/audit.js +56 -6
  4. package/dist/cli/commands/audit.js.map +1 -1
  5. package/dist/cli/commands/config.d.ts +6 -1
  6. package/dist/cli/commands/config.d.ts.map +1 -1
  7. package/dist/cli/commands/config.js +39 -23
  8. package/dist/cli/commands/config.js.map +1 -1
  9. package/dist/cli/commands/doctor.d.ts.map +1 -1
  10. package/dist/cli/commands/doctor.js +63 -20
  11. package/dist/cli/commands/doctor.js.map +1 -1
  12. package/dist/cli/commands/guard.d.ts.map +1 -1
  13. package/dist/cli/commands/guard.js +220 -70
  14. package/dist/cli/commands/guard.js.map +1 -1
  15. package/dist/cli/commands/hook.d.ts +115 -0
  16. package/dist/cli/commands/hook.d.ts.map +1 -0
  17. package/dist/cli/commands/hook.js +767 -0
  18. package/dist/cli/commands/hook.js.map +1 -0
  19. package/dist/cli/commands/persist.d.ts +32 -0
  20. package/dist/cli/commands/persist.d.ts.map +1 -0
  21. package/dist/cli/commands/persist.js +104 -0
  22. package/dist/cli/commands/persist.js.map +1 -0
  23. package/dist/cli/commands/scan.d.ts.map +1 -1
  24. package/dist/cli/commands/scan.js +157 -54
  25. package/dist/cli/commands/scan.js.map +1 -1
  26. package/dist/cli/commands/setup.d.ts.map +1 -1
  27. package/dist/cli/commands/setup.js +110 -37
  28. package/dist/cli/commands/setup.js.map +1 -1
  29. package/dist/cli/commands/status.d.ts.map +1 -1
  30. package/dist/cli/commands/status.js +66 -26
  31. package/dist/cli/commands/status.js.map +1 -1
  32. package/dist/cli/commands/up.d.ts.map +1 -1
  33. package/dist/cli/commands/up.js +380 -96
  34. package/dist/cli/commands/up.js.map +1 -1
  35. package/dist/cli/consent.d.ts +26 -6
  36. package/dist/cli/consent.d.ts.map +1 -1
  37. package/dist/cli/consent.js +47 -18
  38. package/dist/cli/consent.js.map +1 -1
  39. package/dist/cli/credentials.d.ts +11 -1
  40. package/dist/cli/credentials.d.ts.map +1 -1
  41. package/dist/cli/credentials.js +6 -1
  42. package/dist/cli/credentials.js.map +1 -1
  43. package/dist/cli/dashboard-url.d.ts +31 -0
  44. package/dist/cli/dashboard-url.d.ts.map +1 -0
  45. package/dist/cli/dashboard-url.js +66 -0
  46. package/dist/cli/dashboard-url.js.map +1 -0
  47. package/dist/cli/first-run.d.ts +35 -0
  48. package/dist/cli/first-run.d.ts.map +1 -0
  49. package/dist/cli/first-run.js +59 -0
  50. package/dist/cli/first-run.js.map +1 -0
  51. package/dist/cli/guard-config.d.ts.map +1 -1
  52. package/dist/cli/guard-config.js +15 -3
  53. package/dist/cli/guard-config.js.map +1 -1
  54. package/dist/cli/index.js +32 -11
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/interactive/actions/setup.d.ts.map +1 -1
  57. package/dist/cli/interactive/actions/setup.js +2 -10
  58. package/dist/cli/interactive/actions/setup.js.map +1 -1
  59. package/dist/cli/interactive/menu-defs.js +6 -6
  60. package/dist/cli/interactive/render.js +1 -1
  61. package/dist/cli/interactive/render.js.map +1 -1
  62. package/dist/cli/workspace-sync.d.ts +0 -1
  63. package/dist/cli/workspace-sync.d.ts.map +1 -1
  64. package/dist/cli/workspace-sync.js +3 -1
  65. package/dist/cli/workspace-sync.js.map +1 -1
  66. package/dist/init/wizard-runner.d.ts.map +1 -1
  67. package/dist/init/wizard-runner.js +0 -8
  68. package/dist/init/wizard-runner.js.map +1 -1
  69. package/package.json +15 -14
@@ -14,14 +14,20 @@ import { homedir } from 'node:os';
14
14
  import { execFileSync } from 'node:child_process';
15
15
  import { c, symbols, box, header } from '@panguard-ai/core';
16
16
  import { PANGUARD_VERSION } from '../../index.js';
17
+ import { readHookProtectionStatus } from './hook.js';
17
18
  // ---------------------------------------------------------------------------
18
19
  // Paths
19
20
  // ---------------------------------------------------------------------------
20
21
  const HOME = homedir();
21
22
  const PANGUARD_DIR = join(HOME, '.panguard');
22
23
  const CONFIG_PATH = join(PANGUARD_DIR, 'config.json');
24
+ // `pga setup` writes the canonical config to ~/.panguard-guard/config.json, not
25
+ // ~/.panguard/config.json. Doctor must check the guard config path so a freshly
26
+ // configured install is not reported as broken.
27
+ const GUARD_DIR = join(HOME, '.panguard-guard');
28
+ const GUARD_CONFIG_PATH = join(GUARD_DIR, 'config.json');
23
29
  const LAST_SCAN_PATH = join(PANGUARD_DIR, 'last-scan.json');
24
- const GUARD_PID_PATH = join(HOME, '.panguard-guard', 'panguard-guard.pid');
30
+ const GUARD_PID_PATH = join(GUARD_DIR, 'panguard-guard.pid');
25
31
  const LAUNCHD_PLIST_PATH = join(HOME, 'Library', 'LaunchAgents', 'ai.panguard.guard.plist');
26
32
  const ZSH_COMPLETIONS_PATH = join(HOME, '.zsh', 'completions', '_panguard');
27
33
  // ---------------------------------------------------------------------------
@@ -37,28 +43,38 @@ function checkInstallation() {
37
43
  };
38
44
  }
39
45
  function checkConfiguration() {
40
- if (!existsSync(CONFIG_PATH)) {
46
+ // The canonical config `pga setup` writes is ~/.panguard-guard/config.json.
47
+ // Prefer it; fall back to the legacy ~/.panguard/config.json so installs that
48
+ // only have the master config still pass. A configured install must never be
49
+ // reported as broken just because the legacy path is absent.
50
+ const candidate = existsSync(GUARD_CONFIG_PATH)
51
+ ? GUARD_CONFIG_PATH
52
+ : existsSync(CONFIG_PATH)
53
+ ? CONFIG_PATH
54
+ : null;
55
+ if (!candidate) {
41
56
  return {
42
57
  status: 'fail',
43
58
  label: 'Configuration valid',
44
- detail: '~/.panguard/config.json not found',
59
+ detail: '~/.panguard-guard/config.json not found',
45
60
  fix: 'Run "pga setup" to create your configuration',
46
61
  };
47
62
  }
63
+ const display = candidate === GUARD_CONFIG_PATH ? '~/.panguard-guard/config.json' : '~/.panguard/config.json';
48
64
  try {
49
- const raw = readFileSync(CONFIG_PATH, 'utf-8');
65
+ const raw = readFileSync(candidate, 'utf-8');
50
66
  JSON.parse(raw);
51
67
  return {
52
68
  status: 'pass',
53
69
  label: 'Configuration valid',
54
- detail: '~/.panguard/config.json',
70
+ detail: display,
55
71
  };
56
72
  }
57
73
  catch {
58
74
  return {
59
75
  status: 'fail',
60
76
  label: 'Configuration valid',
61
- detail: '~/.panguard/config.json is not valid JSON',
77
+ detail: `${display} is not valid JSON`,
62
78
  fix: 'Run "pga setup" to regenerate the configuration file',
63
79
  };
64
80
  }
@@ -262,35 +278,35 @@ function checkLastScan() {
262
278
  }
263
279
  const DEFAULT_TC_ENDPOINT = 'https://tc.panguard.ai';
264
280
  function checkThreatCloud() {
265
- // TC defaults to tc.panguard.ai no config required. Customer's audit/scan
266
- // already uploads here transparently. Only flag as warn if customer has
267
- // explicitly opted out (threatCloud.enabled: false) or pointed at a custom
268
- // endpoint that's not reachable.
281
+ // Threat Cloud is OPT-IN and defaults to OFF. The single source of truth is the
282
+ // guard config's threatCloudUploadEnabled flag (the same gate the upload path
283
+ // checks with `=== true`). Nothing is shared unless the user explicitly opts in,
284
+ // so doctor must not imply sharing happens "by default".
269
285
  let endpoint = DEFAULT_TC_ENDPOINT;
270
- let enabledFlag;
271
- if (existsSync(CONFIG_PATH)) {
286
+ let uploadEnabled = false;
287
+ if (existsSync(GUARD_CONFIG_PATH)) {
272
288
  try {
273
- const raw = readFileSync(CONFIG_PATH, 'utf-8');
289
+ const raw = readFileSync(GUARD_CONFIG_PATH, 'utf-8');
274
290
  const cfg = JSON.parse(raw);
275
- if (cfg.threatCloud?.endpoint)
276
- endpoint = cfg.threatCloud.endpoint;
277
- enabledFlag = cfg.threatCloud?.enabled;
291
+ uploadEnabled = cfg.threatCloudUploadEnabled === true;
292
+ if (cfg.threatCloudEndpoint)
293
+ endpoint = cfg.threatCloudEndpoint;
278
294
  }
279
295
  catch {
280
- // Config parse error → fall through to default
296
+ // Config parse error → treat as not enabled (privacy-safe default)
281
297
  }
282
298
  }
283
- if (enabledFlag === false) {
299
+ if (uploadEnabled) {
284
300
  return {
285
301
  status: 'pass',
286
302
  label: 'Threat Cloud',
287
- detail: 'Disabled (opted outpga config set threatCloud.enabled true to re-enable)',
303
+ detail: `Enabled (opted in)sharing anonymized findings with ${endpoint.replace(/^https?:\/\//, '')}`,
288
304
  };
289
305
  }
290
306
  return {
291
307
  status: 'pass',
292
308
  label: 'Threat Cloud',
293
- detail: `Connected to ${endpoint.replace(/^https?:\/\//, '')} (default pga audit shares anonymized findings here)`,
309
+ detail: 'opt-in, currently OFF (enable: pga config set threat-cloud true)',
294
310
  };
295
311
  }
296
312
  function checkSystemService() {
@@ -333,6 +349,32 @@ function checkSystemService() {
333
349
  };
334
350
  }
335
351
  }
352
+ function checkHookProtection() {
353
+ // The built-in-tool PreToolUse hook fails OPEN when it loads 0 rules (correct:
354
+ // it must never brick the agent). But silent permanent no-protection is not
355
+ // acceptable — the hook records a degraded marker we surface here.
356
+ const status = readHookProtectionStatus();
357
+ if (!status) {
358
+ return {
359
+ status: 'pass',
360
+ label: 'Built-in-tool hook',
361
+ detail: 'No degraded protection recorded',
362
+ };
363
+ }
364
+ if (status.degraded) {
365
+ return {
366
+ status: 'fail',
367
+ label: 'Built-in-tool hook',
368
+ detail: `Hook loaded 0 rules — protection DEGRADED (allowing all tool calls)${status.at ? ` since ${status.at}` : ''}`,
369
+ fix: 'Run "pga guard sync-rules" (or reinstall) to restore detection rules, then restart the host agent',
370
+ };
371
+ }
372
+ return {
373
+ status: 'pass',
374
+ label: 'Built-in-tool hook',
375
+ detail: `Active (${status.ruleCount} rules at last run)`,
376
+ };
377
+ }
336
378
  function checkShellCompletions() {
337
379
  if (existsSync(ZSH_COMPLETIONS_PATH)) {
338
380
  return {
@@ -467,6 +509,7 @@ function runAllChecks() {
467
509
  checkAiLayerLocal(),
468
510
  checkAiLayerCloud(),
469
511
  checkGuardEngine(),
512
+ checkHookProtection(),
470
513
  checkNotificationChannels(),
471
514
  checkLastScan(),
472
515
  checkThreatCloud(),
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,IAAI,OAAO,CA4HtC"}
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,YAAY,IAAI,OAAO,CAqJtC"}
@@ -2,14 +2,15 @@
2
2
  * panguard guard - Guard engine management
3
3
  * panguard guard - 守護引擎管理
4
4
  */
5
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
5
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync } from 'node:fs';
6
6
  import { join } from 'node:path';
7
- import { homedir } from 'node:os';
7
+ import { homedir, platform } from 'node:os';
8
8
  import { request as httpNodeRequest } from 'node:http';
9
9
  import { execFileSync as nodeExecFileSync } from 'node:child_process';
10
10
  import { Command } from 'commander';
11
- import { runCLI } from '@panguard-ai/panguard-guard';
11
+ import { runCLI, writeEncryptedLlmConfig, clearEncryptedLlmConfig, getEncryptedLlmConfigPath, } from '@panguard-ai/panguard-guard';
12
12
  import { c, box, header, symbols, divider } from '@panguard-ai/core';
13
+ import { ensurePersistentService } from './persist.js';
13
14
  export function guardCommand() {
14
15
  const cmd = new Command('guard')
15
16
  .description('Guard engine management')
@@ -108,9 +109,28 @@ export function guardCommand() {
108
109
  });
109
110
  cmd
110
111
  .command('install')
111
- .description('Install as system service')
112
+ .description('Install as a reboot-surviving service')
112
113
  .option('--data-dir <path>', 'Data directory')
113
114
  .action(async (opts) => {
115
+ // macOS: install the user-level LaunchAgent via the proven command
116
+ // (`pga guard --watch`) — the same path `pga up` uses, one source of truth.
117
+ // The legacy panguard-guard installer builds a `<bin> start` plist, which is
118
+ // wrong from the pga binary (pga has no top-level `start` command) and would
119
+ // silently fail to protect after reboot.
120
+ if (platform() === 'darwin') {
121
+ const r = ensurePersistentService();
122
+ if (r === 'installed') {
123
+ console.log(` ${symbols.pass} ${c.safe('Always-on service installed')} — protection restarts after reboot.`);
124
+ }
125
+ else if (r === 'already') {
126
+ console.log(` ${symbols.info} ${c.dim('Always-on service already installed.')}`);
127
+ }
128
+ else {
129
+ console.log(` ${symbols.fail} ${c.caution('Could not install the service.')}`);
130
+ }
131
+ return;
132
+ }
133
+ // Linux/Windows: system-service path (may require sudo/admin).
114
134
  const args = ['install'];
115
135
  if (opts.dataDir)
116
136
  args.push('--data-dir', opts.dataDir);
@@ -124,8 +144,14 @@ export function guardCommand() {
124
144
  });
125
145
  cmd
126
146
  .command('setup-ai')
127
- .description('Interactive AI layer setup')
128
- .action(async () => {
147
+ .alias('ai')
148
+ .description('Connect the optional semantic layer (Layer C): local Ollama (free) or a cloud key')
149
+ .option('--remove', 'Remove the stored LLM config and turn Layer C off')
150
+ .action(async (opts) => {
151
+ if (opts.remove) {
152
+ await commandRemoveAi();
153
+ return;
154
+ }
129
155
  await commandSetupAi();
130
156
  });
131
157
  return cmd;
@@ -144,16 +170,6 @@ function isOllamaInstalled() {
144
170
  return false;
145
171
  }
146
172
  }
147
- /** Validate API key format */
148
- function validateApiKeyFormat(key) {
149
- if (key.startsWith('sk-ant-')) {
150
- return { valid: true, provider: 'anthropic' };
151
- }
152
- if (key.startsWith('sk-') && !key.startsWith('sk-ant-')) {
153
- return { valid: true, provider: 'openai' };
154
- }
155
- return { valid: false, provider: 'unknown' };
156
- }
157
173
  /** Read a single line from stdin */
158
174
  function readLine(prompt) {
159
175
  return new Promise((resolve) => {
@@ -174,6 +190,70 @@ function readLine(prompt) {
174
190
  });
175
191
  });
176
192
  }
193
+ /**
194
+ * Read a secret from stdin without echoing it. The key never appears on screen,
195
+ * in argv, or in shell history. Falls back to a plain line read when stdin is
196
+ * not a TTY (e.g. piped input in scripts).
197
+ */
198
+ function readSecret(prompt) {
199
+ return new Promise((resolve) => {
200
+ const stdin = process.stdin;
201
+ const NL = String.fromCharCode(10);
202
+ process.stdout.write(prompt);
203
+ stdin.setEncoding('utf-8');
204
+ if (!stdin.isTTY) {
205
+ stdin.resume();
206
+ stdin.once('data', (data) => {
207
+ stdin.pause();
208
+ resolve(data.trim());
209
+ });
210
+ return;
211
+ }
212
+ const wasRaw = stdin.isRaw;
213
+ stdin.setRawMode(true);
214
+ stdin.resume();
215
+ let buf = '';
216
+ const onData = (ch) => {
217
+ const code = ch.charCodeAt(0);
218
+ // Enter (CR=13 / LF=10) or Ctrl-D (EOT=4) terminates input.
219
+ if (code === 13 || code === 10 || code === 4) {
220
+ stdin.removeListener('data', onData);
221
+ stdin.setRawMode(wasRaw);
222
+ stdin.pause();
223
+ process.stdout.write(NL);
224
+ resolve(buf.trim());
225
+ return;
226
+ }
227
+ if (code === 3) {
228
+ // Ctrl-C: abort without leaking the buffer.
229
+ stdin.setRawMode(wasRaw);
230
+ process.stdout.write(NL);
231
+ process.exit(130);
232
+ }
233
+ if (code === 127 || code === 8) {
234
+ buf = buf.slice(0, -1);
235
+ return;
236
+ }
237
+ buf += ch;
238
+ };
239
+ stdin.on('data', onData);
240
+ });
241
+ }
242
+ /** Remove the stored (encrypted) LLM config — turns the optional Layer C off. */
243
+ async function commandRemoveAi() {
244
+ const encPath = await getEncryptedLlmConfigPath();
245
+ const removed = await clearEncryptedLlmConfig();
246
+ console.log('');
247
+ if (removed) {
248
+ console.log(` ${symbols.pass} Removed stored LLM config (${c.sage(encPath)}).`);
249
+ console.log(` ${c.dim('Layer C is now off. Cloud env vars (ANTHROPIC_API_KEY / OPENAI_API_KEY), if set, still apply — unset them too for a full opt-out. Restart guard to apply:')} ${c.sage('pga guard restart')}`);
250
+ }
251
+ else {
252
+ console.log(` ${symbols.info} No stored LLM config to remove.`);
253
+ console.log(` ${c.dim('If you set ANTHROPIC_API_KEY / OPENAI_API_KEY in your environment, unset them to disable Layer C.')}`);
254
+ }
255
+ console.log('');
256
+ }
177
257
  /** Interactive AI setup command */
178
258
  async function commandSetupAi() {
179
259
  const configDir = join(homedir(), '.panguard');
@@ -187,12 +267,21 @@ async function commandSetupAi() {
187
267
  console.log(` ${c.sage('Layer 1')} - Pattern Detection (regex rules, always active)`);
188
268
  console.log(` ${c.dim('第一層')} ${c.dim('模式偵測(正則規則,始終啟用)')}`);
189
269
  console.log('');
190
- console.log(` ${c.sage('Layer 2')} - Local AI (Ollama - free, private, on-device)`);
191
- console.log(` ${c.dim('第二層')} ${c.dim('本地 AI(Ollama - 免費、私密、裝置端)')}`);
270
+ console.log(` ${c.sage('Layer 2')} - Local AI (Ollama - $0, fully private, on-device)`);
271
+ console.log(` ${c.dim('第二層')} ${c.dim('本地 AI(Ollama - $0、完全私密、裝置端執行)')}`);
192
272
  console.log('');
193
273
  console.log(` ${c.sage('Layer 3')} - Cloud AI (Anthropic/OpenAI - fastest, most accurate)`);
194
274
  console.log(` ${c.dim('第三層')} ${c.dim('雲端 AI(Anthropic/OpenAI - 最快、最準確)')}`);
195
275
  console.log('');
276
+ // Cost reality up front, so the choice is informed before anyone picks Layer 3.
277
+ // The semantic judge runs ONLY on events the deterministic layers already
278
+ // flagged — not on every action — so real-world usage is a handful of calls
279
+ // a day, not thousands.
280
+ console.log(` ${c.dim('Layers 2 and 3 only run on events Layer 1 already flagged — not on every')}`);
281
+ console.log(` ${c.dim('action — so a typical developer triggers them just a handful of times a day.')}`);
282
+ console.log(` ${c.dim('第二、三層只在第一層已標記的事件上執行 — 不是每個動作都跑 — 所以一般開發者')}`);
283
+ console.log(` ${c.dim('一天只會觸發幾次。')}`);
284
+ console.log('');
196
285
  console.log(divider());
197
286
  console.log('');
198
287
  // Check current state
@@ -228,14 +317,19 @@ async function commandSetupAi() {
228
317
  }
229
318
  const setupLocal = choice === '1' || choice === '3';
230
319
  const setupCloud = choice === '2' || choice === '3';
231
- // Ensure config directory exists
320
+ // Ensure config directory exists. 0o700: ~/.panguard can hold secret-bearing
321
+ // config — never world/group-traversable on shared machines.
232
322
  if (!existsSync(configDir)) {
233
- mkdirSync(configDir, { recursive: true });
323
+ mkdirSync(configDir, { recursive: true, mode: 0o700 });
234
324
  }
235
325
  // Step 2a: Local AI (Ollama)
236
326
  if (setupLocal) {
237
327
  console.log(divider('Layer 2: Local AI'));
238
328
  console.log('');
329
+ // Honest cost framing: local inference never calls a paid API.
330
+ console.log(` ${c.dim('Cost: $0 and fully private — runs on your machine, nothing leaves it.')}`);
331
+ console.log(` ${c.dim('費用:$0 且完全私密 — 在你的機器上執行,不會有任何資料離開。')}`);
332
+ console.log('');
239
333
  const ollamaInstalled = isOllamaInstalled();
240
334
  if (ollamaInstalled) {
241
335
  console.log(` ${symbols.pass} Ollama is installed / Ollama 已安裝`);
@@ -278,79 +372,135 @@ async function commandSetupAi() {
278
372
  aiConfig['endpoint'] = ollamaEndpoint;
279
373
  }
280
374
  existingConfig = { ...existingConfig, ai: aiConfig };
375
+ // Persist to the encrypted store the daemon reads first (resolveOptedInLLM),
376
+ // so the local model is used deterministically — no PANGUARD_SEMANTIC=1
377
+ // probe needed, and it survives a launchd/systemd restart. Ollama carries no
378
+ // secret, so this is just provider/model/endpoint. If a cloud key is also
379
+ // configured below, that write overwrites this one (cloud takes priority).
380
+ try {
381
+ await writeEncryptedLlmConfig({
382
+ provider: 'ollama',
383
+ model: ollamaModel,
384
+ endpoint: ollamaEndpoint || undefined,
385
+ });
386
+ }
387
+ catch {
388
+ /* non-fatal — daemon can still discover Ollama via PANGUARD_SEMANTIC=1 */
389
+ }
281
390
  console.log('');
282
391
  console.log(` ${symbols.pass} Local AI configured: ${c.sage(`ollama / ${ollamaModel}`)}`);
283
392
  console.log(` ${c.dim('本地 AI 已設定')}: ollama / ${ollamaModel}`);
284
393
  console.log('');
285
394
  }
286
395
  // Step 2b: Cloud AI
396
+ //
397
+ // The cloud key is persisted ENCRYPTED at rest (~/.panguard/llm.enc,
398
+ // AES-256-GCM, machine-bound, 0600) via writeEncryptedLlmConfig — the Guard
399
+ // daemon reads it on startup (resolveOptedInLLM). This is what makes Layer C
400
+ // actually work with the launchd/systemd-spawned daemon, which does NOT
401
+ // inherit a shell environment variable. Users who prefer a key that never
402
+ // touches disk can instead export ANTHROPIC_API_KEY / OPENAI_API_KEY (also
403
+ // read at startup). Prefer no key at all? Local AI (Ollama) needs none.
287
404
  if (setupCloud) {
288
405
  console.log(divider('Layer 3: Cloud AI'));
289
406
  console.log('');
290
- const envKey = process.env['PANGUARD_AI_KEY'] ||
291
- process.env['ANTHROPIC_API_KEY'] ||
292
- process.env['OPENAI_API_KEY'];
293
- if (envKey) {
294
- const { provider } = validateApiKeyFormat(envKey);
295
- console.log(` ${symbols.pass} API key found in environment: ${c.sage(provider)}`);
296
- console.log(` ${c.dim('已在環境變數中找到 API 金鑰')}: ${provider}`);
297
- console.log('');
298
- }
299
- console.log(` Enter your API key (Anthropic or OpenAI):`);
300
- console.log(` ${c.dim('輸入您的 API 金鑰(Anthropic 或 OpenAI):')}`);
301
- console.log(` ${c.dim(' Anthropic: https://console.anthropic.com/')}`);
302
- console.log(` ${c.dim(' OpenAI: https://platform.openai.com/api-keys')}`);
407
+ // Honest cost framing (verified): the semantic judge runs ONLY on events the
408
+ // deterministic layers already flagged — a handful of times a day for a
409
+ // typical developer, so roughly a few cents per month.
410
+ console.log(` ${c.dim('Cost: the cloud judge runs only on already-flagged events — a handful of')}`);
411
+ console.log(` ${c.dim('times a day for typical use, so roughly a few cents per month. You pay')}`);
412
+ console.log(` ${c.dim('your AI provider directly; PanGuard adds no markup and no subscription.')}`);
413
+ console.log(` ${c.dim('費用:雲端判斷層只在已標記的事件上執行 一般一天幾次,約每月幾美分;直接付給供應商。')}`);
303
414
  console.log('');
304
- const apiKey = await readLine(` API Key: `);
415
+ const provider = await readLine(` Cloud provider [claude/openai] (default claude): `);
416
+ const cloudProvider = provider === 'openai' ? 'openai' : 'claude';
417
+ const defaultModel = cloudProvider === 'claude' ? 'claude-sonnet-4-20250514' : 'gpt-4o';
418
+ const model = await readLine(` Model [${defaultModel}]: `);
419
+ const cloudModel = model || defaultModel;
420
+ const envVarName = cloudProvider === 'claude' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';
421
+ const envHasKey = (cloudProvider === 'claude' && !!process.env['ANTHROPIC_API_KEY']) ||
422
+ (cloudProvider === 'openai' && !!process.env['OPENAI_API_KEY']);
305
423
  console.log('');
306
- if (apiKey) {
307
- const { valid, provider } = validateApiKeyFormat(apiKey);
308
- if (!valid) {
309
- console.log(` ${symbols.warn} Unrecognized key format, saving as-is / 無法識別的金鑰格式,直接儲存`);
310
- }
311
- const cloudProvider = provider === 'anthropic' ? 'claude' : provider === 'openai' ? 'openai' : 'claude';
312
- const defaultModel = cloudProvider === 'claude' ? 'claude-sonnet-4-20250514' : 'gpt-4o';
313
- const model = await readLine(` Model [${defaultModel}]: `);
314
- const cloudModel = model || defaultModel;
315
- // If we already set local AI, merge into a combined config
316
- const currentAi = (existingConfig['ai'] ?? {});
317
- if (setupLocal && currentAi['provider'] === 'ollama') {
318
- // Store cloud as the primary with local as fallback info
319
- existingConfig = {
320
- ...existingConfig,
321
- ai: {
424
+ console.log(` How would you like to provide the key?`);
425
+ console.log(` ${c.sage('1')} - Paste it now (stored encrypted on this machine; the daemon reads it)`);
426
+ console.log(` ${c.sage('2')} - I'll set ${envVarName} in my environment myself`);
427
+ if (envHasKey) {
428
+ console.log(` ${c.dim(`(${envVarName} is already set in this shell)`)}`);
429
+ }
430
+ console.log('');
431
+ const keyChoice = await readLine(` Choice [1]: `);
432
+ let persistedKey = false;
433
+ if (keyChoice !== '2') {
434
+ // Hidden input: the key never appears on screen, in argv, or in shell history.
435
+ const key = await readSecret(` Paste ${envVarName} (input hidden): `);
436
+ if (key) {
437
+ try {
438
+ const encPath = await writeEncryptedLlmConfig({
322
439
  provider: cloudProvider,
323
440
  model: cloudModel,
324
- apiKey: apiKey,
325
- },
326
- aiLocal: {
327
- provider: currentAi['provider'],
328
- model: currentAi['model'],
329
- endpoint: currentAi['endpoint'],
330
- },
331
- };
441
+ apiKey: key,
442
+ });
443
+ persistedKey = true;
444
+ console.log(` ${symbols.pass} Key stored encrypted at ${c.sage(encPath)} ${c.dim('(0600, AES-256-GCM)')}`);
445
+ console.log(` ${c.dim('Remove it any time with:')} ${c.sage('pga guard ai --remove')}`);
446
+ }
447
+ catch (err) {
448
+ console.log(` ${symbols.fail} Could not store key: ${err instanceof Error ? err.message : String(err)}`);
449
+ }
332
450
  }
333
451
  else {
334
- existingConfig = {
335
- ...existingConfig,
336
- ai: {
337
- provider: cloudProvider,
338
- model: cloudModel,
339
- apiKey: apiKey,
340
- },
341
- };
452
+ console.log(` ${symbols.info} No key entered — Layer C stays off until you provide one.`);
342
453
  }
454
+ }
455
+ else {
343
456
  console.log('');
344
- console.log(` ${symbols.pass} Cloud AI configured: ${c.sage(`${cloudProvider} / ${cloudModel}`)}`);
457
+ console.log(` ${c.dim('Set it before restarting guard:')} ${c.sage(`export ${envVarName}=...`)}`);
458
+ }
459
+ // Store provider + model (NO secret) in the master config so status/dashboard
460
+ // can show the intended provider. The secret lives only in llm.enc (encrypted)
461
+ // or the env var. If local AI was also configured, keep it as fallback metadata.
462
+ const currentAi = (existingConfig['ai'] ?? {});
463
+ if (setupLocal && currentAi['provider'] === 'ollama') {
464
+ existingConfig = {
465
+ ...existingConfig,
466
+ ai: { provider: cloudProvider, model: cloudModel },
467
+ aiLocal: {
468
+ provider: currentAi['provider'],
469
+ model: currentAi['model'],
470
+ endpoint: currentAi['endpoint'],
471
+ },
472
+ };
473
+ }
474
+ else {
475
+ existingConfig = {
476
+ ...existingConfig,
477
+ ai: { provider: cloudProvider, model: cloudModel },
478
+ };
479
+ }
480
+ console.log('');
481
+ console.log(` ${symbols.pass} Cloud AI provider set: ${c.sage(`${cloudProvider} / ${cloudModel}`)}`);
482
+ if (persistedKey || envHasKey) {
483
+ console.log(` ${c.dim('Restart guard to activate Layer C:')} ${c.sage('pga guard restart')}`);
345
484
  }
346
485
  else {
347
- console.log(` ${symbols.info} Skipped cloud AI setup`);
486
+ console.log(` ${symbols.warn} Layer C stays off until ${c.sage(envVarName)} is set; then run ${c.sage('pga guard restart')}.`);
348
487
  }
349
488
  console.log('');
350
489
  }
351
- // Save config
490
+ // Save config. 0o600 file + chmod (even if the file already existed, to
491
+ // tighten a loosely-created one): config.json can carry other secret-bearing
492
+ // fields (threatCloudApiKey, notification secrets) — never world/group-readable.
352
493
  try {
353
- writeFileSync(configPath, JSON.stringify(existingConfig, null, 2), 'utf-8');
494
+ writeFileSync(configPath, JSON.stringify(existingConfig, null, 2), {
495
+ encoding: 'utf-8',
496
+ mode: 0o600,
497
+ });
498
+ try {
499
+ chmodSync(configPath, 0o600);
500
+ }
501
+ catch {
502
+ /* best effort — platforms without POSIX permissions */
503
+ }
354
504
  console.log(` ${symbols.pass} Configuration saved to ${c.sage(configPath)}`);
355
505
  console.log(` ${c.dim('設定已儲存至')} ${configPath}`);
356
506
  }