@panguard-ai/panguard 0.3.1 → 0.3.2

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 (72) hide show
  1. package/dist/cli/auth-guard.d.ts +9 -7
  2. package/dist/cli/auth-guard.d.ts.map +1 -1
  3. package/dist/cli/auth-guard.js +33 -199
  4. package/dist/cli/auth-guard.js.map +1 -1
  5. package/dist/cli/commands/doctor.d.ts.map +1 -1
  6. package/dist/cli/commands/doctor.js +146 -26
  7. package/dist/cli/commands/doctor.js.map +1 -1
  8. package/dist/cli/commands/guard.d.ts.map +1 -1
  9. package/dist/cli/commands/guard.js +264 -7
  10. package/dist/cli/commands/guard.js.map +1 -1
  11. package/dist/cli/commands/hacktivity.d.ts +10 -0
  12. package/dist/cli/commands/hacktivity.d.ts.map +1 -0
  13. package/dist/cli/commands/hacktivity.js +308 -0
  14. package/dist/cli/commands/hacktivity.js.map +1 -0
  15. package/dist/cli/commands/login.d.ts +3 -4
  16. package/dist/cli/commands/login.d.ts.map +1 -1
  17. package/dist/cli/commands/login.js +8 -258
  18. package/dist/cli/commands/login.js.map +1 -1
  19. package/dist/cli/commands/logout.d.ts +3 -3
  20. package/dist/cli/commands/logout.d.ts.map +1 -1
  21. package/dist/cli/commands/logout.js +7 -35
  22. package/dist/cli/commands/logout.js.map +1 -1
  23. package/dist/cli/commands/report.d.ts +2 -2
  24. package/dist/cli/commands/report.d.ts.map +1 -1
  25. package/dist/cli/commands/report.js +30 -40
  26. package/dist/cli/commands/report.js.map +1 -1
  27. package/dist/cli/commands/scan.d.ts.map +1 -1
  28. package/dist/cli/commands/scan.js +16 -19
  29. package/dist/cli/commands/scan.js.map +1 -1
  30. package/dist/cli/commands/setup-skill-scan.d.ts +39 -0
  31. package/dist/cli/commands/setup-skill-scan.d.ts.map +1 -0
  32. package/dist/cli/commands/setup-skill-scan.js +186 -0
  33. package/dist/cli/commands/setup-skill-scan.js.map +1 -0
  34. package/dist/cli/commands/setup.d.ts +11 -0
  35. package/dist/cli/commands/setup.d.ts.map +1 -0
  36. package/dist/cli/commands/setup.js +219 -0
  37. package/dist/cli/commands/setup.js.map +1 -0
  38. package/dist/cli/commands/status.js +43 -0
  39. package/dist/cli/commands/status.js.map +1 -1
  40. package/dist/cli/commands/threat.d.ts +3 -0
  41. package/dist/cli/commands/threat.d.ts.map +1 -1
  42. package/dist/cli/commands/threat.js +31 -11
  43. package/dist/cli/commands/threat.js.map +1 -1
  44. package/dist/cli/commands/trap.d.ts +2 -2
  45. package/dist/cli/commands/trap.d.ts.map +1 -1
  46. package/dist/cli/commands/trap.js +32 -29
  47. package/dist/cli/commands/trap.js.map +1 -1
  48. package/dist/cli/commands/upgrade.d.ts +3 -4
  49. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  50. package/dist/cli/commands/upgrade.js +10 -234
  51. package/dist/cli/commands/upgrade.js.map +1 -1
  52. package/dist/cli/commands/whoami.d.ts +2 -2
  53. package/dist/cli/commands/whoami.d.ts.map +1 -1
  54. package/dist/cli/commands/whoami.js +9 -60
  55. package/dist/cli/commands/whoami.js.map +1 -1
  56. package/dist/cli/index.js +4 -0
  57. package/dist/cli/index.js.map +1 -1
  58. package/dist/cli/interactive.d.ts +1 -1
  59. package/dist/cli/interactive.d.ts.map +1 -1
  60. package/dist/cli/interactive.js +477 -236
  61. package/dist/cli/interactive.js.map +1 -1
  62. package/dist/cli/menu.d.ts.map +1 -1
  63. package/dist/cli/menu.js +2 -5
  64. package/dist/cli/menu.js.map +1 -1
  65. package/dist/index.d.ts +0 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/init/wizard-runner.d.ts.map +1 -1
  70. package/dist/init/wizard-runner.js +136 -6
  71. package/dist/init/wizard-runner.js.map +1 -1
  72. package/package.json +25 -13
