@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.
- package/dist/cli/auth-guard.d.ts +9 -7
- package/dist/cli/auth-guard.d.ts.map +1 -1
- package/dist/cli/auth-guard.js +33 -199
- package/dist/cli/auth-guard.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +146 -26
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +264 -7
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/hacktivity.d.ts +10 -0
- package/dist/cli/commands/hacktivity.d.ts.map +1 -0
- package/dist/cli/commands/hacktivity.js +308 -0
- package/dist/cli/commands/hacktivity.js.map +1 -0
- package/dist/cli/commands/login.d.ts +3 -4
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +8 -258
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout.d.ts +3 -3
- package/dist/cli/commands/logout.d.ts.map +1 -1
- package/dist/cli/commands/logout.js +7 -35
- package/dist/cli/commands/logout.js.map +1 -1
- package/dist/cli/commands/report.d.ts +2 -2
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +30 -40
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/scan.d.ts.map +1 -1
- package/dist/cli/commands/scan.js +16 -19
- package/dist/cli/commands/scan.js.map +1 -1
- package/dist/cli/commands/setup-skill-scan.d.ts +39 -0
- package/dist/cli/commands/setup-skill-scan.d.ts.map +1 -0
- package/dist/cli/commands/setup-skill-scan.js +186 -0
- package/dist/cli/commands/setup-skill-scan.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +11 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +219 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/status.js +43 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/threat.d.ts +3 -0
- package/dist/cli/commands/threat.d.ts.map +1 -1
- package/dist/cli/commands/threat.js +31 -11
- package/dist/cli/commands/threat.js.map +1 -1
- package/dist/cli/commands/trap.d.ts +2 -2
- package/dist/cli/commands/trap.d.ts.map +1 -1
- package/dist/cli/commands/trap.js +32 -29
- package/dist/cli/commands/trap.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +3 -4
- package/dist/cli/commands/upgrade.d.ts.map +1 -1
- package/dist/cli/commands/upgrade.js +10 -234
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/commands/whoami.d.ts +2 -2
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +9 -60
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive.d.ts +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +477 -236
- package/dist/cli/interactive.js.map +1 -1
- package/dist/cli/menu.d.ts.map +1 -1
- package/dist/cli/menu.js +2 -5
- package/dist/cli/menu.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/init/wizard-runner.d.ts.map +1 -1
- package/dist/init/wizard-runner.js +136 -6
- package/dist/init/wizard-runner.js.map +1 -1
- package/package.json +25 -13
package/dist/cli/auth-guard.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
/**
|
|
79
|
-
export declare const BUSINESS_REPORT_DISCOUNT = 0
|
|
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;
|
|
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"}
|
package/dist/cli/auth-guard.js
CHANGED
|
@@ -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,
|
|
11
|
-
import { loadCredentials,
|
|
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
|
-
//
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
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
|
-
*
|
|
71
|
+
* No-op: all features are free and open source. No auth needed.
|
|
100
72
|
*/
|
|
101
73
|
export function refreshTierInBackground() {
|
|
102
|
-
|
|
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(
|
|
186
|
-
|
|
187
|
-
return
|
|
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(
|
|
206
|
-
|
|
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(
|
|
252
|
-
|
|
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(
|
|
271
|
-
|
|
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: '
|
|
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
|
-
/**
|
|
324
|
-
export const
|
|
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":"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"}
|
|
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;
|
|
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
|
-
|
|
110
|
-
|
|
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 (
|
|
114
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
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: '
|
|
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(),
|