ai-appshield 1.0.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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/browser/shield.min.js +19 -0
  4. package/dist/browser/BotDetector.d.ts +9 -0
  5. package/dist/browser/BotDetector.d.ts.map +1 -0
  6. package/dist/browser/BotDetector.js +99 -0
  7. package/dist/browser/BotDetector.js.map +1 -0
  8. package/dist/browser/ContentProtector.d.ts +27 -0
  9. package/dist/browser/ContentProtector.d.ts.map +1 -0
  10. package/dist/browser/ContentProtector.js +136 -0
  11. package/dist/browser/ContentProtector.js.map +1 -0
  12. package/dist/browser/DevToolsGuard.d.ts +16 -0
  13. package/dist/browser/DevToolsGuard.d.ts.map +1 -0
  14. package/dist/browser/DevToolsGuard.js +89 -0
  15. package/dist/browser/DevToolsGuard.js.map +1 -0
  16. package/dist/browser/Fingerprint.d.ts +30 -0
  17. package/dist/browser/Fingerprint.d.ts.map +1 -0
  18. package/dist/browser/Fingerprint.js +143 -0
  19. package/dist/browser/Fingerprint.js.map +1 -0
  20. package/dist/browser/Shield.d.ts +35 -0
  21. package/dist/browser/Shield.d.ts.map +1 -0
  22. package/dist/browser/Shield.js +177 -0
  23. package/dist/browser/Shield.js.map +1 -0
  24. package/dist/browser/index.d.ts +4 -0
  25. package/dist/browser/index.d.ts.map +1 -0
  26. package/dist/browser/index.js +11 -0
  27. package/dist/browser/index.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +269 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/core/config.d.ts +65 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/config.js +21 -0
  35. package/dist/core/config.js.map +1 -0
  36. package/dist/index.d.ts +6 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +17 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/server/BotAnalyzer.d.ts +24 -0
  41. package/dist/server/BotAnalyzer.d.ts.map +1 -0
  42. package/dist/server/BotAnalyzer.js +124 -0
  43. package/dist/server/BotAnalyzer.js.map +1 -0
  44. package/dist/server/index.d.ts +4 -0
  45. package/dist/server/index.d.ts.map +1 -0
  46. package/dist/server/index.js +10 -0
  47. package/dist/server/index.js.map +1 -0
  48. package/dist/server/middleware.d.ts +28 -0
  49. package/dist/server/middleware.d.ts.map +1 -0
  50. package/dist/server/middleware.js +63 -0
  51. package/dist/server/middleware.js.map +1 -0
  52. package/dist/utils/obfuscate.d.ts +21 -0
  53. package/dist/utils/obfuscate.d.ts.map +1 -0
  54. package/dist/utils/obfuscate.js +59 -0
  55. package/dist/utils/obfuscate.js.map +1 -0
  56. package/dist/utils/signatures.d.ts +13 -0
  57. package/dist/utils/signatures.d.ts.map +1 -0
  58. package/dist/utils/signatures.js +87 -0
  59. package/dist/utils/signatures.js.map +1 -0
  60. package/package.json +73 -0
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DevToolsGuard = void 0;
4
+ class DevToolsGuard {
5
+ constructor(options = {}) {
6
+ this.intervalId = null;
7
+ this.options = {
8
+ checkInterval: options.checkInterval ?? 1000,
9
+ threshold: options.threshold ?? 160,
10
+ onDetected: options.onDetected ?? (() => { }),
11
+ };
12
+ }
13
+ start() {
14
+ if (typeof window === 'undefined')
15
+ return;
16
+ // Method 1: Window size differential
17
+ this.intervalId = setInterval(() => {
18
+ const widthDiff = window.outerWidth - window.innerWidth;
19
+ const heightDiff = window.outerHeight - window.innerHeight;
20
+ if (widthDiff > this.options.threshold || heightDiff > this.options.threshold) {
21
+ this.options.onDetected({
22
+ type: 'devtools_open',
23
+ severity: 'high',
24
+ message: 'Developer tools detected via window size differential',
25
+ timestamp: Date.now(),
26
+ metadata: { widthDiff, heightDiff },
27
+ });
28
+ }
29
+ }, this.options.checkInterval);
30
+ // Method 2: Debugger timing trap
31
+ this.setupDebuggerTrap();
32
+ // Method 3: Console detection via toString override
33
+ this.setupConsoleDetection();
34
+ }
35
+ stop() {
36
+ if (this.intervalId) {
37
+ clearInterval(this.intervalId);
38
+ this.intervalId = null;
39
+ }
40
+ }
41
+ setupDebuggerTrap() {
42
+ if (typeof window === 'undefined')
43
+ return;
44
+ setInterval(() => {
45
+ const start = performance.now();
46
+ // eslint-disable-next-line no-debugger
47
+ const fn = new Function('debugger');
48
+ try {
49
+ fn();
50
+ }
51
+ catch {
52
+ // ignore
53
+ }
54
+ const elapsed = performance.now() - start;
55
+ if (elapsed > 100) {
56
+ this.options.onDetected({
57
+ type: 'devtools_open',
58
+ severity: 'high',
59
+ message: 'Developer tools detected via debugger timing',
60
+ timestamp: Date.now(),
61
+ metadata: { elapsed },
62
+ });
63
+ }
64
+ }, 3000);
65
+ }
66
+ setupConsoleDetection() {
67
+ if (typeof window === 'undefined')
68
+ return;
69
+ const element = new Image();
70
+ Object.defineProperty(element, 'id', {
71
+ get: () => {
72
+ this.options.onDetected({
73
+ type: 'devtools_open',
74
+ severity: 'medium',
75
+ message: 'Developer tools detected via console inspection',
76
+ timestamp: Date.now(),
77
+ });
78
+ return '';
79
+ },
80
+ });
81
+ // Periodically log the trap element
82
+ setInterval(() => {
83
+ // Trigger getter if devtools console is open
84
+ void element.id;
85
+ }, 2000);
86
+ }
87
+ }
88
+ exports.DevToolsGuard = DevToolsGuard;
89
+ //# sourceMappingURL=DevToolsGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevToolsGuard.js","sourceRoot":"","sources":["../../src/browser/DevToolsGuard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ThreatEvent } from '../core/config';
2
+ export interface FingerprintData {
3
+ hash: string;
4
+ userAgent: string;
5
+ language: string;
6
+ platform: string;
7
+ screenResolution: string;
8
+ timezone: string;
9
+ colorDepth: number;
10
+ hardwareConcurrency: number;
11
+ canvas: string;
12
+ webgl: string;
13
+ timestamp: number;
14
+ }
15
+ export declare function collectFingerprint(): FingerprintData;
16
+ export interface HoneypotOptions {
17
+ containerSelector?: string;
18
+ onTriggered?: (event: ThreatEvent) => void;
19
+ }
20
+ export declare class Honeypot {
21
+ private fieldName;
22
+ private options;
23
+ constructor(options?: HoneypotOptions);
24
+ /** Inject a hidden honeypot field into the page */
25
+ inject(): string;
26
+ /** Validate form submission — returns true if honeypot was triggered (bot) */
27
+ validate(formData: FormData | Record<string, string>): boolean;
28
+ getFieldName(): string;
29
+ }
30
+ //# sourceMappingURL=Fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fingerprint.d.ts","sourceRoot":"","sources":["../../src/browser/Fingerprint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CA+BpD;AA0CD,MAAM,WAAW,eAAe;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAA4B;gBAE/B,OAAO,GAAE,eAAoB;IAQzC,mDAAmD;IACnD,MAAM,IAAI,MAAM;IAyChB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;IAmB9D,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Honeypot = void 0;
4
+ exports.collectFingerprint = collectFingerprint;
5
+ const obfuscate_1 = require("../utils/obfuscate");
6
+ const obfuscate_2 = require("../utils/obfuscate");
7
+ function collectFingerprint() {
8
+ const nav = typeof navigator !== 'undefined' ? navigator : {};
9
+ const screen = typeof globalThis.screen !== 'undefined' ? globalThis.screen : {};
10
+ const components = [
11
+ nav.userAgent ?? '',
12
+ nav.language ?? '',
13
+ nav.platform ?? '',
14
+ `${screen.width ?? 0}x${screen.height ?? 0}`,
15
+ Intl.DateTimeFormat().resolvedOptions().timeZone ?? '',
16
+ String(screen.colorDepth ?? 0),
17
+ String(nav.hardwareConcurrency ?? 0),
18
+ getCanvasFingerprint(),
19
+ getWebGLFingerprint(),
20
+ ];
21
+ const raw = components.join('|');
22
+ return {
23
+ hash: (0, obfuscate_1.simpleHash)(raw),
24
+ userAgent: nav.userAgent ?? '',
25
+ language: nav.language ?? '',
26
+ platform: nav.platform ?? '',
27
+ screenResolution: `${screen.width ?? 0}x${screen.height ?? 0}`,
28
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone ?? '',
29
+ colorDepth: screen.colorDepth ?? 0,
30
+ hardwareConcurrency: nav.hardwareConcurrency ?? 0,
31
+ canvas: getCanvasFingerprint(),
32
+ webgl: getWebGLFingerprint(),
33
+ timestamp: Date.now(),
34
+ };
35
+ }
36
+ function getCanvasFingerprint() {
37
+ if (typeof document === 'undefined')
38
+ return '';
39
+ try {
40
+ const canvas = document.createElement('canvas');
41
+ const ctx = canvas.getContext('2d');
42
+ if (!ctx)
43
+ return '';
44
+ ctx.textBaseline = 'top';
45
+ ctx.font = '14px Arial';
46
+ ctx.fillStyle = '#f60';
47
+ ctx.fillRect(125, 1, 62, 20);
48
+ ctx.fillStyle = '#069';
49
+ ctx.fillText('ai-appshield', 2, 15);
50
+ ctx.fillStyle = 'rgba(102, 204, 0, 0.7)';
51
+ ctx.fillText('fingerprint', 4, 17);
52
+ return (0, obfuscate_1.simpleHash)(canvas.toDataURL());
53
+ }
54
+ catch {
55
+ return '';
56
+ }
57
+ }
58
+ function getWebGLFingerprint() {
59
+ if (typeof document === 'undefined')
60
+ return '';
61
+ try {
62
+ const canvas = document.createElement('canvas');
63
+ const gl = canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl');
64
+ if (!gl || !(gl instanceof WebGLRenderingContext))
65
+ return '';
66
+ const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
67
+ if (!debugInfo)
68
+ return '';
69
+ const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
70
+ const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
71
+ return (0, obfuscate_1.simpleHash)(`${vendor}|${renderer}`);
72
+ }
73
+ catch {
74
+ return '';
75
+ }
76
+ }
77
+ class Honeypot {
78
+ constructor(options = {}) {
79
+ this.fieldName = (0, obfuscate_2.generateHoneypotName)();
80
+ this.options = {
81
+ containerSelector: options.containerSelector ?? 'body',
82
+ onTriggered: options.onTriggered ?? (() => { }),
83
+ };
84
+ }
85
+ /** Inject a hidden honeypot field into the page */
86
+ inject() {
87
+ if (typeof document === 'undefined')
88
+ return this.fieldName;
89
+ const container = document.querySelector(this.options.containerSelector) ?? document.body;
90
+ const input = document.createElement('input');
91
+ input.type = 'text';
92
+ input.name = this.fieldName;
93
+ input.id = this.fieldName;
94
+ input.setAttribute('autocomplete', 'off');
95
+ input.setAttribute('tabindex', '-1');
96
+ input.setAttribute('aria-hidden', 'true');
97
+ input.style.cssText =
98
+ 'position:absolute;left:-9999px;top:-9999px;opacity:0;height:0;width:0;z-index:-1;pointer-events:none;';
99
+ // Also add a hidden link trap for scrapers
100
+ const link = document.createElement('a');
101
+ link.href = '/api/internal-data-export';
102
+ link.textContent = 'Admin Data Export';
103
+ link.style.cssText = 'position:absolute;left:-9999px;opacity:0;font-size:0;';
104
+ link.setAttribute('data-honeypot', 'true');
105
+ container.appendChild(input);
106
+ container.appendChild(link);
107
+ // Monitor if honeypot gets filled (bot behavior)
108
+ input.addEventListener('input', () => {
109
+ if (input.value.length > 0) {
110
+ this.options.onTriggered({
111
+ type: 'honeypot_triggered',
112
+ severity: 'critical',
113
+ message: `Honeypot field "${this.fieldName}" was filled`,
114
+ timestamp: Date.now(),
115
+ metadata: { fieldName: this.fieldName, value: input.value },
116
+ });
117
+ }
118
+ });
119
+ return this.fieldName;
120
+ }
121
+ /** Validate form submission — returns true if honeypot was triggered (bot) */
122
+ validate(formData) {
123
+ const value = formData instanceof FormData
124
+ ? formData.get(this.fieldName)
125
+ : formData[this.fieldName];
126
+ if (value && String(value).length > 0) {
127
+ this.options.onTriggered({
128
+ type: 'honeypot_triggered',
129
+ severity: 'critical',
130
+ message: `Honeypot triggered on validation`,
131
+ timestamp: Date.now(),
132
+ metadata: { fieldName: this.fieldName },
133
+ });
134
+ return true;
135
+ }
136
+ return false;
137
+ }
138
+ getFieldName() {
139
+ return this.fieldName;
140
+ }
141
+ }
142
+ exports.Honeypot = Honeypot;
143
+ //# sourceMappingURL=Fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fingerprint.js","sourceRoot":"","sources":["../../src/browser/Fingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type ShieldConfig, type ThreatEvent } from '../core/config';
2
+ export declare class Shield {
3
+ private config;
4
+ private devToolsGuard;
5
+ private contentProtector;
6
+ private honeypot;
7
+ private active;
8
+ private threats;
9
+ constructor(config?: ShieldConfig);
10
+ /** Initialize all enabled protection layers */
11
+ activate(): this;
12
+ /** Tear down all protection layers */
13
+ deactivate(): this;
14
+ /** Get collected threat events */
15
+ getThreats(): ThreatEvent[];
16
+ /** Get current browser fingerprint */
17
+ getFingerprint(): import("./Fingerprint").FingerprintData;
18
+ /** Get honeypot field name (for form integration) */
19
+ getHoneypotFieldName(): string | null;
20
+ /** Manually run bot detection check */
21
+ checkBot(): import("./BotDetector").BotDetectionResult;
22
+ private runBotDetection;
23
+ private handleThreat;
24
+ private blockPage;
25
+ private reportThreat;
26
+ private sendFingerprint;
27
+ private log;
28
+ }
29
+ /** Quick-start: create and activate shield with one call */
30
+ export declare function protect(config?: ShieldConfig): Shield;
31
+ export { detectBot, createBotThreatEvent } from './BotDetector';
32
+ export { DevToolsGuard } from './DevToolsGuard';
33
+ export { ContentProtector } from './ContentProtector';
34
+ export { Honeypot, collectFingerprint } from './Fingerprint';
35
+ //# sourceMappingURL=Shield.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shield.d.ts","sourceRoot":"","sources":["../../src/browser/Shield.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAMxB,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAqB;gBAExB,MAAM,GAAE,YAAiB;IAIrC,+CAA+C;IAC/C,QAAQ,IAAI,IAAI;IA6ChB,sCAAsC;IACtC,UAAU,IAAI,IAAI;IAQlB,kCAAkC;IAClC,UAAU,IAAI,WAAW,EAAE;IAI3B,sCAAsC;IACtC,cAAc;IAId,qDAAqD;IACrD,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAIrC,uCAAuC;IACvC,QAAQ;IAIR,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;IAyBpB,OAAO,CAAC,SAAS;YAQH,YAAY;YAYZ,eAAe;IAkB7B,OAAO,CAAC,GAAG;CAKZ;AAED,4DAA4D;AAC5D,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAIrD;AAED,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectFingerprint = exports.Honeypot = exports.ContentProtector = exports.DevToolsGuard = exports.createBotThreatEvent = exports.detectBot = exports.Shield = void 0;
4
+ exports.protect = protect;
5
+ const config_1 = require("../core/config");
6
+ const BotDetector_1 = require("./BotDetector");
7
+ const DevToolsGuard_1 = require("./DevToolsGuard");
8
+ const ContentProtector_1 = require("./ContentProtector");
9
+ const Fingerprint_1 = require("./Fingerprint");
10
+ class Shield {
11
+ constructor(config = {}) {
12
+ this.devToolsGuard = null;
13
+ this.contentProtector = null;
14
+ this.honeypot = null;
15
+ this.active = false;
16
+ this.threats = [];
17
+ this.config = { ...config_1.DEFAULT_SHIELD_CONFIG, ...config };
18
+ }
19
+ /** Initialize all enabled protection layers */
20
+ activate() {
21
+ if (this.active)
22
+ return this;
23
+ if (typeof window === 'undefined') {
24
+ console.warn('[ai-appshield] Browser environment required for client-side protection');
25
+ return this;
26
+ }
27
+ this.active = true;
28
+ this.log('Activating ai-appshield protection...');
29
+ if (this.config.botDetection) {
30
+ this.runBotDetection();
31
+ }
32
+ if (this.config.devToolsGuard) {
33
+ this.devToolsGuard = new DevToolsGuard_1.DevToolsGuard({
34
+ onDetected: (event) => this.handleThreat(event),
35
+ });
36
+ this.devToolsGuard.start();
37
+ }
38
+ if (this.config.contentProtection || this.config.obfuscateContent) {
39
+ this.contentProtector = new ContentProtector_1.ContentProtector({
40
+ selector: this.config.protectSelector,
41
+ obfuscateElements: this.config.obfuscateContent,
42
+ onScrapeAttempt: (event) => this.handleThreat(event),
43
+ });
44
+ this.contentProtector.activate();
45
+ }
46
+ if (this.config.honeypot) {
47
+ this.honeypot = new Fingerprint_1.Honeypot({
48
+ onTriggered: (event) => this.handleThreat(event),
49
+ });
50
+ this.honeypot.inject();
51
+ }
52
+ if (this.config.fingerprint) {
53
+ this.sendFingerprint();
54
+ }
55
+ this.log('ai-appshield protection active');
56
+ return this;
57
+ }
58
+ /** Tear down all protection layers */
59
+ deactivate() {
60
+ this.devToolsGuard?.stop();
61
+ this.contentProtector?.deactivate();
62
+ this.active = false;
63
+ this.log('ai-appshield protection deactivated');
64
+ return this;
65
+ }
66
+ /** Get collected threat events */
67
+ getThreats() {
68
+ return [...this.threats];
69
+ }
70
+ /** Get current browser fingerprint */
71
+ getFingerprint() {
72
+ return (0, Fingerprint_1.collectFingerprint)();
73
+ }
74
+ /** Get honeypot field name (for form integration) */
75
+ getHoneypotFieldName() {
76
+ return this.honeypot?.getFieldName() ?? null;
77
+ }
78
+ /** Manually run bot detection check */
79
+ checkBot() {
80
+ return (0, BotDetector_1.detectBot)();
81
+ }
82
+ runBotDetection() {
83
+ const result = (0, BotDetector_1.detectBot)();
84
+ if (result.isBot) {
85
+ this.handleThreat((0, BotDetector_1.createBotThreatEvent)(result));
86
+ }
87
+ // Re-check periodically
88
+ setInterval(() => {
89
+ const recheck = (0, BotDetector_1.detectBot)();
90
+ if (recheck.isBot) {
91
+ this.handleThreat((0, BotDetector_1.createBotThreatEvent)(recheck));
92
+ }
93
+ }, 5000);
94
+ }
95
+ handleThreat(event) {
96
+ this.threats.push(event);
97
+ this.log(`Threat detected: ${event.type} — ${event.message}`);
98
+ this.config.onThreatDetected?.(event);
99
+ if (this.config.reportEndpoint) {
100
+ this.reportThreat(event);
101
+ }
102
+ switch (this.config.threatAction) {
103
+ case 'block':
104
+ this.blockPage();
105
+ break;
106
+ case 'redirect':
107
+ if (this.config.redirectUrl) {
108
+ window.location.href = this.config.redirectUrl;
109
+ }
110
+ break;
111
+ case 'warn':
112
+ default:
113
+ break;
114
+ }
115
+ }
116
+ blockPage() {
117
+ if (typeof document === 'undefined')
118
+ return;
119
+ document.body.innerHTML =
120
+ '<div style="display:flex;align-items:center;justify-content:center;height:100vh;font-family:sans-serif;color:#333;">' +
121
+ '<div style="text-align:center;"><h1>Access Denied</h1><p>Automated access is not permitted.</p></div></div>';
122
+ throw new Error('[ai-appshield] Access blocked');
123
+ }
124
+ async reportThreat(event) {
125
+ try {
126
+ await fetch(this.config.reportEndpoint, {
127
+ method: 'POST',
128
+ headers: { 'Content-Type': 'application/json' },
129
+ body: JSON.stringify(event),
130
+ });
131
+ }
132
+ catch {
133
+ this.log('Failed to report threat to server');
134
+ }
135
+ }
136
+ async sendFingerprint() {
137
+ const fp = (0, Fingerprint_1.collectFingerprint)();
138
+ if (this.config.reportEndpoint) {
139
+ try {
140
+ await fetch(this.config.reportEndpoint, {
141
+ method: 'POST',
142
+ headers: {
143
+ 'Content-Type': 'application/json',
144
+ 'X-Ai-Appshield-Fingerprint': fp.hash,
145
+ },
146
+ body: JSON.stringify({ type: 'fingerprint', data: fp }),
147
+ });
148
+ }
149
+ catch {
150
+ this.log('Failed to send fingerprint');
151
+ }
152
+ }
153
+ }
154
+ log(message) {
155
+ if (this.config.debug) {
156
+ console.log(`[ai-appshield] ${message}`);
157
+ }
158
+ }
159
+ }
160
+ exports.Shield = Shield;
161
+ /** Quick-start: create and activate shield with one call */
162
+ function protect(config) {
163
+ const shield = new Shield(config);
164
+ shield.activate();
165
+ return shield;
166
+ }
167
+ var BotDetector_2 = require("./BotDetector");
168
+ Object.defineProperty(exports, "detectBot", { enumerable: true, get: function () { return BotDetector_2.detectBot; } });
169
+ Object.defineProperty(exports, "createBotThreatEvent", { enumerable: true, get: function () { return BotDetector_2.createBotThreatEvent; } });
170
+ var DevToolsGuard_2 = require("./DevToolsGuard");
171
+ Object.defineProperty(exports, "DevToolsGuard", { enumerable: true, get: function () { return DevToolsGuard_2.DevToolsGuard; } });
172
+ var ContentProtector_2 = require("./ContentProtector");
173
+ Object.defineProperty(exports, "ContentProtector", { enumerable: true, get: function () { return ContentProtector_2.ContentProtector; } });
174
+ var Fingerprint_2 = require("./Fingerprint");
175
+ Object.defineProperty(exports, "Honeypot", { enumerable: true, get: function () { return Fingerprint_2.Honeypot; } });
176
+ Object.defineProperty(exports, "collectFingerprint", { enumerable: true, get: function () { return Fingerprint_2.collectFingerprint; } });
177
+ //# sourceMappingURL=Shield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shield.js","sourceRoot":"","sources":["../../src/browser/Shield.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { Shield, protect } from './Shield';
2
+ export type { ShieldConfig, ThreatEvent, ThreatType } from '../core/config';
3
+ export { encodeContent, decodeContent, obfuscateText } from '../utils/obfuscate';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.obfuscateText = exports.decodeContent = exports.encodeContent = exports.protect = exports.Shield = void 0;
4
+ var Shield_1 = require("./Shield");
5
+ Object.defineProperty(exports, "Shield", { enumerable: true, get: function () { return Shield_1.Shield; } });
6
+ Object.defineProperty(exports, "protect", { enumerable: true, get: function () { return Shield_1.protect; } });
7
+ var obfuscate_1 = require("../utils/obfuscate");
8
+ Object.defineProperty(exports, "encodeContent", { enumerable: true, get: function () { return obfuscate_1.encodeContent; } });
9
+ Object.defineProperty(exports, "decodeContent", { enumerable: true, get: function () { return obfuscate_1.decodeContent; } });
10
+ Object.defineProperty(exports, "obfuscateText", { enumerable: true, get: function () { return obfuscate_1.obfuscateText; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":";;;AAAA,mCAA2C;AAAlC,gGAAA,MAAM,OAAA;AAAE,iGAAA,OAAO,OAAA;AAExB,gDAAiF;AAAxE,0GAAA,aAAa,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,0GAAA,aAAa,OAAA"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}