@panguard-ai/panguard-guard 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 (130) hide show
  1. package/dist/agent/analyze-agent.d.ts +62 -0
  2. package/dist/agent/analyze-agent.d.ts.map +1 -0
  3. package/dist/agent/analyze-agent.js +327 -0
  4. package/dist/agent/analyze-agent.js.map +1 -0
  5. package/dist/agent/detect-agent.d.ts +59 -0
  6. package/dist/agent/detect-agent.d.ts.map +1 -0
  7. package/dist/agent/detect-agent.js +214 -0
  8. package/dist/agent/detect-agent.js.map +1 -0
  9. package/dist/agent/index.d.ts +15 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +14 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/report-agent.d.ts +122 -0
  14. package/dist/agent/report-agent.d.ts.map +1 -0
  15. package/dist/agent/report-agent.js +468 -0
  16. package/dist/agent/report-agent.js.map +1 -0
  17. package/dist/agent/respond-agent.d.ts +113 -0
  18. package/dist/agent/respond-agent.d.ts.map +1 -0
  19. package/dist/agent/respond-agent.js +749 -0
  20. package/dist/agent/respond-agent.js.map +1 -0
  21. package/dist/agent-client/index.d.ts +81 -0
  22. package/dist/agent-client/index.d.ts.map +1 -0
  23. package/dist/agent-client/index.js +170 -0
  24. package/dist/agent-client/index.js.map +1 -0
  25. package/dist/cli/index.d.ts +17 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +295 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/config.d.ts +23 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +108 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/daemon/index.d.ts +66 -0
  34. package/dist/daemon/index.d.ts.map +1 -0
  35. package/dist/daemon/index.js +284 -0
  36. package/dist/daemon/index.js.map +1 -0
  37. package/dist/dashboard/index.d.ts +78 -0
  38. package/dist/dashboard/index.d.ts.map +1 -0
  39. package/dist/dashboard/index.js +455 -0
  40. package/dist/dashboard/index.js.map +1 -0
  41. package/dist/guard-engine.d.ts +108 -0
  42. package/dist/guard-engine.d.ts.map +1 -0
  43. package/dist/guard-engine.js +740 -0
  44. package/dist/guard-engine.js.map +1 -0
  45. package/dist/index.d.ts +29 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/install/index.d.ts +23 -0
  50. package/dist/install/index.d.ts.map +1 -0
  51. package/dist/install/index.js +216 -0
  52. package/dist/install/index.js.map +1 -0
  53. package/dist/investigation/index.d.ts +80 -0
  54. package/dist/investigation/index.d.ts.map +1 -0
  55. package/dist/investigation/index.js +570 -0
  56. package/dist/investigation/index.js.map +1 -0
  57. package/dist/license/index.d.ts +46 -0
  58. package/dist/license/index.d.ts.map +1 -0
  59. package/dist/license/index.js +145 -0
  60. package/dist/license/index.js.map +1 -0
  61. package/dist/memory/baseline.d.ts +34 -0
  62. package/dist/memory/baseline.d.ts.map +1 -0
  63. package/dist/memory/baseline.js +224 -0
  64. package/dist/memory/baseline.js.map +1 -0
  65. package/dist/memory/index.d.ts +32 -0
  66. package/dist/memory/index.d.ts.map +1 -0
  67. package/dist/memory/index.js +58 -0
  68. package/dist/memory/index.js.map +1 -0
  69. package/dist/memory/learning.d.ts +35 -0
  70. package/dist/memory/learning.d.ts.map +1 -0
  71. package/dist/memory/learning.js +60 -0
  72. package/dist/memory/learning.js.map +1 -0
  73. package/dist/monitors/falco-monitor.d.ts +62 -0
  74. package/dist/monitors/falco-monitor.d.ts.map +1 -0
  75. package/dist/monitors/falco-monitor.js +226 -0
  76. package/dist/monitors/falco-monitor.js.map +1 -0
  77. package/dist/monitors/suricata-monitor.d.ts +80 -0
  78. package/dist/monitors/suricata-monitor.d.ts.map +1 -0
  79. package/dist/monitors/suricata-monitor.js +227 -0
  80. package/dist/monitors/suricata-monitor.js.map +1 -0
  81. package/dist/notify/email.d.ts +23 -0
  82. package/dist/notify/email.d.ts.map +1 -0
  83. package/dist/notify/email.js +124 -0
  84. package/dist/notify/email.js.map +1 -0
  85. package/dist/notify/index.d.ts +31 -0
  86. package/dist/notify/index.d.ts.map +1 -0
  87. package/dist/notify/index.js +70 -0
  88. package/dist/notify/index.js.map +1 -0
  89. package/dist/notify/line-notify.d.ts.map +1 -0
  90. package/dist/notify/slack.d.ts +21 -0
  91. package/dist/notify/slack.d.ts.map +1 -0
  92. package/dist/notify/slack.js +92 -0
  93. package/dist/notify/slack.js.map +1 -0
  94. package/dist/notify/telegram.d.ts +21 -0
  95. package/dist/notify/telegram.d.ts.map +1 -0
  96. package/dist/notify/telegram.js +89 -0
  97. package/dist/notify/telegram.js.map +1 -0
  98. package/dist/response/file-quarantine.d.ts +63 -0
  99. package/dist/response/file-quarantine.d.ts.map +1 -0
  100. package/dist/response/file-quarantine.js +137 -0
  101. package/dist/response/file-quarantine.js.map +1 -0
  102. package/dist/response/index.d.ts +4 -0
  103. package/dist/response/index.d.ts.map +1 -0
  104. package/dist/response/index.js +4 -0
  105. package/dist/response/index.js.map +1 -0
  106. package/dist/response/ip-blocker.d.ts +69 -0
  107. package/dist/response/ip-blocker.d.ts.map +1 -0
  108. package/dist/response/ip-blocker.js +191 -0
  109. package/dist/response/ip-blocker.js.map +1 -0
  110. package/dist/response/process-killer.d.ts +49 -0
  111. package/dist/response/process-killer.d.ts.map +1 -0
  112. package/dist/response/process-killer.js +230 -0
  113. package/dist/response/process-killer.js.map +1 -0
  114. package/dist/rules/builtin-rules.d.ts +12 -0
  115. package/dist/rules/builtin-rules.d.ts.map +1 -0
  116. package/dist/rules/builtin-rules.js +471 -0
  117. package/dist/rules/builtin-rules.js.map +1 -0
  118. package/dist/threat-cloud/client-id.d.ts +13 -0
  119. package/dist/threat-cloud/client-id.d.ts.map +1 -0
  120. package/dist/threat-cloud/client-id.js +38 -0
  121. package/dist/threat-cloud/client-id.js.map +1 -0
  122. package/dist/threat-cloud/index.d.ts +103 -0
  123. package/dist/threat-cloud/index.d.ts.map +1 -0
  124. package/dist/threat-cloud/index.js +386 -0
  125. package/dist/threat-cloud/index.js.map +1 -0
  126. package/dist/types.d.ts +336 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +42 -0
  129. package/dist/types.js.map +1 -0
  130. package/package.json +35 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * License Key Validation and Feature Gating
