@titanshield/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 (87) hide show
  1. package/dist/TitanShield.d.ts +107 -0
  2. package/dist/TitanShield.d.ts.map +1 -0
  3. package/dist/TitanShield.js +248 -0
  4. package/dist/TitanShield.js.map +1 -0
  5. package/dist/audit.d.ts +8 -0
  6. package/dist/audit.d.ts.map +1 -0
  7. package/dist/audit.js +76 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/auto.d.ts +12 -0
  10. package/dist/auto.d.ts.map +1 -0
  11. package/dist/auto.js +129 -0
  12. package/dist/auto.js.map +1 -0
  13. package/dist/badge.d.ts +27 -0
  14. package/dist/badge.d.ts.map +1 -0
  15. package/dist/badge.js +127 -0
  16. package/dist/badge.js.map +1 -0
  17. package/dist/battle.d.ts +50 -0
  18. package/dist/battle.d.ts.map +1 -0
  19. package/dist/battle.js +239 -0
  20. package/dist/battle.js.map +1 -0
  21. package/dist/biometrics.d.ts +63 -0
  22. package/dist/biometrics.d.ts.map +1 -0
  23. package/dist/biometrics.js +248 -0
  24. package/dist/biometrics.js.map +1 -0
  25. package/dist/collective.d.ts +63 -0
  26. package/dist/collective.d.ts.map +1 -0
  27. package/dist/collective.js +203 -0
  28. package/dist/collective.js.map +1 -0
  29. package/dist/compliance.d.ts +3 -0
  30. package/dist/compliance.d.ts.map +1 -0
  31. package/dist/compliance.js +71 -0
  32. package/dist/compliance.js.map +1 -0
  33. package/dist/dna.d.ts +82 -0
  34. package/dist/dna.d.ts.map +1 -0
  35. package/dist/dna.js +219 -0
  36. package/dist/dna.js.map +1 -0
  37. package/dist/index.d.ts +22 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +56 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/nlrules.d.ts +68 -0
  42. package/dist/nlrules.d.ts.map +1 -0
  43. package/dist/nlrules.js +232 -0
  44. package/dist/nlrules.js.map +1 -0
  45. package/dist/prevent.d.ts +119 -0
  46. package/dist/prevent.d.ts.map +1 -0
  47. package/dist/prevent.js +380 -0
  48. package/dist/prevent.js.map +1 -0
  49. package/dist/quantum.d.ts +105 -0
  50. package/dist/quantum.d.ts.map +1 -0
  51. package/dist/quantum.js +269 -0
  52. package/dist/quantum.js.map +1 -0
  53. package/dist/scanner.d.ts +61 -0
  54. package/dist/scanner.d.ts.map +1 -0
  55. package/dist/scanner.js +364 -0
  56. package/dist/scanner.js.map +1 -0
  57. package/dist/threats.d.ts +10 -0
  58. package/dist/threats.d.ts.map +1 -0
  59. package/dist/threats.js +96 -0
  60. package/dist/threats.js.map +1 -0
  61. package/dist/types.d.ts +68 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +6 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/validate.d.ts +51 -0
  66. package/dist/validate.d.ts.map +1 -0
  67. package/dist/validate.js +59 -0
  68. package/dist/validate.js.map +1 -0
  69. package/package.json +33 -0
  70. package/src/TitanShield.ts +303 -0
  71. package/src/audit.ts +75 -0
  72. package/src/auto.ts +137 -0
  73. package/src/badge.ts +145 -0
  74. package/src/battle.ts +300 -0
  75. package/src/biometrics.ts +307 -0
  76. package/src/collective.ts +269 -0
  77. package/src/compliance.ts +74 -0
  78. package/src/dna.ts +304 -0
  79. package/src/index.ts +59 -0
  80. package/src/nlrules.ts +297 -0
  81. package/src/prevent.ts +474 -0
  82. package/src/quantum.ts +341 -0
  83. package/src/scanner.ts +431 -0
  84. package/src/threats.ts +105 -0
  85. package/src/types.ts +108 -0
  86. package/src/validate.ts +72 -0
  87. package/tsconfig.json +26 -0
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ // ══════════════════════════════════════════════════════════════════════════════
3
+ // TitanShieldAI — scanner.ts
4
+ //
5
+ // WORLD'S FIRST: AI Security Code Scanner for Pre-Deploy Vulnerability Detection
6
+ //
7
+ // Scans your codebase BEFORE it deploys. Finds security issues while you're
8
+ // still writing code — not after hackers exploit them in production.
9
+ //
10
+ // Unlike Snyk (dependency scanner) or SonarQube (requires enterprise license):
11
+ // - Understands YOUR code's context with Gemini AI
12
+ // - Explains vulnerabilities in plain English (not CVE jargon)
13
+ // - Provides exact fix with before/after code diff
14
+ // - Runs in < 2 minutes on a normal codebase
15
+ // - Zero config — just: npx titanshield scan ./src
16
+ //
17
+ // What it finds:
18
+ // - Unvalidated user input going directly to DB / shell / eval
19
+ // - Hardcoded secrets (API keys, passwords, tokens)
20
+ // - Missing auth checks on sensitive routes
21
+ // - Insecure direct object references (IDOR)
22
+ // - SQL/Command/XSS injection patterns
23
+ // - Overly permissive CORS configs
24
+ // - Dependency prototype pollution
25
+ // - JWT algorithm confusion attacks
26
+ // - Timing attack vulnerabilities
27
+ // ══════════════════════════════════════════════════════════════════════════════
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.AISecurityScanner = void 0;
30
+ const fs_1 = require("fs");
31
+ const path_1 = require("path");
32
+ const generative_ai_1 = require("@google/generative-ai");
33
+ // ── Static pattern scanner (fast, no AI needed) ───────────────────────────────
34
+ const STATIC_PATTERNS = [
35
+ {
36
+ pattern: /(?:api[_-]?key|apikey|secret|password|passwd|token)\s*[:=]\s*["'](?!process\.env|os\.environ)[a-zA-Z0-9+/=_-]{8,}/gi,
37
+ category: 'hardcoded_secret',
38
+ severity: 'critical',
39
+ title: 'Hardcoded Secret Detected',
40
+ description: 'A secret key, password, or token is hardcoded directly in your source code. Anyone who sees your code (including GitHub) can steal it and use it.',
41
+ effort: '5 minutes',
42
+ },
43
+ {
44
+ pattern: /eval\s*\(\s*(?:req\.|request\.|params\.|query\.|body\.)/g,
45
+ category: 'injection',
46
+ severity: 'critical',
47
+ title: 'eval() with User Input — Remote Code Execution Risk',
48
+ description: 'You are passing user-controlled data into eval(). This lets attackers run any code they want on your server. This is one of the most dangerous vulnerabilities that exists.',
49
+ effort: '30 minutes',
50
+ },
51
+ {
52
+ pattern: /exec\s*\(\s*`[^`]*\${[^}]*(?:req|params|query|body)/g,
53
+ category: 'injection',
54
+ severity: 'critical',
55
+ title: 'Command Injection via Template Literal',
56
+ description: 'User input is being interpolated directly into a shell command. Attackers can inject shell commands and take over your server.',
57
+ effort: '30 minutes',
58
+ },
59
+ {
60
+ pattern: /SELECT\s+.+\s+FROM\s+.+\s+WHERE\s+.+\+\s*(?:req|params|query|body|user)/gi,
61
+ category: 'injection',
62
+ severity: 'critical',
63
+ title: 'SQL Injection via String Concatenation',
64
+ description: 'You are building SQL queries by concatenating user input. Attackers can manipulate the query to access, modify, or delete your entire database.',
65
+ effort: '30 minutes',
66
+ },
67
+ {
68
+ pattern: /res\.setHeader\s*\(\s*['"]Access-Control-Allow-Origin['"]\s*,\s*['"]\*['"]/g,
69
+ category: 'insecure_config',
70
+ severity: 'high',
71
+ title: 'CORS Wildcard — Any Origin Allowed',
72
+ description: 'Your API accepts requests from ANY website. This means a malicious site can make authenticated requests on behalf of your logged-in users.',
73
+ effort: '5 minutes',
74
+ },
75
+ {
76
+ pattern: /jwt\.verify\s*\(\s*token\s*,\s*(?:key|secret)\s*,\s*\{[^}]*algorithms\s*:\s*\[['"](?:none|HS256)['"]\]/g,
77
+ category: 'crypto_weakness',
78
+ severity: 'high',
79
+ title: 'JWT Algorithm Confusion Vulnerability',
80
+ description: 'Allowing the "none" algorithm or only HS256 in JWT verification can allow attackers to forge tokens and impersonate any user.',
81
+ effort: '30 minutes',
82
+ },
83
+ {
84
+ pattern: /crypto\.createHash\s*\(\s*['"]md5['"]\)|crypto\.createHash\s*\(\s*['"]sha1['"]\)/g,
85
+ category: 'crypto_weakness',
86
+ severity: 'medium',
87
+ title: 'Weak Cryptographic Hash (MD5/SHA1)',
88
+ description: 'MD5 and SHA1 are considered broken for security purposes. Attackers can find collisions and forge data. Use SHA-256 or better.',
89
+ effort: '5 minutes',
90
+ },
91
+ {
92
+ pattern: /\.readFile(?:Sync)?\s*\([^,)]*(?:params|query|body|req\.[a-z]+)\./g,
93
+ category: 'path_traversal',
94
+ severity: 'high',
95
+ title: 'Path Traversal via User Input',
96
+ description: 'A user-controlled value is being used in a file path. Attackers can use "../../../etc/passwd" to read any file on your server.',
97
+ effort: '30 minutes',
98
+ },
99
+ {
100
+ pattern: /process\.env\b(?!.*process\.env)/g, // Zero matches is not a problem; this finds the concept
101
+ category: 'info',
102
+ severity: 'info',
103
+ title: 'Environment Variables Used',
104
+ description: 'Good — environment variables are being used for configuration.',
105
+ effort: '5 minutes',
106
+ },
107
+ ];
108
+ // ── AISecurityScanner ─────────────────────────────────────────────────────────
109
+ class AISecurityScanner {
110
+ constructor(geminiApiKey) {
111
+ this.ai = null;
112
+ this.SUPPORTED_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go']);
113
+ this.SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage', '__pycache__']);
114
+ this.MAX_FILE_SIZE = 50000; // 50KB per file
115
+ this.MAX_FILES_FOR_AI = 20; // AI scan is expensive — limit to highest-risk files
116
+ if (geminiApiKey) {
117
+ this.ai = new generative_ai_1.GoogleGenerativeAI(geminiApiKey);
118
+ }
119
+ }
120
+ /**
121
+ * Scan a directory for security vulnerabilities.
122
+ * Uses fast static analysis first, then AI for deep contextual analysis.
123
+ *
124
+ * @example
125
+ * const result = await scanner.scanDirectory('./src');
126
+ * console.log(result.vulnerabilities); // Sorted by severity
127
+ */
128
+ async scanDirectory(dirPath) {
129
+ const startMs = Date.now();
130
+ console.log(`\n🔍 [TitanShield Scanner] Scanning ${dirPath}...\n`);
131
+ // 1. Walk directory
132
+ const files = this.walkDirectory(dirPath);
133
+ console.log(` Found ${files.length} files to scan`);
134
+ // 2. Static pattern scan (fast, runs on ALL files)
135
+ const allVulns = [];
136
+ let totalLines = 0;
137
+ for (const file of files) {
138
+ const vulns = await this.staticScan(file, dirPath);
139
+ allVulns.push(...vulns);
140
+ try {
141
+ const content = (0, fs_1.readFileSync)(file, 'utf8');
142
+ totalLines += content.split('\n').length;
143
+ }
144
+ catch { }
145
+ }
146
+ // 3. AI deep scan (runs on highest-risk files only)
147
+ if (this.ai) {
148
+ const highRiskFiles = this.prioritizeFiles(files, allVulns);
149
+ const aiVulns = await this.aiScan(highRiskFiles.slice(0, this.MAX_FILES_FOR_AI), dirPath);
150
+ allVulns.push(...aiVulns);
151
+ }
152
+ // 4. Deduplicate and sort by severity
153
+ const unique = this.deduplicateVulns(allVulns);
154
+ const sorted = this.sortBySeverity(unique);
155
+ // 5. Compute risk score
156
+ const riskScore = this.computeRiskScore(sorted);
157
+ const grade = this.computeGrade(riskScore);
158
+ const result = {
159
+ scannedFiles: files.length,
160
+ scannedLines: totalLines,
161
+ vulnerabilities: sorted,
162
+ scanDurationMs: Date.now() - startMs,
163
+ riskScore,
164
+ grade,
165
+ summary: this.generateSummary(sorted, grade, files.length),
166
+ criticalCount: sorted.filter(v => v.severity === 'critical').length,
167
+ highCount: sorted.filter(v => v.severity === 'high').length,
168
+ autoFixable: sorted.filter(v => ['5 minutes', '30 minutes'].includes(v.fix.effort)).length,
169
+ };
170
+ this.printReport(result, dirPath);
171
+ return result;
172
+ }
173
+ async staticScan(filePath, rootDir) {
174
+ let code;
175
+ try {
176
+ const stat = (0, fs_1.statSync)(filePath);
177
+ if (stat.size > this.MAX_FILE_SIZE)
178
+ return [];
179
+ code = (0, fs_1.readFileSync)(filePath, 'utf8');
180
+ }
181
+ catch {
182
+ return [];
183
+ }
184
+ const vulns = [];
185
+ const lines = code.split('\n');
186
+ const relFile = (0, path_1.relative)(rootDir, filePath);
187
+ for (const pattern of STATIC_PATTERNS) {
188
+ if (pattern.category === 'info')
189
+ continue; // skip info patterns
190
+ let match;
191
+ const re = new RegExp(pattern.pattern.source, pattern.pattern.flags);
192
+ while ((match = re.exec(code)) !== null) {
193
+ const matchPos = match.index;
194
+ const lineNum = code.slice(0, matchPos).split('\n').length;
195
+ const evidenceLine = lines[lineNum - 1]?.trim() ?? '';
196
+ vulns.push({
197
+ id: `static_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
198
+ file: relFile,
199
+ line: lineNum,
200
+ severity: pattern.severity,
201
+ category: pattern.category,
202
+ title: pattern.title,
203
+ description: pattern.description,
204
+ evidence: evidenceLine.slice(0, 200),
205
+ fix: {
206
+ summary: `Fix the ${pattern.category} vulnerability in ${relFile}:${lineNum}`,
207
+ codeBefore: evidenceLine,
208
+ codeAfter: '// Replace with safe alternative — see TitanShield documentation',
209
+ effort: pattern.effort,
210
+ },
211
+ });
212
+ }
213
+ }
214
+ return vulns;
215
+ }
216
+ async aiScan(files, rootDir) {
217
+ if (!this.ai || files.length === 0)
218
+ return [];
219
+ const model = this.ai.getGenerativeModel({ model: 'gemini-2.5-flash' });
220
+ const results = [];
221
+ for (const file of files) {
222
+ try {
223
+ const code = (0, fs_1.readFileSync)(file, 'utf8');
224
+ const relFile = (0, path_1.relative)(rootDir, file);
225
+ const prompt = `You are a world-class security engineer performing a code review.
226
+ Analyze this ${(0, path_1.extname)(file)} file for security vulnerabilities.
227
+ File: ${relFile}
228
+
229
+ \`\`\`
230
+ ${code.slice(0, 8000)}
231
+ \`\`\`
232
+
233
+ Return ONLY a JSON array of vulnerabilities found. If none, return [].
234
+ Each vulnerability:
235
+ {
236
+ "line": <line number>,
237
+ "severity": "critical|high|medium|low",
238
+ "category": "injection|xss|hardcoded_secret|missing_auth|idor|insecure_config|crypto_weakness|timing_attack|path_traversal",
239
+ "title": "<concise title, max 60 chars>",
240
+ "description": "<plain English explanation, 2-3 sentences, no jargon>",
241
+ "evidence": "<the exact problematic code snippet>",
242
+ "fix": {
243
+ "summary": "<one line fix description>",
244
+ "codeBefore": "<vulnerable code, max 3 lines>",
245
+ "codeAfter": "<fixed code, max 3 lines>",
246
+ "effort": "5 minutes|30 minutes|2 hours|1 day"
247
+ }
248
+ }`;
249
+ const result = await model.generateContent(prompt);
250
+ const raw = result.response.text().replace(/```json\n?|```/g, '').trim();
251
+ const parsed = JSON.parse(raw.startsWith('[') ? raw : '[]');
252
+ for (const v of parsed) {
253
+ results.push({
254
+ id: `ai_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
255
+ file: relFile,
256
+ line: v.line,
257
+ severity: v.severity,
258
+ category: v.category,
259
+ title: v.title,
260
+ description: v.description,
261
+ evidence: v.evidence ?? '',
262
+ fix: v.fix ?? { summary: 'See description', codeBefore: '', codeAfter: '', effort: '30 minutes' },
263
+ });
264
+ }
265
+ }
266
+ catch { }
267
+ }
268
+ return results;
269
+ }
270
+ walkDirectory(dirPath) {
271
+ const files = [];
272
+ const walk = (dir) => {
273
+ try {
274
+ for (const entry of (0, fs_1.readdirSync)(dir, { withFileTypes: true })) {
275
+ if (this.SKIP_DIRS.has(entry.name))
276
+ continue;
277
+ const fullPath = (0, path_1.join)(dir, entry.name);
278
+ if (entry.isDirectory()) {
279
+ walk(fullPath);
280
+ }
281
+ else if (this.SUPPORTED_EXTENSIONS.has((0, path_1.extname)(entry.name))) {
282
+ files.push(fullPath);
283
+ }
284
+ }
285
+ }
286
+ catch { }
287
+ };
288
+ walk(dirPath);
289
+ return files;
290
+ }
291
+ prioritizeFiles(files, vulns) {
292
+ const vulnFiles = new Set(vulns.map(v => v.file));
293
+ return [
294
+ ...files.filter(f => vulnFiles.has(f)), // files with static vulns first
295
+ ...files.filter(f => !vulnFiles.has(f)),
296
+ ];
297
+ }
298
+ deduplicateVulns(vulns) {
299
+ const seen = new Set();
300
+ return vulns.filter(v => {
301
+ const key = `${v.file}:${v.line}:${v.category}`;
302
+ if (seen.has(key))
303
+ return false;
304
+ seen.add(key);
305
+ return true;
306
+ });
307
+ }
308
+ sortBySeverity(vulns) {
309
+ const order = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
310
+ return [...vulns].sort((a, b) => order[a.severity] - order[b.severity]);
311
+ }
312
+ computeRiskScore(vulns) {
313
+ const weights = { critical: 40, high: 20, medium: 8, low: 2, info: 0 };
314
+ const raw = vulns.reduce((s, v) => s + weights[v.severity], 0);
315
+ return Math.min(100, raw);
316
+ }
317
+ computeGrade(score) {
318
+ if (score === 0)
319
+ return 'A';
320
+ if (score <= 10)
321
+ return 'B';
322
+ if (score <= 30)
323
+ return 'C';
324
+ if (score <= 60)
325
+ return 'D';
326
+ return 'F';
327
+ }
328
+ generateSummary(vulns, grade, fileCount) {
329
+ const c = vulns.filter(v => v.severity === 'critical').length;
330
+ const h = vulns.filter(v => v.severity === 'high').length;
331
+ if (vulns.length === 0)
332
+ return `🎉 Grade ${grade}: No vulnerabilities found in ${fileCount} files! Your code looks secure.`;
333
+ if (c > 0)
334
+ return `🚨 Grade ${grade}: Found ${c} CRITICAL and ${h} high-severity issues across ${fileCount} files. Fix critical issues before deploying!`;
335
+ if (h > 0)
336
+ return `⚠️ Grade ${grade}: Found ${h} high-severity issues. Fix before production deployment.`;
337
+ return `ℹ️ Grade ${grade}: Found ${vulns.length} minor issues. Safe to deploy, but worth fixing.`;
338
+ }
339
+ printReport(result, dir) {
340
+ const COLORS = { critical: '\x1b[31m', high: '\x1b[33m', medium: '\x1b[36m', low: '\x1b[37m', info: '\x1b[90m', reset: '\x1b[0m' };
341
+ console.log(`\n${'═'.repeat(60)}`);
342
+ console.log(` 🛡️ TitanShieldAI Security Scan`);
343
+ console.log(` Directory: ${dir}`);
344
+ console.log(` Files: ${result.scannedFiles} | Lines: ${result.scannedLines.toLocaleString()} | ${result.scanDurationMs}ms`);
345
+ console.log(`${'═'.repeat(60)}`);
346
+ console.log(` Grade: ${result.grade} | Risk Score: ${result.riskScore}/100`);
347
+ console.log(` ${result.summary}\n`);
348
+ if (result.vulnerabilities.length === 0) {
349
+ console.log(' ✅ Clean! No vulnerabilities detected.\n');
350
+ return;
351
+ }
352
+ for (const v of result.vulnerabilities) {
353
+ const color = COLORS[v.severity];
354
+ console.log(` ${color}[${v.severity.toUpperCase()}]${COLORS.reset} ${v.title}`);
355
+ console.log(` File: ${v.file}${v.line ? `:${v.line}` : ''}`);
356
+ console.log(` ${v.description.slice(0, 120)}`);
357
+ console.log(` Fix: ${v.fix.summary} (${v.fix.effort})\n`);
358
+ }
359
+ console.log(` Auto-fixable: ${result.autoFixable}/${result.vulnerabilities.length} vulnerabilities`);
360
+ console.log(`${'═'.repeat(60)}\n`);
361
+ }
362
+ }
363
+ exports.AISecurityScanner = AISecurityScanner;
364
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { StoredAuditEvent, ThreatAlert } from './types.js';
2
+ export declare class ThreatEngine {
3
+ private gemini;
4
+ constructor(geminiApiKey?: string);
5
+ analyzeEvent(event: StoredAuditEvent, recentEvents: StoredAuditEvent[]): Promise<{
6
+ anomalyScore: number;
7
+ alert: ThreatAlert | null;
8
+ }>;
9
+ }
10
+ //# sourceMappingURL=threats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threats.d.ts","sourceRoot":"","sources":["../src/threats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAkC9E,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAA0F;gBAE5F,YAAY,CAAC,EAAE,MAAM;IAO3B,YAAY,CACd,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,gBAAgB,EAAE,GACjC,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,CAAC;CAwDlE"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThreatEngine = void 0;
4
+ const generative_ai_1 = require("@google/generative-ai");
5
+ // ─────────────────────────────────────────────────────────────────────────────
6
+ // AI Threat Engine — Gemini-powered anomaly analysis & narrative generation
7
+ // ─────────────────────────────────────────────────────────────────────────────
8
+ const THREAT_PROMPT = (event, context) => `
9
+ You are TitanShieldAI, a senior security analyst. Analyze this security event and recent context.
10
+
11
+ CURRENT EVENT:
12
+ ${JSON.stringify(event, null, 2)}
13
+
14
+ RECENT CONTEXT (last 10 events, same project):
15
+ ${JSON.stringify(context.slice(-10), null, 2)}
16
+
17
+ Anomaly factors already detected: ${event.anomalyScore > 0 ? 'high_risk_event, failed_outcome' : 'none'}
18
+
19
+ Determine:
20
+ 1. Is this event genuinely suspicious or a false positive?
21
+ 2. What is the threat narrative in plain English (1-2 sentences)?
22
+ 3. What should the developer/admin do right now?
23
+
24
+ Respond ONLY in valid JSON:
25
+ {
26
+ "isThreat": true|false,
27
+ "threatType": "brute_force|unusual_location|data_exfiltration|privilege_escalation|anomaly|none",
28
+ "severity": "low|medium|high|critical",
29
+ "anomalyScore": 0-100,
30
+ "narrative": "Plain English 1-2 sentence threat description",
31
+ "recommendedAction": "Specific action to take right now",
32
+ "falsePositiveReason": "If not a threat, why it looks suspicious but isn't"
33
+ }
34
+ `;
35
+ class ThreatEngine {
36
+ constructor(geminiApiKey) {
37
+ this.gemini = null;
38
+ if (geminiApiKey) {
39
+ const genAI = new generative_ai_1.GoogleGenerativeAI(geminiApiKey);
40
+ this.gemini = genAI.getGenerativeModel({ model: 'gemini-2.5-flash' });
41
+ }
42
+ }
43
+ async analyzeEvent(event, recentEvents) {
44
+ // Skip AI for clearly benign events with low baseline score
45
+ if (event.anomalyScore < 20 && !['user.login_failed', 'data.export', 'admin.user_elevated'].includes(event.event)) {
46
+ return { anomalyScore: event.anomalyScore, alert: null };
47
+ }
48
+ // Use Gemini if available
49
+ if (this.gemini) {
50
+ try {
51
+ const result = await this.gemini.generateContent(THREAT_PROMPT(event, recentEvents));
52
+ const raw = result.response.text().trim().replace(/^```json?\n?/, '').replace(/\n?```$/, '');
53
+ const parsed = JSON.parse(raw);
54
+ if (!parsed.isThreat || parsed.threatType === 'none') {
55
+ return { anomalyScore: parsed.anomalyScore ?? event.anomalyScore, alert: null };
56
+ }
57
+ const alert = {
58
+ id: `alert_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
59
+ triggeredBy: event.id,
60
+ type: parsed.threatType,
61
+ severity: parsed.severity,
62
+ narrative: parsed.narrative,
63
+ affectedUser: event.userId,
64
+ affectedResource: event.resource,
65
+ recommendedAction: parsed.recommendedAction,
66
+ timestamp: new Date(),
67
+ dismissed: false,
68
+ };
69
+ return { anomalyScore: parsed.anomalyScore ?? event.anomalyScore, alert };
70
+ }
71
+ catch (e) {
72
+ // Fallback to heuristic-only if Gemini fails
73
+ console.warn('[TitanShield] AI analysis failed, using heuristic:', e.message);
74
+ }
75
+ }
76
+ // Heuristic-only alert (no Gemini key)
77
+ if (event.anomalyScore >= 50) {
78
+ const alert = {
79
+ id: `alert_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
80
+ triggeredBy: event.id,
81
+ type: 'anomaly',
82
+ severity: event.anomalyScore >= 80 ? 'high' : 'medium',
83
+ narrative: `Suspicious activity detected for ${event.userId ? `user ${event.userId}` : 'anonymous user'}: ${event.event} — anomaly score ${event.anomalyScore}/100.`,
84
+ affectedUser: event.userId,
85
+ affectedResource: event.resource,
86
+ recommendedAction: 'Review this event and recent activity for this user or IP address.',
87
+ timestamp: new Date(),
88
+ dismissed: false,
89
+ };
90
+ return { anomalyScore: event.anomalyScore, alert };
91
+ }
92
+ return { anomalyScore: event.anomalyScore, alert: null };
93
+ }
94
+ }
95
+ exports.ThreatEngine = ThreatEngine;
96
+ //# sourceMappingURL=threats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threats.js","sourceRoot":"","sources":["../src/threats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export interface TitanConfig {
2
+ apiKey: string;
3
+ project: string;
4
+ env?: 'development' | 'staging' | 'production';
5
+ geminiApiKey?: string;
6
+ firestoreCredentials?: object;
7
+ webhookUrl?: string;
8
+ }
9
+ export type AuditEventType = 'user.login' | 'user.logout' | 'user.login_failed' | 'user.signup' | 'user.password_changed' | 'user.mfa_enabled' | 'user.mfa_disabled' | 'data.read' | 'data.write' | 'data.delete' | 'data.export' | 'admin.settings_changed' | 'admin.user_elevated' | 'admin.user_suspended' | 'api.key_created' | 'api.key_revoked' | 'billing.plan_changed' | 'security.threat_detected' | 'security.ip_blocked' | string;
10
+ export interface AuditEvent {
11
+ event: AuditEventType;
12
+ userId?: string;
13
+ ip?: string;
14
+ userAgent?: string;
15
+ resource?: string;
16
+ action?: string;
17
+ outcome?: 'success' | 'failure' | 'blocked';
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ export interface StoredAuditEvent extends AuditEvent {
21
+ id: string;
22
+ project: string;
23
+ env: string;
24
+ timestamp: Date;
25
+ hash: string;
26
+ severityScore: number;
27
+ anomalyScore: number;
28
+ threatFlag: boolean;
29
+ }
30
+ export interface ThreatAlert {
31
+ id: string;
32
+ triggeredBy: string;
33
+ type: 'brute_force' | 'unusual_location' | 'data_exfiltration' | 'privilege_escalation' | 'anomaly';
34
+ severity: 'low' | 'medium' | 'high' | 'critical';
35
+ narrative: string;
36
+ affectedUser?: string;
37
+ affectedResource?: string;
38
+ recommendedAction: string;
39
+ timestamp: Date;
40
+ dismissed: boolean;
41
+ }
42
+ export interface AnomalyScore {
43
+ score: number;
44
+ factors: string[];
45
+ isThreat: boolean;
46
+ }
47
+ export interface ValidationResult {
48
+ valid: boolean;
49
+ errors: ValidationError[];
50
+ sanitized?: unknown;
51
+ }
52
+ export interface ValidationError {
53
+ field: string;
54
+ message: string;
55
+ code: string;
56
+ }
57
+ export type ComplianceStandard = 'SOC2' | 'HIPAA' | 'PCI-DSS' | 'GDPR';
58
+ export interface ComplianceScore {
59
+ overall: number;
60
+ standards: Record<ComplianceStandard, {
61
+ score: number;
62
+ passed: string[];
63
+ failed: string[];
64
+ notApplicable: string[];
65
+ }>;
66
+ generatedAt: Date;
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────────────────────
3
+ // TitanShieldAI — Core Types
4
+ // ─────────────────────────────────────────────────────────────────────────────
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,6BAA6B;AAC7B,gFAAgF"}
@@ -0,0 +1,51 @@
1
+ import { z, ZodSchema } from 'zod';
2
+ import type { ValidationResult } from './types.js';
3
+ export declare function validate<T>(schema: ZodSchema<T>, input: unknown): ValidationResult;
4
+ export declare const Schemas: {
5
+ email: z.ZodObject<{
6
+ email: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ email: string;
9
+ }, {
10
+ email: string;
11
+ }>;
12
+ login: z.ZodObject<{
13
+ email: z.ZodString;
14
+ password: z.ZodString;
15
+ }, "strip", z.ZodTypeAny, {
16
+ email: string;
17
+ password: string;
18
+ }, {
19
+ email: string;
20
+ password: string;
21
+ }>;
22
+ userRegistration: z.ZodObject<{
23
+ email: z.ZodString;
24
+ password: z.ZodString;
25
+ displayName: z.ZodString;
26
+ }, "strip", z.ZodTypeAny, {
27
+ email: string;
28
+ password: string;
29
+ displayName: string;
30
+ }, {
31
+ email: string;
32
+ password: string;
33
+ displayName: string;
34
+ }>;
35
+ text: (maxLen?: number) => z.ZodObject<{
36
+ text: z.ZodString;
37
+ }, "strip", z.ZodTypeAny, {
38
+ text: string;
39
+ }, {
40
+ text: string;
41
+ }>;
42
+ id: z.ZodObject<{
43
+ id: z.ZodString;
44
+ }, "strip", z.ZodTypeAny, {
45
+ id: string;
46
+ }, {
47
+ id: string;
48
+ }>;
49
+ };
50
+ export { z };
51
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA4BnD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAgBlF;AAID,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBnB,CAAC;AAEF,OAAO,EAAE,CAAC,EAAE,CAAC"}