@panguard-ai/panguard 0.1.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.
- package/dist/cli/auth-guard.d.ts +79 -0
- package/dist/cli/auth-guard.d.ts.map +1 -0
- package/dist/cli/auth-guard.js +337 -0
- package/dist/cli/auth-guard.js.map +1 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +129 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +75 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +94 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/demo.d.ts.map +1 -0
- package/dist/cli/commands/demo.js +170 -0
- package/dist/cli/commands/demo.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +9 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +242 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +82 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/hardening.d.ts +9 -0
- package/dist/cli/commands/hardening.d.ts.map +1 -0
- package/dist/cli/commands/hardening.js +114 -0
- package/dist/cli/commands/hardening.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +43 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +12 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +269 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +11 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +48 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/manager.d.ts +7 -0
- package/dist/cli/commands/manager.d.ts.map +1 -0
- package/dist/cli/commands/manager.js +104 -0
- package/dist/cli/commands/manager.js.map +1 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +69 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +279 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +598 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +9 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +258 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/threat.d.ts.map +1 -0
- package/dist/cli/commands/threat.js +115 -0
- package/dist/cli/commands/threat.js.map +1 -0
- package/dist/cli/commands/trap.d.ts.map +1 -0
- package/dist/cli/commands/trap.js +62 -0
- package/dist/cli/commands/trap.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +12 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +258 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +9 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +78 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/credentials.d.ts +71 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +207 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +10 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +822 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/menu.d.ts +54 -0
- package/dist/cli/menu.d.ts.map +1 -0
- package/dist/cli/menu.js +254 -0
- package/dist/cli/menu.js.map +1 -0
- package/dist/cli/theme.d.ts +32 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +79 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/ux-helpers.d.ts +30 -0
- package/dist/cli/ux-helpers.d.ts.map +1 -0
- package/dist/cli/ux-helpers.js +63 -0
- package/dist/cli/ux-helpers.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/init/config-writer.d.ts +20 -0
- package/dist/init/config-writer.d.ts.map +1 -0
- package/dist/init/config-writer.js +149 -0
- package/dist/init/config-writer.js.map +1 -0
- package/dist/init/environment.d.ts +31 -0
- package/dist/init/environment.d.ts.map +1 -0
- package/dist/init/environment.js +62 -0
- package/dist/init/environment.js.map +1 -0
- package/dist/init/index.d.ts +12 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +11 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/steps.d.ts +15 -0
- package/dist/init/steps.d.ts.map +1 -0
- package/dist/init/steps.js +359 -0
- package/dist/init/steps.js.map +1 -0
- package/dist/init/types.d.ts +98 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +8 -0
- package/dist/init/types.js.map +1 -0
- package/dist/init/wizard-runner.d.ts +12 -0
- package/dist/init/wizard-runner.d.ts.map +1 -0
- package/dist/init/wizard-runner.js +204 -0
- package/dist/init/wizard-runner.js.map +1 -0
- package/dist/manager/manager-server.d.ts +102 -0
- package/dist/manager/manager-server.d.ts.map +1 -0
- package/dist/manager/manager-server.js +515 -0
- package/dist/manager/manager-server.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI feature gating based on authenticated user tier.
|
|
3
|
+
* CLI 功能控制 - 基於已驗證用戶的訂閱等級
|
|
4
|
+
*
|
|
5
|
+
* @module @panguard-ai/panguard/cli/auth-guard
|
|
6
|
+
*/
|
|
7
|
+
import type { StoredCredentials, Tier } from './credentials.js';
|
|
8
|
+
export type RequiredTier = Tier;
|
|
9
|
+
export interface AuthCheckResult {
|
|
10
|
+
authenticated: boolean;
|
|
11
|
+
authorized: boolean;
|
|
12
|
+
credentials: StoredCredentials | null;
|
|
13
|
+
}
|
|
14
|
+
export declare const FEATURE_TIER: Record<string, Tier>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if the current CLI user is authenticated and has the required tier.
|
|
17
|
+
*/
|
|
18
|
+
export declare function requireAuth(requiredTier?: RequiredTier): AuthCheckResult;
|
|
19
|
+
/**
|
|
20
|
+
* Decorator for Commander actions that require authentication.
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* .action(withAuth('pro', async (opts, creds) => { ... }))
|
|
24
|
+
*/
|
|
25
|
+
export declare function withAuth<T>(requiredTier: RequiredTier, handler: (options: T, credentials: StoredCredentials) => Promise<void>): (options: T) => Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Tier badge string for display in menus.
|
|
28
|
+
*/
|
|
29
|
+
export declare function tierBadge(tier: RequiredTier): string;
|
|
30
|
+
/**
|
|
31
|
+
* Refresh tier from server in background.
|
|
32
|
+
* Called on CLI startup to ensure local cache is current.
|
|
33
|
+
*/
|
|
34
|
+
export declare function refreshTierInBackground(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get current license/tier from stored credentials or license file.
|
|
37
|
+
* Checks credentials.json first, then falls back to ~/.panguard/license.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getLicense(): {
|
|
40
|
+
tier: Tier;
|
|
41
|
+
email?: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Check if current user has access to a given tier level.
|
|
45
|
+
*/
|
|
46
|
+
export declare function checkAccess(requiredTier: Tier): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Check if current user has access to a feature by name.
|
|
49
|
+
* Uses FEATURE_TIER mapping to resolve the required tier.
|
|
50
|
+
*/
|
|
51
|
+
export declare function checkFeatureAccess(feature: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Display a branded upgrade prompt for a locked feature.
|
|
54
|
+
* Accepts feature KEY (e.g. 'report', not 'Compliance Report').
|
|
55
|
+
*/
|
|
56
|
+
export declare function showUpgradePrompt(feature: string, lang?: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Show a contextual upgrade hint for scan auto-fix.
|
|
59
|
+
* Used after scan results when fixable issues are found.
|
|
60
|
+
*/
|
|
61
|
+
export declare function showScanUpgradeHint(fixableCount: number, lang?: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Show a contextual upgrade hint for Guard AI analysis.
|
|
64
|
+
* Used when a suspicious event needs AI analysis.
|
|
65
|
+
*/
|
|
66
|
+
export declare function showGuardAIHint(threatType: string, confidence: number, lang?: string): void;
|
|
67
|
+
export declare const PRICING_TIERS: Record<string, {
|
|
68
|
+
price: number;
|
|
69
|
+
unit: string;
|
|
70
|
+
machines: string;
|
|
71
|
+
}>;
|
|
72
|
+
export declare const COMPLIANCE_PRICING: Record<string, {
|
|
73
|
+
price: number;
|
|
74
|
+
unit: string;
|
|
75
|
+
name: Record<string, string>;
|
|
76
|
+
}>;
|
|
77
|
+
/** Business subscribers get 50% off additional reports */
|
|
78
|
+
export declare const BUSINESS_REPORT_DISCOUNT = 0.5;
|
|
79
|
+
//# sourceMappingURL=auth-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/cli/auth-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEhE,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,MAAM,CAAC,MAAM,EAAE,IAAI,CAU7C,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,GAAE,YAA0B,GAAG,eAAe,CAoBrF;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"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI feature gating based on authenticated user tier.
|
|
3
|
+
* CLI 功能控制 - 基於已驗證用戶的訂閱等級
|
|
4
|
+
*
|
|
5
|
+
* @module @panguard-ai/panguard/cli/auth-guard
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { c, symbols, box } from '@panguard-ai/core';
|
|
11
|
+
import { loadCredentials, saveCredentials, isTokenExpired, tierDisplayName, TIER_LEVEL, } from './credentials.js';
|
|
12
|
+
/* ── Feature → Tier mapping ── */
|
|
13
|
+
export const FEATURE_TIER = {
|
|
14
|
+
setup: 'community',
|
|
15
|
+
scan: 'community',
|
|
16
|
+
guard: 'community',
|
|
17
|
+
'threat-cloud': 'community',
|
|
18
|
+
demo: 'community',
|
|
19
|
+
notifications: 'solo',
|
|
20
|
+
notify: 'solo',
|
|
21
|
+
trap: 'solo',
|
|
22
|
+
report: 'business',
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Check if the current CLI user is authenticated and has the required tier.
|
|
26
|
+
*/
|
|
27
|
+
export function requireAuth(requiredTier = 'community') {
|
|
28
|
+
// Community tier requires no authentication — allow anonymous usage
|
|
29
|
+
if (requiredTier === 'community') {
|
|
30
|
+
return { authenticated: true, authorized: true, credentials: null };
|
|
31
|
+
}
|
|
32
|
+
const creds = loadCredentials();
|
|
33
|
+
if (!creds || isTokenExpired(creds)) {
|
|
34
|
+
return { authenticated: false, authorized: false, credentials: null };
|
|
35
|
+
}
|
|
36
|
+
const userLevel = TIER_LEVEL[creds.tier] ?? 0;
|
|
37
|
+
const requiredLevel = TIER_LEVEL[requiredTier] ?? 0;
|
|
38
|
+
return {
|
|
39
|
+
authenticated: true,
|
|
40
|
+
authorized: userLevel >= requiredLevel,
|
|
41
|
+
credentials: creds,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Decorator for Commander actions that require authentication.
|
|
46
|
+
*
|
|
47
|
+
* Usage:
|
|
48
|
+
* .action(withAuth('pro', async (opts, creds) => { ... }))
|
|
49
|
+
*/
|
|
50
|
+
export function withAuth(requiredTier, handler) {
|
|
51
|
+
return async (options) => {
|
|
52
|
+
// In server mode, require a valid service token from environment.
|
|
53
|
+
// The server has its own session-based auth for API routes.
|
|
54
|
+
if (process.env['PANGUARD_SERVER_MODE'] === '1') {
|
|
55
|
+
const creds = loadCredentials();
|
|
56
|
+
if (!creds || isTokenExpired(creds)) {
|
|
57
|
+
console.error('Server mode requires valid credentials. Run `panguard login` first.');
|
|
58
|
+
process.exitCode = 1;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
await handler(options, creds);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const check = requireAuth(requiredTier);
|
|
65
|
+
if (!check.authenticated) {
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(box([
|
|
68
|
+
`${symbols.warn} \u9700\u8981\u767B\u5165 / Authentication required`,
|
|
69
|
+
'',
|
|
70
|
+
` \u8ACB\u57F7\u884C ${c.sage('panguard login')} \u4F86\u9A57\u8B49\u3002`,
|
|
71
|
+
` Run ${c.sage('panguard login')} to authenticate.`,
|
|
72
|
+
].join('\n'), { borderColor: c.caution, title: 'Panguard AI' }));
|
|
73
|
+
console.log('');
|
|
74
|
+
process.exitCode = 1;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!check.authorized) {
|
|
78
|
+
const tierName = tierDisplayName(requiredTier);
|
|
79
|
+
console.log('');
|
|
80
|
+
console.log(box([
|
|
81
|
+
`${symbols.fail} \u9700\u8981 ${tierName} \u7B49\u7D1A / ${tierName} tier required`,
|
|
82
|
+
'',
|
|
83
|
+
` \u76EE\u524D\u7B49\u7D1A: ${c.sage(tierDisplayName(check.credentials.tier))}`,
|
|
84
|
+
` Current tier: ${c.sage(tierDisplayName(check.credentials.tier))}`,
|
|
85
|
+
'',
|
|
86
|
+
` \u5347\u7D1A\u8ACB\u898B ${c.underline('https://panguard.ai/pricing')}`,
|
|
87
|
+
].join('\n'), { borderColor: c.critical, title: '\u9700\u8981\u5347\u7D1A / Upgrade Required' }));
|
|
88
|
+
console.log('');
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
await handler(options, check.credentials);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Tier badge string for display in menus.
|
|
97
|
+
*/
|
|
98
|
+
export function tierBadge(tier) {
|
|
99
|
+
if (tier === 'community')
|
|
100
|
+
return '';
|
|
101
|
+
const names = {
|
|
102
|
+
solo: '[SOLO]',
|
|
103
|
+
pro: '[PRO]',
|
|
104
|
+
business: '[BIZ]',
|
|
105
|
+
enterprise: '[ENT]',
|
|
106
|
+
};
|
|
107
|
+
return c.dim(names[tier] ?? '');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Refresh tier from server in background.
|
|
111
|
+
* Called on CLI startup to ensure local cache is current.
|
|
112
|
+
*/
|
|
113
|
+
export function refreshTierInBackground() {
|
|
114
|
+
const creds = loadCredentials();
|
|
115
|
+
if (!creds || isTokenExpired(creds) || !creds.apiUrl)
|
|
116
|
+
return;
|
|
117
|
+
// Fire-and-forget: don't block CLI startup
|
|
118
|
+
fetch(`${creds.apiUrl}/api/auth/me`, {
|
|
119
|
+
headers: { Authorization: `Bearer ${creds.token}` },
|
|
120
|
+
signal: AbortSignal.timeout(5000),
|
|
121
|
+
})
|
|
122
|
+
.then((res) => res.ok
|
|
123
|
+
? res.json()
|
|
124
|
+
: null)
|
|
125
|
+
.then((body) => {
|
|
126
|
+
if (!body?.data?.user?.tier)
|
|
127
|
+
return;
|
|
128
|
+
const serverTier = body.data.user.tier;
|
|
129
|
+
const serverPlanExpires = body.data.user['planExpiresAt'];
|
|
130
|
+
// Check if plan has expired server-side (tier got downgraded to community)
|
|
131
|
+
if (serverTier === 'community' && creds.tier !== 'community') {
|
|
132
|
+
console.log('');
|
|
133
|
+
console.log(c.caution(` [!] Your ${tierDisplayName(creds.tier)} plan has expired. Account downgraded to Community tier.`));
|
|
134
|
+
console.log(c.dim(` Renew at https://panguard.ai/pricing`));
|
|
135
|
+
console.log('');
|
|
136
|
+
}
|
|
137
|
+
// Warn if plan expiring soon (within 3 days)
|
|
138
|
+
if (serverPlanExpires) {
|
|
139
|
+
const expiresDate = new Date(serverPlanExpires);
|
|
140
|
+
const daysLeft = Math.ceil((expiresDate.getTime() - Date.now()) / (24 * 60 * 60 * 1000));
|
|
141
|
+
if (daysLeft > 0 && daysLeft <= 3) {
|
|
142
|
+
console.log('');
|
|
143
|
+
console.log(c.caution(` [!] Your ${tierDisplayName(serverTier)} plan expires in ${daysLeft} day(s).`));
|
|
144
|
+
console.log(c.dim(` Renew at https://panguard.ai/pricing`));
|
|
145
|
+
console.log('');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (serverTier !== creds.tier || body.data.user.name !== creds.name) {
|
|
149
|
+
saveCredentials({
|
|
150
|
+
...creds,
|
|
151
|
+
tier: serverTier,
|
|
152
|
+
name: body.data.user.name ?? creds.name,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
})
|
|
156
|
+
.catch(() => {
|
|
157
|
+
/* offline or timeout — keep local cache */
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get current license/tier from stored credentials or license file.
|
|
162
|
+
* Checks credentials.json first, then falls back to ~/.panguard/license.
|
|
163
|
+
*/
|
|
164
|
+
export function getLicense() {
|
|
165
|
+
// 1. Try credentials.json (logged-in users)
|
|
166
|
+
const creds = loadCredentials();
|
|
167
|
+
if (creds && !isTokenExpired(creds)) {
|
|
168
|
+
return { tier: creds.tier, email: creds.email };
|
|
169
|
+
}
|
|
170
|
+
// 2. Fallback: ~/.panguard/license file (offline license keys)
|
|
171
|
+
const licensePath = join(homedir(), '.panguard', 'license');
|
|
172
|
+
if (existsSync(licensePath)) {
|
|
173
|
+
try {
|
|
174
|
+
const content = readFileSync(licensePath, 'utf-8').trim();
|
|
175
|
+
const data = JSON.parse(content);
|
|
176
|
+
if (data.tier && TIER_LEVEL[data.tier] !== undefined) {
|
|
177
|
+
return { tier: data.tier, email: data.email };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Invalid license file — fall through to community
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { tier: 'community' };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if current user has access to a given tier level.
|
|
188
|
+
*/
|
|
189
|
+
export function checkAccess(requiredTier) {
|
|
190
|
+
const { tier } = getLicense();
|
|
191
|
+
return (TIER_LEVEL[tier] ?? 0) >= (TIER_LEVEL[requiredTier] ?? 0);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if current user has access to a feature by name.
|
|
195
|
+
* Uses FEATURE_TIER mapping to resolve the required tier.
|
|
196
|
+
*/
|
|
197
|
+
export function checkFeatureAccess(feature) {
|
|
198
|
+
const requiredTier = FEATURE_TIER[feature] ?? 'community';
|
|
199
|
+
return checkAccess(requiredTier);
|
|
200
|
+
}
|
|
201
|
+
/* ── Feature display names (bilingual) ── */
|
|
202
|
+
const FEATURE_DISPLAY = {
|
|
203
|
+
scan: { en: 'Security Scan', 'zh-TW': '\u5B89\u5168\u6383\u63CF' },
|
|
204
|
+
guard: { en: 'Guard Engine', 'zh-TW': '\u5B88\u8B77\u5F15\u64CE' },
|
|
205
|
+
report: { en: 'Compliance Report', 'zh-TW': '\u5408\u898F\u5831\u544A' },
|
|
206
|
+
trap: { en: 'Honeypot System', 'zh-TW': '\u871C\u7F50\u7CFB\u7D71' },
|
|
207
|
+
notifications: { en: 'Notifications', 'zh-TW': '\u901A\u77E5\u7CFB\u7D71' },
|
|
208
|
+
notify: { en: 'Notifications', 'zh-TW': '\u901A\u77E5\u7CFB\u7D71' },
|
|
209
|
+
'threat-cloud': { en: 'Threat Intelligence', 'zh-TW': '\u5A01\u8105\u60C5\u5831' },
|
|
210
|
+
setup: { en: 'Setup Wizard', 'zh-TW': '\u521D\u59CB\u8A2D\u5B9A' },
|
|
211
|
+
demo: { en: 'Feature Demo', 'zh-TW': '\u529F\u80FD\u5C55\u793A' },
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Display a branded upgrade prompt for a locked feature.
|
|
215
|
+
* Accepts feature KEY (e.g. 'report', not 'Compliance Report').
|
|
216
|
+
*/
|
|
217
|
+
export function showUpgradePrompt(feature, lang = 'en') {
|
|
218
|
+
const tier = FEATURE_TIER[feature] ?? 'community';
|
|
219
|
+
const { tier: userTier } = getLicense();
|
|
220
|
+
const tierName = tierDisplayName(tier);
|
|
221
|
+
const userTierName = tierDisplayName(userTier);
|
|
222
|
+
const pricing = PRICING_TIERS[tier];
|
|
223
|
+
const priceStr = pricing && pricing.price > 0 ? `$${pricing.price}${pricing.unit}` : '';
|
|
224
|
+
const machinesStr = pricing ? pricing.machines : '';
|
|
225
|
+
const featureName = FEATURE_DISPLAY[feature]?.[lang] ?? FEATURE_DISPLAY[feature]?.['en'] ?? feature;
|
|
226
|
+
const lines = lang === 'zh-TW'
|
|
227
|
+
? [
|
|
228
|
+
`\u300C${featureName}\u300D\u9700\u8981 ${tierName} \u65B9\u6848`,
|
|
229
|
+
priceStr ? `${priceStr} | ${machinesStr} \u53F0\u6A5F\u5668` : '',
|
|
230
|
+
'',
|
|
231
|
+
`\u76EE\u524D\u65B9\u6848: ${c.sage(userTierName)}`,
|
|
232
|
+
`\u9700\u8981\u65B9\u6848: ${c.sage(tierName)}`,
|
|
233
|
+
'',
|
|
234
|
+
`\u2192 ${c.underline('https://panguard.ai/pricing')}`,
|
|
235
|
+
`\u2192 ${c.sage('panguard activate <license-key>')}`,
|
|
236
|
+
'',
|
|
237
|
+
c.dim('\u6240\u6709\u4ED8\u8CBB\u65B9\u6848\u4EAB 30 \u5929\u514D\u8CBB\u8A66\u7528\u3002'),
|
|
238
|
+
]
|
|
239
|
+
: [
|
|
240
|
+
`${featureName} requires ${tierName} plan`,
|
|
241
|
+
priceStr ? `${priceStr} | ${machinesStr} machine(s)` : '',
|
|
242
|
+
'',
|
|
243
|
+
`Current: ${c.sage(userTierName)}`,
|
|
244
|
+
`Required: ${c.sage(tierName)}`,
|
|
245
|
+
'',
|
|
246
|
+
`\u2192 ${c.underline('https://panguard.ai/pricing')}`,
|
|
247
|
+
`\u2192 ${c.sage('panguard activate <license-key>')}`,
|
|
248
|
+
'',
|
|
249
|
+
c.dim('All paid plans include 30-day free trial.'),
|
|
250
|
+
];
|
|
251
|
+
const content = lines.filter((l) => l !== '');
|
|
252
|
+
console.log('');
|
|
253
|
+
console.log(box(content.join('\n'), {
|
|
254
|
+
borderColor: c.sage,
|
|
255
|
+
title: lang === 'zh-TW' ? '\u9700\u8981\u5347\u7D1A' : 'Upgrade Required',
|
|
256
|
+
}));
|
|
257
|
+
console.log('');
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Show a contextual upgrade hint for scan auto-fix.
|
|
261
|
+
* Used after scan results when fixable issues are found.
|
|
262
|
+
*/
|
|
263
|
+
export function showScanUpgradeHint(fixableCount, lang = 'en') {
|
|
264
|
+
const lines = lang === 'zh-TW'
|
|
265
|
+
? [
|
|
266
|
+
`\u767C\u73FE ${fixableCount} \u500B\u53EF\u81EA\u52D5\u4FEE\u5FA9\u7684\u554F\u984C\u3002`,
|
|
267
|
+
`\u5347\u7D1A\u5230 Solo ($9/\u6708) \u5373\u53EF\u4E00\u9375\u4FEE\u5FA9\uFF1A`,
|
|
268
|
+
`$ panguard scan --fix`,
|
|
269
|
+
]
|
|
270
|
+
: [
|
|
271
|
+
`${fixableCount} issue(s) can be auto-fixed.`,
|
|
272
|
+
`Upgrade to Solo ($9/mo) for one-click fix:`,
|
|
273
|
+
`$ panguard scan --fix`,
|
|
274
|
+
];
|
|
275
|
+
console.log('');
|
|
276
|
+
console.log(box(lines.join('\n'), { borderColor: c.sage }));
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Show a contextual upgrade hint for Guard AI analysis.
|
|
280
|
+
* Used when a suspicious event needs AI analysis.
|
|
281
|
+
*/
|
|
282
|
+
export function showGuardAIHint(threatType, confidence, lang = 'en') {
|
|
283
|
+
console.log('');
|
|
284
|
+
if (lang === 'zh-TW') {
|
|
285
|
+
console.log(` ${c.caution('[?]')} \u5075\u6E2C\u5230\u53EF\u7591\u6D3B\u52D5\uFF08\u4FE1\u5FC3\u5EA6 ${confidence}%\uFF09`);
|
|
286
|
+
console.log(` \u985E\u578B: ${threatType}`);
|
|
287
|
+
console.log('');
|
|
288
|
+
console.log(c.dim(` \u9700\u8981 AI \u5206\u6790\u624D\u80FD\u5224\u65B7\u662F\u5426\u70BA\u5A01\u8105\u3002`));
|
|
289
|
+
console.log(c.dim(` \u5347\u7D1A\u5230 Solo ($9/\u6708) \u89E3\u9396 AI \u6DF1\u5EA6\u5206\u6790\u3002`));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
console.log(` ${c.caution('[?]')} Suspicious activity detected (confidence ${confidence}%)`);
|
|
293
|
+
console.log(` Type: ${threatType}`);
|
|
294
|
+
console.log('');
|
|
295
|
+
console.log(c.dim(` AI analysis required to determine if this is a threat.`));
|
|
296
|
+
console.log(c.dim(` Upgrade to Solo ($9/mo) for AI-powered analysis.`));
|
|
297
|
+
}
|
|
298
|
+
console.log('');
|
|
299
|
+
}
|
|
300
|
+
/* ── Pricing Constants ── */
|
|
301
|
+
export const PRICING_TIERS = {
|
|
302
|
+
community: { price: 0, unit: '', machines: '1' },
|
|
303
|
+
solo: { price: 9, unit: '/mo', machines: '3' },
|
|
304
|
+
pro: { price: 29, unit: '/mo', machines: '10' },
|
|
305
|
+
business: { price: 79, unit: '/mo', machines: '25' },
|
|
306
|
+
};
|
|
307
|
+
export const COMPLIANCE_PRICING = {
|
|
308
|
+
tw_cyber_security: {
|
|
309
|
+
price: 299,
|
|
310
|
+
unit: 'one-time',
|
|
311
|
+
name: {
|
|
312
|
+
en: 'TW Cyber Security Act',
|
|
313
|
+
'zh-TW': '\u8CC7\u5B89\u6CD5\u6E96\u5099\u5EA6\u8A55\u4F30',
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
iso27001: {
|
|
317
|
+
price: 499,
|
|
318
|
+
unit: 'one-time',
|
|
319
|
+
name: { en: 'ISO 27001 Readiness', 'zh-TW': 'ISO 27001 \u6E96\u5099\u5EA6\u8A55\u4F30' },
|
|
320
|
+
},
|
|
321
|
+
soc2: {
|
|
322
|
+
price: 699,
|
|
323
|
+
unit: 'one-time',
|
|
324
|
+
name: { en: 'SOC 2 Readiness', 'zh-TW': 'SOC 2 \u6E96\u5099\u5EA6\u8A55\u4F30' },
|
|
325
|
+
},
|
|
326
|
+
bundle: {
|
|
327
|
+
price: 999,
|
|
328
|
+
unit: 'one-time',
|
|
329
|
+
name: {
|
|
330
|
+
en: 'Compliance Bundle (All 3)',
|
|
331
|
+
'zh-TW': '\u5408\u898F\u7D44\u5408\u5305 (3 \u9805\u5168\u542B)',
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
/** Business subscribers get 50% off additional reports */
|
|
336
|
+
export const BUSINESS_REPORT_DISCOUNT = 0.5;
|
|
337
|
+
//# sourceMappingURL=auth-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/cli/auth-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,YAAY,IAAI,OAAO,CAkItC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* panguard admin - Admin management commands
|
|
3
|
+
*
|
|
4
|
+
* panguard admin init Create initial admin account
|
|
5
|
+
* panguard admin create-user Create a user with specified tier
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { createInterface } from 'node:readline';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { mkdirSync } from 'node:fs';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { c, banner } from '@panguard-ai/core';
|
|
13
|
+
import { AuthDB, hashPassword } from '@panguard-ai/panguard-auth';
|
|
14
|
+
function prompt(rl, question) {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
rl.question(question, (answer) => resolve(answer.trim()));
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function adminCommand() {
|
|
20
|
+
const cmd = new Command('admin').description('Admin management commands / 管理員指令');
|
|
21
|
+
cmd
|
|
22
|
+
.command('init')
|
|
23
|
+
.description('Create initial admin account / 建立初始管理員帳號')
|
|
24
|
+
.option('--db <path>', 'Database path', join(homedir(), '.panguard', 'auth.db'))
|
|
25
|
+
.action(async (options) => {
|
|
26
|
+
console.log(banner());
|
|
27
|
+
console.log(` ${c.sage('Admin Init')} - Create admin account`);
|
|
28
|
+
console.log('');
|
|
29
|
+
// Ensure db directory exists
|
|
30
|
+
mkdirSync(join(homedir(), '.panguard'), { recursive: true });
|
|
31
|
+
const db = new AuthDB(options.db);
|
|
32
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
33
|
+
try {
|
|
34
|
+
const email = await prompt(rl, ` ${c.dim('Email:')} `);
|
|
35
|
+
if (!email || !email.includes('@')) {
|
|
36
|
+
console.log(` ${c.critical('Invalid email')}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const existing = db.getUserByEmail(email);
|
|
40
|
+
if (existing) {
|
|
41
|
+
console.log(` ${c.caution('User already exists.')} Updating role to admin...`);
|
|
42
|
+
db.updateUserRole(existing.id, 'admin');
|
|
43
|
+
console.log(` ${c.safe('Done.')} ${email} is now an admin.`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const name = await prompt(rl, ` ${c.dim('Name:')} `);
|
|
47
|
+
const password = await prompt(rl, ` ${c.dim('Password (min 8 chars):')} `);
|
|
48
|
+
if (password.length < 8) {
|
|
49
|
+
console.log(` ${c.critical('Password must be at least 8 characters')}`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const pwHash = await hashPassword(password);
|
|
53
|
+
const user = db.createUser({ email, name: name || email, password }, pwHash);
|
|
54
|
+
db.updateUserRole(user.id, 'admin');
|
|
55
|
+
console.log('');
|
|
56
|
+
console.log(` ${c.safe('Admin account created:')}`);
|
|
57
|
+
console.log(` Email: ${c.sage(email)}`);
|
|
58
|
+
console.log(` Role: ${c.sage('admin')}`);
|
|
59
|
+
console.log(` Tier: ${c.sage('free')} (change via admin panel)`);
|
|
60
|
+
console.log('');
|
|
61
|
+
console.log(` Start the server: ${c.sage('panguard serve')}`);
|
|
62
|
+
console.log(` Admin panel: ${c.sage('http://localhost:3000/admin')}`);
|
|
63
|
+
console.log('');
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
rl.close();
|
|
67
|
+
db.close();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
cmd
|
|
71
|
+
.command('create-user')
|
|
72
|
+
.description('Create a user with specified tier / 建立指定等級的用戶')
|
|
73
|
+
.option('--db <path>', 'Database path', join(homedir(), '.panguard', 'auth.db'))
|
|
74
|
+
.option('--email <email>', 'User email')
|
|
75
|
+
.option('--name <name>', 'User name')
|
|
76
|
+
.option('--password <password>', 'User password')
|
|
77
|
+
.option('--tier <tier>', 'User tier (free/solo/pro/enterprise)', 'free')
|
|
78
|
+
.option('--role <role>', 'User role (user/admin)', 'user')
|
|
79
|
+
.action(async (options) => {
|
|
80
|
+
mkdirSync(join(homedir(), '.panguard'), { recursive: true });
|
|
81
|
+
const db = new AuthDB(options.db);
|
|
82
|
+
let email = options.email;
|
|
83
|
+
let name = options.name;
|
|
84
|
+
let password = options.password;
|
|
85
|
+
// Interactive mode if options not provided
|
|
86
|
+
if (!email || !password) {
|
|
87
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
88
|
+
try {
|
|
89
|
+
if (!email)
|
|
90
|
+
email = await prompt(rl, ` ${c.dim('Email:')} `);
|
|
91
|
+
if (!name)
|
|
92
|
+
name = await prompt(rl, ` ${c.dim('Name:')} `);
|
|
93
|
+
if (!password)
|
|
94
|
+
password = await prompt(rl, ` ${c.dim('Password:')} `);
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
rl.close();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!email || !email.includes('@')) {
|
|
101
|
+
console.log(` ${c.critical('Invalid email')}`);
|
|
102
|
+
db.close();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!password || password.length < 8) {
|
|
106
|
+
console.log(` ${c.critical('Password must be at least 8 characters')}`);
|
|
107
|
+
db.close();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const existing = db.getUserByEmail(email);
|
|
111
|
+
if (existing) {
|
|
112
|
+
console.log(` ${c.caution('User already exists with this email')}`);
|
|
113
|
+
db.close();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const pwHash = await hashPassword(password);
|
|
117
|
+
const user = db.createUser({ email, name: name || email, password }, pwHash);
|
|
118
|
+
db.updateUserTier(user.id, options.tier);
|
|
119
|
+
db.updateUserRole(user.id, options.role);
|
|
120
|
+
console.log(` ${c.safe('User created:')}`);
|
|
121
|
+
console.log(` Email: ${email}`);
|
|
122
|
+
console.log(` Tier: ${options.tier}`);
|
|
123
|
+
console.log(` Role: ${options.role}`);
|
|
124
|
+
console.log('');
|
|
125
|
+
db.close();
|
|
126
|
+
});
|
|
127
|
+
return cmd;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/cli/commands/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,WAAW,IAAI,OAAO,CAsErC"}
|