@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,195 @@
1
+ /**
2
+ * LLM response parsing utilities
3
+ * LLM 回應解析工具
4
+ *
5
+ * Parses raw LLM text responses into structured data objects.
6
+ * Supports JSON extraction from markdown code blocks and plain text fallback.
7
+ * 將原始 LLM 文字回應解析為結構化資料物件。
8
+ * 支援從 Markdown 程式碼區塊提取 JSON 以及純文字回退。
9
+ *
10
+ * @module @panguard-ai/core/ai/response-parser
11
+ */
12
+ import { createLogger } from '../utils/logger.js';
13
+ const logger = createLogger('ai:response-parser');
14
+ /**
15
+ * Valid severity values for validation
16
+ * 用於驗證的有效嚴重等級值
17
+ * @internal
18
+ */
19
+ const VALID_SEVERITIES = new Set([
20
+ 'info',
21
+ 'low',
22
+ 'medium',
23
+ 'high',
24
+ 'critical',
25
+ ]);
26
+ /**
27
+ * Attempt to extract a JSON object from a raw string
28
+ * 嘗試從原始字串中提取 JSON 物件
29
+ *
30
+ * Tries in order: direct JSON.parse, markdown code block extraction, brace extraction.
31
+ * 依序嘗試:直接 JSON.parse、Markdown 程式碼區塊提取、大括號提取。
32
+ *
33
+ * @param raw - Raw LLM response text / 原始 LLM 回應文字
34
+ * @returns Parsed object or null if parsing fails / 解析的物件,或解析失敗時回傳 null
35
+ * @internal
36
+ */
37
+ function extractJson(raw) {
38
+ const trimmed = raw.trim();
39
+ // Strategy 1: Direct JSON.parse
40
+ // 策略 1:直接 JSON.parse
41
+ try {
42
+ const parsed = JSON.parse(trimmed);
43
+ if (typeof parsed === 'object' && parsed !== null) {
44
+ return parsed;
45
+ }
46
+ }
47
+ catch {
48
+ // Not pure JSON, try next strategy
49
+ // 非純 JSON,嘗試下一個策略
50
+ }
51
+ // Strategy 2: Extract from markdown code block (```json ... ``` or ``` ... ```)
52
+ // 策略 2:從 Markdown 程式碼區塊提取
53
+ const codeBlockMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);
54
+ if (codeBlockMatch?.[1]) {
55
+ try {
56
+ const parsed = JSON.parse(codeBlockMatch[1].trim());
57
+ if (typeof parsed === 'object' && parsed !== null) {
58
+ return parsed;
59
+ }
60
+ }
61
+ catch {
62
+ // Code block content is not valid JSON
63
+ // 程式碼區塊內容非有效 JSON
64
+ }
65
+ }
66
+ // Strategy 3: Find first { ... } block (greedy inner match)
67
+ // 策略 3:尋找第一個 { ... } 區塊
68
+ const braceStart = trimmed.indexOf('{');
69
+ const braceEnd = trimmed.lastIndexOf('}');
70
+ if (braceStart !== -1 && braceEnd > braceStart) {
71
+ try {
72
+ const jsonCandidate = trimmed.slice(braceStart, braceEnd + 1);
73
+ const parsed = JSON.parse(jsonCandidate);
74
+ if (typeof parsed === 'object' && parsed !== null) {
75
+ return parsed;
76
+ }
77
+ }
78
+ catch {
79
+ // Brace extraction failed
80
+ // 大括號提取失敗
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Validate and coerce a severity string
87
+ * 驗證並強制轉換嚴重等級字串
88
+ *
89
+ * @param value - Raw severity value / 原始嚴重等級值
90
+ * @returns Valid Severity or 'medium' as default / 有效嚴重等級或預設 'medium'
91
+ * @internal
92
+ */
93
+ function coerceSeverity(value) {
94
+ if (typeof value === 'string' && VALID_SEVERITIES.has(value.toLowerCase())) {
95
+ return value.toLowerCase();
96
+ }
97
+ return 'medium';
98
+ }
99
+ /**
100
+ * Validate and coerce a confidence value
101
+ * 驗證並強制轉換信心值
102
+ *
103
+ * @param value - Raw confidence value / 原始信心值
104
+ * @returns Number between 0 and 1, default 0.5 / 0 到 1 之間的數字,預設 0.5
105
+ * @internal
106
+ */
107
+ function coerceConfidence(value) {
108
+ if (typeof value === 'number' && isFinite(value)) {
109
+ return Math.max(0, Math.min(1, value));
110
+ }
111
+ if (typeof value === 'string') {
112
+ const num = parseFloat(value);
113
+ if (isFinite(num)) {
114
+ return Math.max(0, Math.min(1, num));
115
+ }
116
+ }
117
+ return 0.5;
118
+ }
119
+ /**
120
+ * Parse a raw LLM response into an AnalysisResult
121
+ * 將原始 LLM 回應解析為 AnalysisResult
122
+ *
123
+ * Attempts JSON parsing first, then falls back to treating the entire
124
+ * response as a text summary.
125
+ * 首先嘗試 JSON 解析,然後回退到將整個回應視為文字摘要。
126
+ *
127
+ * @param raw - Raw LLM response text / 原始 LLM 回應文字
128
+ * @returns Parsed analysis result / 解析的分析結果
129
+ */
130
+ export function parseAnalysisResponse(raw) {
131
+ const json = extractJson(raw);
132
+ if (json) {
133
+ logger.debug('Successfully parsed analysis response as JSON', {
134
+ keys: Object.keys(json),
135
+ });
136
+ const recommendations = Array.isArray(json['recommendations'])
137
+ ? json['recommendations'].map(String)
138
+ : typeof json['recommendations'] === 'string'
139
+ ? [json['recommendations']]
140
+ : [];
141
+ return {
142
+ summary: typeof json['summary'] === 'string' ? json['summary'] : raw.slice(0, 500),
143
+ severity: coerceSeverity(json['severity']),
144
+ confidence: coerceConfidence(json['confidence']),
145
+ recommendations,
146
+ rawResponse: raw,
147
+ };
148
+ }
149
+ // Fallback: treat the entire response as a text summary
150
+ // 回退:將整個回應視為文字摘要
151
+ logger.debug('JSON parsing failed, using text fallback for analysis response');
152
+ return {
153
+ summary: raw.slice(0, 2000),
154
+ severity: 'medium',
155
+ confidence: 0.3,
156
+ recommendations: [],
157
+ rawResponse: raw,
158
+ };
159
+ }
160
+ /**
161
+ * Parse a raw LLM response into a ThreatClassification
162
+ * 將原始 LLM 回應解析為 ThreatClassification
163
+ *
164
+ * Attempts JSON parsing first, then falls back to a generic classification.
165
+ * 首先嘗試 JSON 解析,然後回退到通用分類。
166
+ *
167
+ * @param raw - Raw LLM response text / 原始 LLM 回應文字
168
+ * @returns Parsed threat classification / 解析的威脅分類
169
+ */
170
+ export function parseClassificationResponse(raw) {
171
+ const json = extractJson(raw);
172
+ if (json) {
173
+ logger.debug('Successfully parsed classification response as JSON', {
174
+ keys: Object.keys(json),
175
+ });
176
+ return {
177
+ category: typeof json['category'] === 'string' ? json['category'] : 'Unknown',
178
+ technique: typeof json['technique'] === 'string' ? json['technique'] : 'T0000',
179
+ severity: coerceSeverity(json['severity']),
180
+ confidence: coerceConfidence(json['confidence']),
181
+ description: typeof json['description'] === 'string' ? json['description'] : raw.slice(0, 500),
182
+ };
183
+ }
184
+ // Fallback: generic unclassified threat
185
+ // 回退:通用未分類威脅
186
+ logger.debug('JSON parsing failed, using text fallback for classification response');
187
+ return {
188
+ category: 'Unknown',
189
+ technique: 'T0000',
190
+ severity: 'medium',
191
+ confidence: 0.2,
192
+ description: raw.slice(0, 500),
193
+ };
194
+ }
195
+ //# sourceMappingURL=response-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-parser.js","sourceRoot":"","sources":["../../src/ai/response-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Token usage tracking and cost estimation
3
+ * Token 使用追蹤與費用估算
4
+ *
5
+ * Tracks cumulative token usage across LLM requests and calculates
6
+ * estimated costs based on provider-specific pricing.
7
+ * 追蹤跨 LLM 請求的累計 Token 使用量,並根據供應商定價計算估算費用。
8
+ *
9
+ * @module @panguard-ai/core/ai/token-tracker
10
+ */
11
+ import type { LLMProviderType, TokenUsage } from './types.js';
12
+ /**
13
+ * Tracks token usage and estimates cost for an LLM provider
14
+ * 追蹤 LLM 供應商的 Token 使用量並估算費用
15
+ */
16
+ export declare class TokenTracker {
17
+ private readonly provider;
18
+ private readonly model;
19
+ /**
20
+ * Cumulative token usage / 累計 Token 使用量
21
+ * @internal
22
+ */
23
+ private usage;
24
+ /**
25
+ * Create a new TokenTracker instance
26
+ * 建立新的 TokenTracker 實例
27
+ *
28
+ * @param provider - The LLM provider type / LLM 供應商類型
29
+ * @param model - The model name / 模型名稱
30
+ */
31
+ constructor(provider: LLMProviderType, model: string);
32
+ /**
33
+ * Record token usage from a single request
34
+ * 記錄單次請求的 Token 使用量
35
+ *
36
+ * @param promptTokens - Number of prompt tokens used / 使用的提示詞 Token 數
37
+ * @param completionTokens - Number of completion tokens used / 使用的完成回應 Token 數
38
+ */
39
+ track(promptTokens: number, completionTokens: number): void;
40
+ /**
41
+ * Get current cumulative token usage
42
+ * 取得目前累計 Token 使用量
43
+ *
44
+ * @returns A copy of the current token usage / 目前 Token 使用量的副本
45
+ */
46
+ getUsage(): TokenUsage;
47
+ /**
48
+ * Reset all usage counters to zero
49
+ * 重置所有使用量計數器為零
50
+ */
51
+ reset(): void;
52
+ /**
53
+ * Calculate the estimated cost based on cumulative usage
54
+ * 根據累計使用量計算估算費用
55
+ *
56
+ * @returns Estimated cost in USD / 估算費用(美元)
57
+ * @internal
58
+ */
59
+ private calculateCost;
60
+ /**
61
+ * Look up pricing for the current provider and model
62
+ * 查詢目前供應商和模型的定價
63
+ *
64
+ * Falls back to provider default, then to zero cost.
65
+ * 回退到供應商預設值,然後回退到零費用。
66
+ *
67
+ * @returns Pricing tier / 定價層級
68
+ * @internal
69
+ */
70
+ private getPricing;
71
+ }
72
+ //# sourceMappingURL=token-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/ai/token-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8C9D;;;GAGG;AACH,qBAAa,YAAY;IAoBrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IApBxB;;;OAGG;IACH,OAAO,CAAC,KAAK,CAKX;IAEF;;;;;;OAMG;gBAEgB,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,MAAM;IAGhC;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAO3D;;;;;OAKG;IACH,QAAQ,IAAI,UAAU;IAItB;;;OAGG;IACH,KAAK,IAAI,IAAI;IASb;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;;;;;OASG;IACH,OAAO,CAAC,UAAU;CAuBnB"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Token usage tracking and cost estimation
3
+ * Token 使用追蹤與費用估算
4
+ *
5
+ * Tracks cumulative token usage across LLM requests and calculates
6
+ * estimated costs based on provider-specific pricing.
7
+ * 追蹤跨 LLM 請求的累計 Token 使用量,並根據供應商定價計算估算費用。
8
+ *
9
+ * @module @panguard-ai/core/ai/token-tracker
10
+ */
11
+ /**
12
+ * Approximate pricing table for supported providers and models
13
+ * 支援的供應商和模型的近似定價表
14
+ *
15
+ * Pricing is per 1M tokens in USD.
16
+ * 定價為每 1M Token 的美元費用。
17
+ *
18
+ * @internal
19
+ */
20
+ const PRICING = {
21
+ // Ollama: free (local inference)
22
+ // Ollama:免費(本地推論)
23
+ 'ollama:default': { input: 0, output: 0 },
24
+ // Claude models (current generation)
25
+ 'claude:claude-opus-4-6': { input: 15, output: 75 },
26
+ 'claude:claude-sonnet-4-6': { input: 3, output: 15 },
27
+ 'claude:claude-haiku-4-5-20251001': { input: 0.8, output: 4 },
28
+ // Claude models (previous generation)
29
+ 'claude:claude-sonnet-4-20250514': { input: 3, output: 15 },
30
+ 'claude:claude-3-5-sonnet-20241022': { input: 3, output: 15 },
31
+ 'claude:claude-3-haiku-20240307': { input: 0.25, output: 1.25 },
32
+ 'claude:claude-3-opus-20240229': { input: 15, output: 75 },
33
+ // OpenAI models
34
+ 'openai:gpt-4o': { input: 2.5, output: 10 },
35
+ 'openai:gpt-4o-mini': { input: 0.15, output: 0.6 },
36
+ 'openai:gpt-4-turbo': { input: 10, output: 30 },
37
+ 'openai:gpt-3.5-turbo': { input: 0.5, output: 1.5 },
38
+ };
39
+ /**
40
+ * Tracks token usage and estimates cost for an LLM provider
41
+ * 追蹤 LLM 供應商的 Token 使用量並估算費用
42
+ */
43
+ export class TokenTracker {
44
+ provider;
45
+ model;
46
+ /**
47
+ * Cumulative token usage / 累計 Token 使用量
48
+ * @internal
49
+ */
50
+ usage = {
51
+ promptTokens: 0,
52
+ completionTokens: 0,
53
+ totalTokens: 0,
54
+ estimatedCost: 0,
55
+ };
56
+ /**
57
+ * Create a new TokenTracker instance
58
+ * 建立新的 TokenTracker 實例
59
+ *
60
+ * @param provider - The LLM provider type / LLM 供應商類型
61
+ * @param model - The model name / 模型名稱
62
+ */
63
+ constructor(provider, model) {
64
+ this.provider = provider;
65
+ this.model = model;
66
+ }
67
+ /**
68
+ * Record token usage from a single request
69
+ * 記錄單次請求的 Token 使用量
70
+ *
71
+ * @param promptTokens - Number of prompt tokens used / 使用的提示詞 Token 數
72
+ * @param completionTokens - Number of completion tokens used / 使用的完成回應 Token 數
73
+ */
74
+ track(promptTokens, completionTokens) {
75
+ this.usage.promptTokens += promptTokens;
76
+ this.usage.completionTokens += completionTokens;
77
+ this.usage.totalTokens += promptTokens + completionTokens;
78
+ this.usage.estimatedCost = this.calculateCost();
79
+ }
80
+ /**
81
+ * Get current cumulative token usage
82
+ * 取得目前累計 Token 使用量
83
+ *
84
+ * @returns A copy of the current token usage / 目前 Token 使用量的副本
85
+ */
86
+ getUsage() {
87
+ return { ...this.usage };
88
+ }
89
+ /**
90
+ * Reset all usage counters to zero
91
+ * 重置所有使用量計數器為零
92
+ */
93
+ reset() {
94
+ this.usage = {
95
+ promptTokens: 0,
96
+ completionTokens: 0,
97
+ totalTokens: 0,
98
+ estimatedCost: 0,
99
+ };
100
+ }
101
+ /**
102
+ * Calculate the estimated cost based on cumulative usage
103
+ * 根據累計使用量計算估算費用
104
+ *
105
+ * @returns Estimated cost in USD / 估算費用(美元)
106
+ * @internal
107
+ */
108
+ calculateCost() {
109
+ const pricing = this.getPricing();
110
+ const inputCost = (this.usage.promptTokens / 1_000_000) * pricing.input;
111
+ const outputCost = (this.usage.completionTokens / 1_000_000) * pricing.output;
112
+ return Math.round((inputCost + outputCost) * 1_000_000) / 1_000_000;
113
+ }
114
+ /**
115
+ * Look up pricing for the current provider and model
116
+ * 查詢目前供應商和模型的定價
117
+ *
118
+ * Falls back to provider default, then to zero cost.
119
+ * 回退到供應商預設值,然後回退到零費用。
120
+ *
121
+ * @returns Pricing tier / 定價層級
122
+ * @internal
123
+ */
124
+ getPricing() {
125
+ const key = `${this.provider}:${this.model}`;
126
+ if (PRICING[key]) {
127
+ return PRICING[key];
128
+ }
129
+ // Fallback: match by provider prefix
130
+ // 回退:按供應商前綴匹配
131
+ const providerDefault = `${this.provider}:default`;
132
+ if (PRICING[providerDefault]) {
133
+ return PRICING[providerDefault];
134
+ }
135
+ // All Ollama models are free (local)
136
+ // 所有 Ollama 模型免費(本地推論)
137
+ if (this.provider === 'ollama') {
138
+ return { input: 0, output: 0 };
139
+ }
140
+ // Unknown model: return zero to avoid incorrect charges
141
+ // 未知模型:回傳零以避免錯誤計費
142
+ return { input: 0, output: 0 };
143
+ }
144
+ }
145
+ //# sourceMappingURL=token-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/ai/token-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAgC;IAC3C,iCAAiC;IACjC,kBAAkB;IAClB,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IAEzC,qCAAqC;IACrC,wBAAwB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACnD,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IACpD,kCAAkC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;IAC7D,sCAAsC;IACtC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC3D,mCAAmC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7D,gCAAgC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/D,+BAA+B,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAE1D,gBAAgB;IAChB,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IAC3C,oBAAoB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAClD,oBAAoB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC/C,sBAAsB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CACpD,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,YAAY;IAoBJ;IACA;IApBnB;;;OAGG;IACK,KAAK,GAAe;QAC1B,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;QACnB,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,CAAC;KACjB,CAAC;IAEF;;;;;;OAMG;IACH,YACmB,QAAyB,EACzB,KAAa;QADb,aAAQ,GAAR,QAAQ,CAAiB;QACzB,UAAK,GAAL,KAAK,CAAQ;IAC7B,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,YAAoB,EAAE,gBAAwB;QAClD,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,YAAY,GAAG,gBAAgB,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG;YACX,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,CAAC;SACjB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,aAAa;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QACxE,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,CAAC;IAED;;;;;;;;;OASG;IACK,UAAU;QAChB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAED,qCAAqC;QACrC,cAAc;QACd,MAAM,eAAe,GAAG,GAAG,IAAI,CAAC,QAAQ,UAAU,CAAC;QACnD,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,eAAe,CAAC,CAAC;QAClC,CAAC;QAED,qCAAqC;QACrC,uBAAuB;QACvB,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACjC,CAAC;QAED,wDAAwD;QACxD,kBAAkB;QAClB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * AI/LLM unified interface type definitions
3
+ * AI/LLM 統一介面型別定義
4
+ *
5
+ * Defines the contracts for all LLM providers, analysis results,
6
+ * threat classifications, and token usage tracking.
7
+ * 定義所有 LLM 供應商、分析結果、威脅分類和 Token 使用追蹤的契約。
8
+ *
9
+ * @module @panguard-ai/core/ai/types
10
+ */
11
+ import type { Language, Severity, SecurityEvent } from '../types.js';
12
+ /**
13
+ * Supported LLM provider types
14
+ * 支援的 LLM 供應商類型
15
+ */
16
+ export type LLMProviderType = 'ollama' | 'claude' | 'openai';
17
+ /**
18
+ * Configuration for initializing an LLM provider
19
+ * 初始化 LLM 供應商的配置
20
+ */
21
+ export interface LLMConfig {
22
+ /** Provider type / 供應商類型 */
23
+ provider: LLMProviderType;
24
+ /** Model name (e.g., 'llama3', 'claude-sonnet-4-20250514', 'gpt-4o') / 模型名稱 */
25
+ model: string;
26
+ /** API endpoint for Ollama, default 'http://localhost:11434' / Ollama API 端點 */
27
+ endpoint?: string;
28
+ /** API key for Claude/OpenAI / Claude/OpenAI API 金鑰 */
29
+ apiKey?: string;
30
+ /** Response language / 回應語言 */
31
+ lang: Language;
32
+ /** Sampling temperature, default 0.3 / 取樣溫度 */
33
+ temperature?: number;
34
+ /** Maximum output tokens, default 2048 / 最大輸出 Token 數 */
35
+ maxTokens?: number;
36
+ /** Request timeout in milliseconds, default 30000 / 請求逾時時間(毫秒) */
37
+ timeout?: number;
38
+ }
39
+ /**
40
+ * Result of an AI-powered security analysis
41
+ * AI 驅動的安全分析結果
42
+ */
43
+ export interface AnalysisResult {
44
+ /** Human-readable summary of the analysis / 人類可讀的分析摘要 */
45
+ summary: string;
46
+ /** Assessed severity level / 評估的嚴重等級 */
47
+ severity: Severity;
48
+ /** Confidence score from 0 to 1 / 信心分數(0 到 1) */
49
+ confidence: number;
50
+ /** Actionable recommendations / 可執行的建議 */
51
+ recommendations: string[];
52
+ /** Raw LLM response for debugging / 原始 LLM 回應(供除錯用) */
53
+ rawResponse?: string;
54
+ }
55
+ /**
56
+ * MITRE ATT&CK-based threat classification
57
+ * 基於 MITRE ATT&CK 的威脅分類
58
+ */
59
+ export interface ThreatClassification {
60
+ /** MITRE ATT&CK tactic category / MITRE ATT&CK 戰術分類 */
61
+ category: string;
62
+ /** MITRE ATT&CK technique ID (e.g., 'T1059') / MITRE ATT&CK 技術 ID */
63
+ technique: string;
64
+ /** Assessed severity level / 評估的嚴重等級 */
65
+ severity: Severity;
66
+ /** Confidence score from 0 to 1 / 信心分數(0 到 1) */
67
+ confidence: number;
68
+ /** Description of the classified threat / 分類威脅的描述 */
69
+ description: string;
70
+ }
71
+ /**
72
+ * Token usage and cost tracking
73
+ * Token 使用量與費用追蹤
74
+ */
75
+ export interface TokenUsage {
76
+ /** Number of tokens in the prompt / 提示詞 Token 數量 */
77
+ promptTokens: number;
78
+ /** Number of tokens in the completion / 完成回應 Token 數量 */
79
+ completionTokens: number;
80
+ /** Total tokens (prompt + completion) / 總 Token 數量 */
81
+ totalTokens: number;
82
+ /** Estimated cost in USD / 估算費用(美元) */
83
+ estimatedCost: number;
84
+ }
85
+ /**
86
+ * Unified interface for all LLM providers
87
+ * 所有 LLM 供應商的統一介面
88
+ *
89
+ * Implementations must provide security-focused analysis, classification,
90
+ * and summarization capabilities.
91
+ * 實作必須提供安全導向的分析、分類和摘要功能。
92
+ */
93
+ export interface LLMProvider {
94
+ /** The provider type identifier / 供應商類型識別碼 */
95
+ readonly providerType: LLMProviderType;
96
+ /** The model name being used / 使用的模型名稱 */
97
+ readonly model: string;
98
+ /**
99
+ * Analyze a security prompt with optional context
100
+ * 分析安全提示詞,可附帶上下文
101
+ *
102
+ * @param prompt - The analysis prompt / 分析提示詞
103
+ * @param context - Optional additional context / 可選的額外上下文
104
+ * @returns Analysis result / 分析結果
105
+ */
106
+ analyze(prompt: string, context?: string): Promise<AnalysisResult>;
107
+ /**
108
+ * Classify a security event using MITRE ATT&CK framework
109
+ * 使用 MITRE ATT&CK 框架分類安全事件
110
+ *
111
+ * @param event - The security event to classify / 要分類的安全事件
112
+ * @returns Threat classification / 威脅分類
113
+ */
114
+ classify(event: SecurityEvent): Promise<ThreatClassification>;
115
+ /**
116
+ * Summarize multiple security events into a report
117
+ * 將多個安全事件摘要為報告
118
+ *
119
+ * @param events - Array of security events / 安全事件陣列
120
+ * @returns Summary text / 摘要文字
121
+ */
122
+ summarize(events: SecurityEvent[]): Promise<string>;
123
+ /**
124
+ * Check if the provider is available and properly configured
125
+ * 檢查供應商是否可用且配置正確
126
+ *
127
+ * @returns True if provider is ready / 供應商就緒時回傳 true
128
+ */
129
+ isAvailable(): Promise<boolean>;
130
+ /**
131
+ * Get cumulative token usage statistics
132
+ * 取得累計 Token 使用統計
133
+ *
134
+ * @returns Token usage data / Token 使用資料
135
+ */
136
+ getTokenUsage(): TokenUsage;
137
+ }
138
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;IACvC,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnE;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE9D;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpD;;;;;OAKG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;;;OAKG;IACH,aAAa,IAAI,UAAU,CAAC;CAC7B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * AI/LLM unified interface type definitions
3
+ * AI/LLM 統一介面型別定義
4
+ *
5
+ * Defines the contracts for all LLM providers, analysis results,
6
+ * threat classifications, and token usage tracking.
7
+ * 定義所有 LLM 供應商、分析結果、威脅分類和 Token 使用追蹤的契約。
8
+ *
9
+ * @module @panguard-ai/core/ai/types
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}