@@ -30,7 +30,7 @@ export declare function withAuth<T>(requiredTier: RequiredTier, handler: (option
30
30
  export declare function tierBadge(tier: RequiredTier): string;
31
31
  /**
32
32
  * Refresh tier from server in background.
33
- * Called on CLI startup to ensure local cache is current.
33
+ * No-op: all features are free and open source. No auth needed.
34
34
  */
35
35
  export declare function refreshTierInBackground(): void;
36
36
  /**
@@ -49,32 +49,34 @@ export declare function checkAccess(requiredTier: Tier): boolean;
49
49
  * Check if current user has access to a feature by name.
50
50
  * Uses FEATURE_TIER mapping to resolve the required tier.
51
51
  */
52
- export declare function checkFeatureAccess(feature: string): boolean;
52
+ export declare function checkFeatureAccess(_feature: string): boolean;
53
53
  /**
54
54
  * Display a branded upgrade prompt for a locked feature.
55
55
  * Accepts feature KEY (e.g. 'report', not 'Compliance Report').
56
56
  */
57
- export declare function showUpgradePrompt(feature: string, lang?: string): void;
57
+ export declare function showUpgradePrompt(_feature: string, _lang?: string): void;
58
58
  /**
59
59
  * Show a contextual upgrade hint for scan auto-fix.
60
60
  * Used after scan results when fixable issues are found.
61
61
  */
62
- export declare function showScanUpgradeHint(fixableCount: number, lang?: string): void;
62
+ export declare function showScanUpgradeHint(_fixableCount: number, _lang?: string): void;
63
63
  /**
64
64
  * Show a contextual upgrade hint for Guard AI analysis.
65
65
  * Used when a suspicious event needs AI analysis.
66
66
  */
67
- export declare function showGuardAIHint(threatType: string, confidence: number, lang?: string): void;
67
+ export declare function showGuardAIHint(_threatType: string, _confidence: number, _lang?: string): void;
68
+ /** @deprecated All features are free. Kept for backward compatibility. */
68
69
  export declare const PRICING_TIERS: Record<string, {
69
70
  price: number;
70
71
  unit: string;
71
72
  machines: string;
72
73
  }>;
74
+ /** @deprecated All features are free. Kept for backward compatibility. */
73
75
  export declare const COMPLIANCE_PRICING: Record<string, {
74
76
  price: number;
75
77
  unit: string;
76
78
  name: Record<string, string>;
77
79
  }>;
78
- /** Business subscribers get 50% off additional reports */
79
- export declare const BUSINESS_REPORT_DISCOUNT = 0.5;
80
+ /** All features are free no discount logic needed */
81
+ export declare const BUSINESS_REPORT_DISCOUNT = 0;
80
82
  //# sourceMappingURL=auth-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/cli/auth-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAO9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC;AAID,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAsB,CAAC;AAE/E;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,GAAE,YAA0B,GAAG,eAAe,CAiBrF;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GACrE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CA0D/B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CASpD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAgE9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsB3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAGvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG3D;AAgBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa,GAAG,IAAI,CAkD5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa,GAAG,IAAI,CAenF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa,GAAG,IAAI,CA0BjG;AAID,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAK3F,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CACrC,MAAM,EACN;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA4B9D,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,wBAAwB,MAAM,CAAC"}
1
+ {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/cli/auth-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAK9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC;AAID,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAsB,CAAC;AAE/E;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,GAAE,YAA0B,GAAG,eAAe,CAiBrF;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GACrE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAgB/B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CASpD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsB3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAGvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG5D;AAgBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,IAAI,CAE9E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,IAAI,CAErF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,IAAI,CAEpG;AAID,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAE3F,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,MAAM,CACrC,MAAM,EACN;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CACzD,CAAC;AAEP,uDAAuD;AACvD,eAAO,MAAM,wBAAwB,IAAI,CAAC"}
@@ -7,8 +7,8 @@
7
7
  import { existsSync, readFileSync } from 'node:fs';
8
8
  import { join } from 'node:path';
9
9
  import { homedir } from 'node:os';
10
- import { c, symbols, box, FEATURE_TIER as _CORE_FEATURE_TIER, isTierAtLeast, TIER_LEVEL } from '@panguard-ai/core';
11
- import { loadCredentials, saveCredentials, isTokenExpired, tierDisplayName, } from './credentials.js';
10
+ import { c, FEATURE_TIER as _CORE_FEATURE_TIER, isTierAtLeast, TIER_LEVEL } from '@panguard-ai/core';
11
+ import { loadCredentials, isTokenExpired, } from './credentials.js';
12
12
  /* ── Feature → Tier mapping (re-exported from core) ── */
13
13
  export const FEATURE_TIER = _CORE_FEATURE_TIER;
14
14
  /**
@@ -37,47 +37,19 @@ export function requireAuth(requiredTier = 'community') {
37
37
  */
38
38
  export function withAuth(requiredTier, handler) {
39
39
  return async (options) => {
40
- // In server mode, require a valid service token from environment.
41
- // The server has its own session-based auth for API routes.
42
- if (process.env['PANGUARD_SERVER_MODE'] === '1') {
43
- const creds = loadCredentials();
44
- if (!creds || isTokenExpired(creds)) {
45
- console.error('Server mode requires valid credentials. Run `panguard login` first.');
46
- process.exitCode = 1;
47
- return;
48
- }
49
- await handler(options, creds);
50
- return;
51
- }
52
- const check = requireAuth(requiredTier);
53
- if (!check.authenticated) {
54
- console.log('');
55
- console.log(box([
56
- `${symbols.warn} \u9700\u8981\u767B\u5165 / Authentication required`,
57
- '',
58
- ` \u8ACB\u57F7\u884C ${c.sage('panguard login')} \u4F86\u9A57\u8B49\u3002`,
59
- ` Run ${c.sage('panguard login')} to authenticate.`,
60
- ].join('\n'), { borderColor: c.caution, title: 'Panguard AI' }));
61
- console.log('');
62
- process.exitCode = 1;
63
- return;
64
- }
65
- if (!check.authorized) {
66
- const tierName = tierDisplayName(requiredTier);
67
- console.log('');
68
- console.log(box([
69
- `${symbols.fail} \u9700\u8981 ${tierName} \u7B49\u7D1A / ${tierName} tier required`,
70
- '',
71
- ` \u76EE\u524D\u7B49\u7D1A: ${c.sage(tierDisplayName(check.credentials.tier))}`,
72
- ` Current tier: ${c.sage(tierDisplayName(check.credentials.tier))}`,
73
- '',
74
- ` \u5347\u7D1A\u8ACB\u898B ${c.underline('https://panguard.ai/pricing')}`,
75
- ].join('\n'), { borderColor: c.critical, title: '\u9700\u8981\u5347\u7D1A / Upgrade Required' }));
76
- console.log('');
77
- process.exitCode = 1;
78
- return;
79
- }
80
- await handler(options, check.credentials);
40
+ // All features are free skip tier checks entirely.
41
+ // Still load credentials if available for handler context.
42
+ const creds = loadCredentials();
43
+ const fallback = {
44
+ token: '',
45
+ email: '',
46
+ name: 'community',
47
+ tier: 'community',
48
+ apiUrl: '',
49
+ savedAt: new Date().toISOString(),
50
+ expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
51
+ };
52
+ await handler(options, creds ?? fallback);
81
53
  };
82
54
  }
83
55
  /**
@@ -96,54 +68,10 @@ export function tierBadge(tier) {
96
68
  }
97
69
  /**
98
70
  * Refresh tier from server in background.
99
- * Called on CLI startup to ensure local cache is current.
71
+ * No-op: all features are free and open source. No auth needed.
100
72
  */
101
73
  export function refreshTierInBackground() {
102
- const creds = loadCredentials();
103
- if (!creds || isTokenExpired(creds) || !creds.apiUrl)
104
- return;
105
- // Fire-and-forget: don't block CLI startup
106
- fetch(`${creds.apiUrl}/api/auth/me`, {
107
- headers: { Authorization: `Bearer ${creds.token}` },
108
- signal: AbortSignal.timeout(5000),
109
- })
110
- .then((res) => res.ok
111
- ? res.json()
112
- : null)
113
- .then((body) => {
114
- if (!body?.data?.user?.tier)
115
- return;
116
- const serverTier = body.data.user.tier;
117
- const serverPlanExpires = body.data.user['planExpiresAt'];
118
- // Check if plan has expired server-side (tier got downgraded to community)
119
- if (serverTier === 'community' && creds.tier !== 'community') {
120
- console.log('');
121
- console.log(c.caution(` [!] Your ${tierDisplayName(creds.tier)} plan has expired. Account downgraded to Community tier.`));
122
- console.log(c.dim(` Renew at https://panguard.ai/pricing`));
123
- console.log('');
124
- }
125
- // Warn if plan expiring soon (within 3 days)
126
- if (serverPlanExpires) {
127
- const expiresDate = new Date(serverPlanExpires);
128
- const daysLeft = Math.ceil((expiresDate.getTime() - Date.now()) / (24 * 60 * 60 * 1000));
129
- if (daysLeft > 0 && daysLeft <= 3) {
130
- console.log('');
131
- console.log(c.caution(` [!] Your ${tierDisplayName(serverTier)} plan expires in ${daysLeft} day(s).`));
132
- console.log(c.dim(` Renew at https://panguard.ai/pricing`));
133
- console.log('');
134
- }
135
- }
136
- if (serverTier !== creds.tier || body.data.user.name !== creds.name) {
137
- saveCredentials({
138
- ...creds,
139
- tier: serverTier,
140
- name: body.data.user.name ?? creds.name,
141
- });
142
- }
143
- })
144
- .catch(() => {
145
- /* offline or timeout — keep local cache */
146
- });
74
+ // No-op: all features are free and open source
147
75
  }
148
76
  /**
149
77
  * Get current license/tier from stored credentials or license file.
@@ -182,9 +110,9 @@ export function checkAccess(requiredTier) {
182
110
  * Check if current user has access to a feature by name.
183
111
  * Uses FEATURE_TIER mapping to resolve the required tier.
184
112
  */
185
- export function checkFeatureAccess(feature) {
186
- const requiredTier = FEATURE_TIER[feature] ?? 'community';
187
- return checkAccess(requiredTier);
113
+ export function checkFeatureAccess(_feature) {
114
+ // All features are free and open source
115
+ return true;
188
116
  }
189
117
  /* ── Feature display names (bilingual) ── */
190
118
  const FEATURE_DISPLAY = {
@@ -202,124 +130,30 @@ const FEATURE_DISPLAY = {
202
130
  * Display a branded upgrade prompt for a locked feature.
203
131
  * Accepts feature KEY (e.g. 'report', not 'Compliance Report').
204
132
  */
205
- export function showUpgradePrompt(feature, lang = 'en') {
206
- const tier = FEATURE_TIER[feature] ?? 'community';
207
- const { tier: userTier } = getLicense();
208
- const tierName = tierDisplayName(tier);
209
- const userTierName = tierDisplayName(userTier);
210
- const pricing = PRICING_TIERS[tier];
211
- const priceStr = pricing && pricing.price > 0 ? `$${pricing.price}${pricing.unit}` : '';
212
- const machinesStr = pricing ? pricing.machines : '';
213
- const featureName = FEATURE_DISPLAY[feature]?.[lang] ?? FEATURE_DISPLAY[feature]?.['en'] ?? feature;
214
- const lines = lang === 'zh-TW'
215
- ? [
216
- `\u300C${featureName}\u300D\u9700\u8981 ${tierName} \u65B9\u6848`,
217
- priceStr ? `${priceStr} | ${machinesStr} \u53F0\u6A5F\u5668` : '',
218
- '',
219
- `\u76EE\u524D\u65B9\u6848: ${c.sage(userTierName)}`,
220
- `\u9700\u8981\u65B9\u6848: ${c.sage(tierName)}`,
221
- '',
222
- `\u2192 ${c.underline('https://panguard.ai/pricing')}`,
223
- `\u2192 ${c.sage('panguard activate <license-key>')}`,
224
- '',
225
- c.dim('\u6240\u6709\u4ED8\u8CBB\u65B9\u6848\u4EAB 30 \u5929\u514D\u8CBB\u8A66\u7528\u3002'),
226
- ]
227
- : [
228
- `${featureName} requires ${tierName} plan`,
229
- priceStr ? `${priceStr} | ${machinesStr} machine(s)` : '',
230
- '',
231
- `Current: ${c.sage(userTierName)}`,
232
- `Required: ${c.sage(tierName)}`,
233
- '',
234
- `\u2192 ${c.underline('https://panguard.ai/pricing')}`,
235
- `\u2192 ${c.sage('panguard activate <license-key>')}`,
236
- '',
237
- c.dim('All paid plans include 30-day free trial.'),
238
- ];
239
- const content = lines.filter((l) => l !== '');
240
- console.log('');
241
- console.log(box(content.join('\n'), {
242
- borderColor: c.sage,
243
- title: lang === 'zh-TW' ? '\u9700\u8981\u5347\u7D1A' : 'Upgrade Required',
244
- }));
245
- console.log('');
133
+ export function showUpgradePrompt(_feature, _lang = 'en') {
134
+ // All features are free and open source — no upgrade needed
246
135
  }
247
136
  /**
248
137
  * Show a contextual upgrade hint for scan auto-fix.
249
138
  * Used after scan results when fixable issues are found.
250
139
  */
251
- export function showScanUpgradeHint(fixableCount, lang = 'en') {
252
- const lines = lang === 'zh-TW'
253
- ? [
254
- `\u767C\u73FE ${fixableCount} \u500B\u53EF\u81EA\u52D5\u4FEE\u5FA9\u7684\u554F\u984C\u3002`,
255
- `\u5347\u7D1A\u5230 Solo ($9/\u6708) \u5373\u53EF\u4E00\u9375\u4FEE\u5FA9\uFF1A`,
256
- `$ panguard scan --fix`,
257
- ]
258
- : [
259
- `${fixableCount} issue(s) can be auto-fixed.`,
260
- `Upgrade to Solo ($9/mo) for one-click fix:`,
261
- `$ panguard scan --fix`,
262
- ];
263
- console.log('');
264
- console.log(box(lines.join('\n'), { borderColor: c.sage }));
140
+ export function showScanUpgradeHint(_fixableCount, _lang = 'en') {
141
+ // All features are free and open source — no upgrade needed
265
142
  }
266
143
  /**
267
144
  * Show a contextual upgrade hint for Guard AI analysis.
268
145
  * Used when a suspicious event needs AI analysis.
269
146
  */
270
- export function showGuardAIHint(threatType, confidence, lang = 'en') {
271
- console.log('');
272
- if (lang === 'zh-TW') {
273
- console.log(` ${c.caution('[?]')} \u5075\u6E2C\u5230\u53EF\u7591\u6D3B\u52D5\uFF08\u4FE1\u5FC3\u5EA6 ${confidence}%\uFF09`);
274
- console.log(` \u985E\u578B: ${threatType}`);
275
- console.log('');
276
- console.log(c.dim(` \u9700\u8981 AI \u5206\u6790\u624D\u80FD\u5224\u65B7\u662F\u5426\u70BA\u5A01\u8105\u3002`));
277
- console.log(c.dim(` \u5347\u7D1A\u5230 Solo ($9/\u6708) \u89E3\u9396 AI \u6DF1\u5EA6\u5206\u6790\u3002`));
278
- }
279
- else {
280
- console.log(` ${c.caution('[?]')} Suspicious activity detected (confidence ${confidence}%)`);
281
- console.log(` Type: ${threatType}`);
282
- console.log('');
283
- console.log(c.dim(` AI analysis required to determine if this is a threat.`));
284
- console.log(c.dim(` Upgrade to Solo ($9/mo) for AI-powered analysis.`));
285
- }
286
- console.log('');
147
+ export function showGuardAIHint(_threatType, _confidence, _lang = 'en') {
148
+ // All features are free and open source — no upgrade needed
287
149
  }
288
- /* ── Pricing Constants ── */
150
+ /* ── Pricing Constants (deprecated: all features are free) ── */
151
+ /** @deprecated All features are free. Kept for backward compatibility. */
289
152
  export const PRICING_TIERS = {
290
- community: { price: 0, unit: '', machines: '1' },
291
- solo: { price: 9, unit: '/mo', machines: '3' },
292
- pro: { price: 29, unit: '/mo', machines: '10' },
293
- business: { price: 79, unit: '/mo', machines: '25' },
294
- };
295
- export const COMPLIANCE_PRICING = {
296
- tw_cyber_security: {
297
- price: 299,
298
- unit: 'one-time',
299
- name: {
300
- en: 'TW Cyber Security Act',
301
- 'zh-TW': '\u8CC7\u5B89\u6CD5\u6E96\u5099\u5EA6\u8A55\u4F30',
302
- },
303
- },
304
- iso27001: {
305
- price: 499,
306
- unit: 'one-time',
307
- name: { en: 'ISO 27001 Readiness', 'zh-TW': 'ISO 27001 \u6E96\u5099\u5EA6\u8A55\u4F30' },
308
- },
309
- soc2: {
310
- price: 699,
311
- unit: 'one-time',
312
- name: { en: 'SOC 2 Readiness', 'zh-TW': 'SOC 2 \u6E96\u5099\u5EA6\u8A55\u4F30' },
313
- },
314
- bundle: {
315
- price: 999,
316
- unit: 'one-time',
317
- name: {
318
- en: 'Compliance Bundle (All 3)',
319
- 'zh-TW': '\u5408\u898F\u7D44\u5408\u5305 (3 \u9805\u5168\u542B)',
320
- },
321
- },
153
+ community: { price: 0, unit: '', machines: 'unlimited' },
322
154
  };
323
- /** Business subscribers get 50% off additional reports */
324
- export const BUSINESS_REPORT_DISCOUNT = 0.5;
155
+ /** @deprecated All features are free. Kept for backward compatibility. */
156
+ export const COMPLIANCE_PRICING = {};
157
+ /** All features are free — no discount logic needed */
158
+ export const BUSINESS_REPORT_DISCOUNT = 0;
325
159
  //# sourceMappingURL=auth-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/cli/auth-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,IAAI,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEnH,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAW1B,0DAA0D;AAE1D,MAAM,CAAC,MAAM,YAAY,GAAmC,kBAAkB,CAAC;AAE/E;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,eAA6B,WAAW;IAClE,oEAAoE;IACpE,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAEhC,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxE,CAAC;IAED,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC;QACnD,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CACtB,YAA0B,EAC1B,OAAsE;IAEtE,OAAO,KAAK,EAAE,OAAU,EAAE,EAAE;QAC1B,kEAAkE;QAClE,4DAA4D;QAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,GAAG,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;gBACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;QAExC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,GAAG,CACD;gBACE,GAAG,OAAO,CAAC,IAAI,qDAAqD;gBACpE,EAAE;gBACF,wBAAwB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,2BAA2B;gBAC3E,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,mBAAmB;aACrD,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CACjD,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,GAAG,CACD;gBACE,GAAG,OAAO,CAAC,IAAI,iBAAiB,QAAQ,mBAAmB,QAAQ,gBAAgB;gBACnF,EAAE;gBACF,+BAA+B,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAY,CAAC,IAAI,CAAC,CAAC,EAAE;gBACjF,mBAAmB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAY,CAAC,IAAI,CAAC,CAAC,EAAE;gBACrE,EAAE;gBACF,8BAA8B,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,EAAE;aAC3E,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAClF,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,WAAY,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAkB;IAC1C,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,KAAK,GAA2B;QACpC,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,OAAO;KACpB,CAAC;IACF,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO;IAE7D,2CAA2C;IAC3C,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,cAAc,EAAE;QACnC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,KAAK,EAAE,EAAE;QACnD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KAClC,CAAC;SACC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACZ,GAAG,CAAC,EAAE;QACJ,CAAC,CAAE,GAAG,CAAC,IAAI,EAGN;QACL,CAAC,CAAC,IAAI,CACT;SACA,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;YAAE,OAAO;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAY,CAAC;QAC/C,MAAM,iBAAiB,GAAI,IAAI,CAAC,IAAI,CAAC,IAAgC,CAAC,eAAe,CAGxE,CAAC;QAEd,2EAA2E;QAC3E,IAAI,UAAU,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,OAAO,CACP,cAAc,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,0DAA0D,CACpG,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,6CAA6C;QAC7C,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACzF,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,OAAO,CACP,cAAc,eAAe,CAAC,UAAU,CAAC,oBAAoB,QAAQ,UAAU,CAChF,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,UAAU,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACpE,eAAe,CAAC;gBACd,GAAG,KAAK;gBACR,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,2CAA2C;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,4CAA4C;IAC5C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IAED,+DAA+D;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,IAAY,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAY,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,YAAkB;IAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,OAAO,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC;IAC1D,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC;AAED,6CAA6C;AAE7C,MAAM,eAAe,GAA2C;IAC9D,IAAI,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAClE,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAClE,MAAM,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,EAAE;IACxE,IAAI,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,0BAA0B,EAAE;IACpE,aAAa,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAC3E,MAAM,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,0BAA0B,EAAE;IACpE,cAAc,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAClF,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAClE,IAAI,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE;CAClE,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,OAAe,IAAI;IACpE,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC;IAClD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,WAAW,GACf,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;IAElF,MAAM,KAAK,GACT,IAAI,KAAK,OAAO;QACd,CAAC,CAAC;YACE,SAAS,WAAW,sBAAsB,QAAQ,eAAe;YACjE,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,WAAW,qBAAqB,CAAC,CAAC,CAAC,EAAE;YACjE,EAAE;YACF,8BAA8B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YACpD,8BAA8B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAChD,EAAE;YACF,UAAU,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,EAAE;YACtD,UAAU,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,EAAE;YACrD,EAAE;YACF,CAAC,CAAC,GAAG,CACH,oFAAoF,CACrF;SACF;QACH,CAAC,CAAC;YACE,GAAG,WAAW,aAAa,QAAQ,OAAO;YAC1C,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,WAAW,aAAa,CAAC,CAAC,CAAC,EAAE;YACzD,EAAE;YACF,cAAc,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YACpC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAChC,EAAE;YACF,UAAU,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,EAAE;YACtD,UAAU,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,EAAE;YACrD,EAAE;YACF,CAAC,CAAC,GAAG,CAAC,2CAA2C,CAAC;SACnD,CAAC;IAER,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACtB,WAAW,EAAE,CAAC,CAAC,IAAI;QACnB,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,kBAAkB;KAC1E,CAAC,CACH,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAoB,EAAE,OAAe,IAAI;IAC3E,MAAM,KAAK,GACT,IAAI,KAAK,OAAO;QACd,CAAC,CAAC;YACE,gBAAgB,YAAY,+DAA+D;YAC3F,gFAAgF;YAChF,uBAAuB;SACxB;QACH,CAAC,CAAC;YACE,GAAG,YAAY,8BAA8B;YAC7C,4CAA4C;YAC5C,uBAAuB;SACxB,CAAC;IACR,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,UAAkB,EAAE,OAAe,IAAI;IACzF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,uEAAuE,UAAU,SAAS,CAChH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,GAAG,CACH,gGAAgG,CACjG,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,GAAG,CACH,0FAA0F,CAC3F,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,6CAA6C,UAAU,IAAI,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,6BAA6B;AAE7B,MAAM,CAAC,MAAM,aAAa,GAAsE;IAC9F,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;IAChD,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE;IAC9C,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC/C,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;CACrD,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAG3B;IACF,iBAAiB,EAAE;QACjB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE;YACJ,EAAE,EAAE,uBAAuB;YAC3B,OAAO,EAAE,kDAAkD;SAC5D;KACF;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,OAAO,EAAE,0CAA0C,EAAE;KACzF;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,sCAAsC,EAAE;KACjF;IACD,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE;YACJ,EAAE,EAAE,2BAA2B;YAC/B,OAAO,EAAE,uDAAuD;SACjE;KACF;CACF,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC"}
1
+ {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/cli/auth-guard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,KAAK,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;AAsc3B,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCzD;AAMD,wBAAgB,aAAa,IAAI,OAAO,CA0DvC"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,KAAK,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;AAkkB3B,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCzD;AAMD,wBAAgB,aAAa,IAAI,OAAO,CA0DvC"}
@@ -106,25 +106,31 @@ function checkCredentials() {
106
106
  }
107
107
  }
108
108
  function checkAiProvider() {
109
- // Check environment variables
110
- const hasOllama = Boolean(process.env['OLLAMA_HOST']);
109
+ const layers = [];
110
+ // Check Layer 2: Local AI (Ollama)
111
+ const hasOllamaEnv = Boolean(process.env['OLLAMA_HOST']);
112
+ let ollamaInstalled = false;
113
+ try {
114
+ const { execFileSync } = require('node:child_process');
115
+ execFileSync('ollama', ['--version'], { encoding: 'utf-8', timeout: 3000 });
116
+ ollamaInstalled = true;
117
+ }
118
+ catch {
119
+ // Ollama not available
120
+ }
121
+ // Check Layer 3: Cloud AI (API keys)
111
122
  const hasOpenAi = Boolean(process.env['OPENAI_API_KEY']);
112
- const hasAnthropic = Boolean(process.env['ANTHROPIC_API_KEY']);
113
- if (hasOllama || hasOpenAi || hasAnthropic) {
114
- const providers = [];
115
- if (hasOllama)
116
- providers.push('Ollama');
117
- if (hasOpenAi)
118
- providers.push('OpenAI');
119
- if (hasAnthropic)
120
- providers.push('Anthropic');
121
- return {
122
- status: 'pass',
123
- label: 'AI provider',
124
- detail: `API key set (${providers.join(', ')})`,
125
- };
123
+ const hasAnthropic = Boolean(process.env['ANTHROPIC_API_KEY'] || process.env['PANGUARD_AI_KEY']);
124
+ if (hasOllamaEnv || ollamaInstalled) {
125
+ layers.push('Layer 2: Ollama' + (hasOllamaEnv ? ' (env)' : ' (installed)'));
126
126
  }
127
- // Fall back to config file
127
+ if (hasOpenAi)
128
+ layers.push('Layer 3: OpenAI');
129
+ if (hasAnthropic)
130
+ layers.push('Layer 3: Anthropic');
131
+ // Check config file for AI settings
132
+ let configProvider;
133
+ let configModel;
128
134
  if (existsSync(CONFIG_PATH)) {
129
135
  try {
130
136
  const raw = readFileSync(CONFIG_PATH, 'utf-8');
@@ -133,26 +139,47 @@ function checkAiProvider() {
133
139
  return {
134
140
  status: 'pass',
135
141
  label: 'AI provider',
136
- detail: 'Rules-only mode (no AI provider required)',
142
+ detail: 'Rules-only mode (Layer 1 only, no AI provider required)',
137
143
  };
138
144
  }
139
145
  if (cfg.ai?.provider) {
140
- return {
141
- status: 'pass',
142
- label: 'AI provider',
143
- detail: `Provider configured: ${cfg.ai.provider}`,
144
- };
146
+ configProvider = cfg.ai.provider;
147
+ configModel = cfg.ai.model;
148
+ const layerNum = cfg.ai.provider === 'ollama' ? '2' : '3';
149
+ layers.push(`Layer ${layerNum}: ${cfg.ai.provider} (config)` + (cfg.ai.model ? ` / ${cfg.ai.model}` : ''));
145
150
  }
146
151
  }
147
152
  catch {
148
- // fall through to warn
153
+ // fall through
149
154
  }
150
155
  }
156
+ // Also check guard-specific config
157
+ const guardConfigPath = join(HOME, '.panguard-guard', 'config.json');
158
+ if (existsSync(guardConfigPath) && !configProvider) {
159
+ try {
160
+ const raw = readFileSync(guardConfigPath, 'utf-8');
161
+ const cfg = JSON.parse(raw);
162
+ if (cfg.ai?.provider) {
163
+ const layerNum = cfg.ai.provider === 'ollama' ? '2' : '3';
164
+ layers.push(`Layer ${layerNum}: ${cfg.ai.provider} (guard config)` + (cfg.ai.model ? ` / ${cfg.ai.model}` : ''));
165
+ }
166
+ }
167
+ catch {
168
+ // fall through
169
+ }
170
+ }
171
+ if (layers.length > 0) {
172
+ return {
173
+ status: 'pass',
174
+ label: 'AI provider',
175
+ detail: layers.join(', '),
176
+ };
177
+ }
151
178
  return {
152
179
  status: 'warn',
153
180
  label: 'AI provider',
154
- detail: 'No AI provider configured',
155
- fix: 'Set OPENAI_API_KEY / ANTHROPIC_API_KEY env var, or run "panguard config llm --provider ollama"',
181
+ detail: 'No AI provider configured (Layer 1 rules-only mode)',
182
+ fix: 'Run "panguard guard setup-ai" for interactive setup, or set ANTHROPIC_API_KEY / install Ollama',
156
183
  };
157
184
  }
158
185
  function checkGuardEngine() {
@@ -380,12 +407,105 @@ function checkShellCompletions() {
380
407
  // ---------------------------------------------------------------------------
381
408
  // Run all checks
382
409
  // ---------------------------------------------------------------------------
410
+ function checkAiLayerLocal() {
411
+ // Check if Ollama is installed
412
+ let ollamaInstalled = false;
413
+ let ollamaVersion = '';
414
+ try {
415
+ const { execFileSync } = require('node:child_process');
416
+ ollamaVersion = execFileSync('ollama', ['--version'], { encoding: 'utf-8', timeout: 3000 }).trim();
417
+ ollamaInstalled = true;
418
+ }
419
+ catch {
420
+ // not installed
421
+ }
422
+ if (!ollamaInstalled) {
423
+ return {
424
+ status: 'warn',
425
+ label: 'AI Layer 2 (Local)',
426
+ detail: 'Ollama not installed',
427
+ fix: 'Install: curl -fsSL https://ollama.com/install.sh | sh && ollama pull llama3.2',
428
+ };
429
+ }
430
+ // Check if any models are pulled
431
+ try {
432
+ const { execFileSync } = require('node:child_process');
433
+ const models = execFileSync('ollama', ['list'], { encoding: 'utf-8', timeout: 5000 }).trim();
434
+ const modelLines = models.split('\n').slice(1).filter(Boolean);
435
+ if (modelLines.length === 0) {
436
+ return {
437
+ status: 'warn',
438
+ label: 'AI Layer 2 (Local)',
439
+ detail: `Ollama installed (${ollamaVersion}) but no models pulled`,
440
+ fix: 'Pull a model: ollama pull llama3.2',
441
+ };
442
+ }
443
+ const firstModel = modelLines[0]?.split(/\s+/)[0] ?? 'unknown';
444
+ return {
445
+ status: 'pass',
446
+ label: 'AI Layer 2 (Local)',
447
+ detail: `Ollama ready (${modelLines.length} model${modelLines.length > 1 ? 's' : ''}, e.g. ${firstModel})`,
448
+ };
449
+ }
450
+ catch {
451
+ return {
452
+ status: 'warn',
453
+ label: 'AI Layer 2 (Local)',
454
+ detail: 'Ollama installed but cannot list models (is it running?)',
455
+ fix: 'Start Ollama: ollama serve',
456
+ };
457
+ }
458
+ }
459
+ function checkAiLayerCloud() {
460
+ const hasAnthropic = Boolean(process.env['ANTHROPIC_API_KEY'] || process.env['PANGUARD_AI_KEY']);
461
+ const hasOpenAi = Boolean(process.env['OPENAI_API_KEY']);
462
+ // Check config files
463
+ let configCloud = false;
464
+ let configProvider = '';
465
+ for (const cfgPath of [CONFIG_PATH, join(HOME, '.panguard-guard', 'config.json')]) {
466
+ if (existsSync(cfgPath)) {
467
+ try {
468
+ const raw = readFileSync(cfgPath, 'utf-8');
469
+ const cfg = JSON.parse(raw);
470
+ if (cfg.ai?.provider && cfg.ai.provider !== 'ollama' && cfg.ai?.apiKey) {
471
+ configCloud = true;
472
+ configProvider = `${cfg.ai.provider}${cfg.ai.model ? ' / ' + cfg.ai.model : ''}`;
473
+ }
474
+ }
475
+ catch {
476
+ // ignore
477
+ }
478
+ }
479
+ }
480
+ if (hasAnthropic || hasOpenAi || configCloud) {
481
+ const sources = [];
482
+ if (hasAnthropic)
483
+ sources.push('Anthropic (env)');
484
+ if (hasOpenAi)
485
+ sources.push('OpenAI (env)');
486
+ if (configCloud)
487
+ sources.push(configProvider + ' (config)');
488
+ return {
489
+ status: 'pass',
490
+ label: 'AI Layer 3 (Cloud)',
491
+ detail: sources.join(', '),
492
+ };
493
+ }
494
+ return {
495
+ status: 'warn',
496
+ label: 'AI Layer 3 (Cloud)',
497
+ detail: 'No cloud AI API key configured',
498
+ fix: 'Run "panguard guard setup-ai" or set ANTHROPIC_API_KEY / OPENAI_API_KEY',
499
+ };
500
+ }
383
501
  function runAllChecks() {
384
502
  return [
385
503
  checkInstallation(),
386
504
  checkConfiguration(),
387
505
  checkCredentials(),
388
506
  checkAiProvider(),
507
+ checkAiLayerLocal(),
508
+ checkAiLayerCloud(),
389
509
  checkGuardEngine(),
390
510
  checkNotificationChannels(),
391
511
  checkLastScan(),