@panguard-ai/core 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.
Files changed (233) hide show
  1. package/dist/adapters/adapter-registry.d.ts +150 -0
  2. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  3. package/dist/adapters/adapter-registry.js +271 -0
  4. package/dist/adapters/adapter-registry.js.map +1 -0
  5. package/dist/adapters/base-adapter.d.ts +101 -0
  6. package/dist/adapters/base-adapter.d.ts.map +1 -0
  7. package/dist/adapters/base-adapter.js +160 -0
  8. package/dist/adapters/base-adapter.js.map +1 -0
  9. package/dist/adapters/defender-adapter.d.ts +90 -0
  10. package/dist/adapters/defender-adapter.d.ts.map +1 -0
  11. package/dist/adapters/defender-adapter.js +227 -0
  12. package/dist/adapters/defender-adapter.js.map +1 -0
  13. package/dist/adapters/index.d.ts +22 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +23 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/syslog-adapter.d.ts +207 -0
  18. package/dist/adapters/syslog-adapter.d.ts.map +1 -0
  19. package/dist/adapters/syslog-adapter.js +432 -0
  20. package/dist/adapters/syslog-adapter.js.map +1 -0
  21. package/dist/adapters/types.d.ts +135 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +13 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/adapters/wazuh-adapter.d.ts +120 -0
  26. package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
  27. package/dist/adapters/wazuh-adapter.js +266 -0
  28. package/dist/adapters/wazuh-adapter.js.map +1 -0
  29. package/dist/ai/claude-provider.d.ts +66 -0
  30. package/dist/ai/claude-provider.d.ts.map +1 -0
  31. package/dist/ai/claude-provider.js +166 -0
  32. package/dist/ai/claude-provider.js.map +1 -0
  33. package/dist/ai/funnel-router.d.ts +75 -0
  34. package/dist/ai/funnel-router.d.ts.map +1 -0
  35. package/dist/ai/funnel-router.js +173 -0
  36. package/dist/ai/funnel-router.js.map +1 -0
  37. package/dist/ai/index.d.ts +77 -0
  38. package/dist/ai/index.d.ts.map +1 -0
  39. package/dist/ai/index.js +95 -0
  40. package/dist/ai/index.js.map +1 -0
  41. package/dist/ai/ollama-provider.d.ts +73 -0
  42. package/dist/ai/ollama-provider.d.ts.map +1 -0
  43. package/dist/ai/ollama-provider.js +200 -0
  44. package/dist/ai/ollama-provider.js.map +1 -0
  45. package/dist/ai/openai-provider.d.ts +70 -0
  46. package/dist/ai/openai-provider.d.ts.map +1 -0
  47. package/dist/ai/openai-provider.js +175 -0
  48. package/dist/ai/openai-provider.js.map +1 -0
  49. package/dist/ai/prompts/event-classifier.d.ts +25 -0
  50. package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
  51. package/dist/ai/prompts/event-classifier.js +94 -0
  52. package/dist/ai/prompts/event-classifier.js.map +1 -0
  53. package/dist/ai/prompts/index.d.ts +13 -0
  54. package/dist/ai/prompts/index.d.ts.map +1 -0
  55. package/dist/ai/prompts/index.js +13 -0
  56. package/dist/ai/prompts/index.js.map +1 -0
  57. package/dist/ai/prompts/report-generator.d.ts +25 -0
  58. package/dist/ai/prompts/report-generator.d.ts.map +1 -0
  59. package/dist/ai/prompts/report-generator.js +131 -0
  60. package/dist/ai/prompts/report-generator.js.map +1 -0
  61. package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
  62. package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
  63. package/dist/ai/prompts/threat-analyzer.js +75 -0
  64. package/dist/ai/prompts/threat-analyzer.js.map +1 -0
  65. package/dist/ai/provider-base.d.ts +100 -0
  66. package/dist/ai/provider-base.d.ts.map +1 -0
  67. package/dist/ai/provider-base.js +166 -0
  68. package/dist/ai/provider-base.js.map +1 -0
  69. package/dist/ai/response-parser.d.ts +36 -0
  70. package/dist/ai/response-parser.d.ts.map +1 -0
  71. package/dist/ai/response-parser.js +195 -0
  72. package/dist/ai/response-parser.js.map +1 -0
  73. package/dist/ai/token-tracker.d.ts +72 -0
  74. package/dist/ai/token-tracker.d.ts.map +1 -0
  75. package/dist/ai/token-tracker.js +145 -0
  76. package/dist/ai/token-tracker.js.map +1 -0
  77. package/dist/ai/types.d.ts +138 -0
  78. package/dist/ai/types.d.ts.map +1 -0
  79. package/dist/ai/types.js +12 -0
  80. package/dist/ai/types.js.map +1 -0
  81. package/dist/cli/index.d.ts +146 -0
  82. package/dist/cli/index.d.ts.map +1 -0
  83. package/dist/cli/index.js +515 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli/prompts.d.ts +58 -0
  86. package/dist/cli/prompts.d.ts.map +1 -0
  87. package/dist/cli/prompts.js +327 -0
  88. package/dist/cli/prompts.js.map +1 -0
  89. package/dist/cli/wizard.d.ts +58 -0
  90. package/dist/cli/wizard.d.ts.map +1 -0
  91. package/dist/cli/wizard.js +200 -0
  92. package/dist/cli/wizard.js.map +1 -0
  93. package/dist/discovery/firewall-checker.d.ts +28 -0
  94. package/dist/discovery/firewall-checker.d.ts.map +1 -0
  95. package/dist/discovery/firewall-checker.js +379 -0
  96. package/dist/discovery/firewall-checker.js.map +1 -0
  97. package/dist/discovery/index.d.ts +23 -0
  98. package/dist/discovery/index.d.ts.map +1 -0
  99. package/dist/discovery/index.js +29 -0
  100. package/dist/discovery/index.js.map +1 -0
  101. package/dist/discovery/network-scanner.d.ts +60 -0
  102. package/dist/discovery/network-scanner.d.ts.map +1 -0
  103. package/dist/discovery/network-scanner.js +640 -0
  104. package/dist/discovery/network-scanner.js.map +1 -0
  105. package/dist/discovery/os-detector.d.ts +24 -0
  106. package/dist/discovery/os-detector.d.ts.map +1 -0
  107. package/dist/discovery/os-detector.js +253 -0
  108. package/dist/discovery/os-detector.js.map +1 -0
  109. package/dist/discovery/osquery-provider.d.ts +127 -0
  110. package/dist/discovery/osquery-provider.d.ts.map +1 -0
  111. package/dist/discovery/osquery-provider.js +214 -0
  112. package/dist/discovery/osquery-provider.js.map +1 -0
  113. package/dist/discovery/risk-scorer.d.ts +66 -0
  114. package/dist/discovery/risk-scorer.d.ts.map +1 -0
  115. package/dist/discovery/risk-scorer.js +294 -0
  116. package/dist/discovery/risk-scorer.js.map +1 -0
  117. package/dist/discovery/security-tools.d.ts +31 -0
  118. package/dist/discovery/security-tools.d.ts.map +1 -0
  119. package/dist/discovery/security-tools.js +346 -0
  120. package/dist/discovery/security-tools.js.map +1 -0
  121. package/dist/discovery/service-detector.d.ts +28 -0
  122. package/dist/discovery/service-detector.d.ts.map +1 -0
  123. package/dist/discovery/service-detector.js +300 -0
  124. package/dist/discovery/service-detector.js.map +1 -0
  125. package/dist/discovery/types.d.ts +502 -0
  126. package/dist/discovery/types.d.ts.map +1 -0
  127. package/dist/discovery/types.js +12 -0
  128. package/dist/discovery/types.js.map +1 -0
  129. package/dist/discovery/user-auditor.d.ts +28 -0
  130. package/dist/discovery/user-auditor.d.ts.map +1 -0
  131. package/dist/discovery/user-auditor.js +385 -0
  132. package/dist/discovery/user-auditor.js.map +1 -0
  133. package/dist/i18n/config.d.ts +45 -0
  134. package/dist/i18n/config.d.ts.map +1 -0
  135. package/dist/i18n/config.js +135 -0
  136. package/dist/i18n/config.js.map +1 -0
  137. package/dist/i18n/index.d.ts +8 -0
  138. package/dist/i18n/index.d.ts.map +1 -0
  139. package/dist/i18n/index.js +8 -0
  140. package/dist/i18n/index.js.map +1 -0
  141. package/dist/index.d.ts +31 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +31 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/monitor/event-normalizer.d.ts +102 -0
  146. package/dist/monitor/event-normalizer.d.ts.map +1 -0
  147. package/dist/monitor/event-normalizer.js +195 -0
  148. package/dist/monitor/event-normalizer.js.map +1 -0
  149. package/dist/monitor/file-monitor.d.ts +90 -0
  150. package/dist/monitor/file-monitor.d.ts.map +1 -0
  151. package/dist/monitor/file-monitor.js +222 -0
  152. package/dist/monitor/file-monitor.js.map +1 -0
  153. package/dist/monitor/index.d.ts +147 -0
  154. package/dist/monitor/index.d.ts.map +1 -0
  155. package/dist/monitor/index.js +293 -0
  156. package/dist/monitor/index.js.map +1 -0
  157. package/dist/monitor/log-monitor.d.ts +102 -0
  158. package/dist/monitor/log-monitor.d.ts.map +1 -0
  159. package/dist/monitor/log-monitor.js +245 -0
  160. package/dist/monitor/log-monitor.js.map +1 -0
  161. package/dist/monitor/network-monitor.d.ts +103 -0
  162. package/dist/monitor/network-monitor.d.ts.map +1 -0
  163. package/dist/monitor/network-monitor.js +336 -0
  164. package/dist/monitor/network-monitor.js.map +1 -0
  165. package/dist/monitor/process-monitor.d.ts +108 -0
  166. package/dist/monitor/process-monitor.d.ts.map +1 -0
  167. package/dist/monitor/process-monitor.js +245 -0
  168. package/dist/monitor/process-monitor.js.map +1 -0
  169. package/dist/monitor/threat-intel-feeds.d.ts +141 -0
  170. package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
  171. package/dist/monitor/threat-intel-feeds.js +430 -0
  172. package/dist/monitor/threat-intel-feeds.js.map +1 -0
  173. package/dist/monitor/threat-intel.d.ts +83 -0
  174. package/dist/monitor/threat-intel.d.ts.map +1 -0
  175. package/dist/monitor/threat-intel.js +215 -0
  176. package/dist/monitor/threat-intel.js.map +1 -0
  177. package/dist/monitor/types.d.ts +65 -0
  178. package/dist/monitor/types.d.ts.map +1 -0
  179. package/dist/monitor/types.js +20 -0
  180. package/dist/monitor/types.js.map +1 -0
  181. package/dist/rules/index.d.ts +115 -0
  182. package/dist/rules/index.d.ts.map +1 -0
  183. package/dist/rules/index.js +244 -0
  184. package/dist/rules/index.js.map +1 -0
  185. package/dist/rules/rule-loader.d.ts +54 -0
  186. package/dist/rules/rule-loader.d.ts.map +1 -0
  187. package/dist/rules/rule-loader.js +167 -0
  188. package/dist/rules/rule-loader.js.map +1 -0
  189. package/dist/rules/sigma-matcher.d.ts +40 -0
  190. package/dist/rules/sigma-matcher.d.ts.map +1 -0
  191. package/dist/rules/sigma-matcher.js +447 -0
  192. package/dist/rules/sigma-matcher.js.map +1 -0
  193. package/dist/rules/sigma-parser.d.ts +36 -0
  194. package/dist/rules/sigma-parser.d.ts.map +1 -0
  195. package/dist/rules/sigma-parser.js +180 -0
  196. package/dist/rules/sigma-parser.js.map +1 -0
  197. package/dist/rules/types.d.ts +112 -0
  198. package/dist/rules/types.d.ts.map +1 -0
  199. package/dist/rules/types.js +11 -0
  200. package/dist/rules/types.js.map +1 -0
  201. package/dist/rules/yara-scanner.d.ts +103 -0
  202. package/dist/rules/yara-scanner.d.ts.map +1 -0
  203. package/dist/rules/yara-scanner.js +421 -0
  204. package/dist/rules/yara-scanner.js.map +1 -0
  205. package/dist/scoring/achievements.d.ts +76 -0
  206. package/dist/scoring/achievements.d.ts.map +1 -0
  207. package/dist/scoring/achievements.js +211 -0
  208. package/dist/scoring/achievements.js.map +1 -0
  209. package/dist/scoring/index.d.ts +3 -0
  210. package/dist/scoring/index.d.ts.map +1 -0
  211. package/dist/scoring/index.js +3 -0
  212. package/dist/scoring/index.js.map +1 -0
  213. package/dist/scoring/security-score.d.ts +60 -0
  214. package/dist/scoring/security-score.d.ts.map +1 -0
  215. package/dist/scoring/security-score.js +211 -0
  216. package/dist/scoring/security-score.js.map +1 -0
  217. package/dist/types.d.ts +71 -0
  218. package/dist/types.d.ts.map +1 -0
  219. package/dist/types.js +8 -0
  220. package/dist/types.js.map +1 -0
  221. package/dist/utils/index.d.ts +10 -0
  222. package/dist/utils/index.d.ts.map +1 -0
  223. package/dist/utils/index.js +9 -0
  224. package/dist/utils/index.js.map +1 -0
  225. package/dist/utils/logger.d.ts +38 -0
  226. package/dist/utils/logger.d.ts.map +1 -0
  227. package/dist/utils/logger.js +71 -0
  228. package/dist/utils/logger.js.map +1 -0
  229. package/dist/utils/validation.d.ts +35 -0
  230. package/dist/utils/validation.d.ts.map +1 -0
  231. package/dist/utils/validation.js +56 -0
  232. package/dist/utils/validation.js.map +1 -0
  233. package/package.json +60 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Achievement System - Security gamification with badges and milestones
