@kya-os/agentshield-nextjs 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-middleware.js +314 -5
- package/dist/create-middleware.js.map +1 -1
- package/dist/create-middleware.mjs +314 -5
- package/dist/create-middleware.mjs.map +1 -1
- package/dist/edge-wasm-middleware.d.mts +58 -0
- package/dist/edge-wasm-middleware.d.ts +58 -0
- package/dist/edge-wasm-middleware.js +245 -0
- package/dist/edge-wasm-middleware.js.map +1 -0
- package/dist/edge-wasm-middleware.mjs +242 -0
- package/dist/edge-wasm-middleware.mjs.map +1 -0
- package/dist/index.js +314 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +314 -5
- package/dist/index.mjs.map +1 -1
- package/dist/middleware.js +310 -1
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +310 -1
- package/dist/middleware.mjs.map +1 -1
- package/package.json +7 -2
- package/wasm/agentshield_wasm.d.ts +121 -0
- package/wasm/agentshield_wasm.js +576 -0
- package/wasm/agentshield_wasm_bg.wasm +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Edge Runtime Compatible WASM Middleware for AgentShield
|
|
5
|
+
*
|
|
6
|
+
* This module provides WASM-based AI agent detection with 95-100% confidence
|
|
7
|
+
* in Next.js Edge Runtime and Vercel Edge Functions.
|
|
8
|
+
*
|
|
9
|
+
* IMPORTANT: WebAssembly.instantiate(module) IS supported in Edge Runtime
|
|
10
|
+
* when using a pre-compiled module imported with ?module suffix.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
interface EdgeWasmDetectionResult {
|
|
14
|
+
isAgent: boolean;
|
|
15
|
+
confidence: number;
|
|
16
|
+
agent?: string;
|
|
17
|
+
verificationMethod: 'signature' | 'pattern' | 'wasm';
|
|
18
|
+
riskLevel: 'low' | 'medium' | 'high';
|
|
19
|
+
timestamp: string;
|
|
20
|
+
reasons?: string[];
|
|
21
|
+
}
|
|
22
|
+
interface EdgeAgentShieldConfig {
|
|
23
|
+
onAgentDetected?: (result: EdgeWasmDetectionResult) => void | Promise<void>;
|
|
24
|
+
blockOnHighConfidence?: boolean;
|
|
25
|
+
confidenceThreshold?: number;
|
|
26
|
+
skipPaths?: string[];
|
|
27
|
+
blockedResponse?: {
|
|
28
|
+
status?: number;
|
|
29
|
+
message?: string;
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize WASM module with proper imports for Edge Runtime
|
|
35
|
+
*/
|
|
36
|
+
declare function initializeEdgeWasm(wasmModule: WebAssembly.Module): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Create Edge Runtime compatible WASM middleware
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // middleware.ts
|
|
43
|
+
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
44
|
+
* import { createEdgeWasmMiddleware } from '@kya-os/agentshield-nextjs/edge-wasm-middleware';
|
|
45
|
+
*
|
|
46
|
+
* export const middleware = createEdgeWasmMiddleware({
|
|
47
|
+
* wasmModule,
|
|
48
|
+
* onAgentDetected: (result) => {
|
|
49
|
+
* console.log(`AI Agent: ${result.agent} (${result.confidence * 100}% confidence)`);
|
|
50
|
+
* }
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
declare function createEdgeWasmMiddleware(config: EdgeAgentShieldConfig & {
|
|
55
|
+
wasmModule: WebAssembly.Module;
|
|
56
|
+
}): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
57
|
+
|
|
58
|
+
export { type EdgeAgentShieldConfig, type EdgeWasmDetectionResult, createEdgeWasmMiddleware, initializeEdgeWasm };
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('next/server');
|
|
4
|
+
|
|
5
|
+
// src/edge-wasm-middleware.ts
|
|
6
|
+
var wasmExports = null;
|
|
7
|
+
var wasmInitPromise = null;
|
|
8
|
+
var heap = new Array(128).fill(void 0);
|
|
9
|
+
heap.push(void 0, null, true, false);
|
|
10
|
+
var heap_next = heap.length;
|
|
11
|
+
function addHeapObject(obj) {
|
|
12
|
+
if (heap_next === heap.length) heap.push(heap.length + 1);
|
|
13
|
+
const idx = heap_next;
|
|
14
|
+
heap_next = heap[idx];
|
|
15
|
+
heap[idx] = obj;
|
|
16
|
+
return idx;
|
|
17
|
+
}
|
|
18
|
+
function getObject(idx) {
|
|
19
|
+
return heap[idx];
|
|
20
|
+
}
|
|
21
|
+
function dropObject(idx) {
|
|
22
|
+
if (idx < 132) return;
|
|
23
|
+
heap[idx] = heap_next;
|
|
24
|
+
heap_next = idx;
|
|
25
|
+
}
|
|
26
|
+
function takeObject(idx) {
|
|
27
|
+
const ret = getObject(idx);
|
|
28
|
+
dropObject(idx);
|
|
29
|
+
return ret;
|
|
30
|
+
}
|
|
31
|
+
var cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
|
|
32
|
+
var cachedTextEncoder = new TextEncoder();
|
|
33
|
+
var cachedUint8ArrayMemory0 = null;
|
|
34
|
+
function getUint8ArrayMemory0() {
|
|
35
|
+
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
|
|
36
|
+
cachedUint8ArrayMemory0 = new Uint8Array(wasmExports.memory.buffer);
|
|
37
|
+
}
|
|
38
|
+
return cachedUint8ArrayMemory0;
|
|
39
|
+
}
|
|
40
|
+
function getStringFromWasm0(ptr, len) {
|
|
41
|
+
ptr = ptr >>> 0;
|
|
42
|
+
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
|
|
43
|
+
}
|
|
44
|
+
var WASM_VECTOR_LEN = 0;
|
|
45
|
+
function passStringToWasm0(arg, malloc, realloc) {
|
|
46
|
+
if (realloc === void 0) {
|
|
47
|
+
const buf = cachedTextEncoder.encode(arg);
|
|
48
|
+
const ptr2 = malloc(buf.length, 1) >>> 0;
|
|
49
|
+
getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf);
|
|
50
|
+
WASM_VECTOR_LEN = buf.length;
|
|
51
|
+
return ptr2;
|
|
52
|
+
}
|
|
53
|
+
let len = arg.length;
|
|
54
|
+
let ptr = malloc(len, 1) >>> 0;
|
|
55
|
+
const mem = getUint8ArrayMemory0();
|
|
56
|
+
let offset = 0;
|
|
57
|
+
for (; offset < len; offset++) {
|
|
58
|
+
const code = arg.charCodeAt(offset);
|
|
59
|
+
if (code > 127) break;
|
|
60
|
+
mem[ptr + offset] = code;
|
|
61
|
+
}
|
|
62
|
+
if (offset !== len) {
|
|
63
|
+
if (offset !== 0) {
|
|
64
|
+
arg = arg.slice(offset);
|
|
65
|
+
}
|
|
66
|
+
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
|
|
67
|
+
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
|
|
68
|
+
const ret = cachedTextEncoder.encodeInto(arg, view);
|
|
69
|
+
offset += ret.written;
|
|
70
|
+
}
|
|
71
|
+
WASM_VECTOR_LEN = offset;
|
|
72
|
+
return ptr;
|
|
73
|
+
}
|
|
74
|
+
var cachedDataViewMemory0 = null;
|
|
75
|
+
function getDataViewMemory0() {
|
|
76
|
+
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer !== wasmExports.memory.buffer) {
|
|
77
|
+
cachedDataViewMemory0 = new DataView(wasmExports.memory.buffer);
|
|
78
|
+
}
|
|
79
|
+
return cachedDataViewMemory0;
|
|
80
|
+
}
|
|
81
|
+
async function initializeEdgeWasm(wasmModule) {
|
|
82
|
+
if (wasmInitPromise) {
|
|
83
|
+
return wasmInitPromise;
|
|
84
|
+
}
|
|
85
|
+
wasmInitPromise = (async () => {
|
|
86
|
+
try {
|
|
87
|
+
const imports = {
|
|
88
|
+
"./agentshield_wasm_bg.js": {
|
|
89
|
+
__wbindgen_object_drop_ref: function(arg0) {
|
|
90
|
+
dropObject(arg0);
|
|
91
|
+
},
|
|
92
|
+
__wbindgen_string_new: function(arg0, arg1) {
|
|
93
|
+
const ret = getStringFromWasm0(arg0, arg1);
|
|
94
|
+
return addHeapObject(ret);
|
|
95
|
+
},
|
|
96
|
+
__wbindgen_string_get: function(arg0, arg1) {
|
|
97
|
+
const obj = getObject(arg1);
|
|
98
|
+
const ret = typeof obj === "string" ? obj : void 0;
|
|
99
|
+
const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;
|
|
100
|
+
const len1 = WASM_VECTOR_LEN;
|
|
101
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
|
|
102
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
|
|
103
|
+
},
|
|
104
|
+
__wbindgen_throw: function(arg0, arg1) {
|
|
105
|
+
throw new Error(getStringFromWasm0(arg0, arg1));
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
wbg: {
|
|
109
|
+
__wbindgen_object_drop_ref: function(arg0) {
|
|
110
|
+
dropObject(arg0);
|
|
111
|
+
},
|
|
112
|
+
__wbindgen_string_new: function(arg0, arg1) {
|
|
113
|
+
const ret = getStringFromWasm0(arg0, arg1);
|
|
114
|
+
return addHeapObject(ret);
|
|
115
|
+
},
|
|
116
|
+
__wbindgen_string_get: function(arg0, arg1) {
|
|
117
|
+
const obj = getObject(arg1);
|
|
118
|
+
const ret = typeof obj === "string" ? obj : void 0;
|
|
119
|
+
const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;
|
|
120
|
+
const len1 = WASM_VECTOR_LEN;
|
|
121
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
|
|
122
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
|
|
123
|
+
},
|
|
124
|
+
__wbindgen_throw: function(arg0, arg1) {
|
|
125
|
+
throw new Error(getStringFromWasm0(arg0, arg1));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const instance = await WebAssembly.instantiate(wasmModule, imports);
|
|
130
|
+
wasmExports = instance.exports;
|
|
131
|
+
if (wasmExports.__wbindgen_start) {
|
|
132
|
+
wasmExports.__wbindgen_start();
|
|
133
|
+
}
|
|
134
|
+
console.log("\u2705 AgentShield: WASM module loaded successfully in Edge Runtime (95-100% confidence enabled)");
|
|
135
|
+
} catch (error) {
|
|
136
|
+
console.error("\u274C AgentShield: Failed to initialize WASM in Edge Runtime:", error);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
})();
|
|
140
|
+
return wasmInitPromise;
|
|
141
|
+
}
|
|
142
|
+
async function detectWithWasm(metadata) {
|
|
143
|
+
if (!wasmExports) {
|
|
144
|
+
throw new Error("WASM not initialized. Call initializeEdgeWasm first.");
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const userAgent = metadata.userAgent || "";
|
|
148
|
+
const ipAddress = metadata.ipAddress || "";
|
|
149
|
+
const headers = JSON.stringify(metadata.headers);
|
|
150
|
+
const timestamp = metadata.timestamp;
|
|
151
|
+
const ptr0 = passStringToWasm0(userAgent, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
152
|
+
const len0 = WASM_VECTOR_LEN;
|
|
153
|
+
const ptr1 = passStringToWasm0(ipAddress, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
154
|
+
const len1 = WASM_VECTOR_LEN;
|
|
155
|
+
const ptr2 = passStringToWasm0(headers, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
156
|
+
const len2 = WASM_VECTOR_LEN;
|
|
157
|
+
const ptr3 = passStringToWasm0(timestamp, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
158
|
+
const len3 = WASM_VECTOR_LEN;
|
|
159
|
+
const metadataPtr = wasmExports.jsrequestmetadata_new(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3);
|
|
160
|
+
const resultPtr = wasmExports.detect_agent(metadataPtr);
|
|
161
|
+
const result = takeObject(resultPtr);
|
|
162
|
+
wasmExports.__wbg_jsrequestmetadata_free(metadataPtr, 0);
|
|
163
|
+
const parsedResult = typeof result === "string" ? JSON.parse(result) : result;
|
|
164
|
+
return {
|
|
165
|
+
isAgent: parsedResult.is_agent || false,
|
|
166
|
+
confidence: parsedResult.confidence || 0,
|
|
167
|
+
agent: parsedResult.agent,
|
|
168
|
+
verificationMethod: parsedResult.verification_method || "wasm",
|
|
169
|
+
riskLevel: parsedResult.risk_level || "low",
|
|
170
|
+
timestamp: parsedResult.timestamp || metadata.timestamp,
|
|
171
|
+
reasons: parsedResult.reasons || []
|
|
172
|
+
};
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error("WASM detection failed:", error);
|
|
175
|
+
return {
|
|
176
|
+
isAgent: false,
|
|
177
|
+
confidence: 0,
|
|
178
|
+
verificationMethod: "pattern",
|
|
179
|
+
riskLevel: "low",
|
|
180
|
+
timestamp: metadata.timestamp
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function createEdgeWasmMiddleware(config) {
|
|
185
|
+
const {
|
|
186
|
+
wasmModule,
|
|
187
|
+
onAgentDetected,
|
|
188
|
+
blockOnHighConfidence = false,
|
|
189
|
+
confidenceThreshold = 0.9,
|
|
190
|
+
skipPaths = [],
|
|
191
|
+
blockedResponse = {
|
|
192
|
+
status: 403,
|
|
193
|
+
message: "AI agent access restricted",
|
|
194
|
+
headers: { "Content-Type": "application/json" }
|
|
195
|
+
}
|
|
196
|
+
} = config;
|
|
197
|
+
const initPromise = initializeEdgeWasm(wasmModule);
|
|
198
|
+
return async function middleware(request) {
|
|
199
|
+
const path = request.nextUrl.pathname;
|
|
200
|
+
if (skipPaths.some((skip) => path.startsWith(skip))) {
|
|
201
|
+
return server.NextResponse.next();
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
await initPromise;
|
|
205
|
+
const metadata = {
|
|
206
|
+
userAgent: request.headers.get("user-agent") || void 0,
|
|
207
|
+
ipAddress: request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0,
|
|
208
|
+
headers: Object.fromEntries(request.headers.entries()),
|
|
209
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
210
|
+
};
|
|
211
|
+
const result = await detectWithWasm(metadata);
|
|
212
|
+
if (onAgentDetected && result.isAgent) {
|
|
213
|
+
await onAgentDetected(result);
|
|
214
|
+
}
|
|
215
|
+
if (blockOnHighConfidence && result.isAgent && result.confidence >= confidenceThreshold) {
|
|
216
|
+
return server.NextResponse.json(
|
|
217
|
+
{
|
|
218
|
+
error: blockedResponse.message,
|
|
219
|
+
agent: result.agent,
|
|
220
|
+
confidence: Math.round(result.confidence * 100)
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
status: blockedResponse.status || 403,
|
|
224
|
+
headers: blockedResponse.headers || {}
|
|
225
|
+
}
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
const response = server.NextResponse.next();
|
|
229
|
+
if (result.isAgent) {
|
|
230
|
+
response.headers.set("X-Agent-Detected", result.agent || "unknown");
|
|
231
|
+
response.headers.set("X-Agent-Confidence", String(Math.round(result.confidence * 100)));
|
|
232
|
+
response.headers.set("X-Agent-Verification", result.verificationMethod);
|
|
233
|
+
}
|
|
234
|
+
return response;
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error("Edge WASM middleware error:", error);
|
|
237
|
+
return server.NextResponse.next();
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
exports.createEdgeWasmMiddleware = createEdgeWasmMiddleware;
|
|
243
|
+
exports.initializeEdgeWasm = initializeEdgeWasm;
|
|
244
|
+
//# sourceMappingURL=edge-wasm-middleware.js.map
|
|
245
|
+
//# sourceMappingURL=edge-wasm-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/edge-wasm-middleware.ts"],"names":["ptr","NextResponse"],"mappings":"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","file":"edge-wasm-middleware.js","sourcesContent":["/**\n * Edge Runtime Compatible WASM Middleware for AgentShield\n * \n * This module provides WASM-based AI agent detection with 95-100% confidence\n * in Next.js Edge Runtime and Vercel Edge Functions.\n * \n * IMPORTANT: WebAssembly.instantiate(module) IS supported in Edge Runtime\n * when using a pre-compiled module imported with ?module suffix.\n */\n\nimport type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\n\n// Type definitions\nexport interface EdgeWasmDetectionResult {\n isAgent: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: 'signature' | 'pattern' | 'wasm';\n riskLevel: 'low' | 'medium' | 'high';\n timestamp: string;\n reasons?: string[];\n}\n\nexport interface EdgeAgentShieldConfig {\n onAgentDetected?: (result: EdgeWasmDetectionResult) => void | Promise<void>;\n blockOnHighConfidence?: boolean;\n confidenceThreshold?: number;\n skipPaths?: string[];\n blockedResponse?: {\n status?: number;\n message?: string;\n headers?: Record<string, string>;\n };\n}\n\n// WASM module cache\nlet wasmExports: any = null;\nlet wasmInitPromise: Promise<void> | null = null;\n\n// wasm-bindgen glue code\nconst heap = new Array(128).fill(undefined);\nheap.push(undefined, null, true, false);\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj: any) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n heap[idx] = obj;\n return idx;\n}\n\nfunction getObject(idx: number) { return heap[idx]; }\n\nfunction dropObject(idx: number) {\n if (idx < 132) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx: number) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nconst cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\nconst cachedTextEncoder = new TextEncoder();\n\nlet cachedUint8ArrayMemory0: Uint8Array | null = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasmExports.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr: number, len: number) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nfunction passStringToWasm0(arg: string, malloc: any, realloc: any) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n offset += ret.written!;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedDataViewMemory0: DataView | null = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || \n (cachedDataViewMemory0.buffer !== wasmExports.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasmExports.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\n/**\n * Initialize WASM module with proper imports for Edge Runtime\n */\nexport async function initializeEdgeWasm(wasmModule: WebAssembly.Module): Promise<void> {\n if (wasmInitPromise) {\n return wasmInitPromise;\n }\n\n wasmInitPromise = (async () => {\n try {\n // Create imports object required by wasm-bindgen\n const imports = {\n './agentshield_wasm_bg.js': {\n __wbindgen_object_drop_ref: function(arg0: number) {\n dropObject(arg0);\n },\n __wbindgen_string_new: function(arg0: number, arg1: number) {\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n },\n __wbindgen_string_get: function(arg0: number, arg1: number) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'string' ? obj : undefined;\n const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbindgen_throw: function(arg0: number, arg1: number) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n },\n wbg: {\n __wbindgen_object_drop_ref: function(arg0: number) {\n dropObject(arg0);\n },\n __wbindgen_string_new: function(arg0: number, arg1: number) {\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n },\n __wbindgen_string_get: function(arg0: number, arg1: number) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'string' ? obj : undefined;\n const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbindgen_throw: function(arg0: number, arg1: number) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n },\n };\n\n // Instantiate with proper imports\n const instance = await WebAssembly.instantiate(wasmModule, imports);\n wasmExports = instance.exports;\n\n // Initialize wasm-bindgen if needed\n if (wasmExports.__wbindgen_start) {\n wasmExports.__wbindgen_start();\n }\n\n console.log('✅ AgentShield: WASM module loaded successfully in Edge Runtime (95-100% confidence enabled)');\n } catch (error) {\n console.error('❌ AgentShield: Failed to initialize WASM in Edge Runtime:', error);\n throw error;\n }\n })();\n\n return wasmInitPromise;\n}\n\n/**\n * Detect AI agent using WASM in Edge Runtime\n */\nasync function detectWithWasm(metadata: {\n userAgent?: string | undefined;\n ipAddress?: string | undefined;\n headers: Record<string, string>;\n timestamp: string;\n}): Promise<EdgeWasmDetectionResult> {\n if (!wasmExports) {\n throw new Error('WASM not initialized. Call initializeEdgeWasm first.');\n }\n\n try {\n // Create WASM request metadata\n const userAgent = metadata.userAgent || '';\n const ipAddress = metadata.ipAddress || '';\n const headers = JSON.stringify(metadata.headers);\n const timestamp = metadata.timestamp;\n\n // Call WASM function directly\n const ptr0 = passStringToWasm0(userAgent, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(ipAddress, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(headers, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ptr3 = passStringToWasm0(timestamp, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len3 = WASM_VECTOR_LEN;\n\n // Create metadata object in WASM\n const metadataPtr = wasmExports.jsrequestmetadata_new(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3);\n \n // Perform detection\n const resultPtr = wasmExports.detect_agent(metadataPtr);\n const result = takeObject(resultPtr);\n\n // Free WASM metadata\n wasmExports.__wbg_jsrequestmetadata_free(metadataPtr, 0);\n\n // Parse result\n const parsedResult = typeof result === 'string' ? JSON.parse(result) : result;\n\n return {\n isAgent: parsedResult.is_agent || false,\n confidence: parsedResult.confidence || 0,\n agent: parsedResult.agent,\n verificationMethod: parsedResult.verification_method || 'wasm',\n riskLevel: parsedResult.risk_level || 'low',\n timestamp: parsedResult.timestamp || metadata.timestamp,\n reasons: parsedResult.reasons || []\n };\n } catch (error) {\n console.error('WASM detection failed:', error);\n // Fall back to pattern detection\n return {\n isAgent: false,\n confidence: 0,\n verificationMethod: 'pattern',\n riskLevel: 'low',\n timestamp: metadata.timestamp\n };\n }\n}\n\n/**\n * Create Edge Runtime compatible WASM middleware\n * \n * @example\n * ```typescript\n * // middleware.ts\n * import wasmModule from '@kya-os/agentshield/wasm?module';\n * import { createEdgeWasmMiddleware } from '@kya-os/agentshield-nextjs/edge-wasm-middleware';\n * \n * export const middleware = createEdgeWasmMiddleware({\n * wasmModule,\n * onAgentDetected: (result) => {\n * console.log(`AI Agent: ${result.agent} (${result.confidence * 100}% confidence)`);\n * }\n * });\n * ```\n */\nexport function createEdgeWasmMiddleware(config: EdgeAgentShieldConfig & {\n wasmModule: WebAssembly.Module;\n}) {\n const {\n wasmModule,\n onAgentDetected,\n blockOnHighConfidence = false,\n confidenceThreshold = 0.9,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'AI agent access restricted',\n headers: { 'Content-Type': 'application/json' }\n }\n } = config;\n\n // Initialize WASM on first load\n const initPromise = initializeEdgeWasm(wasmModule);\n\n return async function middleware(request: NextRequest) {\n // Check if path should be skipped\n const path = request.nextUrl.pathname;\n if (skipPaths.some(skip => path.startsWith(skip))) {\n return NextResponse.next();\n }\n\n try {\n // Ensure WASM is initialized\n await initPromise;\n\n // Prepare metadata\n const metadata = {\n userAgent: request.headers.get('user-agent') || undefined,\n ipAddress: request.headers.get('x-forwarded-for') || \n request.headers.get('x-real-ip') || \n undefined,\n headers: Object.fromEntries(request.headers.entries()),\n timestamp: new Date().toISOString()\n };\n\n // Perform WASM detection\n const result = await detectWithWasm(metadata);\n\n // Call user callback if provided\n if (onAgentDetected && result.isAgent) {\n await onAgentDetected(result);\n }\n\n // Block if configured\n if (blockOnHighConfidence && \n result.isAgent && \n result.confidence >= confidenceThreshold) {\n \n return NextResponse.json(\n { \n error: blockedResponse.message,\n agent: result.agent,\n confidence: Math.round(result.confidence * 100)\n },\n { \n status: blockedResponse.status || 403,\n headers: blockedResponse.headers || {}\n }\n );\n }\n\n // Add detection headers\n const response = NextResponse.next();\n if (result.isAgent) {\n response.headers.set('X-Agent-Detected', result.agent || 'unknown');\n response.headers.set('X-Agent-Confidence', String(Math.round(result.confidence * 100)));\n response.headers.set('X-Agent-Verification', result.verificationMethod);\n }\n\n return response;\n\n } catch (error) {\n console.error('Edge WASM middleware error:', error);\n // Continue without blocking on error\n return NextResponse.next();\n }\n };\n}"]}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
// src/edge-wasm-middleware.ts
|
|
4
|
+
var wasmExports = null;
|
|
5
|
+
var wasmInitPromise = null;
|
|
6
|
+
var heap = new Array(128).fill(void 0);
|
|
7
|
+
heap.push(void 0, null, true, false);
|
|
8
|
+
var heap_next = heap.length;
|
|
9
|
+
function addHeapObject(obj) {
|
|
10
|
+
if (heap_next === heap.length) heap.push(heap.length + 1);
|
|
11
|
+
const idx = heap_next;
|
|
12
|
+
heap_next = heap[idx];
|
|
13
|
+
heap[idx] = obj;
|
|
14
|
+
return idx;
|
|
15
|
+
}
|
|
16
|
+
function getObject(idx) {
|
|
17
|
+
return heap[idx];
|
|
18
|
+
}
|
|
19
|
+
function dropObject(idx) {
|
|
20
|
+
if (idx < 132) return;
|
|
21
|
+
heap[idx] = heap_next;
|
|
22
|
+
heap_next = idx;
|
|
23
|
+
}
|
|
24
|
+
function takeObject(idx) {
|
|
25
|
+
const ret = getObject(idx);
|
|
26
|
+
dropObject(idx);
|
|
27
|
+
return ret;
|
|
28
|
+
}
|
|
29
|
+
var cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
|
|
30
|
+
var cachedTextEncoder = new TextEncoder();
|
|
31
|
+
var cachedUint8ArrayMemory0 = null;
|
|
32
|
+
function getUint8ArrayMemory0() {
|
|
33
|
+
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
|
|
34
|
+
cachedUint8ArrayMemory0 = new Uint8Array(wasmExports.memory.buffer);
|
|
35
|
+
}
|
|
36
|
+
return cachedUint8ArrayMemory0;
|
|
37
|
+
}
|
|
38
|
+
function getStringFromWasm0(ptr, len) {
|
|
39
|
+
ptr = ptr >>> 0;
|
|
40
|
+
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
|
|
41
|
+
}
|
|
42
|
+
var WASM_VECTOR_LEN = 0;
|
|
43
|
+
function passStringToWasm0(arg, malloc, realloc) {
|
|
44
|
+
if (realloc === void 0) {
|
|
45
|
+
const buf = cachedTextEncoder.encode(arg);
|
|
46
|
+
const ptr2 = malloc(buf.length, 1) >>> 0;
|
|
47
|
+
getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf);
|
|
48
|
+
WASM_VECTOR_LEN = buf.length;
|
|
49
|
+
return ptr2;
|
|
50
|
+
}
|
|
51
|
+
let len = arg.length;
|
|
52
|
+
let ptr = malloc(len, 1) >>> 0;
|
|
53
|
+
const mem = getUint8ArrayMemory0();
|
|
54
|
+
let offset = 0;
|
|
55
|
+
for (; offset < len; offset++) {
|
|
56
|
+
const code = arg.charCodeAt(offset);
|
|
57
|
+
if (code > 127) break;
|
|
58
|
+
mem[ptr + offset] = code;
|
|
59
|
+
}
|
|
60
|
+
if (offset !== len) {
|
|
61
|
+
if (offset !== 0) {
|
|
62
|
+
arg = arg.slice(offset);
|
|
63
|
+
}
|
|
64
|
+
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
|
|
65
|
+
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
|
|
66
|
+
const ret = cachedTextEncoder.encodeInto(arg, view);
|
|
67
|
+
offset += ret.written;
|
|
68
|
+
}
|
|
69
|
+
WASM_VECTOR_LEN = offset;
|
|
70
|
+
return ptr;
|
|
71
|
+
}
|
|
72
|
+
var cachedDataViewMemory0 = null;
|
|
73
|
+
function getDataViewMemory0() {
|
|
74
|
+
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer !== wasmExports.memory.buffer) {
|
|
75
|
+
cachedDataViewMemory0 = new DataView(wasmExports.memory.buffer);
|
|
76
|
+
}
|
|
77
|
+
return cachedDataViewMemory0;
|
|
78
|
+
}
|
|
79
|
+
async function initializeEdgeWasm(wasmModule) {
|
|
80
|
+
if (wasmInitPromise) {
|
|
81
|
+
return wasmInitPromise;
|
|
82
|
+
}
|
|
83
|
+
wasmInitPromise = (async () => {
|
|
84
|
+
try {
|
|
85
|
+
const imports = {
|
|
86
|
+
"./agentshield_wasm_bg.js": {
|
|
87
|
+
__wbindgen_object_drop_ref: function(arg0) {
|
|
88
|
+
dropObject(arg0);
|
|
89
|
+
},
|
|
90
|
+
__wbindgen_string_new: function(arg0, arg1) {
|
|
91
|
+
const ret = getStringFromWasm0(arg0, arg1);
|
|
92
|
+
return addHeapObject(ret);
|
|
93
|
+
},
|
|
94
|
+
__wbindgen_string_get: function(arg0, arg1) {
|
|
95
|
+
const obj = getObject(arg1);
|
|
96
|
+
const ret = typeof obj === "string" ? obj : void 0;
|
|
97
|
+
const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;
|
|
98
|
+
const len1 = WASM_VECTOR_LEN;
|
|
99
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
|
|
100
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
|
|
101
|
+
},
|
|
102
|
+
__wbindgen_throw: function(arg0, arg1) {
|
|
103
|
+
throw new Error(getStringFromWasm0(arg0, arg1));
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
wbg: {
|
|
107
|
+
__wbindgen_object_drop_ref: function(arg0) {
|
|
108
|
+
dropObject(arg0);
|
|
109
|
+
},
|
|
110
|
+
__wbindgen_string_new: function(arg0, arg1) {
|
|
111
|
+
const ret = getStringFromWasm0(arg0, arg1);
|
|
112
|
+
return addHeapObject(ret);
|
|
113
|
+
},
|
|
114
|
+
__wbindgen_string_get: function(arg0, arg1) {
|
|
115
|
+
const obj = getObject(arg1);
|
|
116
|
+
const ret = typeof obj === "string" ? obj : void 0;
|
|
117
|
+
const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;
|
|
118
|
+
const len1 = WASM_VECTOR_LEN;
|
|
119
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
|
|
120
|
+
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
|
|
121
|
+
},
|
|
122
|
+
__wbindgen_throw: function(arg0, arg1) {
|
|
123
|
+
throw new Error(getStringFromWasm0(arg0, arg1));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
const instance = await WebAssembly.instantiate(wasmModule, imports);
|
|
128
|
+
wasmExports = instance.exports;
|
|
129
|
+
if (wasmExports.__wbindgen_start) {
|
|
130
|
+
wasmExports.__wbindgen_start();
|
|
131
|
+
}
|
|
132
|
+
console.log("\u2705 AgentShield: WASM module loaded successfully in Edge Runtime (95-100% confidence enabled)");
|
|
133
|
+
} catch (error) {
|
|
134
|
+
console.error("\u274C AgentShield: Failed to initialize WASM in Edge Runtime:", error);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
})();
|
|
138
|
+
return wasmInitPromise;
|
|
139
|
+
}
|
|
140
|
+
async function detectWithWasm(metadata) {
|
|
141
|
+
if (!wasmExports) {
|
|
142
|
+
throw new Error("WASM not initialized. Call initializeEdgeWasm first.");
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const userAgent = metadata.userAgent || "";
|
|
146
|
+
const ipAddress = metadata.ipAddress || "";
|
|
147
|
+
const headers = JSON.stringify(metadata.headers);
|
|
148
|
+
const timestamp = metadata.timestamp;
|
|
149
|
+
const ptr0 = passStringToWasm0(userAgent, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
150
|
+
const len0 = WASM_VECTOR_LEN;
|
|
151
|
+
const ptr1 = passStringToWasm0(ipAddress, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
152
|
+
const len1 = WASM_VECTOR_LEN;
|
|
153
|
+
const ptr2 = passStringToWasm0(headers, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
154
|
+
const len2 = WASM_VECTOR_LEN;
|
|
155
|
+
const ptr3 = passStringToWasm0(timestamp, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);
|
|
156
|
+
const len3 = WASM_VECTOR_LEN;
|
|
157
|
+
const metadataPtr = wasmExports.jsrequestmetadata_new(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3);
|
|
158
|
+
const resultPtr = wasmExports.detect_agent(metadataPtr);
|
|
159
|
+
const result = takeObject(resultPtr);
|
|
160
|
+
wasmExports.__wbg_jsrequestmetadata_free(metadataPtr, 0);
|
|
161
|
+
const parsedResult = typeof result === "string" ? JSON.parse(result) : result;
|
|
162
|
+
return {
|
|
163
|
+
isAgent: parsedResult.is_agent || false,
|
|
164
|
+
confidence: parsedResult.confidence || 0,
|
|
165
|
+
agent: parsedResult.agent,
|
|
166
|
+
verificationMethod: parsedResult.verification_method || "wasm",
|
|
167
|
+
riskLevel: parsedResult.risk_level || "low",
|
|
168
|
+
timestamp: parsedResult.timestamp || metadata.timestamp,
|
|
169
|
+
reasons: parsedResult.reasons || []
|
|
170
|
+
};
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error("WASM detection failed:", error);
|
|
173
|
+
return {
|
|
174
|
+
isAgent: false,
|
|
175
|
+
confidence: 0,
|
|
176
|
+
verificationMethod: "pattern",
|
|
177
|
+
riskLevel: "low",
|
|
178
|
+
timestamp: metadata.timestamp
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function createEdgeWasmMiddleware(config) {
|
|
183
|
+
const {
|
|
184
|
+
wasmModule,
|
|
185
|
+
onAgentDetected,
|
|
186
|
+
blockOnHighConfidence = false,
|
|
187
|
+
confidenceThreshold = 0.9,
|
|
188
|
+
skipPaths = [],
|
|
189
|
+
blockedResponse = {
|
|
190
|
+
status: 403,
|
|
191
|
+
message: "AI agent access restricted",
|
|
192
|
+
headers: { "Content-Type": "application/json" }
|
|
193
|
+
}
|
|
194
|
+
} = config;
|
|
195
|
+
const initPromise = initializeEdgeWasm(wasmModule);
|
|
196
|
+
return async function middleware(request) {
|
|
197
|
+
const path = request.nextUrl.pathname;
|
|
198
|
+
if (skipPaths.some((skip) => path.startsWith(skip))) {
|
|
199
|
+
return NextResponse.next();
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
await initPromise;
|
|
203
|
+
const metadata = {
|
|
204
|
+
userAgent: request.headers.get("user-agent") || void 0,
|
|
205
|
+
ipAddress: request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0,
|
|
206
|
+
headers: Object.fromEntries(request.headers.entries()),
|
|
207
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
208
|
+
};
|
|
209
|
+
const result = await detectWithWasm(metadata);
|
|
210
|
+
if (onAgentDetected && result.isAgent) {
|
|
211
|
+
await onAgentDetected(result);
|
|
212
|
+
}
|
|
213
|
+
if (blockOnHighConfidence && result.isAgent && result.confidence >= confidenceThreshold) {
|
|
214
|
+
return NextResponse.json(
|
|
215
|
+
{
|
|
216
|
+
error: blockedResponse.message,
|
|
217
|
+
agent: result.agent,
|
|
218
|
+
confidence: Math.round(result.confidence * 100)
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
status: blockedResponse.status || 403,
|
|
222
|
+
headers: blockedResponse.headers || {}
|
|
223
|
+
}
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
const response = NextResponse.next();
|
|
227
|
+
if (result.isAgent) {
|
|
228
|
+
response.headers.set("X-Agent-Detected", result.agent || "unknown");
|
|
229
|
+
response.headers.set("X-Agent-Confidence", String(Math.round(result.confidence * 100)));
|
|
230
|
+
response.headers.set("X-Agent-Verification", result.verificationMethod);
|
|
231
|
+
}
|
|
232
|
+
return response;
|
|
233
|
+
} catch (error) {
|
|
234
|
+
console.error("Edge WASM middleware error:", error);
|
|
235
|
+
return NextResponse.next();
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export { createEdgeWasmMiddleware, initializeEdgeWasm };
|
|
241
|
+
//# sourceMappingURL=edge-wasm-middleware.mjs.map
|
|
242
|
+
//# sourceMappingURL=edge-wasm-middleware.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/edge-wasm-middleware.ts"],"names":["ptr"],"mappings":";;;AAqCA,IAAI,WAAA,GAAmB,IAAA;AACvB,IAAI,eAAA,GAAwC,IAAA;AAG5C,IAAM,OAAO,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,MAAS,CAAA;AAC1C,IAAA,CAAK,IAAA,CAAK,MAAA,EAAW,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AACtC,IAAI,YAAY,IAAA,CAAK,MAAA;AAErB,SAAS,cAAc,GAAA,EAAU;AAC/B,EAAA,IAAI,cAAc,IAAA,CAAK,MAAA,OAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AACxD,EAAA,MAAM,GAAA,GAAM,SAAA;AACZ,EAAA,SAAA,GAAY,KAAK,GAAG,CAAA;AACpB,EAAA,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AACZ,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAU,GAAA,EAAa;AAAE,EAAA,OAAO,KAAK,GAAG,CAAA;AAAG;AAEpD,SAAS,WAAW,GAAA,EAAa;AAC/B,EAAA,IAAI,MAAM,GAAA,EAAK;AACf,EAAA,IAAA,CAAK,GAAG,CAAA,GAAI,SAAA;AACZ,EAAA,SAAA,GAAY,GAAA;AACd;AAEA,SAAS,WAAW,GAAA,EAAa;AAC/B,EAAA,MAAM,GAAA,GAAM,UAAU,GAAG,CAAA;AACzB,EAAA,UAAA,CAAW,GAAG,CAAA;AACd,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,iBAAA,GAAoB,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AACnF,IAAM,iBAAA,GAAoB,IAAI,WAAA,EAAY;AAE1C,IAAI,uBAAA,GAA6C,IAAA;AACjD,SAAS,oBAAA,GAAuB;AAC9B,EAAA,IAAI,uBAAA,KAA4B,IAAA,IAAQ,uBAAA,CAAwB,UAAA,KAAe,CAAA,EAAG;AAChF,IAAA,uBAAA,GAA0B,IAAI,UAAA,CAAW,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,uBAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,KAAa,GAAA,EAAa;AACpD,EAAA,GAAA,GAAM,GAAA,KAAQ,CAAA;AACd,EAAA,OAAO,iBAAA,CAAkB,OAAO,oBAAA,EAAqB,CAAE,SAAS,GAAA,EAAK,GAAA,GAAM,GAAG,CAAC,CAAA;AACjF;AAEA,IAAI,eAAA,GAAkB,CAAA;AAEtB,SAAS,iBAAA,CAAkB,GAAA,EAAa,MAAA,EAAa,OAAA,EAAc;AACjE,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,MAAA,CAAO,GAAG,CAAA;AACxC,IAAA,MAAMA,IAAAA,GAAM,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA,KAAM,CAAA;AACtC,IAAA,oBAAA,EAAqB,CAAE,SAASA,IAAAA,EAAKA,IAAAA,GAAM,IAAI,MAAM,CAAA,CAAE,IAAI,GAAG,CAAA;AAC9D,IAAA,eAAA,GAAkB,GAAA,CAAI,MAAA;AACtB,IAAA,OAAOA,IAAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAM,GAAA,CAAI,MAAA;AACd,EAAA,IAAI,GAAA,GAAM,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA,KAAM,CAAA;AAE7B,EAAA,MAAM,MAAM,oBAAA,EAAqB;AAEjC,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,MAAA,GAAS,KAAK,MAAA,EAAA,EAAU;AAC7B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AAClC,IAAA,IAAI,OAAO,GAAA,EAAM;AACjB,IAAA,GAAA,CAAI,GAAA,GAAM,MAAM,CAAA,GAAI,IAAA;AAAA,EACtB;AAEA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,GAAA,GAAM,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,IACxB;AACA,IAAA,GAAA,GAAM,OAAA,CAAQ,KAAK,GAAA,EAAK,GAAA,GAAM,SAAS,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA;AAC9D,IAAA,MAAM,OAAO,oBAAA,EAAqB,CAAE,SAAS,GAAA,GAAM,MAAA,EAAQ,MAAM,GAAG,CAAA;AACpE,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA;AAClD,IAAA,MAAA,IAAU,GAAA,CAAI,OAAA;AAAA,EAChB;AAEA,EAAA,eAAA,GAAkB,MAAA;AAClB,EAAA,OAAO,GAAA;AACT;AAEA,IAAI,qBAAA,GAAyC,IAAA;AAC7C,SAAS,kBAAA,GAAqB;AAC5B,EAAA,IAAI,0BAA0B,IAAA,IACzB,qBAAA,CAAsB,MAAA,KAAW,WAAA,CAAY,OAAO,MAAA,EAAS;AAChE,IAAA,qBAAA,GAAwB,IAAI,QAAA,CAAS,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,qBAAA;AACT;AAKA,eAAsB,mBAAmB,UAAA,EAA+C;AACtF,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,eAAA,GAAA,CAAmB,YAAY;AAC7B,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,0BAAA,EAA4B;AAAA,UAC1B,0BAAA,EAA4B,SAAS,IAAA,EAAc;AACjD,YAAA,UAAA,CAAW,IAAI,CAAA;AAAA,UACjB,CAAA;AAAA,UACA,qBAAA,EAAuB,SAAS,IAAA,EAAc,IAAA,EAAc;AAC1D,YAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,EAAM,IAAI,CAAA;AACzC,YAAA,OAAO,cAAc,GAAG,CAAA;AAAA,UAC1B,CAAA;AAAA,UACA,qBAAA,EAAuB,SAAS,IAAA,EAAc,IAAA,EAAc;AAC1D,YAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,YAAA,MAAM,GAAA,GAAM,OAAO,GAAA,KAAS,QAAA,GAAW,GAAA,GAAM,KAAA,CAAA;AAC7C,YAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,CAAkB,GAAA,EAAK,YAAY,iBAAA,EAAmB,WAAA,CAAY,kBAAkB,CAAA,GAAI,CAAA;AAC3G,YAAA,MAAM,IAAA,GAAO,eAAA;AACb,YAAA,kBAAA,GAAqB,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,MAAM,IAAI,CAAA;AACtD,YAAA,kBAAA,GAAqB,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,UACxD,CAAA;AAAA,UACA,gBAAA,EAAkB,SAAS,IAAA,EAAc,IAAA,EAAc;AACrD,YAAA,MAAM,IAAI,KAAA,CAAM,kBAAA,CAAmB,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,UAChD;AAAA,SACF;AAAA,QACA,GAAA,EAAK;AAAA,UACH,0BAAA,EAA4B,SAAS,IAAA,EAAc;AACjD,YAAA,UAAA,CAAW,IAAI,CAAA;AAAA,UACjB,CAAA;AAAA,UACA,qBAAA,EAAuB,SAAS,IAAA,EAAc,IAAA,EAAc;AAC1D,YAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,EAAM,IAAI,CAAA;AACzC,YAAA,OAAO,cAAc,GAAG,CAAA;AAAA,UAC1B,CAAA;AAAA,UACA,qBAAA,EAAuB,SAAS,IAAA,EAAc,IAAA,EAAc;AAC1D,YAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,YAAA,MAAM,GAAA,GAAM,OAAO,GAAA,KAAS,QAAA,GAAW,GAAA,GAAM,KAAA,CAAA;AAC7C,YAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,CAAkB,GAAA,EAAK,YAAY,iBAAA,EAAmB,WAAA,CAAY,kBAAkB,CAAA,GAAI,CAAA;AAC3G,YAAA,MAAM,IAAA,GAAO,eAAA;AACb,YAAA,kBAAA,GAAqB,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,MAAM,IAAI,CAAA;AACtD,YAAA,kBAAA,GAAqB,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,UACxD,CAAA;AAAA,UACA,gBAAA,EAAkB,SAAS,IAAA,EAAc,IAAA,EAAc;AACrD,YAAA,MAAM,IAAI,KAAA,CAAM,kBAAA,CAAmB,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,UAChD;AAAA;AACF,OACF;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,WAAA,CAAY,YAAY,OAAO,CAAA;AAClE,MAAA,WAAA,GAAc,QAAA,CAAS,OAAA;AAGvB,MAAA,IAAI,YAAY,gBAAA,EAAkB;AAChC,QAAA,WAAA,CAAY,gBAAA,EAAiB;AAAA,MAC/B;AAEA,MAAA,OAAA,CAAQ,IAAI,kGAA6F,CAAA;AAAA,IAC3G,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kEAA6D,KAAK,CAAA;AAChF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO,eAAA;AACT;AAKA,eAAe,eAAe,QAAA,EAKO;AACnC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,EAAA;AACxC,IAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,EAAA;AACxC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAC/C,IAAA,MAAM,YAAY,QAAA,CAAS,SAAA;AAG3B,IAAA,MAAM,OAAO,iBAAA,CAAkB,SAAA,EAAW,WAAA,CAAY,iBAAA,EAAmB,YAAY,kBAAkB,CAAA;AACvG,IAAA,MAAM,IAAA,GAAO,eAAA;AACb,IAAA,MAAM,OAAO,iBAAA,CAAkB,SAAA,EAAW,WAAA,CAAY,iBAAA,EAAmB,YAAY,kBAAkB,CAAA;AACvG,IAAA,MAAM,IAAA,GAAO,eAAA;AACb,IAAA,MAAM,OAAO,iBAAA,CAAkB,OAAA,EAAS,WAAA,CAAY,iBAAA,EAAmB,YAAY,kBAAkB,CAAA;AACrG,IAAA,MAAM,IAAA,GAAO,eAAA;AACb,IAAA,MAAM,OAAO,iBAAA,CAAkB,SAAA,EAAW,WAAA,CAAY,iBAAA,EAAmB,YAAY,kBAAkB,CAAA;AACvG,IAAA,MAAM,IAAA,GAAO,eAAA;AAGb,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,qBAAA,CAAsB,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAGpG,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,YAAA,CAAa,WAAW,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AAGnC,IAAA,WAAA,CAAY,4BAAA,CAA6B,aAAa,CAAC,CAAA;AAGvD,IAAA,MAAM,eAAe,OAAO,MAAA,KAAW,WAAW,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA;AAEvE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,aAAa,QAAA,IAAY,KAAA;AAAA,MAClC,UAAA,EAAY,aAAa,UAAA,IAAc,CAAA;AAAA,MACvC,OAAO,YAAA,CAAa,KAAA;AAAA,MACpB,kBAAA,EAAoB,aAAa,mBAAA,IAAuB,MAAA;AAAA,MACxD,SAAA,EAAW,aAAa,UAAA,IAAc,KAAA;AAAA,MACtC,SAAA,EAAW,YAAA,CAAa,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,MAC9C,OAAA,EAAS,YAAA,CAAa,OAAA,IAAW;AAAC,KACpC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAE7C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,kBAAA,EAAoB,SAAA;AAAA,MACpB,SAAA,EAAW,KAAA;AAAA,MACX,WAAW,QAAA,CAAS;AAAA,KACtB;AAAA,EACF;AACF;AAmBO,SAAS,yBAAyB,MAAA,EAEtC;AACD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA,GAAwB,KAAA;AAAA,IACxB,mBAAA,GAAsB,GAAA;AAAA,IACtB,YAAY,EAAC;AAAA,IACb,eAAA,GAAkB;AAAA,MAChB,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS,4BAAA;AAAA,MACT,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB;AAChD,GACF,GAAI,MAAA;AAGJ,EAAA,MAAM,WAAA,GAAc,mBAAmB,UAAU,CAAA;AAEjD,EAAA,OAAO,eAAe,WAAW,OAAA,EAAsB;AAErD,IAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,CAAQ,QAAA;AAC7B,IAAA,IAAI,UAAU,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,UAAA,CAAW,IAAI,CAAC,CAAA,EAAG;AACjD,MAAA,OAAO,aAAa,IAAA,EAAK;AAAA,IAC3B;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA;AAGN,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,SAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IAAK,KAAA,CAAA;AAAA,QAChD,SAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAiB,KACrC,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAC/B,KAAA,CAAA;AAAA,QACX,SAAS,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAAA,QACrD,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,QAAQ,CAAA;AAG5C,MAAA,IAAI,eAAA,IAAmB,OAAO,OAAA,EAAS;AACrC,QAAA,MAAM,gBAAgB,MAAM,CAAA;AAAA,MAC9B;AAGA,MAAA,IAAI,qBAAA,IACA,MAAA,CAAO,OAAA,IACP,MAAA,CAAO,cAAc,mBAAA,EAAqB;AAE5C,QAAA,OAAO,YAAA,CAAa,IAAA;AAAA,UAClB;AAAA,YACE,OAAO,eAAA,CAAgB,OAAA;AAAA,YACvB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAa,GAAG;AAAA,WAChD;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,gBAAgB,MAAA,IAAU,GAAA;AAAA,YAClC,OAAA,EAAS,eAAA,CAAgB,OAAA,IAAW;AAAC;AACvC,SACF;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,aAAa,IAAA,EAAK;AACnC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,MAAA,CAAO,SAAS,SAAS,CAAA;AAClE,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,oBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,MAAM,MAAA,CAAO,UAAA,GAAa,GAAG,CAAC,CAAC,CAAA;AACtF,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,sBAAA,EAAwB,MAAA,CAAO,kBAAkB,CAAA;AAAA,MACxE;AAEA,MAAA,OAAO,QAAA;AAAA,IAET,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAElD,MAAA,OAAO,aAAa,IAAA,EAAK;AAAA,IAC3B;AAAA,EACF,CAAA;AACF","file":"edge-wasm-middleware.mjs","sourcesContent":["/**\n * Edge Runtime Compatible WASM Middleware for AgentShield\n * \n * This module provides WASM-based AI agent detection with 95-100% confidence\n * in Next.js Edge Runtime and Vercel Edge Functions.\n * \n * IMPORTANT: WebAssembly.instantiate(module) IS supported in Edge Runtime\n * when using a pre-compiled module imported with ?module suffix.\n */\n\nimport type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\n\n// Type definitions\nexport interface EdgeWasmDetectionResult {\n isAgent: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: 'signature' | 'pattern' | 'wasm';\n riskLevel: 'low' | 'medium' | 'high';\n timestamp: string;\n reasons?: string[];\n}\n\nexport interface EdgeAgentShieldConfig {\n onAgentDetected?: (result: EdgeWasmDetectionResult) => void | Promise<void>;\n blockOnHighConfidence?: boolean;\n confidenceThreshold?: number;\n skipPaths?: string[];\n blockedResponse?: {\n status?: number;\n message?: string;\n headers?: Record<string, string>;\n };\n}\n\n// WASM module cache\nlet wasmExports: any = null;\nlet wasmInitPromise: Promise<void> | null = null;\n\n// wasm-bindgen glue code\nconst heap = new Array(128).fill(undefined);\nheap.push(undefined, null, true, false);\nlet heap_next = heap.length;\n\nfunction addHeapObject(obj: any) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n heap[idx] = obj;\n return idx;\n}\n\nfunction getObject(idx: number) { return heap[idx]; }\n\nfunction dropObject(idx: number) {\n if (idx < 132) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx: number) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nconst cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\nconst cachedTextEncoder = new TextEncoder();\n\nlet cachedUint8ArrayMemory0: Uint8Array | null = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasmExports.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr: number, len: number) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nfunction passStringToWasm0(arg: string, malloc: any, realloc: any) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n offset += ret.written!;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedDataViewMemory0: DataView | null = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || \n (cachedDataViewMemory0.buffer !== wasmExports.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasmExports.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\n/**\n * Initialize WASM module with proper imports for Edge Runtime\n */\nexport async function initializeEdgeWasm(wasmModule: WebAssembly.Module): Promise<void> {\n if (wasmInitPromise) {\n return wasmInitPromise;\n }\n\n wasmInitPromise = (async () => {\n try {\n // Create imports object required by wasm-bindgen\n const imports = {\n './agentshield_wasm_bg.js': {\n __wbindgen_object_drop_ref: function(arg0: number) {\n dropObject(arg0);\n },\n __wbindgen_string_new: function(arg0: number, arg1: number) {\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n },\n __wbindgen_string_get: function(arg0: number, arg1: number) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'string' ? obj : undefined;\n const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbindgen_throw: function(arg0: number, arg1: number) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n },\n wbg: {\n __wbindgen_object_drop_ref: function(arg0: number) {\n dropObject(arg0);\n },\n __wbindgen_string_new: function(arg0: number, arg1: number) {\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n },\n __wbindgen_string_get: function(arg0: number, arg1: number) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'string' ? obj : undefined;\n const ptr1 = ret ? passStringToWasm0(ret, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc) : 0;\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbindgen_throw: function(arg0: number, arg1: number) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n },\n };\n\n // Instantiate with proper imports\n const instance = await WebAssembly.instantiate(wasmModule, imports);\n wasmExports = instance.exports;\n\n // Initialize wasm-bindgen if needed\n if (wasmExports.__wbindgen_start) {\n wasmExports.__wbindgen_start();\n }\n\n console.log('✅ AgentShield: WASM module loaded successfully in Edge Runtime (95-100% confidence enabled)');\n } catch (error) {\n console.error('❌ AgentShield: Failed to initialize WASM in Edge Runtime:', error);\n throw error;\n }\n })();\n\n return wasmInitPromise;\n}\n\n/**\n * Detect AI agent using WASM in Edge Runtime\n */\nasync function detectWithWasm(metadata: {\n userAgent?: string | undefined;\n ipAddress?: string | undefined;\n headers: Record<string, string>;\n timestamp: string;\n}): Promise<EdgeWasmDetectionResult> {\n if (!wasmExports) {\n throw new Error('WASM not initialized. Call initializeEdgeWasm first.');\n }\n\n try {\n // Create WASM request metadata\n const userAgent = metadata.userAgent || '';\n const ipAddress = metadata.ipAddress || '';\n const headers = JSON.stringify(metadata.headers);\n const timestamp = metadata.timestamp;\n\n // Call WASM function directly\n const ptr0 = passStringToWasm0(userAgent, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(ipAddress, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(headers, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ptr3 = passStringToWasm0(timestamp, wasmExports.__wbindgen_malloc, wasmExports.__wbindgen_realloc);\n const len3 = WASM_VECTOR_LEN;\n\n // Create metadata object in WASM\n const metadataPtr = wasmExports.jsrequestmetadata_new(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3);\n \n // Perform detection\n const resultPtr = wasmExports.detect_agent(metadataPtr);\n const result = takeObject(resultPtr);\n\n // Free WASM metadata\n wasmExports.__wbg_jsrequestmetadata_free(metadataPtr, 0);\n\n // Parse result\n const parsedResult = typeof result === 'string' ? JSON.parse(result) : result;\n\n return {\n isAgent: parsedResult.is_agent || false,\n confidence: parsedResult.confidence || 0,\n agent: parsedResult.agent,\n verificationMethod: parsedResult.verification_method || 'wasm',\n riskLevel: parsedResult.risk_level || 'low',\n timestamp: parsedResult.timestamp || metadata.timestamp,\n reasons: parsedResult.reasons || []\n };\n } catch (error) {\n console.error('WASM detection failed:', error);\n // Fall back to pattern detection\n return {\n isAgent: false,\n confidence: 0,\n verificationMethod: 'pattern',\n riskLevel: 'low',\n timestamp: metadata.timestamp\n };\n }\n}\n\n/**\n * Create Edge Runtime compatible WASM middleware\n * \n * @example\n * ```typescript\n * // middleware.ts\n * import wasmModule from '@kya-os/agentshield/wasm?module';\n * import { createEdgeWasmMiddleware } from '@kya-os/agentshield-nextjs/edge-wasm-middleware';\n * \n * export const middleware = createEdgeWasmMiddleware({\n * wasmModule,\n * onAgentDetected: (result) => {\n * console.log(`AI Agent: ${result.agent} (${result.confidence * 100}% confidence)`);\n * }\n * });\n * ```\n */\nexport function createEdgeWasmMiddleware(config: EdgeAgentShieldConfig & {\n wasmModule: WebAssembly.Module;\n}) {\n const {\n wasmModule,\n onAgentDetected,\n blockOnHighConfidence = false,\n confidenceThreshold = 0.9,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'AI agent access restricted',\n headers: { 'Content-Type': 'application/json' }\n }\n } = config;\n\n // Initialize WASM on first load\n const initPromise = initializeEdgeWasm(wasmModule);\n\n return async function middleware(request: NextRequest) {\n // Check if path should be skipped\n const path = request.nextUrl.pathname;\n if (skipPaths.some(skip => path.startsWith(skip))) {\n return NextResponse.next();\n }\n\n try {\n // Ensure WASM is initialized\n await initPromise;\n\n // Prepare metadata\n const metadata = {\n userAgent: request.headers.get('user-agent') || undefined,\n ipAddress: request.headers.get('x-forwarded-for') || \n request.headers.get('x-real-ip') || \n undefined,\n headers: Object.fromEntries(request.headers.entries()),\n timestamp: new Date().toISOString()\n };\n\n // Perform WASM detection\n const result = await detectWithWasm(metadata);\n\n // Call user callback if provided\n if (onAgentDetected && result.isAgent) {\n await onAgentDetected(result);\n }\n\n // Block if configured\n if (blockOnHighConfidence && \n result.isAgent && \n result.confidence >= confidenceThreshold) {\n \n return NextResponse.json(\n { \n error: blockedResponse.message,\n agent: result.agent,\n confidence: Math.round(result.confidence * 100)\n },\n { \n status: blockedResponse.status || 403,\n headers: blockedResponse.headers || {}\n }\n );\n }\n\n // Add detection headers\n const response = NextResponse.next();\n if (result.isAgent) {\n response.headers.set('X-Agent-Detected', result.agent || 'unknown');\n response.headers.set('X-Agent-Confidence', String(Math.round(result.confidence * 100)));\n response.headers.set('X-Agent-Verification', result.verificationMethod);\n }\n\n return response;\n\n } catch (error) {\n console.error('Edge WASM middleware error:', error);\n // Continue without blocking on error\n return NextResponse.next();\n }\n };\n}"]}
|