@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.
- package/dist/adapters/adapter-registry.d.ts +150 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +271 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +101 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +160 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/defender-adapter.d.ts +90 -0
- package/dist/adapters/defender-adapter.d.ts.map +1 -0
- package/dist/adapters/defender-adapter.js +227 -0
- package/dist/adapters/defender-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +22 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +23 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/syslog-adapter.d.ts +207 -0
- package/dist/adapters/syslog-adapter.d.ts.map +1 -0
- package/dist/adapters/syslog-adapter.js +432 -0
- package/dist/adapters/syslog-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +135 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +13 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/wazuh-adapter.d.ts +120 -0
- package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
- package/dist/adapters/wazuh-adapter.js +266 -0
- package/dist/adapters/wazuh-adapter.js.map +1 -0
- package/dist/ai/claude-provider.d.ts +66 -0
- package/dist/ai/claude-provider.d.ts.map +1 -0
- package/dist/ai/claude-provider.js +166 -0
- package/dist/ai/claude-provider.js.map +1 -0
- package/dist/ai/funnel-router.d.ts +75 -0
- package/dist/ai/funnel-router.d.ts.map +1 -0
- package/dist/ai/funnel-router.js +173 -0
- package/dist/ai/funnel-router.js.map +1 -0
- package/dist/ai/index.d.ts +77 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +95 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/ollama-provider.d.ts +73 -0
- package/dist/ai/ollama-provider.d.ts.map +1 -0
- package/dist/ai/ollama-provider.js +200 -0
- package/dist/ai/ollama-provider.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +70 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +175 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/prompts/event-classifier.d.ts +25 -0
- package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
- package/dist/ai/prompts/event-classifier.js +94 -0
- package/dist/ai/prompts/event-classifier.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +13 -0
- package/dist/ai/prompts/index.d.ts.map +1 -0
- package/dist/ai/prompts/index.js +13 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/report-generator.d.ts +25 -0
- package/dist/ai/prompts/report-generator.d.ts.map +1 -0
- package/dist/ai/prompts/report-generator.js +131 -0
- package/dist/ai/prompts/report-generator.js.map +1 -0
- package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
- package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
- package/dist/ai/prompts/threat-analyzer.js +75 -0
- package/dist/ai/prompts/threat-analyzer.js.map +1 -0
- package/dist/ai/provider-base.d.ts +100 -0
- package/dist/ai/provider-base.d.ts.map +1 -0
- package/dist/ai/provider-base.js +166 -0
- package/dist/ai/provider-base.js.map +1 -0
- package/dist/ai/response-parser.d.ts +36 -0
- package/dist/ai/response-parser.d.ts.map +1 -0
- package/dist/ai/response-parser.js +195 -0
- package/dist/ai/response-parser.js.map +1 -0
- package/dist/ai/token-tracker.d.ts +72 -0
- package/dist/ai/token-tracker.d.ts.map +1 -0
- package/dist/ai/token-tracker.js +145 -0
- package/dist/ai/token-tracker.js.map +1 -0
- package/dist/ai/types.d.ts +138 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +12 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/index.d.ts +146 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +515 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +58 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +327 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/wizard.d.ts +58 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +200 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/discovery/firewall-checker.d.ts +28 -0
- package/dist/discovery/firewall-checker.d.ts.map +1 -0
- package/dist/discovery/firewall-checker.js +379 -0
- package/dist/discovery/firewall-checker.js.map +1 -0
- package/dist/discovery/index.d.ts +23 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +29 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/network-scanner.d.ts +60 -0
- package/dist/discovery/network-scanner.d.ts.map +1 -0
- package/dist/discovery/network-scanner.js +640 -0
- package/dist/discovery/network-scanner.js.map +1 -0
- package/dist/discovery/os-detector.d.ts +24 -0
- package/dist/discovery/os-detector.d.ts.map +1 -0
- package/dist/discovery/os-detector.js +253 -0
- package/dist/discovery/os-detector.js.map +1 -0
- package/dist/discovery/osquery-provider.d.ts +127 -0
- package/dist/discovery/osquery-provider.d.ts.map +1 -0
- package/dist/discovery/osquery-provider.js +214 -0
- package/dist/discovery/osquery-provider.js.map +1 -0
- package/dist/discovery/risk-scorer.d.ts +66 -0
- package/dist/discovery/risk-scorer.d.ts.map +1 -0
- package/dist/discovery/risk-scorer.js +294 -0
- package/dist/discovery/risk-scorer.js.map +1 -0
- package/dist/discovery/security-tools.d.ts +31 -0
- package/dist/discovery/security-tools.d.ts.map +1 -0
- package/dist/discovery/security-tools.js +346 -0
- package/dist/discovery/security-tools.js.map +1 -0
- package/dist/discovery/service-detector.d.ts +28 -0
- package/dist/discovery/service-detector.d.ts.map +1 -0
- package/dist/discovery/service-detector.js +300 -0
- package/dist/discovery/service-detector.js.map +1 -0
- package/dist/discovery/types.d.ts +502 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +12 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/discovery/user-auditor.d.ts +28 -0
- package/dist/discovery/user-auditor.d.ts.map +1 -0
- package/dist/discovery/user-auditor.js +385 -0
- package/dist/discovery/user-auditor.js.map +1 -0
- package/dist/i18n/config.d.ts +45 -0
- package/dist/i18n/config.d.ts.map +1 -0
- package/dist/i18n/config.js +135 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/index.d.ts +8 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +8 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/monitor/event-normalizer.d.ts +102 -0
- package/dist/monitor/event-normalizer.d.ts.map +1 -0
- package/dist/monitor/event-normalizer.js +195 -0
- package/dist/monitor/event-normalizer.js.map +1 -0
- package/dist/monitor/file-monitor.d.ts +90 -0
- package/dist/monitor/file-monitor.d.ts.map +1 -0
- package/dist/monitor/file-monitor.js +222 -0
- package/dist/monitor/file-monitor.js.map +1 -0
- package/dist/monitor/index.d.ts +147 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +293 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/log-monitor.d.ts +102 -0
- package/dist/monitor/log-monitor.d.ts.map +1 -0
- package/dist/monitor/log-monitor.js +245 -0
- package/dist/monitor/log-monitor.js.map +1 -0
- package/dist/monitor/network-monitor.d.ts +103 -0
- package/dist/monitor/network-monitor.d.ts.map +1 -0
- package/dist/monitor/network-monitor.js +336 -0
- package/dist/monitor/network-monitor.js.map +1 -0
- package/dist/monitor/process-monitor.d.ts +108 -0
- package/dist/monitor/process-monitor.d.ts.map +1 -0
- package/dist/monitor/process-monitor.js +245 -0
- package/dist/monitor/process-monitor.js.map +1 -0
- package/dist/monitor/threat-intel-feeds.d.ts +141 -0
- package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
- package/dist/monitor/threat-intel-feeds.js +430 -0
- package/dist/monitor/threat-intel-feeds.js.map +1 -0
- package/dist/monitor/threat-intel.d.ts +83 -0
- package/dist/monitor/threat-intel.d.ts.map +1 -0
- package/dist/monitor/threat-intel.js +215 -0
- package/dist/monitor/threat-intel.js.map +1 -0
- package/dist/monitor/types.d.ts +65 -0
- package/dist/monitor/types.d.ts.map +1 -0
- package/dist/monitor/types.js +20 -0
- package/dist/monitor/types.js.map +1 -0
- package/dist/rules/index.d.ts +115 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +244 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/rule-loader.d.ts +54 -0
- package/dist/rules/rule-loader.d.ts.map +1 -0
- package/dist/rules/rule-loader.js +167 -0
- package/dist/rules/rule-loader.js.map +1 -0
- package/dist/rules/sigma-matcher.d.ts +40 -0
- package/dist/rules/sigma-matcher.d.ts.map +1 -0
- package/dist/rules/sigma-matcher.js +447 -0
- package/dist/rules/sigma-matcher.js.map +1 -0
- package/dist/rules/sigma-parser.d.ts +36 -0
- package/dist/rules/sigma-parser.d.ts.map +1 -0
- package/dist/rules/sigma-parser.js +180 -0
- package/dist/rules/sigma-parser.js.map +1 -0
- package/dist/rules/types.d.ts +112 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +11 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/yara-scanner.d.ts +103 -0
- package/dist/rules/yara-scanner.d.ts.map +1 -0
- package/dist/rules/yara-scanner.js +421 -0
- package/dist/rules/yara-scanner.js.map +1 -0
- package/dist/scoring/achievements.d.ts +76 -0
- package/dist/scoring/achievements.d.ts.map +1 -0
- package/dist/scoring/achievements.js +211 -0
- package/dist/scoring/achievements.js.map +1 -0
- package/dist/scoring/index.d.ts +3 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +3 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/security-score.d.ts +60 -0
- package/dist/scoring/security-score.d.ts.map +1 -0
- package/dist/scoring/security-score.js +211 -0
- package/dist/scoring/security-score.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +71 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +35 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.js.map +1 -0
- 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"}
|