@panguard-ai/threat-cloud 1.4.1 → 1.5.5
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/LICENSE +21 -0
- package/dist/admin-dashboard.js +5 -5
- package/dist/audit-logger.d.ts +1 -1
- package/dist/audit-logger.d.ts.map +1 -1
- package/dist/audit-logger.js.map +1 -1
- package/dist/badge-api.d.ts +58 -0
- package/dist/badge-api.d.ts.map +1 -0
- package/dist/badge-api.js +248 -0
- package/dist/badge-api.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/database.d.ts +254 -2
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +769 -72
- package/dist/database.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/llm-reviewer-tools.d.ts +110 -0
- package/dist/llm-reviewer-tools.d.ts.map +1 -0
- package/dist/llm-reviewer-tools.js +446 -0
- package/dist/llm-reviewer-tools.js.map +1 -0
- package/dist/llm-reviewer.d.ts +54 -0
- package/dist/llm-reviewer.d.ts.map +1 -1
- package/dist/llm-reviewer.js +708 -64
- package/dist/llm-reviewer.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +215 -0
- package/dist/migrations.js.map +1 -1
- package/dist/migrator-crystallization.d.ts +80 -0
- package/dist/migrator-crystallization.d.ts.map +1 -0
- package/dist/migrator-crystallization.js +108 -0
- package/dist/migrator-crystallization.js.map +1 -0
- package/dist/server.d.ts +75 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1249 -130
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +15 -12
package/dist/database.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module @panguard-ai/threat-cloud/database
|
|
8
8
|
*/
|
|
9
|
+
import Database from 'better-sqlite3';
|
|
9
10
|
import type { AnonymizedThreatData, ThreatCloudRule, ThreatStats, ATRProposal, SkillThreatSubmission, SkillBlacklistEntry, ScanEvent, AggregatedMetrics } from './types.js';
|
|
10
11
|
import { AuditLogger } from './audit-logger.js';
|
|
11
12
|
/**
|
|
@@ -16,6 +17,12 @@ export declare class ThreatCloudDB {
|
|
|
16
17
|
private readonly db;
|
|
17
18
|
readonly audit: AuditLogger;
|
|
18
19
|
constructor(dbPath: string);
|
|
20
|
+
/**
|
|
21
|
+
* Escape hatch for callers that need direct DB access (e.g. modules
|
|
22
|
+
* defined outside this class that perform table-specific queries).
|
|
23
|
+
* Prefer adding a typed method here when the access pattern stabilises.
|
|
24
|
+
*/
|
|
25
|
+
getRawDb(): Database.Database;
|
|
19
26
|
/** Create tables if they don't exist / 建立資料表 */
|
|
20
27
|
private initialize;
|
|
21
28
|
/** Insert anonymized threat data / 插入匿名化威脅數據 */
|
|
@@ -28,6 +35,10 @@ export declare class ThreatCloudDB {
|
|
|
28
35
|
private extractMetadata;
|
|
29
36
|
/** Insert or update a community rule / 插入或更新社群規則 */
|
|
30
37
|
upsertRule(rule: ThreatCloudRule): void;
|
|
38
|
+
/** Delete all rules with a given source. Returns number of deleted rows. */
|
|
39
|
+
deleteRulesBySource(source: string): number;
|
|
40
|
+
/** Delete rules by a list of rule IDs. Returns number of deleted rows. */
|
|
41
|
+
deleteRulesByIds(ruleIds: readonly string[]): number;
|
|
31
42
|
/** Fetch rules published after a given timestamp / 取得指定時間後發佈的規則 */
|
|
32
43
|
getRulesSince(since: string, filters?: {
|
|
33
44
|
category?: string;
|
|
@@ -63,7 +74,14 @@ export declare class ThreatCloudDB {
|
|
|
63
74
|
avgRiskScore: number;
|
|
64
75
|
maxRiskLevel: string;
|
|
65
76
|
findings: string[];
|
|
77
|
+
/** ATR rule IDs that triggered across all reports */
|
|
78
|
+
atrRuleIds: string[];
|
|
66
79
|
};
|
|
80
|
+
/** Fetch rule content by IDs. Returns the YAML detection patterns for crystallization. */
|
|
81
|
+
getRuleContentByIds(ruleIds: string[]): Array<{
|
|
82
|
+
ruleId: string;
|
|
83
|
+
ruleContent: string;
|
|
84
|
+
}>;
|
|
67
85
|
/** Check if an ATR proposal already exists for a pattern hash */
|
|
68
86
|
hasATRProposal(patternHash: string): boolean;
|
|
69
87
|
/** Get an ATR proposal by pattern_hash, returning client_id and confirmations */
|
|
@@ -71,12 +89,52 @@ export declare class ThreatCloudDB {
|
|
|
71
89
|
client_id: string | null;
|
|
72
90
|
confirmations: number;
|
|
73
91
|
} | undefined;
|
|
92
|
+
/**
|
|
93
|
+
* Look up a previously-judged payload fingerprint. Caller should call this
|
|
94
|
+
* BEFORE invoking the LLM drafter; on hit, skip the Anthropic call entirely
|
|
95
|
+
* and reuse the cached verdict.
|
|
96
|
+
*
|
|
97
|
+
* 查詢先前已判斷過的 payload fingerprint。呼叫端應在叫用 LLM drafter 之前查
|
|
98
|
+
* 這個表;命中時直接跳過 Anthropic 呼叫,回覆之前的結果。
|
|
99
|
+
*/
|
|
100
|
+
getPayloadFingerprint(fingerprint: string): {
|
|
101
|
+
result: 'duplicate' | 'novel' | 'rejected';
|
|
102
|
+
ruleId: string | null;
|
|
103
|
+
patternHash: string | null;
|
|
104
|
+
hitCount: number;
|
|
105
|
+
} | null;
|
|
106
|
+
/**
|
|
107
|
+
* Insert or bump a payload fingerprint verdict. UPSERT by fingerprint:
|
|
108
|
+
* - First time: insert with hit_count=1
|
|
109
|
+
* - Repeat: increment hit_count, refresh last_seen_at
|
|
110
|
+
*
|
|
111
|
+
* 新增或累計 payload fingerprint 判斷結果。
|
|
112
|
+
*/
|
|
113
|
+
recordPayloadFingerprint(fingerprint: string, result: 'duplicate' | 'novel' | 'rejected', details?: {
|
|
114
|
+
ruleId?: string;
|
|
115
|
+
patternHash?: string;
|
|
116
|
+
}): void;
|
|
117
|
+
/**
|
|
118
|
+
* Stats for the fingerprint cache. Surfaced in admin dashboard so you can
|
|
119
|
+
* see the hit rate and confirm the cost-saving is real.
|
|
120
|
+
* 指紋快取統計。供 admin dashboard 顯示命中率,確認省錢有效。
|
|
121
|
+
*/
|
|
122
|
+
getPayloadFingerprintStats(): {
|
|
123
|
+
total: number;
|
|
124
|
+
novel: number;
|
|
125
|
+
duplicate: number;
|
|
126
|
+
rejected: number;
|
|
127
|
+
totalHits: number;
|
|
128
|
+
cacheHits: number;
|
|
129
|
+
};
|
|
74
130
|
/** Get recent skill threats / 取得最近技能威脅 */
|
|
75
131
|
getSkillThreats(limit?: number): unknown[];
|
|
76
132
|
/** Get proposal statistics / 取得提案統計 */
|
|
77
133
|
getProposalStats(): {
|
|
78
134
|
pending: number;
|
|
79
135
|
confirmed: number;
|
|
136
|
+
canary: number;
|
|
137
|
+
quarantined: number;
|
|
80
138
|
rejected: number;
|
|
81
139
|
total: number;
|
|
82
140
|
};
|
|
@@ -93,7 +151,27 @@ export declare class ThreatCloudDB {
|
|
|
93
151
|
count: number;
|
|
94
152
|
}>;
|
|
95
153
|
};
|
|
154
|
+
/** Record a telemetry event / 記錄遙測事件 */
|
|
155
|
+
recordTelemetryEvent(event: {
|
|
156
|
+
eventType: string;
|
|
157
|
+
platform: string;
|
|
158
|
+
skillCount: number;
|
|
159
|
+
findingCount: number;
|
|
160
|
+
severity: string;
|
|
161
|
+
}): void;
|
|
162
|
+
/** Get telemetry stats merging raw events + hourly aggregates / 取得遙測統計 */
|
|
163
|
+
getTelemetryStats(): {
|
|
164
|
+
totalEvents: number;
|
|
165
|
+
eventsToday: number;
|
|
166
|
+
byEventType: Record<string, number>;
|
|
167
|
+
byPlatform: Record<string, number>;
|
|
168
|
+
avgFindingCount: number;
|
|
169
|
+
};
|
|
170
|
+
/** Aggregate raw telemetry events into hourly buckets, then delete old raw events / 彙總遙測事件 */
|
|
171
|
+
cleanupTelemetryEvents(): number;
|
|
96
172
|
clearAllRules(): number;
|
|
173
|
+
/** Get current schema version for health diagnostics */
|
|
174
|
+
getSchemaVersion(): number;
|
|
97
175
|
getStats(): ThreatStats;
|
|
98
176
|
/** Get confirmed/promoted ATR rules, optionally filtered by date / 取得已確認 ATR 規則 */
|
|
99
177
|
getConfirmedATRRules(since?: string): Array<{
|
|
@@ -110,6 +188,37 @@ export declare class ThreatCloudDB {
|
|
|
110
188
|
upsertIoC(type: string, value: string, reputation: number, source: string): void;
|
|
111
189
|
/** Promote proposals to rules based on community consensus and/or LLM approval / 推廣提案為規則 */
|
|
112
190
|
promoteConfirmedProposals(): number;
|
|
191
|
+
/**
|
|
192
|
+
* Self-heal: find proposals that are status='promoted' but have no
|
|
193
|
+
* corresponding rule in the rules table, and re-upsert them. This
|
|
194
|
+
* handles historical bugs where promoteCanaryRules set the status but
|
|
195
|
+
* the upsertRule call failed silently (e.g., during a prior schema or
|
|
196
|
+
* constraint mismatch). Idempotent — safe to run every promotion cycle.
|
|
197
|
+
* Returns the number of rules restored.
|
|
198
|
+
*/
|
|
199
|
+
healOrphanedPromotedProposals(): number;
|
|
200
|
+
/** Canary period in milliseconds (24 hours) / Canary 觀察期(24 小時) */
|
|
201
|
+
private static readonly CANARY_PERIOD_MS;
|
|
202
|
+
/**
|
|
203
|
+
* Promote canary rules that have survived the 24-hour observation period
|
|
204
|
+
* without negative feedback. Quarantine rules with negative feedback.
|
|
205
|
+
* 推廣存活 24 小時且無負面回饋的 canary 規則。隔離有負面回饋的規則。
|
|
206
|
+
*/
|
|
207
|
+
promoteCanaryRules(): {
|
|
208
|
+
promoted: number;
|
|
209
|
+
quarantined: number;
|
|
210
|
+
};
|
|
211
|
+
/** Get count of negative feedback for a rule / 取得規則負面回饋數 */
|
|
212
|
+
getNegativeFeedbackCount(ruleId: string): number;
|
|
213
|
+
/** Quarantine a proposal / 隔離提案 */
|
|
214
|
+
quarantineProposal(patternHash: string): void;
|
|
215
|
+
/** Get canary rules (for 10% client sampling) / 取得 canary 規則(供 10% 客戶端抽樣) */
|
|
216
|
+
getCanaryATRRules(): Array<{
|
|
217
|
+
ruleId: string;
|
|
218
|
+
ruleContent: string;
|
|
219
|
+
publishedAt: string;
|
|
220
|
+
source: string;
|
|
221
|
+
}>;
|
|
113
222
|
/** Reject an ATR proposal / 拒絕 ATR 提案 */
|
|
114
223
|
rejectATRProposal(patternHash: string): void;
|
|
115
224
|
/** Admin: manually approve an ATR proposal and promote to rule */
|
|
@@ -127,7 +236,7 @@ export declare class ThreatCloudDB {
|
|
|
127
236
|
/** Report a safe skill (increment confirmations, auto-confirm at 3+) / 回報安全 skill */
|
|
128
237
|
reportSafeSkill(skillName: string, fingerprintHash?: string): void;
|
|
129
238
|
/** Get confirmed community whitelist / 取得社群白名單 */
|
|
130
|
-
getSkillWhitelist(): Array<{
|
|
239
|
+
getSkillWhitelist(since?: string): Array<{
|
|
131
240
|
name: string;
|
|
132
241
|
hash: string | null;
|
|
133
242
|
confirmations: number;
|
|
@@ -136,7 +245,7 @@ export declare class ThreatCloudDB {
|
|
|
136
245
|
* Get skill blacklist: skills reported by 3+ distinct clients with avg risk >= 70
|
|
137
246
|
* 取得技能黑名單:3+ 不同客戶端回報且平均風險 >= 70 的技能
|
|
138
247
|
*/
|
|
139
|
-
getSkillBlacklist(minReports?: number, minAvgRisk?: number): SkillBlacklistEntry[];
|
|
248
|
+
getSkillBlacklist(minReports?: number, minAvgRisk?: number, since?: string): SkillBlacklistEntry[];
|
|
140
249
|
/** Backfill classification for rules with NULL category / 回填缺少分類的規則 */
|
|
141
250
|
backfillClassification(): number;
|
|
142
251
|
/**
|
|
@@ -150,6 +259,32 @@ export declare class ThreatCloudDB {
|
|
|
150
259
|
}>;
|
|
151
260
|
/** Insert scan event from any source / 插入掃描事件 */
|
|
152
261
|
insertScanEvent(event: ScanEvent): void;
|
|
262
|
+
/** Record a one-time activation event / 記錄一次性啟動事件 */
|
|
263
|
+
recordActivation(activation: {
|
|
264
|
+
clientId: string;
|
|
265
|
+
platform: string;
|
|
266
|
+
osType: string;
|
|
267
|
+
panguardVersion: string;
|
|
268
|
+
nodeVersion: string;
|
|
269
|
+
}): boolean;
|
|
270
|
+
/** Get activation stats / 取得啟動統計 */
|
|
271
|
+
getActivationStats(): {
|
|
272
|
+
total: number;
|
|
273
|
+
byPlatform: Array<{
|
|
274
|
+
platform: string;
|
|
275
|
+
count: number;
|
|
276
|
+
}>;
|
|
277
|
+
byOs: Array<{
|
|
278
|
+
osType: string;
|
|
279
|
+
count: number;
|
|
280
|
+
}>;
|
|
281
|
+
recent: Array<{
|
|
282
|
+
activatedAt: string;
|
|
283
|
+
platform: string;
|
|
284
|
+
osType: string;
|
|
285
|
+
panguardVersion: string;
|
|
286
|
+
}>;
|
|
287
|
+
};
|
|
153
288
|
/** Get contributor leaderboard (hashed IDs, no PII) / 取得貢獻者排行榜 */
|
|
154
289
|
getContributorLeaderboard(limit?: number): Array<{
|
|
155
290
|
contributorHash: string;
|
|
@@ -159,6 +294,123 @@ export declare class ThreatCloudDB {
|
|
|
159
294
|
}>;
|
|
160
295
|
/** Get aggregated metrics across all sources / 取得所有來源的聚合指標 */
|
|
161
296
|
getAggregatedMetrics(): AggregatedMetrics;
|
|
297
|
+
/** Look up a cached verdict by content hash. Returns null if miss or expired. */
|
|
298
|
+
getVerdictCache(contentHash: string): {
|
|
299
|
+
readonly contentHash: string;
|
|
300
|
+
readonly skillName: string;
|
|
301
|
+
readonly verdict: string;
|
|
302
|
+
readonly scannedAt: string;
|
|
303
|
+
readonly scanCount: number;
|
|
304
|
+
} | null;
|
|
305
|
+
/** Insert or replace a verdict cache entry with 30-day TTL. */
|
|
306
|
+
insertVerdictCache(entry: {
|
|
307
|
+
readonly contentHash: string;
|
|
308
|
+
readonly skillName: string;
|
|
309
|
+
readonly verdict: string;
|
|
310
|
+
}): void;
|
|
311
|
+
/** Delete a specific cache entry. Returns true if a row was deleted. */
|
|
312
|
+
invalidateVerdictCache(contentHash: string): boolean;
|
|
313
|
+
/** Purge all expired cache entries. Returns count deleted. */
|
|
314
|
+
purgeExpiredVerdictCache(): number;
|
|
315
|
+
/** Get the latest (non-superseded) hash entry for a skill. */
|
|
316
|
+
getLatestSkillHash(skillName: string): {
|
|
317
|
+
readonly contentHash: string;
|
|
318
|
+
readonly scanVerdict: string | null;
|
|
319
|
+
} | null;
|
|
320
|
+
/** Record a skill hash observation. Creates or updates last_seen. */
|
|
321
|
+
recordSkillHash(entry: {
|
|
322
|
+
readonly skillName: string;
|
|
323
|
+
readonly contentHash: string;
|
|
324
|
+
readonly scanVerdict?: string;
|
|
325
|
+
readonly rugPullFlag?: boolean;
|
|
326
|
+
}): void;
|
|
327
|
+
/** Mark a previous hash as superseded by a new hash. */
|
|
328
|
+
markSkillHashSuperseded(skillName: string, oldHash: string, newHash: string): void;
|
|
329
|
+
/** Get full hash history for a skill (audit trail). */
|
|
330
|
+
getSkillHashHistory(skillName: string): ReadonlyArray<{
|
|
331
|
+
readonly contentHash: string;
|
|
332
|
+
readonly firstSeen: string;
|
|
333
|
+
readonly lastSeen: string;
|
|
334
|
+
readonly scanVerdict: string | null;
|
|
335
|
+
readonly supersededBy: string | null;
|
|
336
|
+
readonly rugPullFlag: boolean;
|
|
337
|
+
}>;
|
|
338
|
+
/** Create an organization / 建立組織 */
|
|
339
|
+
createOrg(id: string, name: string): void;
|
|
340
|
+
/** Get org by ID / 取得組織 */
|
|
341
|
+
getOrg(id: string): {
|
|
342
|
+
id: string;
|
|
343
|
+
name: string;
|
|
344
|
+
created_at: string;
|
|
345
|
+
} | undefined;
|
|
346
|
+
/** Upsert device heartbeat / 更新裝置心跳
|
|
347
|
+
* Threat Model: Fleet view (#6 Scope Escalation — org-level visibility) */
|
|
348
|
+
upsertDevice(data: {
|
|
349
|
+
deviceId: string;
|
|
350
|
+
orgId: string;
|
|
351
|
+
hostname?: string;
|
|
352
|
+
osType?: string;
|
|
353
|
+
agentCount?: number;
|
|
354
|
+
guardVersion?: string;
|
|
355
|
+
}): void;
|
|
356
|
+
/** List devices for an org / 列出組織下的裝置
|
|
357
|
+
* Threat Model: Fleet view (#6) */
|
|
358
|
+
getDevicesByOrg(orgId: string, limit?: number, offset?: number): ReadonlyArray<{
|
|
359
|
+
id: string;
|
|
360
|
+
hostname: string | null;
|
|
361
|
+
os_type: string | null;
|
|
362
|
+
agent_count: number;
|
|
363
|
+
guard_version: string | null;
|
|
364
|
+
last_seen: string;
|
|
365
|
+
created_at: string;
|
|
366
|
+
}>;
|
|
367
|
+
/** Get device count for an org / 取得組織裝置數 */
|
|
368
|
+
getDeviceCount(orgId: string): number;
|
|
369
|
+
/** Set org policy / 設定組織策略
|
|
370
|
+
* Threat Model: Policy engine (#1 Supply Chain, #6 Scope Escalation) */
|
|
371
|
+
setOrgPolicy(orgId: string, category: string, action: 'allow' | 'block'): void;
|
|
372
|
+
/** Get org policies / 取得組織策略 */
|
|
373
|
+
getOrgPolicies(orgId: string): ReadonlyArray<{
|
|
374
|
+
category: string;
|
|
375
|
+
action: string;
|
|
376
|
+
created_at: string;
|
|
377
|
+
}>;
|
|
378
|
+
/** Delete org policy / 刪除組織策略 */
|
|
379
|
+
deleteOrgPolicy(orgId: string, category: string): boolean;
|
|
380
|
+
/** Register a new client key. Returns the raw key (only time it's visible). */
|
|
381
|
+
registerClientKey(clientId: string, ipAddress: string | null): {
|
|
382
|
+
clientKey: string;
|
|
383
|
+
};
|
|
384
|
+
/** Validate a raw client key. Updates last_used_at on success. */
|
|
385
|
+
validateClientKey(rawKey: string): boolean;
|
|
386
|
+
/**
|
|
387
|
+
* Look up role + clientId for a raw client key. Returns null if invalid/revoked.
|
|
388
|
+
* Does NOT update last_used_at (caller should use validateClientKey for that).
|
|
389
|
+
* Used by L5 partner-sync endpoints to enforce role-based access.
|
|
390
|
+
*/
|
|
391
|
+
getClientKeyInfo(rawKey: string): {
|
|
392
|
+
clientId: string;
|
|
393
|
+
role: string;
|
|
394
|
+
} | null;
|
|
395
|
+
/**
|
|
396
|
+
* Issue a partner key. Partner keys are manually issued by admin and can
|
|
397
|
+
* access L5 live-sync endpoints (e.g. /api/atr-rules/live). Returns the
|
|
398
|
+
* raw key once — caller must store it securely.
|
|
399
|
+
*/
|
|
400
|
+
registerPartnerKey(partnerName: string, issuedBy: string): {
|
|
401
|
+
clientKey: string;
|
|
402
|
+
};
|
|
403
|
+
/** Revoke all keys for a client. Returns number of keys revoked. */
|
|
404
|
+
revokeClientKey(clientId: string): number;
|
|
405
|
+
/** List client keys (admin). Never returns raw keys. */
|
|
406
|
+
listClientKeys(limit?: number, offset?: number): Array<{
|
|
407
|
+
id: number;
|
|
408
|
+
clientId: string;
|
|
409
|
+
createdAt: string;
|
|
410
|
+
lastUsedAt: string | null;
|
|
411
|
+
revoked: boolean;
|
|
412
|
+
ipAddress: string | null;
|
|
413
|
+
}>;
|
|
162
414
|
/** Close the database / 關閉資料庫 */
|
|
163
415
|
close(): void;
|
|
164
416
|
}
|
package/dist/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|