@kya-os/agentshield-nextjs 0.1.18 → 0.1.19

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.
@@ -0,0 +1,198 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ // src/edge-runtime-loader.ts
6
+ var EdgeRuntimeAgentShield = class {
7
+ wasmInstance = null;
8
+ wasmMemory = null;
9
+ config;
10
+ initialized = false;
11
+ constructor(config = {}) {
12
+ this.config = config;
13
+ }
14
+ async init(wasmModule) {
15
+ if (this.initialized) return;
16
+ const module = wasmModule || this.config.wasmModule;
17
+ if (module && this.config.enableWasm !== false) {
18
+ try {
19
+ this.wasmMemory = new WebAssembly.Memory({ initial: 17, maximum: 256 });
20
+ const imports = {
21
+ wbg: {
22
+ __wbindgen_throw: (ptr, len) => {
23
+ throw new Error(this.readString(ptr, len));
24
+ },
25
+ __wbg_log_: (ptr, len) => {
26
+ if (this.config.debug) {
27
+ console.log(this.readString(ptr, len));
28
+ }
29
+ }
30
+ },
31
+ env: {
32
+ memory: this.wasmMemory
33
+ }
34
+ };
35
+ this.wasmInstance = await WebAssembly.instantiate(module, imports);
36
+ this.initialized = true;
37
+ if (this.config.debug) {
38
+ console.log("\u2705 AgentShield WASM initialized in Edge Runtime");
39
+ }
40
+ } catch (error) {
41
+ console.warn(
42
+ "\u26A0\uFE0F WASM initialization failed, using pattern detection:",
43
+ error
44
+ );
45
+ this.initialized = true;
46
+ }
47
+ } else {
48
+ this.initialized = true;
49
+ }
50
+ }
51
+ readString(ptr, len) {
52
+ if (!this.wasmInstance || !this.wasmMemory) {
53
+ throw new Error("WASM not initialized");
54
+ }
55
+ const memory = new Uint8Array(this.wasmMemory.buffer);
56
+ const bytes = memory.slice(ptr, ptr + len);
57
+ return new TextDecoder().decode(bytes);
58
+ }
59
+ writeString(str) {
60
+ if (!this.wasmInstance) {
61
+ throw new Error("WASM not initialized");
62
+ }
63
+ const exports = this.wasmInstance.exports;
64
+ const encoded = new TextEncoder().encode(str);
65
+ const ptr = exports.__wbindgen_malloc(encoded.length);
66
+ const memory = new Uint8Array(exports.memory.buffer);
67
+ memory.set(encoded, ptr);
68
+ return [ptr, encoded.length];
69
+ }
70
+ async detect(request) {
71
+ if (!this.initialized) {
72
+ await this.init();
73
+ }
74
+ const metadata = {
75
+ userAgent: request.headers.get("user-agent") || "",
76
+ ipAddress: request.ip || request.headers.get("x-forwarded-for")?.split(",")[0] || "",
77
+ headers: Object.fromEntries(request.headers.entries())
78
+ };
79
+ if (this.wasmInstance && this.config.enableWasm !== false) {
80
+ try {
81
+ const exports = this.wasmInstance.exports;
82
+ const [ptr, len] = this.writeString(JSON.stringify(metadata));
83
+ const resultPtr = exports.detect_agent(ptr, len);
84
+ let resultStr = "";
85
+ let offset = 0;
86
+ const memory = new Uint8Array(
87
+ exports.memory.buffer
88
+ );
89
+ while (offset < 4096) {
90
+ const byte = memory[resultPtr + offset];
91
+ if (byte === 0 || byte === void 0) break;
92
+ offset++;
93
+ }
94
+ if (offset > 0) {
95
+ resultStr = this.readString(resultPtr, offset);
96
+ }
97
+ exports.__wbindgen_free(ptr, len);
98
+ if (offset > 0) {
99
+ exports.__wbindgen_free(resultPtr, offset);
100
+ }
101
+ const result = JSON.parse(resultStr);
102
+ const detection = {
103
+ ...result,
104
+ verificationMethod: "cryptographic",
105
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
106
+ };
107
+ if (this.config.onAgentDetected && detection.isAgent) {
108
+ this.config.onAgentDetected(detection);
109
+ }
110
+ return detection;
111
+ } catch (error) {
112
+ if (this.config.debug) {
113
+ console.error("WASM detection failed:", error);
114
+ }
115
+ }
116
+ }
117
+ return this.patternDetection(metadata);
118
+ }
119
+ patternDetection(metadata) {
120
+ const userAgent = metadata.userAgent.toLowerCase();
121
+ const patterns = [
122
+ // High confidence - explicit AI identifiers
123
+ { pattern: /chatgpt-user/i, name: "ChatGPT", confidence: 0.95 },
124
+ { pattern: /claude-web/i, name: "Claude", confidence: 0.95 },
125
+ { pattern: /gpt-crawler/i, name: "GPT Crawler", confidence: 0.95 },
126
+ // Medium-high confidence - company identifiers
127
+ { pattern: /anthropic/i, name: "Anthropic", confidence: 0.9 },
128
+ { pattern: /openai/i, name: "OpenAI", confidence: 0.9 },
129
+ // Medium confidence - product names
130
+ { pattern: /copilot/i, name: "GitHub Copilot", confidence: 0.85 },
131
+ { pattern: /bard/i, name: "Google Bard", confidence: 0.85 },
132
+ { pattern: /gemini/i, name: "Google Gemini", confidence: 0.85 },
133
+ { pattern: /perplexity/i, name: "Perplexity", confidence: 0.85 },
134
+ { pattern: /you\.com/i, name: "You.com", confidence: 0.8 },
135
+ { pattern: /phind/i, name: "Phind", confidence: 0.8 }
136
+ ];
137
+ const suspiciousHeaders = [
138
+ "x-openai-",
139
+ "x-anthropic-",
140
+ "x-ai-",
141
+ "x-llm-",
142
+ "x-gpt-"
143
+ ];
144
+ let headerBoost = 0;
145
+ for (const [key] of Object.entries(metadata.headers)) {
146
+ if (suspiciousHeaders.some((prefix) => key.toLowerCase().startsWith(prefix))) {
147
+ headerBoost = 0.1;
148
+ break;
149
+ }
150
+ }
151
+ for (const { pattern, name, confidence } of patterns) {
152
+ if (pattern.test(userAgent)) {
153
+ const finalConfidence = Math.min(confidence + headerBoost, 1);
154
+ const result = {
155
+ isAgent: true,
156
+ confidence: finalConfidence,
157
+ agent: name,
158
+ verificationMethod: "pattern",
159
+ riskLevel: finalConfidence > 0.9 ? "high" : "medium",
160
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
161
+ };
162
+ if (this.config.onAgentDetected) {
163
+ this.config.onAgentDetected(result);
164
+ }
165
+ return result;
166
+ }
167
+ }
168
+ return {
169
+ isAgent: false,
170
+ confidence: 0.85,
171
+ verificationMethod: "pattern",
172
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
173
+ };
174
+ }
175
+ isInitialized() {
176
+ return this.initialized;
177
+ }
178
+ getVerificationMethod() {
179
+ return this.wasmInstance ? "cryptographic" : "pattern";
180
+ }
181
+ };
182
+ function createEdgeAgentShield(config) {
183
+ return new EdgeRuntimeAgentShield(config);
184
+ }
185
+ var defaultInstance = null;
186
+ function getDefaultAgentShield(config) {
187
+ if (!defaultInstance) {
188
+ defaultInstance = new EdgeRuntimeAgentShield(config);
189
+ }
190
+ return defaultInstance;
191
+ }
192
+ var edge_runtime_loader_default = createEdgeAgentShield;
193
+
194
+ exports.createEdgeAgentShield = createEdgeAgentShield;
195
+ exports.default = edge_runtime_loader_default;
196
+ exports.getDefaultAgentShield = getDefaultAgentShield;
197
+ //# sourceMappingURL=edge-runtime-loader.js.map
198
+ //# sourceMappingURL=edge-runtime-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edge-runtime-loader.ts"],"names":[],"mappings":"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","file":"edge-runtime-loader.js","sourcesContent":["/**\n * Edge Runtime Compatible WASM Loader for AgentShield\n *\n * This module provides a pre-built solution for loading WASM in Edge Runtime.\n * It requires the WASM file to be manually placed in the project.\n */\n\nimport type { NextRequest } from 'next/server';\n\n// User must provide the WASM module via import\n// This is intentionally not imported here to allow user control\nexport interface WasmModule {\n default: WebAssembly.Module;\n}\n\nexport interface DetectionResult {\n isAgent: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: 'cryptographic' | 'pattern';\n riskLevel?: 'low' | 'medium' | 'high' | 'critical';\n timestamp: string;\n}\n\nexport interface AgentShieldConfig {\n wasmModule?: WebAssembly.Module;\n enableWasm?: boolean;\n onAgentDetected?: (result: DetectionResult) => void;\n blockAgents?: boolean;\n allowedAgents?: string[];\n debug?: boolean;\n}\n\ninterface WasmExports {\n detect_agent(metadataPtr: number, metadataLen: number): number;\n get_version(): number;\n __wbindgen_malloc(size: number): number;\n __wbindgen_free(ptr: number, size: number): void;\n __wbindgen_realloc(ptr: number, oldSize: number, newSize: number): number;\n memory: WebAssembly.Memory;\n}\n\nclass EdgeRuntimeAgentShield {\n private wasmInstance: WebAssembly.Instance | null = null;\n private wasmMemory: WebAssembly.Memory | null = null;\n private config: AgentShieldConfig;\n private initialized = false;\n\n constructor(config: AgentShieldConfig = {}) {\n this.config = config;\n }\n\n async init(wasmModule?: WebAssembly.Module): Promise<void> {\n if (this.initialized) return;\n\n const module = wasmModule || this.config.wasmModule;\n\n if (module && this.config.enableWasm !== false) {\n try {\n this.wasmMemory = new WebAssembly.Memory({ initial: 17, maximum: 256 });\n\n const imports = {\n wbg: {\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(this.readString(ptr, len));\n },\n __wbg_log_: (ptr: number, len: number) => {\n if (this.config.debug) {\n console.log(this.readString(ptr, len));\n }\n },\n },\n env: {\n memory: this.wasmMemory,\n },\n };\n\n this.wasmInstance = await WebAssembly.instantiate(module, imports);\n this.initialized = true;\n\n if (this.config.debug) {\n console.log('✅ AgentShield WASM initialized in Edge Runtime');\n }\n } catch (error) {\n console.warn(\n '⚠️ WASM initialization failed, using pattern detection:',\n error\n );\n this.initialized = true;\n }\n } else {\n this.initialized = true;\n }\n }\n\n private readString(ptr: number, len: number): string {\n if (!this.wasmInstance || !this.wasmMemory) {\n throw new Error('WASM not initialized');\n }\n const memory = new Uint8Array(this.wasmMemory.buffer);\n const bytes = memory.slice(ptr, ptr + len);\n return new TextDecoder().decode(bytes);\n }\n\n private writeString(str: string): [number, number] {\n if (!this.wasmInstance) {\n throw new Error('WASM not initialized');\n }\n const exports = this.wasmInstance.exports as unknown as WasmExports;\n\n const encoded = new TextEncoder().encode(str);\n const ptr = exports.__wbindgen_malloc(encoded.length);\n\n const memory = new Uint8Array(exports.memory.buffer);\n memory.set(encoded, ptr);\n\n return [ptr, encoded.length];\n }\n\n async detect(request: NextRequest): Promise<DetectionResult> {\n if (!this.initialized) {\n await this.init();\n }\n\n const metadata = {\n userAgent: request.headers.get('user-agent') || '',\n ipAddress:\n request.ip ||\n request.headers.get('x-forwarded-for')?.split(',')[0] ||\n '',\n headers: Object.fromEntries(request.headers.entries()),\n };\n\n // Try WASM detection first\n if (this.wasmInstance && this.config.enableWasm !== false) {\n try {\n const exports = this.wasmInstance.exports as unknown as WasmExports;\n const [ptr, len] = this.writeString(JSON.stringify(metadata));\n\n const resultPtr = exports.detect_agent(ptr, len);\n // Read result with dynamic size\n let resultStr = '';\n let offset = 0;\n const memory = new Uint8Array(\n (exports.memory as WebAssembly.Memory).buffer\n );\n\n // Read until we find the end of the JSON string\n while (offset < 4096) {\n // Max 4KB result\n const byte = memory[resultPtr + offset];\n if (byte === 0 || byte === undefined) break;\n offset++;\n }\n\n if (offset > 0) {\n resultStr = this.readString(resultPtr, offset);\n }\n\n exports.__wbindgen_free(ptr, len);\n if (offset > 0) {\n exports.__wbindgen_free(resultPtr, offset);\n }\n\n const result = JSON.parse(resultStr);\n\n const detection: DetectionResult = {\n ...result,\n verificationMethod: 'cryptographic',\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.onAgentDetected && detection.isAgent) {\n this.config.onAgentDetected(detection);\n }\n\n return detection;\n } catch (error) {\n if (this.config.debug) {\n console.error('WASM detection failed:', error);\n }\n // Fall through to pattern detection\n }\n }\n\n // Fallback: Pattern-based detection\n return this.patternDetection(metadata);\n }\n\n private patternDetection(metadata: {\n userAgent: string;\n ipAddress: string;\n headers: Record<string, string>;\n }): DetectionResult {\n const userAgent = metadata.userAgent.toLowerCase();\n\n // Enhanced AI agent patterns with confidence scores\n const patterns = [\n // High confidence - explicit AI identifiers\n { pattern: /chatgpt-user/i, name: 'ChatGPT', confidence: 0.95 },\n { pattern: /claude-web/i, name: 'Claude', confidence: 0.95 },\n { pattern: /gpt-crawler/i, name: 'GPT Crawler', confidence: 0.95 },\n\n // Medium-high confidence - company identifiers\n { pattern: /anthropic/i, name: 'Anthropic', confidence: 0.9 },\n { pattern: /openai/i, name: 'OpenAI', confidence: 0.9 },\n\n // Medium confidence - product names\n { pattern: /copilot/i, name: 'GitHub Copilot', confidence: 0.85 },\n { pattern: /bard/i, name: 'Google Bard', confidence: 0.85 },\n { pattern: /gemini/i, name: 'Google Gemini', confidence: 0.85 },\n { pattern: /perplexity/i, name: 'Perplexity', confidence: 0.85 },\n { pattern: /you\\.com/i, name: 'You.com', confidence: 0.8 },\n { pattern: /phind/i, name: 'Phind', confidence: 0.8 },\n ];\n\n // Check for suspicious headers\n const suspiciousHeaders = [\n 'x-openai-',\n 'x-anthropic-',\n 'x-ai-',\n 'x-llm-',\n 'x-gpt-',\n ];\n\n let headerBoost = 0;\n for (const [key] of Object.entries(metadata.headers)) {\n if (\n suspiciousHeaders.some(prefix => key.toLowerCase().startsWith(prefix))\n ) {\n headerBoost = 0.1;\n break;\n }\n }\n\n // Check patterns\n for (const { pattern, name, confidence } of patterns) {\n if (pattern.test(userAgent)) {\n const finalConfidence = Math.min(confidence + headerBoost, 1.0);\n\n const result: DetectionResult = {\n isAgent: true,\n confidence: finalConfidence,\n agent: name,\n verificationMethod: 'pattern',\n riskLevel: finalConfidence > 0.9 ? 'high' : 'medium',\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.onAgentDetected) {\n this.config.onAgentDetected(result);\n }\n\n return result;\n }\n }\n\n // Not detected\n return {\n isAgent: false,\n confidence: 0.85,\n verificationMethod: 'pattern',\n timestamp: new Date().toISOString(),\n };\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n getVerificationMethod(): 'cryptographic' | 'pattern' {\n return this.wasmInstance ? 'cryptographic' : 'pattern';\n }\n}\n\n/**\n * Factory function to create an AgentShield instance for Edge Runtime\n */\nexport function createEdgeAgentShield(config?: AgentShieldConfig) {\n return new EdgeRuntimeAgentShield(config);\n}\n\n/**\n * Singleton instance for simple usage\n */\nlet defaultInstance: EdgeRuntimeAgentShield | null = null;\n\nexport function getDefaultAgentShield(\n config?: AgentShieldConfig\n): EdgeRuntimeAgentShield {\n if (!defaultInstance) {\n defaultInstance = new EdgeRuntimeAgentShield(config);\n }\n return defaultInstance;\n}\n\nexport default createEdgeAgentShield;\n"]}
@@ -0,0 +1,192 @@
1
+ // src/edge-runtime-loader.ts
2
+ var EdgeRuntimeAgentShield = class {
3
+ wasmInstance = null;
4
+ wasmMemory = null;
5
+ config;
6
+ initialized = false;
7
+ constructor(config = {}) {
8
+ this.config = config;
9
+ }
10
+ async init(wasmModule) {
11
+ if (this.initialized) return;
12
+ const module = wasmModule || this.config.wasmModule;
13
+ if (module && this.config.enableWasm !== false) {
14
+ try {
15
+ this.wasmMemory = new WebAssembly.Memory({ initial: 17, maximum: 256 });
16
+ const imports = {
17
+ wbg: {
18
+ __wbindgen_throw: (ptr, len) => {
19
+ throw new Error(this.readString(ptr, len));
20
+ },
21
+ __wbg_log_: (ptr, len) => {
22
+ if (this.config.debug) {
23
+ console.log(this.readString(ptr, len));
24
+ }
25
+ }
26
+ },
27
+ env: {
28
+ memory: this.wasmMemory
29
+ }
30
+ };
31
+ this.wasmInstance = await WebAssembly.instantiate(module, imports);
32
+ this.initialized = true;
33
+ if (this.config.debug) {
34
+ console.log("\u2705 AgentShield WASM initialized in Edge Runtime");
35
+ }
36
+ } catch (error) {
37
+ console.warn(
38
+ "\u26A0\uFE0F WASM initialization failed, using pattern detection:",
39
+ error
40
+ );
41
+ this.initialized = true;
42
+ }
43
+ } else {
44
+ this.initialized = true;
45
+ }
46
+ }
47
+ readString(ptr, len) {
48
+ if (!this.wasmInstance || !this.wasmMemory) {
49
+ throw new Error("WASM not initialized");
50
+ }
51
+ const memory = new Uint8Array(this.wasmMemory.buffer);
52
+ const bytes = memory.slice(ptr, ptr + len);
53
+ return new TextDecoder().decode(bytes);
54
+ }
55
+ writeString(str) {
56
+ if (!this.wasmInstance) {
57
+ throw new Error("WASM not initialized");
58
+ }
59
+ const exports = this.wasmInstance.exports;
60
+ const encoded = new TextEncoder().encode(str);
61
+ const ptr = exports.__wbindgen_malloc(encoded.length);
62
+ const memory = new Uint8Array(exports.memory.buffer);
63
+ memory.set(encoded, ptr);
64
+ return [ptr, encoded.length];
65
+ }
66
+ async detect(request) {
67
+ if (!this.initialized) {
68
+ await this.init();
69
+ }
70
+ const metadata = {
71
+ userAgent: request.headers.get("user-agent") || "",
72
+ ipAddress: request.ip || request.headers.get("x-forwarded-for")?.split(",")[0] || "",
73
+ headers: Object.fromEntries(request.headers.entries())
74
+ };
75
+ if (this.wasmInstance && this.config.enableWasm !== false) {
76
+ try {
77
+ const exports = this.wasmInstance.exports;
78
+ const [ptr, len] = this.writeString(JSON.stringify(metadata));
79
+ const resultPtr = exports.detect_agent(ptr, len);
80
+ let resultStr = "";
81
+ let offset = 0;
82
+ const memory = new Uint8Array(
83
+ exports.memory.buffer
84
+ );
85
+ while (offset < 4096) {
86
+ const byte = memory[resultPtr + offset];
87
+ if (byte === 0 || byte === void 0) break;
88
+ offset++;
89
+ }
90
+ if (offset > 0) {
91
+ resultStr = this.readString(resultPtr, offset);
92
+ }
93
+ exports.__wbindgen_free(ptr, len);
94
+ if (offset > 0) {
95
+ exports.__wbindgen_free(resultPtr, offset);
96
+ }
97
+ const result = JSON.parse(resultStr);
98
+ const detection = {
99
+ ...result,
100
+ verificationMethod: "cryptographic",
101
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
102
+ };
103
+ if (this.config.onAgentDetected && detection.isAgent) {
104
+ this.config.onAgentDetected(detection);
105
+ }
106
+ return detection;
107
+ } catch (error) {
108
+ if (this.config.debug) {
109
+ console.error("WASM detection failed:", error);
110
+ }
111
+ }
112
+ }
113
+ return this.patternDetection(metadata);
114
+ }
115
+ patternDetection(metadata) {
116
+ const userAgent = metadata.userAgent.toLowerCase();
117
+ const patterns = [
118
+ // High confidence - explicit AI identifiers
119
+ { pattern: /chatgpt-user/i, name: "ChatGPT", confidence: 0.95 },
120
+ { pattern: /claude-web/i, name: "Claude", confidence: 0.95 },
121
+ { pattern: /gpt-crawler/i, name: "GPT Crawler", confidence: 0.95 },
122
+ // Medium-high confidence - company identifiers
123
+ { pattern: /anthropic/i, name: "Anthropic", confidence: 0.9 },
124
+ { pattern: /openai/i, name: "OpenAI", confidence: 0.9 },
125
+ // Medium confidence - product names
126
+ { pattern: /copilot/i, name: "GitHub Copilot", confidence: 0.85 },
127
+ { pattern: /bard/i, name: "Google Bard", confidence: 0.85 },
128
+ { pattern: /gemini/i, name: "Google Gemini", confidence: 0.85 },
129
+ { pattern: /perplexity/i, name: "Perplexity", confidence: 0.85 },
130
+ { pattern: /you\.com/i, name: "You.com", confidence: 0.8 },
131
+ { pattern: /phind/i, name: "Phind", confidence: 0.8 }
132
+ ];
133
+ const suspiciousHeaders = [
134
+ "x-openai-",
135
+ "x-anthropic-",
136
+ "x-ai-",
137
+ "x-llm-",
138
+ "x-gpt-"
139
+ ];
140
+ let headerBoost = 0;
141
+ for (const [key] of Object.entries(metadata.headers)) {
142
+ if (suspiciousHeaders.some((prefix) => key.toLowerCase().startsWith(prefix))) {
143
+ headerBoost = 0.1;
144
+ break;
145
+ }
146
+ }
147
+ for (const { pattern, name, confidence } of patterns) {
148
+ if (pattern.test(userAgent)) {
149
+ const finalConfidence = Math.min(confidence + headerBoost, 1);
150
+ const result = {
151
+ isAgent: true,
152
+ confidence: finalConfidence,
153
+ agent: name,
154
+ verificationMethod: "pattern",
155
+ riskLevel: finalConfidence > 0.9 ? "high" : "medium",
156
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
157
+ };
158
+ if (this.config.onAgentDetected) {
159
+ this.config.onAgentDetected(result);
160
+ }
161
+ return result;
162
+ }
163
+ }
164
+ return {
165
+ isAgent: false,
166
+ confidence: 0.85,
167
+ verificationMethod: "pattern",
168
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
169
+ };
170
+ }
171
+ isInitialized() {
172
+ return this.initialized;
173
+ }
174
+ getVerificationMethod() {
175
+ return this.wasmInstance ? "cryptographic" : "pattern";
176
+ }
177
+ };
178
+ function createEdgeAgentShield(config) {
179
+ return new EdgeRuntimeAgentShield(config);
180
+ }
181
+ var defaultInstance = null;
182
+ function getDefaultAgentShield(config) {
183
+ if (!defaultInstance) {
184
+ defaultInstance = new EdgeRuntimeAgentShield(config);
185
+ }
186
+ return defaultInstance;
187
+ }
188
+ var edge_runtime_loader_default = createEdgeAgentShield;
189
+
190
+ export { createEdgeAgentShield, edge_runtime_loader_default as default, getDefaultAgentShield };
191
+ //# sourceMappingURL=edge-runtime-loader.mjs.map
192
+ //# sourceMappingURL=edge-runtime-loader.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edge-runtime-loader.ts"],"names":[],"mappings":"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","file":"edge-runtime-loader.mjs","sourcesContent":["/**\n * Edge Runtime Compatible WASM Loader for AgentShield\n *\n * This module provides a pre-built solution for loading WASM in Edge Runtime.\n * It requires the WASM file to be manually placed in the project.\n */\n\nimport type { NextRequest } from 'next/server';\n\n// User must provide the WASM module via import\n// This is intentionally not imported here to allow user control\nexport interface WasmModule {\n default: WebAssembly.Module;\n}\n\nexport interface DetectionResult {\n isAgent: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: 'cryptographic' | 'pattern';\n riskLevel?: 'low' | 'medium' | 'high' | 'critical';\n timestamp: string;\n}\n\nexport interface AgentShieldConfig {\n wasmModule?: WebAssembly.Module;\n enableWasm?: boolean;\n onAgentDetected?: (result: DetectionResult) => void;\n blockAgents?: boolean;\n allowedAgents?: string[];\n debug?: boolean;\n}\n\ninterface WasmExports {\n detect_agent(metadataPtr: number, metadataLen: number): number;\n get_version(): number;\n __wbindgen_malloc(size: number): number;\n __wbindgen_free(ptr: number, size: number): void;\n __wbindgen_realloc(ptr: number, oldSize: number, newSize: number): number;\n memory: WebAssembly.Memory;\n}\n\nclass EdgeRuntimeAgentShield {\n private wasmInstance: WebAssembly.Instance | null = null;\n private wasmMemory: WebAssembly.Memory | null = null;\n private config: AgentShieldConfig;\n private initialized = false;\n\n constructor(config: AgentShieldConfig = {}) {\n this.config = config;\n }\n\n async init(wasmModule?: WebAssembly.Module): Promise<void> {\n if (this.initialized) return;\n\n const module = wasmModule || this.config.wasmModule;\n\n if (module && this.config.enableWasm !== false) {\n try {\n this.wasmMemory = new WebAssembly.Memory({ initial: 17, maximum: 256 });\n\n const imports = {\n wbg: {\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(this.readString(ptr, len));\n },\n __wbg_log_: (ptr: number, len: number) => {\n if (this.config.debug) {\n console.log(this.readString(ptr, len));\n }\n },\n },\n env: {\n memory: this.wasmMemory,\n },\n };\n\n this.wasmInstance = await WebAssembly.instantiate(module, imports);\n this.initialized = true;\n\n if (this.config.debug) {\n console.log('✅ AgentShield WASM initialized in Edge Runtime');\n }\n } catch (error) {\n console.warn(\n '⚠️ WASM initialization failed, using pattern detection:',\n error\n );\n this.initialized = true;\n }\n } else {\n this.initialized = true;\n }\n }\n\n private readString(ptr: number, len: number): string {\n if (!this.wasmInstance || !this.wasmMemory) {\n throw new Error('WASM not initialized');\n }\n const memory = new Uint8Array(this.wasmMemory.buffer);\n const bytes = memory.slice(ptr, ptr + len);\n return new TextDecoder().decode(bytes);\n }\n\n private writeString(str: string): [number, number] {\n if (!this.wasmInstance) {\n throw new Error('WASM not initialized');\n }\n const exports = this.wasmInstance.exports as unknown as WasmExports;\n\n const encoded = new TextEncoder().encode(str);\n const ptr = exports.__wbindgen_malloc(encoded.length);\n\n const memory = new Uint8Array(exports.memory.buffer);\n memory.set(encoded, ptr);\n\n return [ptr, encoded.length];\n }\n\n async detect(request: NextRequest): Promise<DetectionResult> {\n if (!this.initialized) {\n await this.init();\n }\n\n const metadata = {\n userAgent: request.headers.get('user-agent') || '',\n ipAddress:\n request.ip ||\n request.headers.get('x-forwarded-for')?.split(',')[0] ||\n '',\n headers: Object.fromEntries(request.headers.entries()),\n };\n\n // Try WASM detection first\n if (this.wasmInstance && this.config.enableWasm !== false) {\n try {\n const exports = this.wasmInstance.exports as unknown as WasmExports;\n const [ptr, len] = this.writeString(JSON.stringify(metadata));\n\n const resultPtr = exports.detect_agent(ptr, len);\n // Read result with dynamic size\n let resultStr = '';\n let offset = 0;\n const memory = new Uint8Array(\n (exports.memory as WebAssembly.Memory).buffer\n );\n\n // Read until we find the end of the JSON string\n while (offset < 4096) {\n // Max 4KB result\n const byte = memory[resultPtr + offset];\n if (byte === 0 || byte === undefined) break;\n offset++;\n }\n\n if (offset > 0) {\n resultStr = this.readString(resultPtr, offset);\n }\n\n exports.__wbindgen_free(ptr, len);\n if (offset > 0) {\n exports.__wbindgen_free(resultPtr, offset);\n }\n\n const result = JSON.parse(resultStr);\n\n const detection: DetectionResult = {\n ...result,\n verificationMethod: 'cryptographic',\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.onAgentDetected && detection.isAgent) {\n this.config.onAgentDetected(detection);\n }\n\n return detection;\n } catch (error) {\n if (this.config.debug) {\n console.error('WASM detection failed:', error);\n }\n // Fall through to pattern detection\n }\n }\n\n // Fallback: Pattern-based detection\n return this.patternDetection(metadata);\n }\n\n private patternDetection(metadata: {\n userAgent: string;\n ipAddress: string;\n headers: Record<string, string>;\n }): DetectionResult {\n const userAgent = metadata.userAgent.toLowerCase();\n\n // Enhanced AI agent patterns with confidence scores\n const patterns = [\n // High confidence - explicit AI identifiers\n { pattern: /chatgpt-user/i, name: 'ChatGPT', confidence: 0.95 },\n { pattern: /claude-web/i, name: 'Claude', confidence: 0.95 },\n { pattern: /gpt-crawler/i, name: 'GPT Crawler', confidence: 0.95 },\n\n // Medium-high confidence - company identifiers\n { pattern: /anthropic/i, name: 'Anthropic', confidence: 0.9 },\n { pattern: /openai/i, name: 'OpenAI', confidence: 0.9 },\n\n // Medium confidence - product names\n { pattern: /copilot/i, name: 'GitHub Copilot', confidence: 0.85 },\n { pattern: /bard/i, name: 'Google Bard', confidence: 0.85 },\n { pattern: /gemini/i, name: 'Google Gemini', confidence: 0.85 },\n { pattern: /perplexity/i, name: 'Perplexity', confidence: 0.85 },\n { pattern: /you\\.com/i, name: 'You.com', confidence: 0.8 },\n { pattern: /phind/i, name: 'Phind', confidence: 0.8 },\n ];\n\n // Check for suspicious headers\n const suspiciousHeaders = [\n 'x-openai-',\n 'x-anthropic-',\n 'x-ai-',\n 'x-llm-',\n 'x-gpt-',\n ];\n\n let headerBoost = 0;\n for (const [key] of Object.entries(metadata.headers)) {\n if (\n suspiciousHeaders.some(prefix => key.toLowerCase().startsWith(prefix))\n ) {\n headerBoost = 0.1;\n break;\n }\n }\n\n // Check patterns\n for (const { pattern, name, confidence } of patterns) {\n if (pattern.test(userAgent)) {\n const finalConfidence = Math.min(confidence + headerBoost, 1.0);\n\n const result: DetectionResult = {\n isAgent: true,\n confidence: finalConfidence,\n agent: name,\n verificationMethod: 'pattern',\n riskLevel: finalConfidence > 0.9 ? 'high' : 'medium',\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.onAgentDetected) {\n this.config.onAgentDetected(result);\n }\n\n return result;\n }\n }\n\n // Not detected\n return {\n isAgent: false,\n confidence: 0.85,\n verificationMethod: 'pattern',\n timestamp: new Date().toISOString(),\n };\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n getVerificationMethod(): 'cryptographic' | 'pattern' {\n return this.wasmInstance ? 'cryptographic' : 'pattern';\n }\n}\n\n/**\n * Factory function to create an AgentShield instance for Edge Runtime\n */\nexport function createEdgeAgentShield(config?: AgentShieldConfig) {\n return new EdgeRuntimeAgentShield(config);\n}\n\n/**\n * Singleton instance for simple usage\n */\nlet defaultInstance: EdgeRuntimeAgentShield | null = null;\n\nexport function getDefaultAgentShield(\n config?: AgentShieldConfig\n): EdgeRuntimeAgentShield {\n if (!defaultInstance) {\n defaultInstance = new EdgeRuntimeAgentShield(config);\n }\n return defaultInstance;\n}\n\nexport default createEdgeAgentShield;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kya-os/agentshield-nextjs",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "description": "Next.js middleware for AgentShield AI agent detection",
5
5
  "keywords": [
6
6
  "nextjs",
@@ -25,12 +25,20 @@
25
25
  "main": "./dist/index.js",
26
26
  "module": "./dist/index.mjs",
27
27
  "types": "./dist/index.d.ts",
28
+ "bin": {
29
+ "agentshield-setup-edge": "./bin/setup-edge-wasm.js"
30
+ },
28
31
  "exports": {
29
32
  ".": {
30
33
  "types": "./dist/index.d.ts",
31
34
  "import": "./dist/index.mjs",
32
35
  "require": "./dist/index.js"
33
36
  },
37
+ "./edge": {
38
+ "types": "./dist/edge-runtime-loader.d.ts",
39
+ "import": "./dist/edge-runtime-loader.mjs",
40
+ "require": "./dist/edge-runtime-loader.js"
41
+ },
34
42
  "./middleware": {
35
43
  "types": "./dist/middleware.d.ts",
36
44
  "import": "./dist/middleware.mjs",
@@ -45,9 +53,11 @@
45
53
  },
46
54
  "files": [
47
55
  "dist",
56
+ "bin",
48
57
  "wasm.d.ts",
49
58
  "README.md",
50
- "CHANGELOG.md"
59
+ "CHANGELOG.md",
60
+ "EDGE_RUNTIME_WASM_SETUP.md"
51
61
  ],
52
62
  "engines": {
53
63
  "node": ">=18.0.0"
@@ -91,6 +101,6 @@
91
101
  },
92
102
  "sideEffects": false,
93
103
  "dependencies": {
94
- "@kya-os/agentshield": "^0.1.18"
104
+ "@kya-os/agentshield": "^0.1.19"
95
105
  }
96
- }
106
+ }