@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,107 @@
1
+ import EventEmitter from 'events';
2
+ import { AccountLockout, IpReputationEngine, SessionFingerprinter, type PreventionConfig } from './prevent.js';
3
+ import { QuantumAuditChain, QuantumRandom } from './quantum.js';
4
+ import { NaturalLanguageRuleParser } from './nlrules.js';
5
+ import { SecurityDNAProfiler } from './dna.js';
6
+ import { CollectiveDefenseNetwork } from './collective.js';
7
+ import { BattleReportGenerator } from './battle.js';
8
+ import { BiometricAnalyzer } from './biometrics.js';
9
+ import type { TitanConfig, AuditEvent, StoredAuditEvent, ThreatAlert, ComplianceScore, ValidationResult } from './types.js';
10
+ export declare class TitanShield extends EventEmitter {
11
+ private config;
12
+ private threatEngine;
13
+ private eventStore;
14
+ private alertStore;
15
+ private rateMap;
16
+ readonly lockout: AccountLockout;
17
+ readonly ipEngine: IpReputationEngine;
18
+ readonly fingerprinter: SessionFingerprinter;
19
+ readonly quantum: QuantumAuditChain;
20
+ readonly qrng: QuantumRandom;
21
+ readonly nlRules: NaturalLanguageRuleParser;
22
+ readonly dna: SecurityDNAProfiler;
23
+ readonly collective: CollectiveDefenseNetwork;
24
+ readonly battleReport: BattleReportGenerator;
25
+ readonly biometrics: BiometricAnalyzer;
26
+ constructor(config: TitanConfig);
27
+ /**
28
+ * Log a security-relevant event.
29
+ * Stores it in the tamper-proof chain and runs AI threat analysis asynchronously.
30
+ *
31
+ * @example
32
+ * await shield.log({ event: 'user.login', userId: 'u123', ip: '1.2.3.4', outcome: 'success' });
33
+ */
34
+ log(event: AuditEvent): Promise<StoredAuditEvent>;
35
+ /**
36
+ * Validate and sanitize input against a Zod schema.
37
+ * Automatically strips XSS and SQL injection patterns.
38
+ *
39
+ * @example
40
+ * const result = shield.validate(Schemas.login, req.body);
41
+ * if (!result.valid) return res.status(400).json(result.errors);
42
+ */
43
+ validate<T>(schema: import('zod').ZodSchema<T>, input: unknown): ValidationResult;
44
+ /**
45
+ * Record a failed login — auto-locks account after maxFailedLogins attempts.
46
+ * Returns { locked, attemptsLeft, message } in plain English.
47
+ *
48
+ * @example
49
+ * const status = shield.recordFailedLogin(userId, req.ip);
50
+ * if (status.locked) return res.status(423).json({ error: status.message });
51
+ */
52
+ recordFailedLogin(identifier: string, ip?: string): {
53
+ locked: boolean;
54
+ attemptsLeft: number;
55
+ message: string;
56
+ lockedFor?: number;
57
+ };
58
+ /** Call on successful login to clear lockout state */
59
+ recordSuccessfulLogin(identifier: string): void;
60
+ /** Check if an account is locked before even attempting auth */
61
+ isAccountLocked(identifier: string): {
62
+ locked: boolean;
63
+ unlockAt?: number;
64
+ message?: string;
65
+ };
66
+ /**
67
+ * Returns Express security headers middleware.
68
+ * Adds CSP, HSTS, X-Frame-Options, Permissions-Policy, and more.
69
+ *
70
+ * @example
71
+ * app.use(shield.securityHeadersMiddleware());
72
+ */
73
+ securityHeadersMiddleware(config?: PreventionConfig): (_req: import("express").Request, res: import("express").Response, next: import("express").NextFunction) => void;
74
+ /**
75
+ * Returns comprehensive prevention middleware.
76
+ * Combines IP reputation, bot detection, injection prevention.
77
+ *
78
+ * @example
79
+ * app.use(shield.preventionMiddleware());
80
+ */
81
+ preventionMiddleware(config?: PreventionConfig): (req: import("express").Request, res: import("express").Response, next: import("express").NextFunction) => void;
82
+ /**
83
+ * Check if a key (IP, userId) has exceeded the rate limit.
84
+ * Returns true if the request should be ALLOWED.
85
+ *
86
+ * @example
87
+ * if (!shield.rateLimit(req.ip, 10, 60_000)) return res.status(429).end();
88
+ */
89
+ rateLimit(key: string, maxRequests?: number, windowMs?: number): boolean;
90
+ /** Get recent audit events */
91
+ getEvents(limit?: number): StoredAuditEvent[];
92
+ /** Get active threat alerts */
93
+ getAlerts(includesDismissed?: boolean): ThreatAlert[];
94
+ /** Dismiss a threat alert */
95
+ dismissAlert(alertId: string): boolean;
96
+ /** Compute compliance score across all standards */
97
+ complianceScore(): Promise<ComplianceScore>;
98
+ stats(): {
99
+ totalEvents: number;
100
+ threats: number;
101
+ eventsLast24h: number;
102
+ avgAnomalyScore: number;
103
+ topEventTypes: [string, number][];
104
+ };
105
+ private sendWebhook;
106
+ }
107
+ //# sourceMappingURL=TitanShield.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TitanShield.d.ts","sourceRoot":"","sources":["../src/TitanShield.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAKlC,OAAO,EACH,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAE7B,KAAK,gBAAgB,EACnD,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EACR,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,eAAe,EAEf,gBAAgB,EACnB,MAAM,YAAY,CAAC;AAOpB,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAA+B;IAG9C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAG7C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;gBAE3B,MAAM,EAAE,WAAW;IAsC/B;;;;;;OAMG;IACG,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoDvD;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAKjF;;;;;;;OAOG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM;;;;;;IAcjD,sDAAsD;IACtD,qBAAqB,CAAC,UAAU,EAAE,MAAM;IAIxC,gEAAgE;IAChE,eAAe,CAAC,UAAU,EAAE,MAAM;;;;;IAKlC;;;;;;OAMG;IACH,yBAAyB,CAAC,MAAM,CAAC,EAAE,gBAAgB;IAInD;;;;;;OAMG;IACH,oBAAoB,CAAC,MAAM,CAAC,EAAE,gBAAgB;IAY9C;;;;;;OAMG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAM,EAAE,QAAQ,SAAS,GAAG,OAAO;IAkBrE,8BAA8B;IAC9B,SAAS,CAAC,KAAK,SAAM,GAAG,gBAAgB,EAAE;IAI1C,+BAA+B;IAC/B,SAAS,CAAC,iBAAiB,UAAQ,GAAG,WAAW,EAAE;IAInD,6BAA6B;IAC7B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOtC,oDAAoD;IAC9C,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;IAKjD,KAAK;;;;;;;YAiBS,WAAW;CAW5B"}
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TitanShield = void 0;
7
+ const events_1 = __importDefault(require("events"));
8
+ const audit_js_1 = require("./audit.js");
9
+ const threats_js_1 = require("./threats.js");
10
+ const validate_js_1 = require("./validate.js");
11
+ const compliance_js_1 = require("./compliance.js");
12
+ const prevent_js_1 = require("./prevent.js");
13
+ const quantum_js_1 = require("./quantum.js");
14
+ const nlrules_js_1 = require("./nlrules.js");
15
+ const dna_js_1 = require("./dna.js");
16
+ const collective_js_1 = require("./collective.js");
17
+ const battle_js_1 = require("./battle.js");
18
+ const biometrics_js_1 = require("./biometrics.js");
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // TitanShield — Main SDK Class
21
+ // The single entry point developers interact with
22
+ // ─────────────────────────────────────────────────────────────────────────────
23
+ class TitanShield extends events_1.default {
24
+ constructor(config) {
25
+ super();
26
+ this.eventStore = []; // In-memory store (use Firestore in prod)
27
+ this.alertStore = [];
28
+ this.rateMap = new Map(); // key → [timestamps]
29
+ this.config = {
30
+ env: 'production',
31
+ geminiApiKey: '',
32
+ firestoreCredentials: {},
33
+ webhookUrl: '',
34
+ ...config,
35
+ };
36
+ this.threatEngine = new threats_js_1.ThreatEngine(this.config.geminiApiKey || undefined);
37
+ // v0.2 Prevention layers
38
+ this.lockout = new prevent_js_1.AccountLockout();
39
+ this.ipEngine = new prevent_js_1.IpReputationEngine();
40
+ this.fingerprinter = new prevent_js_1.SessionFingerprinter();
41
+ // v0.3 World-First Modules
42
+ this.quantum = new quantum_js_1.QuantumAuditChain();
43
+ this.qrng = new quantum_js_1.QuantumRandom();
44
+ this.nlRules = new nlrules_js_1.NaturalLanguageRuleParser(this.config.geminiApiKey || undefined);
45
+ this.dna = new dna_js_1.SecurityDNAProfiler(config.project);
46
+ this.collective = new collective_js_1.CollectiveDefenseNetwork(config.project);
47
+ this.battleReport = new battle_js_1.BattleReportGenerator(this.config.geminiApiKey || undefined);
48
+ this.biometrics = new biometrics_js_1.BiometricAnalyzer();
49
+ console.log(`[TitanShield] v0.3 — World's First & Best Security System\n` +
50
+ ` QUANTUM: ✅ ML-DSA-65 quantum signatures ✅ QRNG true-random tokens\n` +
51
+ ` AI: ✅ Natural language rules ✅ Security DNA profiling\n` +
52
+ ` ✅ AI threat detection ✅ AI code scanner ready\n` +
53
+ ` NETWORK: ✅ Collective defense network ✅ Auto IP blocklist\n` +
54
+ ` HUMAN: ✅ Behavioral biometrics ✅ Invisible bot detection\n` +
55
+ ` VIRAL: ✅ Monthly battle reports ✅ GitHub security badge\n` +
56
+ ` project: ${config.project} | env: ${this.config.env}`);
57
+ }
58
+ // ── Core: Audit Log ────────────────────────────────────────────────────────
59
+ /**
60
+ * Log a security-relevant event.
61
+ * Stores it in the tamper-proof chain and runs AI threat analysis asynchronously.
62
+ *
63
+ * @example
64
+ * await shield.log({ event: 'user.login', userId: 'u123', ip: '1.2.3.4', outcome: 'success' });
65
+ */
66
+ async log(event) {
67
+ // 1. Baseline anomaly scoring
68
+ const { score, factors } = (0, audit_js_1.computeBaselineAnomalyScore)(event, this.eventStore.slice(-100));
69
+ // 2. Build and store the event
70
+ const stored = (0, audit_js_1.buildStoredEvent)(event, this.config.project, this.config.env, {
71
+ anomalyScore: score,
72
+ });
73
+ this.eventStore.push(stored);
74
+ // Emit for real-time dashboard streaming
75
+ this.emit('event', stored);
76
+ // 3. AI threat analysis (async — don't block the caller)
77
+ if (score >= 20 || factors.length > 0) {
78
+ setImmediate(async () => {
79
+ try {
80
+ const { anomalyScore, alert } = await this.threatEngine.analyzeEvent({ ...stored, anomalyScore: score }, this.eventStore.slice(-50));
81
+ // Update the stored event with AI score
82
+ stored.anomalyScore = anomalyScore;
83
+ stored.threatFlag = alert !== null;
84
+ if (alert) {
85
+ this.alertStore.push(alert);
86
+ this.emit('threat', alert);
87
+ console.warn(`[TitanShield] 🚨 THREAT: ${alert.severity.toUpperCase()} — ${alert.narrative}`);
88
+ // v0.2: Auto-block the IP when AI detects a high/critical threat
89
+ const ip = event.ip;
90
+ if (ip && (alert.severity === 'critical' || alert.severity === 'high')) {
91
+ this.ipEngine.autoBlockFromThreat(ip, alert.narrative);
92
+ }
93
+ // Fire webhook if configured
94
+ if (this.config.webhookUrl) {
95
+ this.sendWebhook(alert).catch(() => { });
96
+ }
97
+ }
98
+ }
99
+ catch (e) {
100
+ console.error('[TitanShield] Threat analysis error:', e);
101
+ }
102
+ });
103
+ }
104
+ return stored;
105
+ }
106
+ // ── Input Validation ───────────────────────────────────────────────────────
107
+ /**
108
+ * Validate and sanitize input against a Zod schema.
109
+ * Automatically strips XSS and SQL injection patterns.
110
+ *
111
+ * @example
112
+ * const result = shield.validate(Schemas.login, req.body);
113
+ * if (!result.valid) return res.status(400).json(result.errors);
114
+ */
115
+ validate(schema, input) {
116
+ return (0, validate_js_1.validate)(schema, input);
117
+ }
118
+ // ── Account Lockout (v0.2) ────────────────────────────────────────────────
119
+ /**
120
+ * Record a failed login — auto-locks account after maxFailedLogins attempts.
121
+ * Returns { locked, attemptsLeft, message } in plain English.
122
+ *
123
+ * @example
124
+ * const status = shield.recordFailedLogin(userId, req.ip);
125
+ * if (status.locked) return res.status(423).json({ error: status.message });
126
+ */
127
+ recordFailedLogin(identifier, ip) {
128
+ const result = this.lockout.recordFailure(identifier, ip);
129
+ if (result.locked) {
130
+ this.log({
131
+ event: 'user.login_failed',
132
+ userId: identifier,
133
+ ip: ip || 'unknown',
134
+ outcome: 'blocked',
135
+ metadata: { reason: 'account_lockout', attemptsLeft: 0 }
136
+ }).catch(() => { });
137
+ }
138
+ return result;
139
+ }
140
+ /** Call on successful login to clear lockout state */
141
+ recordSuccessfulLogin(identifier) {
142
+ this.lockout.recordSuccess(identifier);
143
+ }
144
+ /** Check if an account is locked before even attempting auth */
145
+ isAccountLocked(identifier) {
146
+ return this.lockout.isLocked(identifier);
147
+ }
148
+ // ── Express Middlewares (v0.2) ────────────────────────────────────────────
149
+ /**
150
+ * Returns Express security headers middleware.
151
+ * Adds CSP, HSTS, X-Frame-Options, Permissions-Policy, and more.
152
+ *
153
+ * @example
154
+ * app.use(shield.securityHeadersMiddleware());
155
+ */
156
+ securityHeadersMiddleware(config) {
157
+ return (0, prevent_js_1.securityHeaders)(config);
158
+ }
159
+ /**
160
+ * Returns comprehensive prevention middleware.
161
+ * Combines IP reputation, bot detection, injection prevention.
162
+ *
163
+ * @example
164
+ * app.use(shield.preventionMiddleware());
165
+ */
166
+ preventionMiddleware(config) {
167
+ return (0, prevent_js_1.titanPreventionMiddleware)(this.lockout, this.ipEngine, config, (event, detail, ip) => {
168
+ this.log({ event: event, ip, outcome: 'blocked', metadata: { detail } }).catch(() => { });
169
+ });
170
+ }
171
+ // ── Rate Limiting ──────────────────────────────────────────────────────────
172
+ /**
173
+ * Check if a key (IP, userId) has exceeded the rate limit.
174
+ * Returns true if the request should be ALLOWED.
175
+ *
176
+ * @example
177
+ * if (!shield.rateLimit(req.ip, 10, 60_000)) return res.status(429).end();
178
+ */
179
+ rateLimit(key, maxRequests = 100, windowMs = 60000) {
180
+ const now = Date.now();
181
+ const timestamps = (this.rateMap.get(key) || []).filter(t => now - t < windowMs);
182
+ timestamps.push(now);
183
+ this.rateMap.set(key, timestamps);
184
+ if (timestamps.length > maxRequests) {
185
+ // Log the rate limit violation
186
+ this.log({
187
+ event: 'security.ip_blocked', ip: key, outcome: 'blocked',
188
+ metadata: { reason: 'rate_limit', count: timestamps.length, windowMs }
189
+ }).catch(() => { });
190
+ return false;
191
+ }
192
+ return true;
193
+ }
194
+ // ── Query ──────────────────────────────────────────────────────────────────
195
+ /** Get recent audit events */
196
+ getEvents(limit = 100) {
197
+ return this.eventStore.slice(-limit).reverse();
198
+ }
199
+ /** Get active threat alerts */
200
+ getAlerts(includesDismissed = false) {
201
+ return includesDismissed ? this.alertStore : this.alertStore.filter(a => !a.dismissed);
202
+ }
203
+ /** Dismiss a threat alert */
204
+ dismissAlert(alertId) {
205
+ const alert = this.alertStore.find(a => a.id === alertId);
206
+ if (alert) {
207
+ alert.dismissed = true;
208
+ return true;
209
+ }
210
+ return false;
211
+ }
212
+ // ── Compliance ─────────────────────────────────────────────────────────────
213
+ /** Compute compliance score across all standards */
214
+ async complianceScore() {
215
+ return (0, compliance_js_1.computeComplianceScore)(this.eventStore);
216
+ }
217
+ // ── Stats ──────────────────────────────────────────────────────────────────
218
+ stats() {
219
+ const events = this.eventStore;
220
+ return {
221
+ totalEvents: events.length,
222
+ threats: this.alertStore.filter(a => !a.dismissed).length,
223
+ eventsLast24h: events.filter(e => Date.now() - e.timestamp.getTime() < 86400000).length,
224
+ avgAnomalyScore: events.length
225
+ ? Math.round(events.reduce((s, e) => s + e.anomalyScore, 0) / events.length)
226
+ : 0,
227
+ topEventTypes: [...events.reduce((m, e) => {
228
+ m.set(e.event, (m.get(e.event) || 0) + 1);
229
+ return m;
230
+ }, new Map()).entries()]
231
+ .sort((a, b) => b[1] - a[1]).slice(0, 5),
232
+ };
233
+ }
234
+ // ── Webhook ────────────────────────────────────────────────────────────────
235
+ async sendWebhook(alert) {
236
+ const body = JSON.stringify({
237
+ text: `🚨 *TitanShield Alert* [${alert.severity.toUpperCase()}]\n*${alert.narrative}*\n_Action: ${alert.recommendedAction}_`,
238
+ alert,
239
+ });
240
+ await fetch(this.config.webhookUrl, {
241
+ method: 'POST',
242
+ headers: { 'Content-Type': 'application/json' },
243
+ body,
244
+ });
245
+ }
246
+ }
247
+ exports.TitanShield = TitanShield;
248
+ //# sourceMappingURL=TitanShield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TitanShield.js","sourceRoot":"","sources":["../src/TitanShield.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAClC,yCAA2E;AAC3E,6CAA4C;AAC5C,+CAAqD;AACrD,mDAAyD;AACzD,6CAIsB;AACtB,6CAAgE;AAChE,6CAAyD;AACzD,qCAA+C;AAC/C,mDAA2D;AAC3D,2CAAoD;AACpD,mDAAoD;AAWpD,gFAAgF;AAChF,+BAA+B;AAC/B,kDAAkD;AAClD,gFAAgF;AAEhF,MAAa,WAAY,SAAQ,gBAAY;IAqBzC,YAAY,MAAmB;QAC3B,KAAK,EAAE,CAAC;QAnBJ,eAAU,GAAuB,EAAE,CAAC,CAAC,0CAA0C;QAC/E,eAAU,GAAkB,EAAE,CAAC;QAC/B,YAAO,GAAG,IAAI,GAAG,EAAoB,CAAC,CAAC,qBAAqB;QAkBhE,IAAI,CAAC,MAAM,GAAG;YACV,GAAG,EAAE,YAAY;YACjB,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,UAAU,EAAE,EAAE;YACd,GAAG,MAAM;SACZ,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,IAAI,yBAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC;QAE5E,yBAAyB;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,2BAAc,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,+BAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,iCAAoB,EAAE,CAAC;QAEhD,2BAA2B;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,8BAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,0BAAa,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,IAAI,sCAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC;QACpF,IAAI,CAAC,GAAG,GAAG,IAAI,4BAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,wCAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,GAAG,IAAI,iCAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC;QACrF,IAAI,CAAC,UAAU,GAAG,IAAI,iCAAiB,EAAE,CAAC;QAE1C,OAAO,CAAC,GAAG,CACP,6DAA6D;YAC7D,wEAAwE;YACxE,yEAAyE;YACzE,wEAAwE;YACxE,oEAAoE;YACpE,0EAA0E;YAC1E,wEAAwE;YACxE,cAAc,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAC3D,CAAC;IACN,CAAC;IAED,8EAA8E;IAC9E;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAiB;QACvB,8BAA8B;QAC9B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAA,sCAA2B,EAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3F,+BAA+B;QAC/B,MAAM,MAAM,GAAG,IAAA,2BAAgB,EAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACzE,YAAY,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7B,yCAAyC;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE3B,yDAAyD;QACzD,IAAI,KAAK,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,YAAY,CAAC,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC;oBACD,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAChE,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAC7B,CAAC;oBAEF,wCAAwC;oBACxC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;oBACnC,MAAM,CAAC,UAAU,GAAG,KAAK,KAAK,IAAI,CAAC;oBAEnC,IAAI,KAAK,EAAE,CAAC;wBACR,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;wBAC3B,OAAO,CAAC,IAAI,CAAC,4BAA4B,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;wBAE9F,iEAAiE;wBACjE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;wBACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;4BACrE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC3D,CAAC;wBAED,6BAA6B;wBAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;4BACzB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBAC7C,CAAC;oBACL,CAAC;gBACL,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E;;;;;;;OAOG;IACH,QAAQ,CAAI,MAAkC,EAAE,KAAc;QAC1D,OAAO,IAAA,sBAAQ,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,6EAA6E;IAC7E;;;;;;;OAOG;IACH,iBAAiB,CAAC,UAAkB,EAAE,EAAW;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC;gBACL,KAAK,EAAE,mBAAmB;gBAC1B,MAAM,EAAE,UAAU;gBAClB,EAAE,EAAE,EAAE,IAAI,SAAS;gBACnB,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC,EAAE;aAC3D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,sDAAsD;IACtD,qBAAqB,CAAC,UAAkB;QACpC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,gEAAgE;IAChE,eAAe,CAAC,UAAkB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,6EAA6E;IAC7E;;;;;;OAMG;IACH,yBAAyB,CAAC,MAAyB;QAC/C,OAAO,IAAA,4BAAe,EAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB,CAAC,MAAyB;QAC1C,OAAO,IAAA,sCAAyB,EAC5B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,MAAM,EACN,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;YAClB,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAY,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACrG,CAAC,CACJ,CAAC;IACN,CAAC;IAED,8EAA8E;IAC9E;;;;;;OAMG;IACH,SAAS,CAAC,GAAW,EAAE,WAAW,GAAG,GAAG,EAAE,QAAQ,GAAG,KAAM;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QACjF,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAElC,IAAI,UAAU,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAClC,+BAA+B;YAC/B,IAAI,CAAC,GAAG,CAAC;gBACL,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS;gBACzD,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE;aACzE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YACpB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,8EAA8E;IAC9E,8BAA8B;IAC9B,SAAS,CAAC,KAAK,GAAG,GAAG;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC;IAED,+BAA+B;IAC/B,SAAS,CAAC,iBAAiB,GAAG,KAAK;QAC/B,OAAO,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3F,CAAC;IAED,6BAA6B;IAC7B,YAAY,CAAC,OAAe;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,CAAC;YAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QACnD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,oDAAoD;IACpD,KAAK,CAAC,eAAe;QACjB,OAAO,IAAA,sCAAsB,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,8EAA8E;IAC9E,KAAK;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,OAAO;YACH,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM;YACzD,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,QAAU,CAAC,CAAC,MAAM;YACzF,eAAe,EAAE,MAAM,CAAC,MAAM;gBAC1B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC5E,CAAC,CAAC,CAAC;YACP,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACtC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAC,OAAO,CAAC,CAAC;gBACxD,CAAC,EAAE,IAAI,GAAG,EAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;iBACnC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SAC/C,CAAC;IACN,CAAC;IAED,8EAA8E;IACtE,KAAK,CAAC,WAAW,CAAC,KAAkB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YACxB,IAAI,EAAE,2BAA2B,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,iBAAiB,GAAG;YAC5H,KAAK;SACR,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI;SACP,CAAC,CAAC;IACP,CAAC;CACJ;AA/QD,kCA+QC"}
@@ -0,0 +1,8 @@
1
+ import type { AuditEvent, StoredAuditEvent } from './types.js';
2
+ export declare function computeEventHash(prevHash: string, event: AuditEvent, timestamp: Date): string;
3
+ export declare function buildStoredEvent(event: AuditEvent, project: string, env: string, overrides?: Partial<StoredAuditEvent>): StoredAuditEvent;
4
+ export declare function computeBaselineAnomalyScore(event: AuditEvent, recentEvents: StoredAuditEvent[]): {
5
+ score: number;
6
+ factors: string[];
7
+ };
8
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAS/D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,CAG7F;AAED,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAC1C,gBAAgB,CAkBlB;AAGD,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,gBAAgB,EAAE,GACjC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA8BtC"}
package/dist/audit.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.computeEventHash = computeEventHash;
7
+ exports.buildStoredEvent = buildStoredEvent;
8
+ exports.computeBaselineAnomalyScore = computeBaselineAnomalyScore;
9
+ const crypto_1 = __importDefault(require("crypto"));
10
+ // ─────────────────────────────────────────────────────────────────────────────
11
+ // Audit Module — Tamper-proof event logging with hash chain
12
+ // ─────────────────────────────────────────────────────────────────────────────
13
+ // In-memory prev hash (server restarts reset it — use Firestore for persistence)
14
+ let prevHash = '0000000000000000000000000000000000000000000000000000000000000000';
15
+ function computeEventHash(prevHash, event, timestamp) {
16
+ const payload = JSON.stringify({ prev: prevHash, event, ts: timestamp.toISOString() });
17
+ return crypto_1.default.createHash('sha256').update(payload).digest('hex');
18
+ }
19
+ function buildStoredEvent(event, project, env, overrides = {}) {
20
+ const timestamp = new Date();
21
+ const id = `ts_${Date.now()}_${crypto_1.default.randomBytes(4).toString('hex')}`;
22
+ const hash = computeEventHash(prevHash, event, timestamp);
23
+ prevHash = hash; // advance chain
24
+ return {
25
+ id,
26
+ project,
27
+ env,
28
+ timestamp,
29
+ hash,
30
+ severityScore: 0,
31
+ anomalyScore: 0,
32
+ threatFlag: false,
33
+ ...event,
34
+ ...overrides,
35
+ };
36
+ }
37
+ // Anomaly heuristics — upgrades to AI scoring when Gemini key is present
38
+ function computeBaselineAnomalyScore(event, recentEvents) {
39
+ const factors = [];
40
+ let score = 0;
41
+ // High-risk event types
42
+ const highRiskEvents = ['user.login_failed', 'data.delete', 'data.export', 'admin.user_elevated', 'api.key_revoked'];
43
+ if (highRiskEvents.includes(event.event)) {
44
+ score += 30;
45
+ factors.push('high_risk_event');
46
+ }
47
+ // Brute force: >5 failed logins from same IP in last 10 events
48
+ if (event.event === 'user.login_failed' && event.ip) {
49
+ const sameIpFailures = recentEvents.filter(e => e.event === 'user.login_failed' && e.ip === event.ip);
50
+ if (sameIpFailures.length >= 4) {
51
+ score += 40;
52
+ factors.push('brute_force_pattern');
53
+ }
54
+ }
55
+ // High frequency: >20 events from same user in last minute
56
+ if (event.userId) {
57
+ const recentUserEvents = recentEvents.filter(e => e.userId === event.userId && Date.now() - e.timestamp.getTime() < 60000);
58
+ if (recentUserEvents.length >= 20) {
59
+ score += 35;
60
+ factors.push('high_frequency');
61
+ }
62
+ }
63
+ // Unusual hour (2am-5am UTC)
64
+ const hour = new Date().getUTCHours();
65
+ if (hour >= 2 && hour <= 5) {
66
+ score += 10;
67
+ factors.push('unusual_hour');
68
+ }
69
+ // Failed outcome
70
+ if (event.outcome === 'failure') {
71
+ score += 15;
72
+ factors.push('failed_outcome');
73
+ }
74
+ return { score: Math.min(score, 100), factors };
75
+ }
76
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
package/dist/auto.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import type { Request, Response, NextFunction } from 'express';
2
+ import { TitanShield } from './TitanShield.js';
3
+ export declare const shield: TitanShield;
4
+ export declare function titanMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
5
+ export declare function protect(app: {
6
+ use: (...args: unknown[]) => unknown;
7
+ }): {
8
+ use: (...args: unknown[]) => unknown;
9
+ };
10
+ export { TitanShield } from './TitanShield.js';
11
+ export { Schemas } from './validate.js';
12
+ //# sourceMappingURL=auto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.d.ts","sourceRoot":"","sources":["../src/auto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAuB/D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAW/C,eAAO,MAAM,MAAM,aAAkC,CAAC;AAoBtD,wBAAgB,eAAe,KACiB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBA6D9F;AAGD,wBAAgB,OAAO,CAAC,GAAG,EAAE;IAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAE;SAAjC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO;EAQlE;AAQD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
package/dist/auto.js ADDED
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Schemas = exports.TitanShield = exports.shield = void 0;
4
+ exports.titanMiddleware = titanMiddleware;
5
+ exports.protect = protect;
6
+ // ─────────────────────────────────────────────────────────────────────────────
7
+ // @titanshield/auto — World's First Zero-Code Security Auto-Instrumentation
8
+ //
9
+ // HOW TO USE: Just add ONE flag when starting your server. That's it.
10
+ //
11
+ // node -r @titanshield/auto your-server.js
12
+ //
13
+ // OR require it at the very top of your entry file:
14
+ //
15
+ // require('@titanshield/auto'); // ← ONE LINE. Everything else: automatic.
16
+ //
17
+ // TitanShield will automatically:
18
+ // ✅ Log every login, logout, and failed attempt
19
+ // ✅ Block bad guys who try too many times
20
+ // ✅ Clean up dangerous text before it reaches your code
21
+ // ✅ Detect and alert on suspicious patterns
22
+ // ✅ Track compliance events
23
+ //
24
+ // No configuration. No code changes. No PhD required.
25
+ // ─────────────────────────────────────────────────────────────────────────────
26
+ const TitanShield_js_1 = require("./TitanShield.js");
27
+ const DEFAULT_CONFIG = {
28
+ apiKey: process.env.TITANSHIELD_API_KEY || 'ts_auto_key',
29
+ project: process.env.TITANSHIELD_PROJECT || process.env.npm_package_name || 'my-app',
30
+ env: process.env.NODE_ENV || 'development',
31
+ geminiApiKey: process.env.GEMINI_API_KEY,
32
+ webhookUrl: process.env.TITANSHIELD_WEBHOOK_URL,
33
+ };
34
+ // Global singleton — shared across the entire app
35
+ exports.shield = new TitanShield_js_1.TitanShield(DEFAULT_CONFIG);
36
+ // ── XSS / SQLi auto-sanitizer ─────────────────────────────────────────────────
37
+ const XSS = /<script[\s\S]*?>[\s\S]*?<\/script>|javascript:|on\w+\s*=|<iframe|<object/gi;
38
+ const SQLI = /(\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|EXEC|DECLARE)\b)|(-{2}|\/\*|\*\/)/gi;
39
+ function deepSanitize(obj) {
40
+ if (typeof obj === 'string')
41
+ return obj.replace(XSS, '').replace(SQLI, '').trim();
42
+ if (Array.isArray(obj))
43
+ return obj.map(deepSanitize);
44
+ if (obj && typeof obj === 'object') {
45
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, deepSanitize(v)]));
46
+ }
47
+ return obj;
48
+ }
49
+ // ── Express middleware factory ────────────────────────────────────────────────
50
+ // Call shield.middleware() to get Express middleware, OR use shield.protect(app)
51
+ function titanMiddleware() {
52
+ return async function titanShieldMiddleware(req, res, next) {
53
+ const ip = req.headers['x-forwarded-for']?.split(',')[0] || req.ip || '0.0.0.0';
54
+ const ua = req.headers['user-agent'] || '';
55
+ // 1. Auto rate-limit (100 req/min per IP by default)
56
+ const limit = parseInt(process.env.TITANSHIELD_RATE_LIMIT || '100');
57
+ if (!exports.shield.rateLimit(ip, limit, 60000)) {
58
+ await exports.shield.log({
59
+ event: 'security.ip_blocked', ip, userAgent: ua, outcome: 'blocked',
60
+ metadata: { reason: 'rate_limit', path: req.path }
61
+ });
62
+ res.status(429).json({
63
+ error: 'Slow down! You\'re making too many requests.',
64
+ retryAfter: '60 seconds',
65
+ });
66
+ return;
67
+ }
68
+ // 2. Auto-sanitize request body (strip XSS + SQLi silently)
69
+ if (req.body && typeof req.body === 'object') {
70
+ req.body = deepSanitize(req.body);
71
+ }
72
+ // 3. Auto-detect and log auth events from common patterns
73
+ const path = req.path.toLowerCase();
74
+ const isLoginRoute = /\/(login|signin|auth|token)/.test(path);
75
+ const isLogoutRoute = /\/(logout|signout)/.test(path);
76
+ const isSignupRoute = /\/(signup|register|create.?account)/.test(path);
77
+ // Hook into response to capture outcome
78
+ const originalJson = res.json.bind(res);
79
+ res.json = function (body) {
80
+ const statusCode = res.statusCode;
81
+ const success = statusCode < 400;
82
+ if (isLoginRoute && req.method === 'POST') {
83
+ const userId = req.body?.email || req.body?.username;
84
+ exports.shield.log({
85
+ event: success ? 'user.login' : 'user.login_failed',
86
+ userId, ip, userAgent: ua,
87
+ outcome: success ? 'success' : 'failure',
88
+ metadata: { path: req.path, statusCode }
89
+ }).catch(() => { });
90
+ }
91
+ else if (isLogoutRoute && success) {
92
+ exports.shield.log({ event: 'user.logout', ip, userAgent: ua, outcome: 'success' }).catch(() => { });
93
+ }
94
+ else if (isSignupRoute && req.method === 'POST' && success) {
95
+ const userId = req.body?.email;
96
+ exports.shield.log({ event: 'user.signup', userId, ip, userAgent: ua, outcome: 'success' }).catch(() => { });
97
+ }
98
+ else if (!success && statusCode >= 500) {
99
+ // Log server errors as security-relevant events
100
+ exports.shield.log({
101
+ event: 'security.threat_detected', ip, userAgent: ua, outcome: 'failure',
102
+ metadata: { statusCode, path: req.path, method: req.method }
103
+ }).catch(() => { });
104
+ }
105
+ return originalJson(body);
106
+ };
107
+ next();
108
+ };
109
+ }
110
+ // ── protect(app) — Wraps an existing Express app with ONE call ────────────────
111
+ function protect(app) {
112
+ app.use(titanMiddleware());
113
+ console.log(`\n🛡️ [TitanShieldAI] Auto-protection active!`);
114
+ console.log(` Project: ${DEFAULT_CONFIG.project} | Env: ${DEFAULT_CONFIG.env}`);
115
+ console.log(` ✅ Rate limiting: ON ✅ XSS/SQLi sanitization: ON ✅ Audit logging: ON`);
116
+ console.log(` ✅ AI threat detection: ${DEFAULT_CONFIG.geminiApiKey ? 'ON (Gemini)' : 'ON (heuristic)'}`);
117
+ console.log(` Dashboard: run 'titanshield dashboard' to view\n`);
118
+ return app;
119
+ }
120
+ // When required as -r flag, print startup banner
121
+ console.log(`\n🛡️ TitanShieldAI auto-instrumentation loaded.`);
122
+ console.log(` Call shield.protect(app) to activate — or use titanMiddleware() in your routes.`);
123
+ console.log(` Zero config needed. Titan tough. Shield strong.\n`);
124
+ // Re-export shield instance for direct use
125
+ var TitanShield_js_2 = require("./TitanShield.js");
126
+ Object.defineProperty(exports, "TitanShield", { enumerable: true, get: function () { return TitanShield_js_2.TitanShield; } });
127
+ var validate_js_1 = require("./validate.js");
128
+ Object.defineProperty(exports, "Schemas", { enumerable: true, get: function () { return validate_js_1.Schemas; } });
129
+ //# sourceMappingURL=auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.js","sourceRoot":"","sources":["../src/auto.ts"],"names":[],"mappings":"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"}