@panguard-ai/threat-cloud 1.4.2 → 1.5.6

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-2026 Panguard AI Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import type Database from 'better-sqlite3';
11
11
  /** Valid audit action types / 有效的審計動作類型 */
12
- export type AuditAction = 'rule.create' | 'rule.delete' | 'proposal.approve' | 'proposal.reject' | 'threat.submit' | 'skill_threat.submit' | 'scan_event.submit' | 'admin.login';
12
+ export type AuditAction = 'rule.create' | 'rule.sync' | 'rule.delete' | 'rule.bulk-delete' | 'proposal.approve' | 'proposal.reject' | 'threat.submit' | 'skill_threat.submit' | 'scan_event.submit' | 'admin.login' | 'client_key.register' | 'client_key.revoke' | 'partner_key.issue';
13
13
  /** An entry from the audit_log table / audit_log 資料表的條目 */
14
14
  export interface AuditLogEntry {
15
15
  id: number;
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,2CAA2C;AAC3C,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,aAAa,GACb,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,qBAAqB,GACrB,mBAAmB,GACnB,aAAa,CAAC;AAElB,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAcD;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;gBAE3B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC;;;;;;;;;;OAUG;IACH,SAAS,CACP,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAaP;;;;;;;OAOG;IACH,WAAW,CAAC,KAAK,GAAE,MAAY,EAAE,MAAM,GAAE,MAAU,GAAG,aAAa,EAAE;IAwBrE;;;OAGG;IACH,gBAAgB,IAAI,MAAM;CAO3B"}
1
+ {"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,2CAA2C;AAC3C,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,WAAW,GACX,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,qBAAqB,GACrB,mBAAmB,GACnB,aAAa,GACb,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,CAAC;AAExB,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAcD;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;gBAE3B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC;;;;;;;;;;OAUG;IACH,SAAS,CACP,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAaP;;;;;;;OAOG;IACH,WAAW,CAAC,KAAK,GAAE,MAAY,EAAE,MAAM,GAAE,MAAU,GAAG,aAAa,EAAE;IAwBrE;;;OAGG;IACH,gBAAgB,IAAI,MAAM;CAO3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuCH;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACL,EAAE,CAAoB;IAEvC,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;;;;;;;;;OAUG;IACH,SAAS,CACP,KAAa,EACb,MAAmB,EACnB,YAAoB,EACpB,UAAmB,EACnB,OAAiC,EACjC,SAAkB;QAElB,MAAM,WAAW,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3E,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;OAGD,CACA;aACA,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,IAAI,IAAI,EAAE,WAAW,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,QAAgB,GAAG,EAAE,SAAiB,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;OAKD,CACA;aACA,GAAG,CAAC,KAAK,EAAE,MAAM,CAAkB,CAAC;QAEvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA6B,CAAC,CAAC,CAAC,IAAI;YAC3F,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,OACE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAG/D,CAAC,KAAK,CAAC;IACV,CAAC;CACF"}
1
+ {"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4CH;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACL,EAAE,CAAoB;IAEvC,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;;;;;;;;;OAUG;IACH,SAAS,CACP,KAAa,EACb,MAAmB,EACnB,YAAoB,EACpB,UAAmB,EACnB,OAAiC,EACjC,SAAkB;QAElB,MAAM,WAAW,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3E,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;OAGD,CACA;aACA,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,IAAI,IAAI,EAAE,WAAW,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,QAAgB,GAAG,EAAE,SAAiB,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;OAKD,CACA;aACA,GAAG,CAAC,KAAK,EAAE,MAAM,CAAkB,CAAC;QAEvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA6B,CAAC,CAAC,CAAC,IAAI;YAC3F,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,OACE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAG/D,CAAC,KAAK,CAAC;IACV,CAAC;CACF"}
package/dist/cli.js CHANGED
@@ -55,7 +55,7 @@ async function main() {
55
55
  port: args.port ?? Number(process.env['PORT'] ?? '8080'),
56
56
  host: args.host ?? process.env['TC_HOST'] ?? process.env['HOST'] ?? '127.0.0.1',
57
57
  dbPath: args.dbPath ?? process.env['TC_DB_PATH'] ?? process.env['DB_PATH'] ?? './threat-cloud.db',
58
- apiKeyRequired: args.apiKeyRequired ?? false,
58
+ apiKeyRequired: args.apiKeyRequired ?? process.env['NODE_ENV'] === 'production',
59
59
  apiKeys: args.apiKeys ?? process.env['TC_API_KEYS']?.split(',') ?? [],
60
60
  rateLimitPerMinute: Number(process.env['TC_RATE_LIMIT'] ?? '120'),
61
61
  anthropicApiKey: args.anthropicApiKey ?? process.env['ANTHROPIC_API_KEY'],
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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
  };
@@ -112,6 +170,8 @@ export declare class ThreatCloudDB {
112
170
  /** Aggregate raw telemetry events into hourly buckets, then delete old raw events / 彙總遙測事件 */
113
171
  cleanupTelemetryEvents(): number;
114
172
  clearAllRules(): number;
173
+ /** Get current schema version for health diagnostics */
174
+ getSchemaVersion(): number;
115
175
  getStats(): ThreatStats;
116
176
  /** Get confirmed/promoted ATR rules, optionally filtered by date / 取得已確認 ATR 規則 */
117
177
  getConfirmedATRRules(since?: string): Array<{
@@ -128,6 +188,37 @@ export declare class ThreatCloudDB {
128
188
  upsertIoC(type: string, value: string, reputation: number, source: string): void;
129
189
  /** Promote proposals to rules based on community consensus and/or LLM approval / 推廣提案為規則 */
130
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
+ }>;
131
222
  /** Reject an ATR proposal / 拒絕 ATR 提案 */
132
223
  rejectATRProposal(patternHash: string): void;
133
224
  /** Admin: manually approve an ATR proposal and promote to rule */
@@ -145,7 +236,7 @@ export declare class ThreatCloudDB {
145
236
  /** Report a safe skill (increment confirmations, auto-confirm at 3+) / 回報安全 skill */
146
237
  reportSafeSkill(skillName: string, fingerprintHash?: string): void;
147
238
  /** Get confirmed community whitelist / 取得社群白名單 */
148
- getSkillWhitelist(): Array<{
239
+ getSkillWhitelist(since?: string): Array<{
149
240
  name: string;
150
241
  hash: string | null;
151
242
  confirmations: number;
@@ -154,7 +245,7 @@ export declare class ThreatCloudDB {
154
245
  * Get skill blacklist: skills reported by 3+ distinct clients with avg risk >= 70
155
246
  * 取得技能黑名單:3+ 不同客戶端回報且平均風險 >= 70 的技能
156
247
  */
157
- getSkillBlacklist(minReports?: number, minAvgRisk?: number): SkillBlacklistEntry[];
248
+ getSkillBlacklist(minReports?: number, minAvgRisk?: number, since?: string): SkillBlacklistEntry[];
158
249
  /** Backfill classification for rules with NULL category / 回填缺少分類的規則 */
159
250
  backfillClassification(): number;
160
251
  /**
@@ -168,6 +259,32 @@ export declare class ThreatCloudDB {
168
259
  }>;
169
260
  /** Insert scan event from any source / 插入掃描事件 */
170
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
+ };
171
288
  /** Get contributor leaderboard (hashed IDs, no PII) / 取得貢獻者排行榜 */
172
289
  getContributorLeaderboard(limit?: number): Array<{
173
290
  contributorHash: string;
@@ -177,6 +294,123 @@ export declare class ThreatCloudDB {
177
294
  }>;
178
295
  /** Get aggregated metrics across all sources / 取得所有來源的聚合指標 */
179
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
+ }>;
180
414
  /** Close the database / 關閉資料庫 */
181
415
  close(): void;
182
416
  }
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EACT,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;gBAEhB,MAAM,EAAE,MAAM;IAQ1B,gDAAgD;IAChD,OAAO,CAAC,UAAU;IAuJlB,gDAAgD;IAChD,YAAY,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAgB9C,qDAAqD;IACrD,UAAU,CAAC,KAAK,GAAE,MAAW,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO,EAAE;IAM7D,sCAAsC;IACtC,cAAc,IAAI,MAAM;IAKxB,uEAAuE;IACvE,OAAO,CAAC,eAAe;IAiJvB,oDAAoD;IACpD,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAiCvC,mEAAmE;IACnE,aAAa,CACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,eAAe,EAAE;IAuBpB,+CAA+C;IAC/C,WAAW,CACT,KAAK,SAAO,EACZ,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,eAAe,EAAE;IAwBpB,6CAA6C;IAC7C,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAe9C,mEAAmE;IACnE,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAS3C,6EAA6E;IAC7E,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAc7C,6DAA6D;IAC7D,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAUtE,sCAAsC;IACtC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAUnF,+CAA+C;IAC/C,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE;IAkBtF,gDAAgD;IAChD,iBAAiB,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAe1D,iFAAiF;IACjF,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG;QAC5C,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB;IAsCD,iEAAiE;IACjE,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAO5C,iFAAiF;IACjF,oBAAoB,CAClB,WAAW,EAAE,MAAM,GAClB;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAMlE,0CAA0C;IAC1C,eAAe,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,EAAE;IAM9C,uCAAuC;IACvC,gBAAgB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAsB3F,qCAAqC;IAKrC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM7F,aAAa,IAAI;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpD;IAoDD,wCAAwC;IACxC,oBAAoB,CAAC,KAAK,EAAE;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IAQR,0EAA0E;IAC1E,iBAAiB,IAAI;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,eAAe,EAAE,MAAM,CAAC;KACzB;IAkED,8FAA8F;IAC9F,sBAAsB,IAAI,MAAM;IAkChC,aAAa,IAAI,MAAM;IAMvB,QAAQ,IAAI,WAAW;IAyFvB,mFAAmF;IACnF,oBAAoB,CAClB,KAAK,CAAC,EAAE,MAAM,GACb,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAyCtF,gFAAgF;IAChF,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE;IA+B/C,uDAAuD;IACvD,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE;IAcnD,yCAAyC;IACzC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBhF,4FAA4F;IAC5F,yBAAyB,IAAI,MAAM;IA+DnC,yCAAyC;IACzC,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAW5C,kEAAkE;IAClE,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAmChD,2CAA2C;IAC3C,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAY/C,iEAAiE;IACjE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAevD,0EAA0E;IAC1E,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAW/C,mEAAmE;IACnE,sBAAsB,IAAI,OAAO,EAAE;IAanC,sEAAsE;IACtE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;IA2BnE,qFAAqF;IACrF,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI;IAiBlE,kDAAkD;IAClD,iBAAiB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAaxF;;;OAGG;IACH,iBAAiB,CAAC,UAAU,GAAE,MAAU,EAAE,UAAU,GAAE,MAAW,GAAG,mBAAmB,EAAE;IAqBzF,uEAAuE;IACvE,sBAAsB,IAAI,MAAM;IAmBhC;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,GAAE,MAAU,GAAG,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAmB9F,iDAAiD;IACjD,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAkBvC,kEAAkE;IAClE,yBAAyB,CAAC,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC;QACnD,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IAoDF,8DAA8D;IAC9D,oBAAoB,IAAI,iBAAiB;IAgFzC,iCAAiC;IACjC,KAAK,IAAI,IAAI;CAGd"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}