@panguard-ai/panguard-web 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.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Content module barrel exports
3
+ * 內容模組匯出
4
+ *
5
+ * @module @panguard-ai/panguard-web/content
6
+ */
7
+ export { PERSONAS, getPersona, getAllPersonas } from './personas.js';
8
+ export { PRICING_PLANS, REPORT_ADDONS, getPricingPlan, getAllPricingPlans, getRecommendedPlan, getAllReportAddons, getReportAddon, } from './pricing.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACf,MAAM,cAAc,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Content module barrel exports
3
+ * 內容模組匯出
4
+ *
5
+ * @module @panguard-ai/panguard-web/content
6
+ */
7
+ export { PERSONAS, getPersona, getAllPersonas } from './personas.js';
8
+ export { PRICING_PLANS, REPORT_ADDONS, getPricingPlan, getAllPricingPlans, getRecommendedPlan, getAllReportAddons, getReportAddon, } from './pricing.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACf,MAAM,cAAc,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Target audience persona definitions
3
+ * 目標用戶角色定義
4
+ *
5
+ * Based on README TA: individual developers, small businesses (5-50), mid enterprises (50-500)
6
+ * 根據 README TA:個人開發者、小型企業 (5-50 人)、中型企業 (50-500 人)
7
+ *
8
+ * @module @panguard-ai/panguard-web/content/personas
9
+ */
10
+ import type { PersonaProfile } from '../types.js';
11
+ export declare const PERSONAS: Record<string, PersonaProfile>;
12
+ /**
13
+ * Get persona by type
14
+ * 根據類型取得角色
15
+ */
16
+ export declare function getPersona(type: string): PersonaProfile | undefined;
17
+ /**
18
+ * Get all personas
19
+ * 取得所有角色
20
+ */
21
+ export declare function getAllPersonas(): PersonaProfile[];
22
+ //# sourceMappingURL=personas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../../src/content/personas.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AA4GjE,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAoEnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEnE;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,cAAc,EAAE,CAEjD"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Target audience persona definitions
3
+ * 目標用戶角色定義
4
+ *
5
+ * Based on README TA: individual developers, small businesses (5-50), mid enterprises (50-500)
6
+ * 根據 README TA:個人開發者、小型企業 (5-50 人)、中型企業 (50-500 人)
7
+ *
8
+ * @module @panguard-ai/panguard-web/content/personas
9
+ */
10
+ // ---------------------------------------------------------------------------
11
+ // Scenario stories per persona
12
+ // 各角色的場景故事
13
+ // ---------------------------------------------------------------------------
14
+ const DEVELOPER_SCENARIOS = [
15
+ {
16
+ id: 'dev-ssh-brute',
17
+ threatType: 'SSH Brute Force',
18
+ beforeEn: 'Your VPS is getting hammered by SSH brute force attacks from bots. You have no idea because you never check auth.log.',
19
+ beforeZh: '你的 VPS 正在被機器人的 SSH 暴力破解攻擊轟炸。你完全不知道,因為你從來不看 auth.log。',
20
+ afterEn: 'Panguard AI detects 500 failed login attempts from China, automatically blocks the IP, and tells you on Telegram.',
21
+ afterZh: 'Panguard AI 偵測到來自中國的 500 次登入失敗,自動封鎖 IP,並在 Telegram 上告訴你。',
22
+ notificationEn: "Someone was trying to guess your password to log in. Source: Hebei, China. 500 attempts, all failed. I've added this IP to the blocklist.",
23
+ notificationZh: '有人正在嘗試猜你的密碼登入。來源:中國河北。已嘗試 500 次,全部失敗。我已把這個 IP 加入黑名單。',
24
+ },
25
+ {
26
+ id: 'dev-ai-code-vuln',
27
+ threatType: 'Vulnerable AI-Generated Code',
28
+ beforeEn: 'AI-generated code deployed a web server with an exposed .env file containing your database credentials.',
29
+ beforeZh: 'AI 生成的程式碼部署了一個 Web Server,其中 .env 檔案暴露了你的資料庫密碼。',
30
+ afterEn: 'Panguard Scan detects the exposed configuration within 60 seconds and alerts you immediately.',
31
+ afterZh: 'Panguard Scan 在 60 秒內偵測到暴露的配置檔,並立即通知你。',
32
+ notificationEn: 'Found a security issue: your database password is publicly accessible through .env file. I recommend moving it to environment variables immediately.',
33
+ notificationZh: '發現一個安全問題:你的資料庫密碼透過 .env 檔案公開了。建議立即將它移到環境變數中。',
34
+ },
35
+ ];
36
+ const SMALL_BIZ_SCENARIOS = [
37
+ {
38
+ id: 'biz-ransomware',
39
+ threatType: 'Ransomware',
40
+ beforeEn: 'An employee clicks a phishing email attachment. Ransomware encrypts the company NAS within 15 minutes. The company goes bankrupt.',
41
+ beforeZh: '員工點了釣魚信件的附件。勒索軟體在 15 分鐘內加密了公司 NAS。公司倒閉。',
42
+ afterEn: 'Panguard AI detects the ransomware within 3 seconds of execution, isolates the file before encryption begins, and notifies the boss.',
43
+ afterZh: 'Panguard AI 在勒索軟體執行的 3 秒內偵測到它,在加密開始前隔離檔案,並通知老闆。',
44
+ notificationEn: "Found a ransomware (LockBit type) on Ms. Wang's computer. Already intercepted and isolated before it could encrypt any files.",
45
+ notificationZh: '在王小姐的電腦上發現一個勒索病毒(LockBit 類型)。已在它加密檔案之前攔截並隔離。',
46
+ },
47
+ {
48
+ id: 'biz-weak-password',
49
+ threatType: 'Weak Passwords',
50
+ beforeEn: 'Your employees use "123456" and "password" for everything. You have no password policy because no one knows how to set one up.',
51
+ beforeZh: '你的員工所有帳號都用「123456」和「password」。你沒有密碼政策,因為沒人知道怎麼設定。',
52
+ afterEn: 'Panguard Scan identifies all weak password policies and explains what to do in plain language.',
53
+ afterZh: 'Panguard Scan 找出所有弱密碼政策,用白話文告訴你該怎麼做。',
54
+ notificationEn: 'Your system allows passwords as short as 1 character. I recommend requiring at least 12 characters with a mix of letters, numbers, and symbols.',
55
+ notificationZh: '你的系統允許只有 1 個字元的密碼。建議要求至少 12 個字元,混合英文、數字和符號。',
56
+ },
57
+ ];
58
+ const ENTERPRISE_SCENARIOS = [
59
+ {
60
+ id: 'ent-compliance',
61
+ threatType: 'Compliance Gap',
62
+ beforeEn: 'An audit is coming in 2 weeks. You need to prove compliance with the Cyber Security Management Act but have no documentation.',
63
+ beforeZh: '稽核 2 週後就來了。你需要證明符合資通安全管理法但沒有任何文件。',
64
+ afterEn: 'Panguard Report generates a complete compliance report in 5 minutes, mapping your security posture to all 10 control requirements.',
65
+ afterZh: 'Panguard Report 在 5 分鐘內產生完整的合規報告,將你的資安狀態對應到全部 10 個控制項。',
66
+ notificationEn: 'Your compliance report is ready. Overall score: 72%. 2 controls need immediate attention. Report has been sent to your email.',
67
+ notificationZh: '你的合規報告已經產生。整體分數:72%。2 個控制項需要立即處理。報告已寄到你的信箱。',
68
+ },
69
+ {
70
+ id: 'ent-lateral-movement',
71
+ threatType: 'Lateral Movement',
72
+ beforeEn: 'An attacker gained access to one workstation and is silently moving across your network to reach the database server.',
73
+ beforeZh: '攻擊者取得了一台工作站的存取權限,正在悄悄地在你的網路中移動,目標是資料庫伺服器。',
74
+ afterEn: 'Panguard Guard detects abnormal internal connections, blocks the lateral movement, and notifies the IT admin with full investigation results.',
75
+ afterZh: 'Panguard Guard 偵測到異常的內部連線,封鎖橫向移動,並將完整調查結果通知 IT 管理員。',
76
+ notificationEn: 'Your server is trying to connect to an address it has never connected to before. This is abnormal. I have blocked this connection and am investigating.',
77
+ notificationZh: '你的伺服器正在嘗試連線到一個它從來沒連過的可疑地址。這不正常。我已阻止這個連線並在調查中。',
78
+ },
79
+ ];
80
+ // ---------------------------------------------------------------------------
81
+ // Persona definitions
82
+ // 角色定義
83
+ // ---------------------------------------------------------------------------
84
+ export const PERSONAS = {
85
+ developer: {
86
+ type: 'developer',
87
+ nameEn: 'Individual Developer / AI Developer',
88
+ nameZh: '個人開發者 / AI 開發者',
89
+ descriptionEn: 'Has a VPS exposed to the internet. AI-generated code quality varies. No time for security.',
90
+ descriptionZh: '有 VPS 暴露在公網上。AI 生成的 code 品質不穩定。沒時間管資安。',
91
+ painPointsEn: [
92
+ 'Server exposed to public internet with no protection',
93
+ 'AI-generated code may have security vulnerabilities',
94
+ 'Too busy building product to think about security',
95
+ 'No idea what attacks are happening right now',
96
+ ],
97
+ painPointsZh: [
98
+ '伺服器暴露在公網上沒有任何防護',
99
+ 'AI 生成的程式碼可能有安全漏洞',
100
+ '忙著做產品,沒時間想資安',
101
+ '完全不知道現在正在發生什麼攻擊',
102
+ ],
103
+ recommendedPlan: 'solo',
104
+ scenarios: DEVELOPER_SCENARIOS,
105
+ },
106
+ small_business: {
107
+ type: 'small_business',
108
+ nameEn: 'Small Business (5-50 employees)',
109
+ nameZh: '小型企業(5-50 人)',
110
+ descriptionEn: 'No IT department. Employees click on phishing emails. One ransomware attack could shut down the company.',
111
+ descriptionZh: '沒有 IT 部門。員工會亂點附件。一次勒索軟體攻擊就可能倒閉。',
112
+ painPointsEn: [
113
+ 'No dedicated IT or security team',
114
+ 'Employees lack security awareness training',
115
+ 'One ransomware attack could bankrupt the company',
116
+ 'Cannot afford enterprise security solutions',
117
+ ],
118
+ painPointsZh: [
119
+ '沒有專職的 IT 或資安團隊',
120
+ '員工缺乏資安意識訓練',
121
+ '一次勒索軟體攻擊就可能讓公司倒閉',
122
+ '負擔不起企業級資安解決方案',
123
+ ],
124
+ recommendedPlan: 'pro',
125
+ scenarios: SMALL_BIZ_SCENARIOS,
126
+ },
127
+ mid_enterprise: {
128
+ type: 'mid_enterprise',
129
+ nameEn: 'Mid-size Enterprise (50-500 employees)',
130
+ nameZh: '中型企業(50-500 人)',
131
+ descriptionEn: 'Has IT but no security team. Needs compliance reports for audits.',
132
+ descriptionZh: '有 IT 沒有資安。需要合規報告來通過稽核。',
133
+ painPointsEn: [
134
+ 'IT team is stretched thin, no dedicated security staff',
135
+ 'Compliance requirements (Cyber Security Act, ISO 27001)',
136
+ 'Need audit-ready reports on short notice',
137
+ 'Multiple offices/servers to protect',
138
+ ],
139
+ painPointsZh: [
140
+ 'IT 團隊人手不足,沒有專職資安人員',
141
+ '合規要求(資通安全管理法、ISO 27001)',
142
+ '需要隨時能拿出稽核用的報告',
143
+ '多個辦公室 / 伺服器需要防護',
144
+ ],
145
+ recommendedPlan: 'business',
146
+ scenarios: ENTERPRISE_SCENARIOS,
147
+ },
148
+ };
149
+ /**
150
+ * Get persona by type
151
+ * 根據類型取得角色
152
+ */
153
+ export function getPersona(type) {
154
+ return PERSONAS[type];
155
+ }
156
+ /**
157
+ * Get all personas
158
+ * 取得所有角色
159
+ */
160
+ export function getAllPersonas() {
161
+ return Object.values(PERSONAS);
162
+ }
163
+ //# sourceMappingURL=personas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personas.js","sourceRoot":"","sources":["../../src/content/personas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Pricing plan definitions
3
+ * 定價方案定義
4
+ *
5
+ * Based on competitive analysis: Panguard fills the gap between
6
+ * self-serve EDR ($2-8/ep) and enterprise AI SOC ($36K+/yr).
7
+ * "AI watches for you, at self-serve prices."
8
+ *
9
+ * @module @panguard-ai/panguard-web/content/pricing
10
+ */
11
+ import type { PricingPlanDetails, PricingPlan, ReportAddon } from '../types.js';
12
+ export declare const PRICING_PLANS: PricingPlanDetails[];
13
+ export declare const REPORT_ADDONS: ReportAddon[];
14
+ /**
15
+ * Get pricing plan by type
16
+ * 根據類型取得方案
17
+ */
18
+ export declare function getPricingPlan(plan: PricingPlan): PricingPlanDetails | undefined;
19
+ /**
20
+ * Get all pricing plans
21
+ * 取得所有方案
22
+ */
23
+ export declare function getAllPricingPlans(): PricingPlanDetails[];
24
+ /**
25
+ * Get recommended plan for a persona
26
+ * 根據角色取得推薦方案
27
+ */
28
+ export declare function getRecommendedPlan(persona: string): PricingPlanDetails | undefined;
29
+ /**
30
+ * Get all report add-on products
31
+ * 取得所有報告加購產品
32
+ */
33
+ export declare function getAllReportAddons(): ReportAddon[];
34
+ /**
35
+ * Get report add-on by ID
36
+ * 根據 ID 取得報告加購產品
37
+ */
38
+ export declare function getReportAddon(id: string): ReportAddon | undefined;
39
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/content/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB7F,eAAO,MAAM,aAAa,EAAE,kBAAkB,EAyF7C,CAAC;AAOF,eAAO,MAAM,aAAa,EAAE,WAAW,EAwDtC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,kBAAkB,GAAG,SAAS,CAEhF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,kBAAkB,EAAE,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAKlF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,EAAE,CAElD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAElE"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Pricing plan definitions
3
+ * 定價方案定義
4
+ *
5
+ * Based on competitive analysis: Panguard fills the gap between
6
+ * self-serve EDR ($2-8/ep) and enterprise AI SOC ($36K+/yr).
7
+ * "AI watches for you, at self-serve prices."
8
+ *
9
+ * @module @panguard-ai/panguard-web/content/pricing
10
+ */
11
+ // ---------------------------------------------------------------------------
12
+ // Shared features
13
+ // 共享功能
14
+ // ---------------------------------------------------------------------------
15
+ function feature(nameEn, nameZh, included, limit) {
16
+ return { nameEn, nameZh, included, limit };
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Plan definitions (3 paid tiers + Community free)
20
+ // 方案定義(3 個付費方案 + 社群免費版)
21
+ // ---------------------------------------------------------------------------
22
+ export const PRICING_PLANS = [
23
+ {
24
+ plan: 'community',
25
+ nameEn: 'Community',
26
+ nameZh: '社群版',
27
+ taglineEn: '60-second security health check',
28
+ taglineZh: '60 秒資安健檢',
29
+ priceUsd: 0,
30
+ priceDisplayEn: 'Free',
31
+ priceDisplayZh: '免費',
32
+ targetPersona: 'developer',
33
+ highlighted: false,
34
+ features: [
35
+ feature('Panguard Scan (full scan)', 'Panguard Scan(完整掃描)', true),
36
+ feature('Guard detection (Layer 1)', 'Guard 偵測(第一層)', true),
37
+ feature('Auto-block known patterns', '自動封鎖已知攻擊模式', true),
38
+ feature('Manual remediation guide', '手動修復指南', true),
39
+ feature('Community support', '社群支援', true),
40
+ feature('AI analysis', 'AI 分析', false),
41
+ feature('Notification channels', '通知管道', false),
42
+ feature('Compliance reports', '合規報告', false),
43
+ ],
44
+ },
45
+ {
46
+ plan: 'solo',
47
+ nameEn: 'Solo',
48
+ nameZh: '個人版',
49
+ taglineEn: 'Full protection for individual developers',
50
+ taglineZh: '個人開發者的完整防護',
51
+ priceUsd: 9,
52
+ priceDisplayEn: '$9/mo',
53
+ priceDisplayZh: 'US$9/月',
54
+ targetPersona: 'developer',
55
+ highlighted: false,
56
+ features: [
57
+ feature('Everything in Community', '社群版所有功能', true),
58
+ feature('Guard detection (Layer 1+2+3)', 'Guard 偵測(全部三層)', true),
59
+ feature('Up to 3 machines', '最多 3 台機器', true, '3 machines'),
60
+ feature('AI analysis', 'AI 分析', true),
61
+ feature('Panguard Chat (basic)', 'Panguard Chat(基礎版)', true),
62
+ feature('Email + Telegram alerts', 'Email + Telegram 通知', true),
63
+ feature('One-click auto-fix', '一鍵自動修復', true),
64
+ feature('7-day log retention', '7 天日誌保留', true),
65
+ ],
66
+ },
67
+ {
68
+ plan: 'pro',
69
+ nameEn: 'Pro',
70
+ nameZh: '專業版',
71
+ taglineEn: 'AI-powered protection for teams',
72
+ taglineZh: 'AI 驅動的團隊防護',
73
+ priceUsd: 29,
74
+ priceDisplayEn: '$29/mo',
75
+ priceDisplayZh: 'US$29/月',
76
+ targetPersona: 'small_business',
77
+ highlighted: true,
78
+ features: [
79
+ feature('Everything in Solo', '個人版所有功能', true),
80
+ feature('Up to 10 machines', '最多 10 台機器', true, '10 machines'),
81
+ feature('Panguard Chat (advanced)', 'Panguard Chat(進階版)', true),
82
+ feature('Panguard Report (full)', 'Panguard Report(完整報告)', true),
83
+ feature('Panguard Trap (honeypot)', 'Panguard Trap(蜜罐系統)', true),
84
+ feature('Slack integration', 'Slack 整合', true),
85
+ feature('Priority support', '優先技術支援', true),
86
+ feature('30-day log retention', '30 天日誌保留', true),
87
+ ],
88
+ },
89
+ {
90
+ plan: 'business',
91
+ nameEn: 'Business',
92
+ nameZh: '企業版',
93
+ taglineEn: 'Compliance-ready, audit-proof',
94
+ taglineZh: '合規就緒,稽核免煩惱',
95
+ priceUsd: 79,
96
+ priceDisplayEn: '$79/mo',
97
+ priceDisplayZh: 'US$79/月',
98
+ targetPersona: 'mid_enterprise',
99
+ highlighted: false,
100
+ features: [
101
+ feature('Everything in Pro', '專業版所有功能', true),
102
+ feature('Up to 25 machines', '最多 25 台機器', true, '25 machines'),
103
+ feature('Custom AI models', '自訂 AI 模型', true),
104
+ feature('Panguard Chat (advanced + API)', 'Panguard Chat(進階 + API)', true),
105
+ feature('Webhook / API integration', 'Webhook / API 整合', true),
106
+ feature('Panguard Report (full + custom)', 'Panguard Report(完整 + 客製)', true),
107
+ feature('90-day+ log retention', '90 天以上日誌保留', true),
108
+ feature('SSO / SAML (roadmap)', 'SSO / SAML(規劃中)', true),
109
+ ],
110
+ },
111
+ ];
112
+ // ---------------------------------------------------------------------------
113
+ // Report add-on products (independent of subscription tier)
114
+ // 報告加購產品(獨立於訂閱方案)
115
+ // ---------------------------------------------------------------------------
116
+ export const REPORT_ADDONS = [
117
+ {
118
+ id: 'tw_cyber_security_act',
119
+ nameEn: 'Taiwan Cyber Security Act',
120
+ nameZh: '台灣資通安全管理法',
121
+ descriptionEn: 'Automated compliance assessment against Taiwan Cyber Security Management Act. Monthly monitoring and reporting.',
122
+ descriptionZh: '自動化台灣資通安全管理法合規評估。每月監控與報告。',
123
+ pricingModel: 'subscription',
124
+ priceUsd: 149,
125
+ priceDisplayEn: '$149/mo',
126
+ priceDisplayZh: 'US$149/月',
127
+ annualPriceUsd: 1499,
128
+ annualPriceDisplayEn: '$1,499/yr',
129
+ annualPriceDisplayZh: 'US$1,499/年',
130
+ framework: 'tw_cyber_security_act',
131
+ },
132
+ {
133
+ id: 'iso27001',
134
+ nameEn: 'ISO 27001 Readiness Report',
135
+ nameZh: 'ISO 27001 準備報告',
136
+ descriptionEn: 'Gap analysis report for ISO/IEC 27001:2022 certification readiness. Includes control mapping and remediation plan.',
137
+ descriptionZh: 'ISO/IEC 27001:2022 認證準備差距分析報告。含控制項對照與改善計畫。',
138
+ pricingModel: 'per_report',
139
+ priceUsd: 499,
140
+ priceDisplayEn: '$499/report',
141
+ priceDisplayZh: 'US$499/份',
142
+ framework: 'iso27001',
143
+ },
144
+ {
145
+ id: 'soc2',
146
+ nameEn: 'SOC 2 Readiness Report',
147
+ nameZh: 'SOC 2 準備報告',
148
+ descriptionEn: 'Trust Services Criteria assessment for SOC 2 audit preparation. Covers all 5 trust categories.',
149
+ descriptionZh: 'SOC 2 稽核準備的信任服務準則評估。涵蓋全部 5 大信任類別。',
150
+ pricingModel: 'per_report',
151
+ priceUsd: 499,
152
+ priceDisplayEn: '$499/report',
153
+ priceDisplayZh: 'US$499/份',
154
+ framework: 'soc2',
155
+ },
156
+ {
157
+ id: 'incident_report',
158
+ nameEn: 'Security Incident Report',
159
+ nameZh: '資安事件報告',
160
+ descriptionEn: 'Formal security incident documentation required by regulators. Includes timeline, impact analysis, and remediation.',
161
+ descriptionZh: '監管機關要求的正式資安事件文件。含時間線、影響分析及改善措施。',
162
+ pricingModel: 'per_report',
163
+ priceUsd: 299,
164
+ priceDisplayEn: '$299/report',
165
+ priceDisplayZh: 'US$299/份',
166
+ framework: 'incident',
167
+ },
168
+ ];
169
+ /**
170
+ * Get pricing plan by type
171
+ * 根據類型取得方案
172
+ */
173
+ export function getPricingPlan(plan) {
174
+ return PRICING_PLANS.find((p) => p.plan === plan);
175
+ }
176
+ /**
177
+ * Get all pricing plans
178
+ * 取得所有方案
179
+ */
180
+ export function getAllPricingPlans() {
181
+ return PRICING_PLANS;
182
+ }
183
+ /**
184
+ * Get recommended plan for a persona
185
+ * 根據角色取得推薦方案
186
+ */
187
+ export function getRecommendedPlan(persona) {
188
+ return (PRICING_PLANS.find((p) => p.targetPersona === persona && p.highlighted) ??
189
+ PRICING_PLANS.find((p) => p.targetPersona === persona));
190
+ }
191
+ /**
192
+ * Get all report add-on products
193
+ * 取得所有報告加購產品
194
+ */
195
+ export function getAllReportAddons() {
196
+ return REPORT_ADDONS;
197
+ }
198
+ /**
199
+ * Get report add-on by ID
200
+ * 根據 ID 取得報告加購產品
201
+ */
202
+ export function getReportAddon(id) {
203
+ return REPORT_ADDONS.find((r) => r.id === id);
204
+ }
205
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/content/pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Online Guidance Wizard Engine
3
+ * 線上引導精靈引擎
4
+ *
5
+ * Implements the interactive onboarding flow that helps users
6
+ * find the right security solution based on their profile.
7
+ * 實作互動式引導流程,幫助用戶根據自身條件找到合適的資安方案。
8
+ *
9
+ * @module @panguard-ai/panguard-web/guidance
10
+ */
11
+ import type { GuidanceStep, GuidanceAnswers, GuidanceResult, GuidanceStepType, WebLanguage } from '../types.js';
12
+ /** All guidance steps / 所有引導步驟 */
13
+ export declare const GUIDANCE_STEPS: GuidanceStep[];
14
+ /**
15
+ * Get guidance step by type
16
+ * 根據類型取得引導步驟
17
+ */
18
+ export declare function getGuidanceStep(type: GuidanceStepType): GuidanceStep | undefined;
19
+ /**
20
+ * Get the next step in the guidance flow
21
+ * 取得引導流程的下一步
22
+ */
23
+ export declare function getNextStep(currentType: GuidanceStepType): GuidanceStep | undefined;
24
+ /**
25
+ * Get the previous step in the guidance flow
26
+ * 取得引導流程的上一步
27
+ */
28
+ export declare function getPreviousStep(currentType: GuidanceStepType): GuidanceStep | undefined;
29
+ /**
30
+ * Get total step count
31
+ * 取得總步驟數
32
+ */
33
+ export declare function getTotalSteps(): number;
34
+ /**
35
+ * Generate guidance result from user answers
36
+ * 從用戶回答產生引導結果
37
+ */
38
+ export declare function generateGuidanceResult(answers: GuidanceAnswers, language?: WebLanguage): GuidanceResult;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guidance/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAGhB,WAAW,EACZ,MAAM,aAAa,CAAC;AAOrB,kCAAkC;AAClC,eAAO,MAAM,cAAc,EAAE,YAAY,EAiIxC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAEhF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAMnF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAMvF;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA8GD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,QAAQ,GAAE,WAAqB,GAC9B,cAAc,CAsBhB"}