@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,135 @@
1
+ /**
2
+ * Security tool adapter type definitions
3
+ * 資安工具對接器型別定義
4
+ *
5
+ * Defines all interfaces used by security tool adapters for
6
+ * integrating with external security systems (Defender, Wazuh, Syslog, etc.).
7
+ * 定義資安工具對接器所使用的所有介面,用於與外部安全系統整合
8
+ * (Defender、Wazuh、Syslog 等)。
9
+ *
10
+ * @module @panguard-ai/core/adapters/types
11
+ */
12
+ import type { SecurityEvent } from '../types.js';
13
+ /**
14
+ * Configuration for a security adapter
15
+ * 安全對接器配置
16
+ */
17
+ export interface AdapterConfig {
18
+ /**
19
+ * Whether this adapter is enabled
20
+ * 此對接器是否已啟用
21
+ */
22
+ enabled: boolean;
23
+ /**
24
+ * API endpoint URL (for REST-based adapters)
25
+ * API 端點 URL(用於基於 REST 的對接器)
26
+ */
27
+ endpoint?: string;
28
+ /**
29
+ * API key for authentication
30
+ * 用於認證的 API 金鑰
31
+ */
32
+ apiKey?: string;
33
+ /**
34
+ * Username for basic authentication
35
+ * 用於基本認證的使用者名稱
36
+ */
37
+ username?: string;
38
+ /**
39
+ * Password for basic authentication
40
+ * 用於基本認證的密碼
41
+ */
42
+ password?: string;
43
+ /**
44
+ * Polling interval in milliseconds for periodic alert collection
45
+ * 定期收集告警的輪詢間隔(毫秒)
46
+ */
47
+ pollInterval?: number;
48
+ }
49
+ /**
50
+ * Normalized alert from an external security tool
51
+ * 來自外部安全工具的正規化告警
52
+ */
53
+ export interface AdapterAlert {
54
+ /**
55
+ * Unique alert identifier
56
+ * 唯一告警識別碼
57
+ */
58
+ id: string;
59
+ /**
60
+ * Alert timestamp (ISO 8601 string)
61
+ * 告警時間戳(ISO 8601 字串)
62
+ */
63
+ timestamp: string;
64
+ /**
65
+ * Severity level as string (mapped to Severity type in SecurityEvent)
66
+ * 嚴重等級字串(在 SecurityEvent 中映射為 Severity 型別)
67
+ */
68
+ severity: string;
69
+ /**
70
+ * Alert title / summary
71
+ * 告警標題/摘要
72
+ */
73
+ title: string;
74
+ /**
75
+ * Alert description with full details
76
+ * 告警描述及完整詳情
77
+ */
78
+ description: string;
79
+ /**
80
+ * Source system name (e.g. 'defender', 'wazuh', 'syslog')
81
+ * 來源系統名稱(例如 'defender'、'wazuh'、'syslog')
82
+ */
83
+ source: string;
84
+ /**
85
+ * Raw alert data from the original source
86
+ * 來自原始來源的原始告警資料
87
+ */
88
+ raw?: unknown;
89
+ }
90
+ /**
91
+ * Common interface for all security tool adapters
92
+ * 所有安全工具對接器的通用介面
93
+ *
94
+ * Each adapter wraps a specific security tool or data source and provides
95
+ * a uniform way to check availability, retrieve alerts, and convert them
96
+ * to the standardized SecurityEvent format.
97
+ * 每個對接器包裝一個特定的安全工具或資料來源,提供統一的方式來
98
+ * 檢查可用性、取得告警,並將其轉換為標準化的 SecurityEvent 格式。
99
+ */
100
+ export interface SecurityAdapter {
101
+ /**
102
+ * Human-readable adapter name (e.g. 'Windows Defender')
103
+ * 人類可讀的對接器名稱(例如 'Windows Defender')
104
+ */
105
+ readonly name: string;
106
+ /**
107
+ * Adapter type identifier (e.g. 'antivirus', 'siem', 'syslog')
108
+ * 對接器類型識別碼(例如 'antivirus'、'siem'、'syslog')
109
+ */
110
+ readonly type: string;
111
+ /**
112
+ * Check if the underlying security tool is available and reachable
113
+ * 檢查底層安全工具是否可用且可連線
114
+ *
115
+ * @returns True if available, false otherwise / 可用則回傳 true,否則 false
116
+ */
117
+ isAvailable(): Promise<boolean>;
118
+ /**
119
+ * Retrieve alerts from the security tool
120
+ * 從安全工具取得告警
121
+ *
122
+ * @param since - Optional cutoff date; only return alerts after this time / 可選截止日期,僅回傳此時間之後的告警
123
+ * @returns Array of normalized adapter alerts / 正規化對接器告警陣列
124
+ */
125
+ getAlerts(since?: Date): Promise<AdapterAlert[]>;
126
+ /**
127
+ * Convert adapter alerts to standardized SecurityEvent format
128
+ * 將對接器告警轉換為標準化的 SecurityEvent 格式
129
+ *
130
+ * @param alerts - Array of adapter alerts to convert / 要轉換的對接器告警陣列
131
+ * @returns Array of SecurityEvent instances / SecurityEvent 實例陣列
132
+ */
133
+ toSecurityEvents(alerts: AdapterAlert[]): SecurityEvent[];
134
+ }
135
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;OAKG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE,CAAC;CAC3D"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Security tool adapter type definitions
3
+ * 資安工具對接器型別定義
4
+ *
5
+ * Defines all interfaces used by security tool adapters for
6
+ * integrating with external security systems (Defender, Wazuh, Syslog, etc.).
7
+ * 定義資安工具對接器所使用的所有介面,用於與外部安全系統整合
8
+ * (Defender、Wazuh、Syslog 等)。
9
+ *
10
+ * @module @panguard-ai/core/adapters/types
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Wazuh REST API adapter
3
+ * Wazuh REST API 對接器
4
+ *
5
+ * Integrates with Wazuh SIEM/XDR platform via its REST API for
6
+ * alert retrieval and security event correlation.
7
+ * Handles authentication, connection failures, and alert normalization.
8
+ * 透過 REST API 與 Wazuh SIEM/XDR 平台整合,進行告警取得和安全事件關聯。
9
+ * 處理認證、連線失敗和告警正規化。
10
+ *
11
+ * @module @panguard-ai/core/adapters/wazuh-adapter
12
+ */
13
+ import type { AdapterConfig, AdapterAlert } from './types.js';
14
+ import { BaseAdapter } from './base-adapter.js';
15
+ /**
16
+ * Wazuh REST API security adapter
17
+ * Wazuh REST API 安全對接器
18
+ *
19
+ * Connects to a Wazuh manager instance via its REST API to:
20
+ * - Authenticate using basic credentials or API key
21
+ * - Retrieve security alerts with optional time filtering
22
+ * - Convert Wazuh alerts to the standardized SecurityEvent format
23
+ *
24
+ * 連接到 Wazuh 管理器實例的 REST API 以:
25
+ * - 使用基本憑證或 API 金鑰進行認證
26
+ * - 取得安全告警(可選時間過濾)
27
+ * - 將 Wazuh 告警轉換為標準化的 SecurityEvent 格式
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const adapter = new WazuhAdapter({
32
+ * enabled: true,
33
+ * endpoint: 'https://wazuh-manager:55000',
34
+ * username: 'wazuh-wui',
35
+ * password: 'wazuh-wui',
36
+ * });
37
+ *
38
+ * if (await adapter.isAvailable()) {
39
+ * const alerts = await adapter.getAlerts(new Date(Date.now() - 3600000));
40
+ * const events = adapter.toSecurityEvents(alerts);
41
+ * }
42
+ * ```
43
+ */
44
+ export declare class WazuhAdapter extends BaseAdapter {
45
+ /** @inheritdoc */
46
+ readonly name = "Wazuh";
47
+ /** @inheritdoc */
48
+ readonly type = "siem";
49
+ /**
50
+ * Cached JWT token from Wazuh authentication
51
+ * 從 Wazuh 認證快取的 JWT 令牌
52
+ */
53
+ private authToken;
54
+ /**
55
+ * Token expiration timestamp
56
+ * 令牌到期時間戳
57
+ */
58
+ private tokenExpiry;
59
+ /**
60
+ * Create a new WazuhAdapter instance
61
+ * 建立新的 WazuhAdapter 實例
62
+ *
63
+ * @param config - Adapter configuration (merged with defaults) / 對接器配置(與預設值合併)
64
+ */
65
+ constructor(config?: Partial<AdapterConfig>);
66
+ /**
67
+ * Get the configured Wazuh API endpoint
68
+ * 取得已配置的 Wazuh API 端點
69
+ *
70
+ * @returns Endpoint URL without trailing slash / 不含末尾斜線的端點 URL
71
+ */
72
+ private get endpoint();
73
+ /**
74
+ * Authenticate with the Wazuh API and obtain a JWT token
75
+ * 與 Wazuh API 認證並取得 JWT 令牌
76
+ *
77
+ * Uses basic authentication (username:password) to obtain a bearer token
78
+ * from the /security/user/authenticate endpoint.
79
+ * 使用基本認證(使用者名稱:密碼)從 /security/user/authenticate 端點取得 bearer 令牌。
80
+ *
81
+ * @returns JWT token string / JWT 令牌字串
82
+ * @throws Error if authentication fails / 認證失敗時拋出錯誤
83
+ */
84
+ private authenticate;
85
+ /**
86
+ * Make an authenticated request to the Wazuh API
87
+ * 向 Wazuh API 發送已認證的請求
88
+ *
89
+ * @param path - API path (appended to endpoint) / API 路徑(附加到端點)
90
+ * @param params - Optional URL search parameters / 可選的 URL 搜尋參數
91
+ * @returns Parsed JSON response / 解析後的 JSON 回應
92
+ */
93
+ private apiRequest;
94
+ /**
95
+ * Check if the Wazuh API is available and reachable
96
+ * 檢查 Wazuh API 是否可用且可連線
97
+ *
98
+ * Attempts to authenticate with the configured endpoint.
99
+ * Returns false if authentication fails or endpoint is unreachable.
100
+ * 嘗試與已配置的端點進行認證。
101
+ * 若認證失敗或端點不可連線,則回傳 false。
102
+ *
103
+ * @returns True if Wazuh is available / 若 Wazuh 可用則回傳 true
104
+ */
105
+ isAvailable(): Promise<boolean>;
106
+ /**
107
+ * Retrieve alerts from the Wazuh API
108
+ * 從 Wazuh API 取得告警
109
+ *
110
+ * Fetches up to 500 alerts from the /alerts endpoint, optionally
111
+ * filtered by timestamp. Handles connection errors gracefully.
112
+ * 從 /alerts 端點取得最多 500 筆告警,可選依時間戳過濾。
113
+ * 優雅地處理連線錯誤。
114
+ *
115
+ * @param since - Optional cutoff date; only return alerts after this time / 可選截止日期,僅回傳此時間之後的告警
116
+ * @returns Array of normalized adapter alerts / 正規化對接器告警陣列
117
+ */
118
+ getAlerts(since?: Date): Promise<AdapterAlert[]>;
119
+ }
120
+ //# sourceMappingURL=wazuh-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wazuh-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/wazuh-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsFhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,kBAAkB;IAClB,QAAQ,CAAC,IAAI,WAAW;IAExB,kBAAkB;IAClB,QAAQ,CAAC,IAAI,UAAU;IAEvB;;;OAGG;IACH,OAAO,CAAC,SAAS,CAAuB;IAExC;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAa;IAEhC;;;;;OAKG;gBACS,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAK/C;;;;;OAKG;IACH,OAAO,KAAK,QAAQ,GAEnB;IAED;;;;;;;;;;OAUG;YACW,YAAY;IA2C1B;;;;;;;OAOG;YACW,UAAU;IA2BxB;;;;;;;;;;OAUG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAarC;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAqDvD"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Wazuh REST API adapter
3
+ * Wazuh REST API 對接器
4
+ *
5
+ * Integrates with Wazuh SIEM/XDR platform via its REST API for
6
+ * alert retrieval and security event correlation.
7
+ * Handles authentication, connection failures, and alert normalization.
8
+ * 透過 REST API 與 Wazuh SIEM/XDR 平台整合,進行告警取得和安全事件關聯。
9
+ * 處理認證、連線失敗和告警正規化。
10
+ *
11
+ * @module @panguard-ai/core/adapters/wazuh-adapter
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { BaseAdapter } from './base-adapter.js';
15
+ /**
16
+ * Default configuration for the Wazuh adapter
17
+ * Wazuh 對接器的預設配置
18
+ */
19
+ const DEFAULT_WAZUH_CONFIG = {
20
+ enabled: true,
21
+ endpoint: process.env['WAZUH_API_URL'] ?? 'https://localhost:55000',
22
+ username: process.env['WAZUH_API_USER'] ?? '',
23
+ password: process.env['WAZUH_API_PASS'] ?? '',
24
+ pollInterval: 30000,
25
+ };
26
+ /**
27
+ * Map Wazuh rule level (0-15) to severity string
28
+ * 將 Wazuh 規則等級 (0-15) 映射為嚴重等級字串
29
+ *
30
+ * Wazuh levels: 0-3 info, 4-7 low, 8-11 medium, 12-14 high, 15 critical
31
+ * Wazuh 等級:0-3 資訊,4-7 低,8-11 中,12-14 高,15 重大
32
+ *
33
+ * @param level - Wazuh rule level / Wazuh 規則等級
34
+ * @returns Severity string / 嚴重等級字串
35
+ */
36
+ function mapWazuhLevel(level) {
37
+ if (level >= 15)
38
+ return 'critical';
39
+ if (level >= 12)
40
+ return 'high';
41
+ if (level >= 8)
42
+ return 'medium';
43
+ if (level >= 4)
44
+ return 'low';
45
+ return 'info';
46
+ }
47
+ /**
48
+ * Wazuh REST API security adapter
49
+ * Wazuh REST API 安全對接器
50
+ *
51
+ * Connects to a Wazuh manager instance via its REST API to:
52
+ * - Authenticate using basic credentials or API key
53
+ * - Retrieve security alerts with optional time filtering
54
+ * - Convert Wazuh alerts to the standardized SecurityEvent format
55
+ *
56
+ * 連接到 Wazuh 管理器實例的 REST API 以:
57
+ * - 使用基本憑證或 API 金鑰進行認證
58
+ * - 取得安全告警(可選時間過濾)
59
+ * - 將 Wazuh 告警轉換為標準化的 SecurityEvent 格式
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const adapter = new WazuhAdapter({
64
+ * enabled: true,
65
+ * endpoint: 'https://wazuh-manager:55000',
66
+ * username: 'wazuh-wui',
67
+ * password: 'wazuh-wui',
68
+ * });
69
+ *
70
+ * if (await adapter.isAvailable()) {
71
+ * const alerts = await adapter.getAlerts(new Date(Date.now() - 3600000));
72
+ * const events = adapter.toSecurityEvents(alerts);
73
+ * }
74
+ * ```
75
+ */
76
+ export class WazuhAdapter extends BaseAdapter {
77
+ /** @inheritdoc */
78
+ name = 'Wazuh';
79
+ /** @inheritdoc */
80
+ type = 'siem';
81
+ /**
82
+ * Cached JWT token from Wazuh authentication
83
+ * 從 Wazuh 認證快取的 JWT 令牌
84
+ */
85
+ authToken = null;
86
+ /**
87
+ * Token expiration timestamp
88
+ * 令牌到期時間戳
89
+ */
90
+ tokenExpiry = 0;
91
+ /**
92
+ * Create a new WazuhAdapter instance
93
+ * 建立新的 WazuhAdapter 實例
94
+ *
95
+ * @param config - Adapter configuration (merged with defaults) / 對接器配置(與預設值合併)
96
+ */
97
+ constructor(config = {}) {
98
+ const merged = { ...DEFAULT_WAZUH_CONFIG, ...config };
99
+ super('adapter-wazuh', merged);
100
+ }
101
+ /**
102
+ * Get the configured Wazuh API endpoint
103
+ * 取得已配置的 Wazuh API 端點
104
+ *
105
+ * @returns Endpoint URL without trailing slash / 不含末尾斜線的端點 URL
106
+ */
107
+ get endpoint() {
108
+ return (this.config.endpoint ?? DEFAULT_WAZUH_CONFIG.endpoint).replace(/\/+$/, '');
109
+ }
110
+ /**
111
+ * Authenticate with the Wazuh API and obtain a JWT token
112
+ * 與 Wazuh API 認證並取得 JWT 令牌
113
+ *
114
+ * Uses basic authentication (username:password) to obtain a bearer token
115
+ * from the /security/user/authenticate endpoint.
116
+ * 使用基本認證(使用者名稱:密碼)從 /security/user/authenticate 端點取得 bearer 令牌。
117
+ *
118
+ * @returns JWT token string / JWT 令牌字串
119
+ * @throws Error if authentication fails / 認證失敗時拋出錯誤
120
+ */
121
+ async authenticate() {
122
+ // Return cached token if still valid (with 60s buffer)
123
+ // 若快取令牌仍有效(含 60 秒緩衝),則回傳快取令牌
124
+ if (this.authToken && Date.now() < this.tokenExpiry - 60000) {
125
+ return this.authToken;
126
+ }
127
+ const username = this.config.username ?? '';
128
+ const password = this.config.password ?? '';
129
+ const credentials = Buffer.from(`${username}:${password}`).toString('base64');
130
+ const url = `${this.endpoint}/security/user/authenticate`;
131
+ this.logger.debug('Authenticating with Wazuh API', { url });
132
+ const response = await fetch(url, {
133
+ method: 'POST',
134
+ headers: {
135
+ Authorization: `Basic ${credentials}`,
136
+ 'Content-Type': 'application/json',
137
+ },
138
+ });
139
+ if (!response.ok) {
140
+ throw new Error(`Wazuh authentication failed: ${response.status} ${response.statusText}`);
141
+ }
142
+ const body = (await response.json());
143
+ const token = body.data?.token;
144
+ if (!token) {
145
+ throw new Error('Wazuh authentication response did not contain a token');
146
+ }
147
+ this.authToken = token;
148
+ // Wazuh tokens typically expire in 900s (15 min)
149
+ // Wazuh 令牌通常在 900 秒(15 分鐘)後到期
150
+ this.tokenExpiry = Date.now() + 900000;
151
+ this.logger.info('Successfully authenticated with Wazuh API');
152
+ return token;
153
+ }
154
+ /**
155
+ * Make an authenticated request to the Wazuh API
156
+ * 向 Wazuh API 發送已認證的請求
157
+ *
158
+ * @param path - API path (appended to endpoint) / API 路徑(附加到端點)
159
+ * @param params - Optional URL search parameters / 可選的 URL 搜尋參數
160
+ * @returns Parsed JSON response / 解析後的 JSON 回應
161
+ */
162
+ async apiRequest(path, params) {
163
+ const token = await this.authenticate();
164
+ const url = new URL(`${this.endpoint}${path}`);
165
+ if (params) {
166
+ for (const [key, value] of Object.entries(params)) {
167
+ url.searchParams.set(key, value);
168
+ }
169
+ }
170
+ const response = await fetch(url.toString(), {
171
+ method: 'GET',
172
+ headers: {
173
+ Authorization: `Bearer ${token}`,
174
+ 'Content-Type': 'application/json',
175
+ },
176
+ });
177
+ if (!response.ok) {
178
+ throw new Error(`Wazuh API request failed: ${response.status} ${response.statusText} for ${path}`);
179
+ }
180
+ return (await response.json());
181
+ }
182
+ /**
183
+ * Check if the Wazuh API is available and reachable
184
+ * 檢查 Wazuh API 是否可用且可連線
185
+ *
186
+ * Attempts to authenticate with the configured endpoint.
187
+ * Returns false if authentication fails or endpoint is unreachable.
188
+ * 嘗試與已配置的端點進行認證。
189
+ * 若認證失敗或端點不可連線,則回傳 false。
190
+ *
191
+ * @returns True if Wazuh is available / 若 Wazuh 可用則回傳 true
192
+ */
193
+ async isAvailable() {
194
+ try {
195
+ await this.authenticate();
196
+ return true;
197
+ }
198
+ catch (err) {
199
+ this.logger.warn('Wazuh API is not available', {
200
+ endpoint: this.endpoint,
201
+ error: err instanceof Error ? err.message : String(err),
202
+ });
203
+ return false;
204
+ }
205
+ }
206
+ /**
207
+ * Retrieve alerts from the Wazuh API
208
+ * 從 Wazuh API 取得告警
209
+ *
210
+ * Fetches up to 500 alerts from the /alerts endpoint, optionally
211
+ * filtered by timestamp. Handles connection errors gracefully.
212
+ * 從 /alerts 端點取得最多 500 筆告警,可選依時間戳過濾。
213
+ * 優雅地處理連線錯誤。
214
+ *
215
+ * @param since - Optional cutoff date; only return alerts after this time / 可選截止日期,僅回傳此時間之後的告警
216
+ * @returns Array of normalized adapter alerts / 正規化對接器告警陣列
217
+ */
218
+ async getAlerts(since) {
219
+ try {
220
+ const params = {
221
+ offset: '0',
222
+ limit: '500',
223
+ };
224
+ if (since) {
225
+ // Wazuh API query filter format: timestamp>ISO_DATE
226
+ // Wazuh API 查詢過濾格式:timestamp>ISO_DATE
227
+ params['q'] = `timestamp>${since.toISOString()}`;
228
+ }
229
+ const response = await this.apiRequest('/alerts', params);
230
+ const items = response.data?.affected_items ?? [];
231
+ if (items.length === 0) {
232
+ this.logger.debug('No alerts returned from Wazuh');
233
+ return [];
234
+ }
235
+ const alerts = items.map((item) => ({
236
+ id: item.id ?? item.rule?.id ?? randomUUID(),
237
+ timestamp: item.timestamp ?? new Date().toISOString(),
238
+ severity: mapWazuhLevel(item.rule?.level ?? 0),
239
+ title: item.rule?.description ?? 'Wazuh Alert',
240
+ description: [
241
+ item.rule?.description ?? '',
242
+ item.full_log ? `Log: ${item.full_log}` : '',
243
+ item.agent?.name ? `Agent: ${item.agent.name}` : '',
244
+ item.rule?.groups?.length ? `Groups: ${item.rule.groups.join(', ')}` : '',
245
+ ]
246
+ .filter(Boolean)
247
+ .join(' | '),
248
+ source: 'wazuh',
249
+ raw: item,
250
+ }));
251
+ this.logger.info(`Retrieved ${alerts.length} alerts from Wazuh`, {
252
+ total: response.data?.total_affected_items ?? alerts.length,
253
+ returned: alerts.length,
254
+ });
255
+ return alerts;
256
+ }
257
+ catch (err) {
258
+ this.logger.warn('Failed to retrieve alerts from Wazuh', {
259
+ endpoint: this.endpoint,
260
+ error: err instanceof Error ? err.message : String(err),
261
+ });
262
+ return [];
263
+ }
264
+ }
265
+ }
266
+ //# sourceMappingURL=wazuh-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wazuh-adapter.js","sourceRoot":"","sources":["../../src/adapters/wazuh-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Claude (Anthropic) LLM provider implementation
3
+ * Claude (Anthropic) LLM 供應商實作
4
+ *
5
+ * Uses the @anthropic-ai/sdk package via dynamic import to avoid
6
+ * hard dependencies. Users must install the SDK separately.
7
+ * 透過動態匯入使用 @anthropic-ai/sdk 套件以避免硬性相依。
8
+ * 使用者必須另外安裝 SDK。
9
+ *
10
+ * @module @panguard-ai/core/ai/claude-provider
11
+ */
12
+ import type { LLMConfig } from './types.js';
13
+ import { LLMProviderBase } from './provider-base.js';
14
+ /**
15
+ * Claude (Anthropic) LLM provider
16
+ * Claude (Anthropic) LLM 供應商
17
+ *
18
+ * Requires the @anthropic-ai/sdk package to be installed separately.
19
+ * The SDK is loaded via dynamic import() on first use.
20
+ * 需要另外安裝 @anthropic-ai/sdk 套件。
21
+ * SDK 在首次使用時透過動態 import() 載入。
22
+ */
23
+ export declare class ClaudeProvider extends LLMProviderBase {
24
+ /**
25
+ * Cached Anthropic client instance / 快取的 Anthropic 客戶端實例
26
+ * @internal
27
+ */
28
+ private client;
29
+ /**
30
+ * Create a new ClaudeProvider instance
31
+ * 建立新的 ClaudeProvider 實例
32
+ *
33
+ * @param config - LLM configuration (apiKey required) / LLM 配置(需要 apiKey)
34
+ */
35
+ constructor(config: LLMConfig);
36
+ /**
37
+ * Lazily initialize the Anthropic SDK client via dynamic import
38
+ * 透過動態匯入延遲初始化 Anthropic SDK 客戶端
39
+ *
40
+ * @returns Initialized Anthropic client / 初始化的 Anthropic 客戶端
41
+ * @throws Error if the SDK is not installed or API key is missing
42
+ * 如果 SDK 未安裝或 API 金鑰遺失則拋出錯誤
43
+ * @internal
44
+ */
45
+ private getClient;
46
+ /**
47
+ * Check if the Claude API is available and the API key is valid
48
+ * 檢查 Claude API 是否可用且 API 金鑰有效
49
+ *
50
+ * Attempts to create a minimal message to verify connectivity.
51
+ * 嘗試建立最小訊息以驗證連接性。
52
+ *
53
+ * @returns True if Claude API is reachable / Claude API 可連接時回傳 true
54
+ */
55
+ isAvailable(): Promise<boolean>;
56
+ /**
57
+ * Send a prompt to the Claude API via the Anthropic SDK
58
+ * 透過 Anthropic SDK 向 Claude API 發送提示詞
59
+ *
60
+ * @param prompt - The prompt to send / 要發送的提示詞
61
+ * @returns Raw response text / 原始回應文字
62
+ * @throws Error if the API call fails / API 呼叫失敗時拋出錯誤
63
+ */
64
+ protected sendRequest(prompt: string): Promise<string>;
65
+ }
66
+ //# sourceMappingURL=claude-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-provider.d.ts","sourceRoot":"","sources":["../../src/ai/claude-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAmCrD;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAgC;IAE9C;;;;;OAKG;gBACS,MAAM,EAAE,SAAS;IAK7B;;;;;;;;OAQG;YACW,SAAS;IAqCvB;;;;;;;;OAQG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IA4BrC;;;;;;;OAOG;cACa,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuD7D"}