3
+ * 成就系統 - 安全遊戲化(徽章與里程碑)
4
+ *
5
+ * Tracks user progress and awards achievements for security best practices.
6
+ * Designed to encourage continuous security improvement.
7
+ *
8
+ * @module @panguard-ai/core/scoring/achievements
9
+ */
10
+ import { createLogger } from '../utils/logger.js';
11
+ const logger = createLogger('achievements');
12
+ /** All defined achievements / 所有已定義的成就 */
13
+ export const ACHIEVEMENTS = [
14
+ // Scan achievements
15
+ {
16
+ id: 'first_scan',
17
+ name: 'First Scan',
18
+ nameZhTW: 'First Scan',
19
+ description: 'Complete your first security scan',
20
+ descriptionZhTW: 'Complete your first security scan',
21
+ category: 'scan',
22
+ icon: '[SCAN]',
23
+ condition: (s) => s.firstScanCompleted,
24
+ },
25
+ {
26
+ id: 'scan_10',
27
+ name: 'Scan Veteran',
28
+ nameZhTW: 'Scan Veteran',
29
+ description: 'Complete 10 security scans',
30
+ descriptionZhTW: 'Complete 10 security scans',
31
+ category: 'scan',
32
+ icon: '[SCAN+]',
33
+ condition: (s) => s.totalScans >= 10,
34
+ },
35
+ // Streak achievements
36
+ {
37
+ id: 'safe_7_days',
38
+ name: '7 Day Clean Streak',
39
+ nameZhTW: '7 Day Clean Streak',
40
+ description: '7 consecutive days with zero threats',
41
+ descriptionZhTW: '7 consecutive days with zero threats',
42
+ category: 'streak',
43
+ icon: '[7DAY]',
44
+ condition: (s) => s.consecutiveSafeDays >= 7,
45
+ },
46
+ {
47
+ id: 'safe_30_days',
48
+ name: '30 Day Fortress',
49
+ nameZhTW: '30 Day Fortress',
50
+ description: '30 consecutive days with zero threats',
51
+ descriptionZhTW: '30 consecutive days with zero threats',
52
+ category: 'streak',
53
+ icon: '[30DAY]',
54
+ condition: (s) => s.consecutiveSafeDays >= 30,
55
+ },
56
+ // Response achievements
57
+ {
58
+ id: 'quick_fix',
59
+ name: 'Patch Champion',
60
+ nameZhTW: 'Patch Champion',
61
+ description: 'Fix all vulnerabilities within 24 hours',
62
+ descriptionZhTW: 'Fix all vulnerabilities within 24 hours',
63
+ category: 'response',
64
+ icon: '[FIX]',
65
+ condition: (s) => s.vulnsFixedWithin24h >= 5,
66
+ },
67
+ {
68
+ id: 'threat_hunter',
69
+ name: 'Threat Hunter',
70
+ nameZhTW: 'Threat Hunter',
71
+ description: 'Block 50 threats',
72
+ descriptionZhTW: 'Block 50 threats',
73
+ category: 'response',
74
+ icon: '[HUNT]',
75
+ condition: (s) => s.threatsBlocked >= 50,
76
+ },
77
+ {
78
+ id: 'first_block',
79
+ name: 'First Defense',
80
+ nameZhTW: 'First Defense',
81
+ description: 'Block your first threat',
82
+ descriptionZhTW: 'Block your first threat',
83
+ category: 'response',
84
+ icon: '[DEF]',
85
+ condition: (s) => s.threatsBlocked >= 1,
86
+ },
87
+ // Compliance achievements
88
+ {
89
+ id: 'compliance_80',
90
+ name: 'Compliance Ready',
91
+ nameZhTW: 'Compliance Ready',
92
+ description: 'Reach 80% compliance score',
93
+ descriptionZhTW: 'Reach 80% compliance score',
94
+ category: 'compliance',
95
+ icon: '[COMP]',
96
+ condition: (s) => s.complianceScore >= 80,
97
+ },
98
+ // Guard achievements
99
+ {
100
+ id: 'fully_armed',
101
+ name: 'Fully Armed',
102
+ nameZhTW: 'Fully Armed',
103
+ description: 'Enable all recommended security settings',
104
+ descriptionZhTW: 'Enable all recommended security settings',
105
+ category: 'guard',
106
+ icon: '[ARM]',
107
+ condition: (s) => s.allRecommendationsEnabled,
108
+ },
109
+ {
110
+ id: 'guard_7_days',
111
+ name: 'Vigilant Guardian',
112
+ nameZhTW: 'Vigilant Guardian',
113
+ description: 'Run Guard continuously for 7 days',
114
+ descriptionZhTW: 'Run Guard continuously for 7 days',
115
+ category: 'guard',
116
+ icon: '[GUARD]',
117
+ condition: (s) => s.guardRunningDays >= 7,
118
+ },
119
+ {
120
+ id: 'score_90',
121
+ name: 'Grade A Security',
122
+ nameZhTW: 'Grade A Security',
123
+ description: 'Achieve a security score of 90 or higher',
124
+ descriptionZhTW: 'Achieve a security score of 90 or higher',
125
+ category: 'guard',
126
+ icon: '[A+]',
127
+ condition: (s) => s.securityScore >= 90,
128
+ },
129
+ {
130
+ id: 'chat_connected',
131
+ name: 'Connected',
132
+ nameZhTW: 'Connected',
133
+ description: 'Configure at least one notification channel',
134
+ descriptionZhTW: 'Configure at least one notification channel',
135
+ category: 'guard',
136
+ icon: '[CHAT]',
137
+ condition: (s) => s.chatChannelsConfigured >= 1,
138
+ },
139
+ ];
140
+ /**
141
+ * Achievement Tracker - manages earned achievements
142
+ * 成就追蹤器 - 管理已獲得的成就
143
+ */
144
+ export class AchievementTracker {
145
+ earned = new Map();
146
+ /**
147
+ * Check stats against all achievements, return newly earned ones
148
+ * 檢查統計數據,回傳新獲得的成就
149
+ */
150
+ check(stats) {
151
+ const newlyEarned = [];
152
+ for (const achievement of ACHIEVEMENTS) {
153
+ if (this.earned.has(achievement.id))
154
+ continue;
155
+ if (achievement.condition(stats)) {
156
+ const earned = {
157
+ achievement,
158
+ earnedAt: new Date().toISOString(),
159
+ notified: false,
160
+ };
161
+ this.earned.set(achievement.id, earned);
162
+ newlyEarned.push(earned);
163
+ logger.info(`Achievement unlocked: ${achievement.name} (${achievement.id})`);
164
+ }
165
+ }
166
+ return newlyEarned;
167
+ }
168
+ /** Get all earned achievements / 取得所有已獲得的成就 */
169
+ getEarned() {
170
+ return Array.from(this.earned.values());
171
+ }
172
+ /** Get count of earned achievements / 取得已獲得成就數量 */
173
+ getEarnedCount() {
174
+ return this.earned.size;
175
+ }
176
+ /** Get total available achievements / 取得所有可用成就數量 */
177
+ getTotalCount() {
178
+ return ACHIEVEMENTS.length;
179
+ }
180
+ /** Mark an achievement as notified / 標記成就已通知 */
181
+ markNotified(id) {
182
+ const earned = this.earned.get(id);
183
+ if (earned)
184
+ earned.notified = true;
185
+ }
186
+ /** Get un-notified achievements / 取得未通知的成就 */
187
+ getUnnotified() {
188
+ return Array.from(this.earned.values()).filter((e) => !e.notified);
189
+ }
190
+ /** Load earned achievements from serialized data / 從序列化資料載入 */
191
+ load(data) {
192
+ for (const item of data) {
193
+ const achievement = ACHIEVEMENTS.find((a) => a.id === item.id);
194
+ if (achievement) {
195
+ this.earned.set(item.id, {
196
+ achievement,
197
+ earnedAt: item.earnedAt,
198
+ notified: true,
199
+ });
200
+ }
201
+ }
202
+ }
203
+ /** Serialize earned achievements / 序列化已獲得的成就 */
204
+ serialize() {
205
+ return Array.from(this.earned.values()).map((e) => ({
206
+ id: e.achievement.id,
207
+ earnedAt: e.earnedAt,
208
+ }));
209
+ }
210
+ }
211
+ //# sourceMappingURL=achievements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"achievements.js","sourceRoot":"","sources":["../../src/scoring/achievements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { calculateSecurityScore, scoreToGrade, scoreToColor, generateScoreSummary, type ScoreFactor, type SecurityScoreSnapshot, type ScoreInput, } from './security-score.js';
2
+ export { AchievementTracker, ACHIEVEMENTS, type Achievement, type AchievementStats, type EarnedAchievement, } from './achievements.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { calculateSecurityScore, scoreToGrade, scoreToColor, generateScoreSummary, } from './security-score.js';
2
+ export { AchievementTracker, ACHIEVEMENTS, } from './achievements.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,oBAAoB,GAIrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,YAAY,GAIb,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Security Score Engine - Weighted security posture scoring
3
+ * 安全分數引擎 - 加權安全態勢評分
4
+ *
5
+ * Calculates a 0-100 security score based on multiple factors:
6
+ * - Firewall status (15%)
7
+ * - Open port risk (15%)
8
+ * - Password policy (10%)
9
+ * - System updates (15%)
10
+ * - Security tools running (10%)
11
+ * - Recent threat count (15%)
12
+ * - Compliance progress (10%)
13
+ * - Response speed (10%)
14
+ *
15
+ * @module @panguard-ai/core/scoring/security-score
16
+ */
17
+ /** Individual score factor / 個別評分因子 */
18
+ export interface ScoreFactor {
19
+ name: string;
20
+ weight: number;
21
+ score: number;
22
+ description: string;
23
+ }
24
+ /** Security score snapshot / 安全分數快照 */
25
+ export interface SecurityScoreSnapshot {
26
+ totalScore: number;
27
+ grade: 'A' | 'B' | 'C' | 'D' | 'F';
28
+ factors: ScoreFactor[];
29
+ calculatedAt: string;
30
+ trend: 'improving' | 'stable' | 'declining';
31
+ previousScore?: number;
32
+ }
33
+ /** Input data for score calculation / 計算分數的輸入資料 */
34
+ export interface ScoreInput {
35
+ firewallEnabled: boolean;
36
+ openPorts: Array<{
37
+ port: number;
38
+ service?: string;
39
+ }>;
40
+ dangerousPorts: number[];
41
+ passwordPolicyStrength: number;
42
+ pendingUpdates: number;
43
+ securityToolsRunning: string[];
44
+ recentThreats24h: number;
45
+ recentThreats7d: number;
46
+ complianceProgress: number;
47
+ avgResponseTimeMs: number;
48
+ }
49
+ /**
50
+ * Calculate security score from system state
51
+ * 從系統狀態計算安全分數
52
+ */
53
+ export declare function calculateSecurityScore(input: ScoreInput, previousScore?: number): SecurityScoreSnapshot;
54
+ /** Convert score to letter grade / 分數轉換為等級 */
55
+ export declare function scoreToGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F';
56
+ /** Get color for score (for CLI/UI) / 取得分數的顏色 */
57
+ export declare function scoreToColor(score: number): 'green' | 'yellow' | 'orange' | 'red';
58
+ /** Generate human-readable summary / 產生人類可讀的摘要 */
59
+ export declare function generateScoreSummary(snapshot: SecurityScoreSnapshot, lang?: 'en' | 'zh-TW'): string;
60
+ //# sourceMappingURL=security-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-score.d.ts","sourceRoot":"","sources":["../../src/scoring/security-score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,uCAAuC;AACvC,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACnC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAOD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,UAAU,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,qBAAqB,CAkKvB;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAMvE;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAKjF;AAED,kDAAkD;AAClD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,GAAE,IAAI,GAAG,OAAc,GAC1B,MAAM,CA8BR"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Security Score Engine - Weighted security posture scoring
3
+ * 安全分數引擎 - 加權安全態勢評分
4
+ *
5
+ * Calculates a 0-100 security score based on multiple factors:
6
+ * - Firewall status (15%)
7
+ * - Open port risk (15%)
8
+ * - Password policy (10%)
9
+ * - System updates (15%)
10
+ * - Security tools running (10%)
11
+ * - Recent threat count (15%)
12
+ * - Compliance progress (10%)
13
+ * - Response speed (10%)
14
+ *
15
+ * @module @panguard-ai/core/scoring/security-score
16
+ */
17
+ import { createLogger } from '../utils/logger.js';
18
+ const logger = createLogger('security-score');
19
+ /** Score thresholds for actions / 分數行動閾值 */
20
+ const DANGEROUS_PORTS = new Set([
21
+ 21, 22, 23, 25, 135, 139, 445, 1433, 3306, 3389, 5432, 5900, 6379, 27017,
22
+ ]);
23
+ /**
24
+ * Calculate security score from system state
25
+ * 從系統狀態計算安全分數
26
+ */
27
+ export function calculateSecurityScore(input, previousScore) {
28
+ const factors = [];
29
+ // 1. Firewall (15%)
30
+ const firewallScore = input.firewallEnabled ? 100 : 0;
31
+ factors.push({
32
+ name: 'firewall',
33
+ weight: 0.15,
34
+ score: firewallScore,
35
+ description: input.firewallEnabled
36
+ ? 'Firewall is active'
37
+ : 'Firewall is disabled - critical risk',
38
+ });
39
+ // 2. Open Port Risk (15%)
40
+ const dangerousOpenPorts = input.openPorts.filter((p) => DANGEROUS_PORTS.has(p.port) || input.dangerousPorts.includes(p.port));
41
+ const portScore = dangerousOpenPorts.length === 0
42
+ ? 100
43
+ : dangerousOpenPorts.length <= 1
44
+ ? 70
45
+ : dangerousOpenPorts.length <= 3
46
+ ? 40
47
+ : 10;
48
+ factors.push({
49
+ name: 'open_ports',
50
+ weight: 0.15,
51
+ score: portScore,
52
+ description: dangerousOpenPorts.length === 0
53
+ ? 'No dangerous ports exposed'
54
+ : `${dangerousOpenPorts.length} dangerous port(s) open`,
55
+ });
56
+ // 3. Password Policy (10%)
57
+ factors.push({
58
+ name: 'password_policy',
59
+ weight: 0.1,
60
+ score: input.passwordPolicyStrength,
61
+ description: input.passwordPolicyStrength >= 80
62
+ ? 'Strong password policy'
63
+ : input.passwordPolicyStrength >= 50
64
+ ? 'Moderate password policy'
65
+ : 'Weak password policy',
66
+ });
67
+ // 4. System Updates (15%)
68
+ const updateScore = input.pendingUpdates === 0
69
+ ? 100
70
+ : input.pendingUpdates <= 5
71
+ ? 70
72
+ : input.pendingUpdates <= 20
73
+ ? 40
74
+ : 10;
75
+ factors.push({
76
+ name: 'system_updates',
77
+ weight: 0.15,
78
+ score: updateScore,
79
+ description: input.pendingUpdates === 0
80
+ ? 'System is fully updated'
81
+ : `${input.pendingUpdates} pending update(s)`,
82
+ });
83
+ // 5. Security Tools (10%)
84
+ const toolScore = input.securityToolsRunning.length >= 3
85
+ ? 100
86
+ : input.securityToolsRunning.length === 2
87
+ ? 80
88
+ : input.securityToolsRunning.length === 1
89
+ ? 50
90
+ : 0;
91
+ factors.push({
92
+ name: 'security_tools',
93
+ weight: 0.1,
94
+ score: toolScore,
95
+ description: input.securityToolsRunning.length === 0
96
+ ? 'No security tools detected'
97
+ : `${input.securityToolsRunning.length} security tool(s) active`,
98
+ });
99
+ // 6. Recent Threats (15%)
100
+ const threatScore = input.recentThreats24h === 0 && input.recentThreats7d === 0
101
+ ? 100
102
+ : input.recentThreats24h === 0
103
+ ? 80
104
+ : input.recentThreats24h <= 3
105
+ ? 50
106
+ : input.recentThreats24h <= 10
107
+ ? 25
108
+ : 5;
109
+ factors.push({
110
+ name: 'recent_threats',
111
+ weight: 0.15,
112
+ score: threatScore,
113
+ description: input.recentThreats24h === 0
114
+ ? 'No threats in the last 24 hours'
115
+ : `${input.recentThreats24h} threat(s) in the last 24 hours`,
116
+ });
117
+ // 7. Compliance Progress (10%)
118
+ factors.push({
119
+ name: 'compliance',
120
+ weight: 0.1,
121
+ score: input.complianceProgress,
122
+ description: input.complianceProgress >= 80
123
+ ? 'Good compliance progress'
124
+ : input.complianceProgress >= 50
125
+ ? 'Moderate compliance progress'
126
+ : 'Compliance needs attention',
127
+ });
128
+ // 8. Response Speed (10%)
129
+ const responseScore = input.avgResponseTimeMs <= 60000
130
+ ? 100 // < 1 min
131
+ : input.avgResponseTimeMs <= 300000
132
+ ? 80 // < 5 min
133
+ : input.avgResponseTimeMs <= 900000
134
+ ? 50 // < 15 min
135
+ : input.avgResponseTimeMs <= 3600000
136
+ ? 25 // < 1 hour
137
+ : 10;
138
+ factors.push({
139
+ name: 'response_speed',
140
+ weight: 0.1,
141
+ score: responseScore,
142
+ description: `Average response time: ${Math.round(input.avgResponseTimeMs / 1000)}s`,
143
+ });
144
+ // Calculate weighted total
145
+ const totalScore = Math.round(factors.reduce((sum, f) => sum + f.score * f.weight, 0));
146
+ // Determine trend
147
+ let trend = 'stable';
148
+ if (previousScore !== undefined) {
149
+ if (totalScore > previousScore + 2)
150
+ trend = 'improving';
151
+ else if (totalScore < previousScore - 2)
152
+ trend = 'declining';
153
+ }
154
+ const snapshot = {
155
+ totalScore,
156
+ grade: scoreToGrade(totalScore),
157
+ factors,
158
+ calculatedAt: new Date().toISOString(),
159
+ trend,
160
+ previousScore,
161
+ };
162
+ logger.info(`Security score calculated: ${totalScore}/100 (Grade: ${snapshot.grade}, Trend: ${trend})`);
163
+ return snapshot;
164
+ }
165
+ /** Convert score to letter grade / 分數轉換為等級 */
166
+ export function scoreToGrade(score) {
167
+ if (score >= 90)
168
+ return 'A';
169
+ if (score >= 75)
170
+ return 'B';
171
+ if (score >= 60)
172
+ return 'C';
173
+ if (score >= 40)
174
+ return 'D';
175
+ return 'F';
176
+ }
177
+ /** Get color for score (for CLI/UI) / 取得分數的顏色 */
178
+ export function scoreToColor(score) {
179
+ if (score >= 80)
180
+ return 'green';
181
+ if (score >= 60)
182
+ return 'yellow';
183
+ if (score >= 40)
184
+ return 'orange';
185
+ return 'red';
186
+ }
187
+ /** Generate human-readable summary / 產生人類可讀的摘要 */
188
+ export function generateScoreSummary(snapshot, lang = 'en') {
189
+ const { totalScore, grade, trend, factors } = snapshot;
190
+ const trendText = lang === 'zh-TW'
191
+ ? trend === 'improving'
192
+ ? 'improving'
193
+ : trend === 'declining'
194
+ ? 'declining'
195
+ : 'stable'
196
+ : trend;
197
+ const trendArrow = trend === 'improving' ? '+' : trend === 'declining' ? '-' : '=';
198
+ const worstFactors = [...factors]
199
+ .sort((a, b) => a.score - b.score)
200
+ .slice(0, 3)
201
+ .filter((f) => f.score < 70);
202
+ let summary = lang === 'zh-TW'
203
+ ? `Security Score: ${totalScore}/100 (${grade}) [${trendArrow} ${trendText}]`
204
+ : `Security Score: ${totalScore}/100 (${grade}) [${trendArrow} ${trendText}]`;
205
+ if (worstFactors.length > 0) {
206
+ const items = worstFactors.map((f) => ` - ${f.name}: ${f.score}/100 - ${f.description}`);
207
+ summary += `\n\nTop issues:\n${items.join('\n')}`;
208
+ }
209
+ return summary;
210
+ }
211
+ //# sourceMappingURL=security-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-score.js","sourceRoot":"","sources":["../../src/scoring/security-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Core type definitions for Panguard AI platform
3
+ * Panguard 安全平台核心類型定義
4
+ *
5
+ * @module @panguard-ai/core/types
6
+ */
7
+ /**
8
+ * Supported languages / 支援的語言
9
+ */
10
+ export type Language = 'zh-TW' | 'en';
11
+ /**
12
+ * Severity levels for security events / 安全事件嚴重等級
13
+ */
14
+ export type Severity = 'info' | 'low' | 'medium' | 'high' | 'critical';
15
+ /**
16
+ * Security event source types / 安全事件來源類型
17
+ */
18
+ export type EventSource = 'windows_event' | 'syslog' | 'network' | 'process' | 'file' | 'falco' | 'suricata';
19
+ /**
20
+ * Base application configuration / 基礎應用程式配置
21
+ */
22
+ export interface BaseConfig {
23
+ /** Application language / 應用語言 */
24
+ language: Language;
25
+ /** Debug mode / 除錯模式 */
26
+ debug: boolean;
27
+ /** Log level / 日誌等級 */
28
+ logLevel: 'info' | 'warn' | 'error' | 'debug';
29
+ }
30
+ /**
31
+ * Standardized security event format / 標準化安全事件格式
32
+ *
33
+ * All security events from different sources are normalized to this format.
34
+ * 所有來自不同來源的安全事件都會標準化為此格式。
35
+ */
36
+ export interface SecurityEvent {
37
+ /** Unique event identifier / 唯一事件識別碼 */
38
+ id: string;
39
+ /** Event timestamp / 事件時間戳 */
40
+ timestamp: Date;
41
+ /** Event source type / 事件來源類型 */
42
+ source: EventSource;
43
+ /** Severity level / 嚴重等級 */
44
+ severity: Severity;
45
+ /** MITRE ATT&CK category / MITRE ATT&CK 分類 */
46
+ category: string;
47
+ /** Event description / 事件描述 */
48
+ description: string;
49
+ /** Raw event data / 原始事件資料 */
50
+ raw: unknown;
51
+ /** Hostname / 主機名稱 */
52
+ host: string;
53
+ /** Additional metadata / 額外中繼資料 */
54
+ metadata: Record<string, unknown>;
55
+ }
56
+ /**
57
+ * Log entry format for structured logging / 結構化日誌條目格式
58
+ */
59
+ export interface LogEntry {
60
+ /** ISO timestamp / ISO 時間戳 */
61
+ timestamp: string;
62
+ /** Log level / 日誌等級 */
63
+ level: 'info' | 'warn' | 'error' | 'debug';
64
+ /** Log message / 日誌訊息 */
65
+ message: string;
66
+ /** Module that generated the log / 產生日誌的模組 */
67
+ module: string;
68
+ /** Additional context / 額外上下文 */
69
+ context?: Record<string, unknown>;
70
+ }
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,QAAQ,GACR,SAAS,GACT,SAAS,GACT,MAAM,GACN,OAAO,GACP,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,uBAAuB;IACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,iCAAiC;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,GAAG,EAAE,OAAO,CAAC;IACb,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC3C,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core type definitions for Panguard AI platform
3
+ * Panguard 安全平台核心類型定義
4
+ *
5
+ * @module @panguard-ai/core/types
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Utility module exports
3
+ * 工具模組匯出
4
+ *
5
+ * @module @panguard-ai/core/utils
6
+ */
7
+ export { createLogger, setLogLevel } from './logger.js';
8
+ export type { Logger } from './logger.js';
9
+ export { validateInput, sanitizeString, validateFilePath } from './validation.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utility module exports
3
+ * 工具模組匯出
4
+ *
5
+ * @module @panguard-ai/core/utils
6
+ */
7
+ export { createLogger, setLogLevel } from './logger.js';
8
+ export { validateInput, sanitizeString, validateFilePath } from './validation.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}