3
+ * 授權金鑰驗證與功能閘
4
+ *
5
+ * Validates license keys in the format CLAW-TIER-XXXX-XXXX-XXXX,
6
+ * determines tier (Free/Pro/Enterprise), and gates features accordingly.
7
+ * 驗證格式為 CLAW-TIER-XXXX-XXXX-XXXX 的授權金鑰,
8
+ * 判定等級(Free/Pro/Enterprise),並據此控制功能閘。
9
+ *
10
+ * @module @panguard-ai/panguard-guard/license
11
+ */
12
+ import { createLogger } from '@panguard-ai/core';
13
+ import { TIER_FEATURES } from '../types.js';
14
+ const logger = createLogger('panguard-guard:license');
15
+ /** License key format: CLAW-TIER-XXXX-XXXX-XXXX / 授權金鑰格式 */
16
+ const LICENSE_PATTERN = /^CLAW-(FREE|PRO|ENT)-([A-Z0-9]{4})-([A-Z0-9]{4})-([A-Z0-9]{4})$/;
17
+ /** Tier mapping from key prefix / 從金鑰前綴映射等級 */
18
+ const TIER_MAP = {
19
+ FREE: 'free',
20
+ PRO: 'pro',
21
+ ENT: 'enterprise',
22
+ };
23
+ /**
24
+ * Validate a license key and return license information
25
+ * 驗證授權金鑰並回傳授權資訊
26
+ *
27
+ * Key format: CLAW-{TIER}-{XXXX}-{XXXX}-{XXXX}
28
+ * - TIER: FREE, PRO, or ENT
29
+ * - X: Alphanumeric characters
30
+ * - Last 4 characters contain a checksum
31
+ *
32
+ * @param key - The license key to validate / 要驗證的授權金鑰
33
+ * @returns License information / 授權資訊
34
+ */
35
+ export function validateLicense(key) {
36
+ // No key = free tier / 無金鑰 = 免費等級
37
+ if (!key || key.trim() === '') {
38
+ logger.info('No license key provided, using Free tier / 未提供授權金鑰,使用免費等級');
39
+ return {
40
+ key: '',
41
+ tier: 'free',
42
+ isValid: true,
43
+ features: TIER_FEATURES.free,
44
+ };
45
+ }
46
+ const normalizedKey = key.trim().toUpperCase();
47
+ const match = normalizedKey.match(LICENSE_PATTERN);
48
+ if (!match) {
49
+ logger.warn(`Invalid license key format: ${maskKey(normalizedKey)} / 無效的授權金鑰格式`);
50
+ return {
51
+ key: normalizedKey,
52
+ tier: 'free',
53
+ isValid: false,
54
+ features: TIER_FEATURES.free,
55
+ };
56
+ }
57
+ const tierCode = match[1];
58
+ const segment2 = match[2];
59
+ const segment3 = match[3];
60
+ const segment4 = match[4];
61
+ // Validate checksum: last character of segment4 should equal
62
+ // sum of all alphanumeric values mod 36 converted to base36
63
+ // 驗證校驗碼
64
+ const checksumValid = validateChecksum(tierCode, segment2, segment3, segment4);
65
+ if (!checksumValid) {
66
+ logger.warn(`License key checksum failed: ${maskKey(normalizedKey)} / 授權金鑰校驗碼失敗`);
67
+ return {
68
+ key: normalizedKey,
69
+ tier: 'free',
70
+ isValid: false,
71
+ features: TIER_FEATURES.free,
72
+ };
73
+ }
74
+ const tier = TIER_MAP[tierCode] ?? 'free';
75
+ const features = TIER_FEATURES[tier];
76
+ logger.info(`License validated: ${tier} tier / 授權已驗證: ${tier} 等級`);
77
+ return {
78
+ key: normalizedKey,
79
+ tier,
80
+ isValid: true,
81
+ features,
82
+ maxEndpoints: tier === 'enterprise' ? 1000 : tier === 'pro' ? 10 : 1,
83
+ };
84
+ }
85
+ /**
86
+ * Check if a feature is available for the given license
87
+ * 檢查功能是否適用於給定的授權
88
+ *
89
+ * @param license - License information / 授權資訊
90
+ * @param feature - Feature name to check / 要檢查的功能名稱
91
+ * @returns True if feature is available / 功能可用時回傳 true
92
+ */
93
+ export function hasFeature(license, feature) {
94
+ return license.features.includes(feature);
95
+ }
96
+ /**
97
+ * Get all features for a tier / 取得等級的所有功能
98
+ */
99
+ export function getTierFeatures(tier) {
100
+ return TIER_FEATURES[tier];
101
+ }
102
+ /**
103
+ * Generate a license key for testing / 產生測試用授權金鑰
104
+ *
105
+ * @param tier - The tier to generate for / 要產生的等級
106
+ * @returns A valid license key / 有效的授權金鑰
107
+ */
108
+ export function generateTestLicenseKey(tier) {
109
+ const tierCode = tier === 'enterprise' ? 'ENT' : tier === 'pro' ? 'PRO' : 'FREE';
110
+ // Generate random segments / 產生隨機段落
111
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
112
+ const randomChar = () => chars.charAt(Math.floor(Math.random() * chars.length));
113
+ const seg2 = randomChar() + randomChar() + randomChar() + randomChar();
114
+ const seg3 = randomChar() + randomChar() + randomChar() + randomChar();
115
+ // Calculate checksum for segment 4 / 計算段落 4 的校驗碼
116
+ const seg4base = randomChar() + randomChar() + randomChar();
117
+ const checkChar = calculateCheckChar(tierCode, seg2, seg3, seg4base);
118
+ return `CLAW-${tierCode}-${seg2}-${seg3}-${seg4base}${checkChar}`;
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // Internal / 內部函數
122
+ // ---------------------------------------------------------------------------
123
+ /** Validate checksum of license key segments / 驗證授權金鑰段落的校驗碼 */
124
+ function validateChecksum(tierCode, seg2, seg3, seg4) {
125
+ const seg4base = seg4.slice(0, 3);
126
+ const checkChar = seg4[3];
127
+ const expected = calculateCheckChar(tierCode, seg2, seg3, seg4base);
128
+ return checkChar === expected;
129
+ }
130
+ /** Calculate the check character / 計算校驗字元 */
131
+ function calculateCheckChar(tierCode, seg2, seg3, seg4base) {
132
+ const allChars = tierCode + seg2 + seg3 + seg4base;
133
+ let sum = 0;
134
+ for (const ch of allChars) {
135
+ sum += parseInt(ch, 36);
136
+ }
137
+ return (sum % 36).toString(36).toUpperCase();
138
+ }
139
+ /** Mask a license key for logging (show first 8 and last 4 chars) / 遮罩授權金鑰 */
140
+ function maskKey(key) {
141
+ if (key.length <= 12)
142
+ return '****';
143
+ return key.slice(0, 8) + '****' + key.slice(-4);
144
+ }
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Baseline Memory - Environment behavior baseline management
3
+ * 基線記憶 - 環境行為基線管理
4
+ *
5
+ * Tracks normal system behavior patterns and detects deviations.
6
+ * 追蹤正常系統行為模式並偵測偏離。
7
+ *
8
+ * @module @panguard-ai/panguard-guard/memory/baseline
9
+ */
10
+ import type { SecurityEvent } from '@panguard-ai/core';
11
+ import type { EnvironmentBaseline, DeviationResult } from '../types.js';
12
+ /**
13
+ * Create an empty baseline / 建立空白基線
14
+ */
15
+ export declare function createEmptyBaseline(): EnvironmentBaseline;
16
+ /**
17
+ * Check if a security event deviates from the environment baseline
18
+ * 檢查安全事件是否偏離環境基線
19
+ *
20
+ * @param baseline - The current environment baseline / 當前環境基線
21
+ * @param event - The security event to check / 要檢查的安全事件
22
+ * @returns DeviationResult indicating whether a deviation was found / 偏離結果
23
+ */
24
+ export declare function checkDeviation(baseline: EnvironmentBaseline, event: SecurityEvent): DeviationResult;
25
+ /**
26
+ * Update the baseline with a new event (learning mode)
27
+ * 使用新事件更新基線(學習模式)
28
+ *
29
+ * @param baseline - The current baseline to update / 要更新的當前基線
30
+ * @param event - The security event to learn from / 要學習的安全事件
31
+ * @returns Updated baseline / 更新後的基線
32
+ */
33
+ export declare function updateBaseline(baseline: EnvironmentBaseline, event: SecurityEvent): EnvironmentBaseline;
34
+ //# sourceMappingURL=baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/memory/baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAIhB,MAAM,aAAa,CAAC;AAIrB;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,mBAAmB,CAYzD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,aAAa,GACnB,eAAe,CA8DjB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,aAAa,GACnB,mBAAmB,CA2DrB"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Baseline Memory - Environment behavior baseline management
3
+ * 基線記憶 - 環境行為基線管理
4
+ *
5
+ * Tracks normal system behavior patterns and detects deviations.
6
+ * 追蹤正常系統行為模式並偵測偏離。
7
+ *
8
+ * @module @panguard-ai/panguard-guard/memory/baseline
9
+ */
10
+ import { createLogger } from '@panguard-ai/core';
11
+ const logger = createLogger('panguard-guard:baseline');
12
+ /**
13
+ * Create an empty baseline / 建立空白基線
14
+ */
15
+ export function createEmptyBaseline() {
16
+ return {
17
+ normalProcesses: [],
18
+ normalConnections: [],
19
+ normalLoginPatterns: [],
20
+ normalServicePorts: [],
21
+ learningStarted: new Date().toISOString(),
22
+ learningComplete: false,
23
+ confidenceLevel: 0,
24
+ lastUpdated: new Date().toISOString(),
25
+ eventCount: 0,
26
+ };
27
+ }
28
+ /**
29
+ * Check if a security event deviates from the environment baseline
30
+ * 檢查安全事件是否偏離環境基線
31
+ *
32
+ * @param baseline - The current environment baseline / 當前環境基線
33
+ * @param event - The security event to check / 要檢查的安全事件
34
+ * @returns DeviationResult indicating whether a deviation was found / 偏離結果
35
+ */
36
+ export function checkDeviation(baseline, event) {
37
+ // Check for new process / 檢查新程序
38
+ if (event.source === 'process') {
39
+ const processName = extractProcessName(event);
40
+ if (processName) {
41
+ const known = baseline.normalProcesses.some((p) => p.name === processName);
42
+ if (!known) {
43
+ return {
44
+ isDeviation: true,
45
+ deviationType: 'new_process',
46
+ confidence: 70,
47
+ description: `New process detected: ${processName} (not in baseline) / ` +
48
+ `偵測到新程序: ${processName} (不在基線中)`,
49
+ };
50
+ }
51
+ }
52
+ }
53
+ // Check for new network destination / 檢查新網路目的地
54
+ if (event.source === 'network') {
55
+ const remoteAddr = extractRemoteAddress(event);
56
+ if (remoteAddr) {
57
+ const known = baseline.normalConnections.some((c) => c.remoteAddress === remoteAddr);
58
+ if (!known) {
59
+ return {
60
+ isDeviation: true,
61
+ deviationType: 'new_network_dest',
62
+ confidence: 65,
63
+ description: `New network destination: ${remoteAddr} (not in baseline) / ` +
64
+ `偵測到新網路目的地: ${remoteAddr} (不在基線中)`,
65
+ };
66
+ }
67
+ }
68
+ }
69
+ // Check for new user login pattern / 檢查新使用者登入模式
70
+ const username = extractUsername(event);
71
+ if (username) {
72
+ const known = baseline.normalLoginPatterns.some((l) => l.username === username);
73
+ if (!known) {
74
+ return {
75
+ isDeviation: true,
76
+ deviationType: 'new_user',
77
+ confidence: 60,
78
+ description: `New user activity: ${username} (not in baseline) / ` +
79
+ `偵測到新使用者活動: ${username} (不在基線中)`,
80
+ };
81
+ }
82
+ }
83
+ // No deviation / 無偏離
84
+ return {
85
+ isDeviation: false,
86
+ deviationType: 'none',
87
+ confidence: 0,
88
+ description: 'Event within normal baseline parameters / 事件在正常基線參數範圍內',
89
+ };
90
+ }
91
+ /**
92
+ * Update the baseline with a new event (learning mode)
93
+ * 使用新事件更新基線(學習模式)
94
+ *
95
+ * @param baseline - The current baseline to update / 要更新的當前基線
96
+ * @param event - The security event to learn from / 要學習的安全事件
97
+ * @returns Updated baseline / 更新後的基線
98
+ */
99
+ export function updateBaseline(baseline, event) {
100
+ const now = new Date().toISOString();
101
+ const updated = {
102
+ ...baseline,
103
+ lastUpdated: now,
104
+ eventCount: baseline.eventCount + 1,
105
+ };
106
+ // Update process patterns / 更新程序模式
107
+ if (event.source === 'process') {
108
+ const processName = extractProcessName(event);
109
+ if (processName) {
110
+ updated.normalProcesses = updateProcessPatterns([...baseline.normalProcesses], processName, event.metadata?.['processPath'] ?? undefined, now);
111
+ }
112
+ }
113
+ // Update connection patterns / 更新連線模式
114
+ if (event.source === 'network') {
115
+ const remoteAddr = extractRemoteAddress(event);
116
+ if (remoteAddr) {
117
+ updated.normalConnections = updateConnectionPatterns([...baseline.normalConnections], remoteAddr, event.metadata?.['remotePort'] ?? 0, event.metadata?.['protocol'] ?? 'tcp', now);
118
+ }
119
+ }
120
+ // Update login patterns / 更新登入模式
121
+ const username = extractUsername(event);
122
+ if (username) {
123
+ const eventDate = event.timestamp instanceof Date ? event.timestamp : new Date(event.timestamp);
124
+ updated.normalLoginPatterns = updateLoginPatterns([...baseline.normalLoginPatterns], username, event.metadata?.['sourceIP'] ?? undefined, eventDate.getHours(), eventDate.getDay(), now);
125
+ }
126
+ // Recalculate confidence / 重新計算信心度
127
+ updated.confidenceLevel = calculateConfidence(updated);
128
+ logger.info(`Baseline updated: ${event.source}/${event.category} ` +
129
+ `(events: ${updated.eventCount}, confidence: ${(updated.confidenceLevel * 100).toFixed(1)}%) / ` +
130
+ `基線已更新`);
131
+ return updated;
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Internal helpers / 內部輔助函數
135
+ // ---------------------------------------------------------------------------
136
+ /** Extract process name from event metadata / 從事件 metadata 提取程序名稱 */
137
+ function extractProcessName(event) {
138
+ return event.metadata?.['processName'] ?? undefined;
139
+ }
140
+ /** Extract remote address from event metadata / 從事件 metadata 提取遠端地址 */
141
+ function extractRemoteAddress(event) {
142
+ return (event.metadata?.['remoteAddress'] ??
143
+ event.metadata?.['destinationIP'] ??
144
+ event.metadata?.['sourceIP'] ??
145
+ undefined);
146
+ }
147
+ /** Extract username from event metadata / 從事件 metadata 提取使用者名稱 */
148
+ function extractUsername(event) {
149
+ return (event.metadata?.['user'] ?? event.metadata?.['username'] ?? undefined);
150
+ }
151
+ /** Update process patterns list / 更新程序模式列表 */
152
+ function updateProcessPatterns(patterns, name, path, now) {
153
+ const existing = patterns.find((p) => p.name === name);
154
+ if (existing) {
155
+ existing.frequency += 1;
156
+ existing.lastSeen = now;
157
+ }
158
+ else {
159
+ patterns.push({
160
+ name,
161
+ path,
162
+ frequency: 1,
163
+ firstSeen: now,
164
+ lastSeen: now,
165
+ });
166
+ }
167
+ return patterns;
168
+ }
169
+ /** Update connection patterns list / 更新連線模式列表 */
170
+ function updateConnectionPatterns(patterns, remoteAddress, remotePort, protocol, now) {
171
+ const existing = patterns.find((c) => c.remoteAddress === remoteAddress && c.remotePort === remotePort);
172
+ if (existing) {
173
+ existing.frequency += 1;
174
+ existing.lastSeen = now;
175
+ }
176
+ else {
177
+ patterns.push({
178
+ remoteAddress,
179
+ remotePort,
180
+ protocol,
181
+ frequency: 1,
182
+ firstSeen: now,
183
+ lastSeen: now,
184
+ });
185
+ }
186
+ return patterns;
187
+ }
188
+ /** Update login patterns list / 更新登入模式列表 */
189
+ function updateLoginPatterns(patterns, username, sourceIP, hourOfDay, dayOfWeek, now) {
190
+ const existing = patterns.find((l) => l.username === username);
191
+ if (existing) {
192
+ existing.frequency += 1;
193
+ existing.lastSeen = now;
194
+ }
195
+ else {
196
+ patterns.push({
197
+ username,
198
+ sourceIP,
199
+ hourOfDay,
200
+ dayOfWeek,
201
+ frequency: 1,
202
+ firstSeen: now,
203
+ lastSeen: now,
204
+ });
205
+ }
206
+ return patterns;
207
+ }
208
+ /**
209
+ * Calculate baseline confidence based on data volume
210
+ * 根據數據量計算基線信心度
211
+ *
212
+ * Confidence grows logarithmically with event count, capping at 0.95
213
+ * 信心度隨事件數量對數增長,上限為 0.95
214
+ */
215
+ function calculateConfidence(baseline) {
216
+ const minEvents = 100;
217
+ const targetEvents = 10000;
218
+ if (baseline.eventCount < minEvents) {
219
+ return (baseline.eventCount / minEvents) * 0.3;
220
+ }
221
+ const logProgress = Math.log(baseline.eventCount / minEvents) / Math.log(targetEvents / minEvents);
222
+ return Math.min(0.95, 0.3 + logProgress * 0.65);
223
+ }
224
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/memory/baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Context Memory Module
3
+ * Context Memory 模組
4
+ *
5
+ * Environment behavior baseline management with learning period support.
6
+ * Tracks normal system behavior during learning mode and detects
7
+ * deviations once in protection mode.
8
+ * 環境行為基線管理,支援學習期。在學習模式中追蹤正常系統行為,
9
+ * 進入防護模式後偵測偏離。
10
+ *
11
+ * @module @panguard-ai/panguard-guard/memory
12
+ */
13
+ import type { EnvironmentBaseline } from '../types.js';
14
+ export { createEmptyBaseline, checkDeviation, updateBaseline } from './baseline.js';
15
+ export { isLearningComplete, getLearningProgress, getRemainingDays, switchToProtectionMode, getBaselineSummary, } from './learning.js';
16
+ /**
17
+ * Load baseline from a JSON file, or create empty if not found
18
+ * 從 JSON 檔案載入基線,找不到則建立空白基線
19
+ *
20
+ * @param filePath - Path to the baseline JSON file / 基線 JSON 檔案路徑
21
+ * @returns The loaded or newly created baseline / 載入或新建的基線
22
+ */
23
+ export declare function loadBaseline(filePath: string): EnvironmentBaseline;
24
+ /**
25
+ * Save baseline to a JSON file
26
+ * 將基線儲存至 JSON 檔案
27
+ *
28
+ * @param filePath - Path to save the baseline / 儲存基線的路徑
29
+ * @param baseline - The baseline to save / 要儲存的基線
30
+ */
31
+ export declare function saveBaseline(filePath: string, baseline: EnvironmentBaseline): void;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAalE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CASlF"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Context Memory Module
3
+ * Context Memory 模組
4
+ *
5
+ * Environment behavior baseline management with learning period support.
6
+ * Tracks normal system behavior during learning mode and detects
7
+ * deviations once in protection mode.
8
+ * 環境行為基線管理,支援學習期。在學習模式中追蹤正常系統行為,
9
+ * 進入防護模式後偵測偏離。
10
+ *
11
+ * @module @panguard-ai/panguard-guard/memory
12
+ */
13
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
14
+ import { dirname } from 'node:path';
15
+ import { createLogger } from '@panguard-ai/core';
16
+ import { createEmptyBaseline } from './baseline.js';
17
+ const logger = createLogger('panguard-guard:memory');
18
+ export { createEmptyBaseline, checkDeviation, updateBaseline } from './baseline.js';
19
+ export { isLearningComplete, getLearningProgress, getRemainingDays, switchToProtectionMode, getBaselineSummary, } from './learning.js';
20
+ /**
21
+ * Load baseline from a JSON file, or create empty if not found
22
+ * 從 JSON 檔案載入基線,找不到則建立空白基線
23
+ *
24
+ * @param filePath - Path to the baseline JSON file / 基線 JSON 檔案路徑
25
+ * @returns The loaded or newly created baseline / 載入或新建的基線
26
+ */
27
+ export function loadBaseline(filePath) {
28
+ try {
29
+ const raw = readFileSync(filePath, 'utf-8');
30
+ const parsed = JSON.parse(raw);
31
+ logger.info(`Baseline loaded from ${filePath} / 已從 ${filePath} 載入基線`);
32
+ return parsed;
33
+ }
34
+ catch {
35
+ logger.info(`No existing baseline at ${filePath}, creating empty / ` +
36
+ `${filePath} 無現有基線,建立空白基線`);
37
+ return createEmptyBaseline();
38
+ }
39
+ }
40
+ /**
41
+ * Save baseline to a JSON file
42
+ * 將基線儲存至 JSON 檔案
43
+ *
44
+ * @param filePath - Path to save the baseline / 儲存基線的路徑
45
+ * @param baseline - The baseline to save / 要儲存的基線
46
+ */
47
+ export function saveBaseline(filePath, baseline) {
48
+ try {
49
+ mkdirSync(dirname(filePath), { recursive: true });
50
+ writeFileSync(filePath, JSON.stringify(baseline, null, 2), 'utf-8');
51
+ logger.info(`Baseline saved to ${filePath} / 基線已儲存至 ${filePath}`);
52
+ }
53
+ catch (err) {
54
+ const msg = err instanceof Error ? err.message : String(err);
55
+ logger.error(`Failed to save baseline: ${msg} / 儲存基線失敗: ${msg}`);
56
+ }
57
+ }
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpF,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,SAAS,QAAQ,OAAO,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CACT,2BAA2B,QAAQ,qBAAqB;YACtD,GAAG,QAAQ,eAAe,CAC7B,CAAC;QACF,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,QAA6B;IAC1E,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,qBAAqB,QAAQ,aAAa,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,cAAc,GAAG,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Learning period management for Context Memory
3
+ * Context Memory 的學習期管理
4
+ * @module @panguard-ai/panguard-guard/memory/learning
5
+ */
6
+ import type { EnvironmentBaseline } from '../types.js';
7
+ /**
8
+ * Check if the learning period has completed / 檢查學習期是否已完成
9
+ */
10
+ export declare function isLearningComplete(baseline: EnvironmentBaseline, learningDays: number): boolean;
11
+ /**
12
+ * Get learning progress as a percentage (0-100) / 取得學習進度百分比
13
+ */
14
+ export declare function getLearningProgress(baseline: EnvironmentBaseline, learningDays: number): number;
15
+ /**
16
+ * Get remaining learning days / 取得剩餘學習天數
17
+ */
18
+ export declare function getRemainingDays(baseline: EnvironmentBaseline, learningDays: number): number;
19
+ /**
20
+ * Switch baseline to protection mode / 將基線切換到防護模式
21
+ */
22
+ export declare function switchToProtectionMode(baseline: EnvironmentBaseline): EnvironmentBaseline;
23
+ /**
24
+ * Get baseline summary for display / 取得基線摘要
25
+ */
26
+ export declare function getBaselineSummary(baseline: EnvironmentBaseline): {
27
+ processCount: number;
28
+ connectionCount: number;
29
+ loginPatternCount: number;
30
+ portCount: number;
31
+ eventCount: number;
32
+ confidenceLevel: number;
33
+ learningComplete: boolean;
34
+ };
35
+ //# sourceMappingURL=learning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../src/memory/learning.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIvD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAK/F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAK/F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAK5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB,CAMzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAUA"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Learning period management for Context Memory
3
+ * Context Memory 的學習期管理
4
+ * @module @panguard-ai/panguard-guard/memory/learning
5
+ */
6
+ import { createLogger } from '@panguard-ai/core';
7
+ const logger = createLogger('panguard-guard:learning');
8
+ /**
9
+ * Check if the learning period has completed / 檢查學習期是否已完成
10
+ */
11
+ export function isLearningComplete(baseline, learningDays) {
12
+ if (baseline.learningComplete)
13
+ return true;
14
+ const startTime = new Date(baseline.learningStarted).getTime();
15
+ const elapsedDays = (Date.now() - startTime) / (1000 * 60 * 60 * 24);
16
+ return elapsedDays >= learningDays;
17
+ }
18
+ /**
19
+ * Get learning progress as a percentage (0-100) / 取得學習進度百分比
20
+ */
21
+ export function getLearningProgress(baseline, learningDays) {
22
+ if (baseline.learningComplete)
23
+ return 100;
24
+ const startTime = new Date(baseline.learningStarted).getTime();
25
+ const elapsedDays = (Date.now() - startTime) / (1000 * 60 * 60 * 24);
26
+ return Math.round(Math.min((elapsedDays / learningDays) * 100, 100));
27
+ }
28
+ /**
29
+ * Get remaining learning days / 取得剩餘學習天數
30
+ */
31
+ export function getRemainingDays(baseline, learningDays) {
32
+ if (baseline.learningComplete)
33
+ return 0;
34
+ const startTime = new Date(baseline.learningStarted).getTime();
35
+ const elapsedDays = (Date.now() - startTime) / (1000 * 60 * 60 * 24);
36
+ return Math.ceil(Math.max(learningDays - elapsedDays, 0));
37
+ }
38
+ /**
39
+ * Switch baseline to protection mode / 將基線切換到防護模式
40
+ */
41
+ export function switchToProtectionMode(baseline) {
42
+ logger.info(`Switching to protection mode. Processes: ${baseline.normalProcesses.length}, ` +
43
+ `Connections: ${baseline.normalConnections.length}, Login patterns: ${baseline.normalLoginPatterns.length} / 切換至防護模式`);
44
+ return { ...baseline, learningComplete: true, lastUpdated: new Date().toISOString() };
45
+ }
46
+ /**
47
+ * Get baseline summary for display / 取得基線摘要
48
+ */
49
+ export function getBaselineSummary(baseline) {
50
+ return {
51
+ processCount: baseline.normalProcesses.length,
52
+ connectionCount: baseline.normalConnections.length,
53
+ loginPatternCount: baseline.normalLoginPatterns.length,
54
+ portCount: baseline.normalServicePorts.length,
55
+ eventCount: baseline.eventCount,
56
+ confidenceLevel: baseline.confidenceLevel,
57
+ learningComplete: baseline.learningComplete,
58
+ };
59
+ }
60
+ //# sourceMappingURL=learning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning.js","sourceRoot":"","sources":["../../src/memory/learning.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA6B,EAAE,YAAoB;IACpF,IAAI,QAAQ,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,OAAO,WAAW,IAAI,YAAY,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAA6B,EAAE,YAAoB;IACrF,IAAI,QAAQ,CAAC,gBAAgB;QAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA6B,EAAE,YAAoB;IAClF,IAAI,QAAQ,CAAC,gBAAgB;QAAE,OAAO,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA6B;IAClE,MAAM,CAAC,IAAI,CACT,4CAA4C,QAAQ,CAAC,eAAe,CAAC,MAAM,IAAI;QAC7E,gBAAgB,QAAQ,CAAC,iBAAiB,CAAC,MAAM,qBAAqB,QAAQ,CAAC,mBAAmB,CAAC,MAAM,YAAY,CACxH,CAAC;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA6B;IAS9D,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,MAAM;QAC7C,eAAe,EAAE,QAAQ,CAAC,iBAAiB,CAAC,MAAM;QAClD,iBAAiB,EAAE,QAAQ,CAAC,mBAAmB,CAAC,MAAM;QACtD,SAAS,EAAE,QAAQ,CAAC,kBAAkB,CAAC,MAAM;QAC7C,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;KAC5C,CAAC;AACJ,CAAC"}