@kya-os/agentshield-nextjs 0.3.2 → 0.3.5

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 (110) hide show
  1. package/README.md +21 -369
  2. package/index.js +9 -0
  3. package/package.json +6 -141
  4. package/EDGE_RUNTIME_WASM_SETUP.md +0 -348
  5. package/bin/setup-edge-wasm.js +0 -525
  6. package/dist/.tsbuildinfo +0 -1
  7. package/dist/api-client.d.mts +0 -196
  8. package/dist/api-client.d.ts +0 -196
  9. package/dist/api-client.js +0 -200
  10. package/dist/api-client.js.map +0 -1
  11. package/dist/api-client.mjs +0 -196
  12. package/dist/api-client.mjs.map +0 -1
  13. package/dist/api-middleware.d.mts +0 -140
  14. package/dist/api-middleware.d.ts +0 -140
  15. package/dist/api-middleware.js +0 -511
  16. package/dist/api-middleware.js.map +0 -1
  17. package/dist/api-middleware.mjs +0 -508
  18. package/dist/api-middleware.mjs.map +0 -1
  19. package/dist/create-middleware.d.mts +0 -17
  20. package/dist/create-middleware.d.ts +0 -17
  21. package/dist/create-middleware.js +0 -1381
  22. package/dist/create-middleware.js.map +0 -1
  23. package/dist/create-middleware.mjs +0 -1358
  24. package/dist/create-middleware.mjs.map +0 -1
  25. package/dist/edge/index.d.mts +0 -110
  26. package/dist/edge/index.d.ts +0 -110
  27. package/dist/edge/index.js +0 -277
  28. package/dist/edge/index.js.map +0 -1
  29. package/dist/edge/index.mjs +0 -275
  30. package/dist/edge/index.mjs.map +0 -1
  31. package/dist/edge-detector-wrapper.d.mts +0 -34
  32. package/dist/edge-detector-wrapper.d.ts +0 -34
  33. package/dist/edge-detector-wrapper.js +0 -596
  34. package/dist/edge-detector-wrapper.js.map +0 -1
  35. package/dist/edge-detector-wrapper.mjs +0 -574
  36. package/dist/edge-detector-wrapper.mjs.map +0 -1
  37. package/dist/edge-runtime-loader.d.mts +0 -50
  38. package/dist/edge-runtime-loader.d.ts +0 -50
  39. package/dist/edge-runtime-loader.js +0 -204
  40. package/dist/edge-runtime-loader.js.map +0 -1
  41. package/dist/edge-runtime-loader.mjs +0 -201
  42. package/dist/edge-runtime-loader.mjs.map +0 -1
  43. package/dist/edge-wasm-middleware.d.mts +0 -68
  44. package/dist/edge-wasm-middleware.d.ts +0 -68
  45. package/dist/edge-wasm-middleware.js +0 -318
  46. package/dist/edge-wasm-middleware.js.map +0 -1
  47. package/dist/edge-wasm-middleware.mjs +0 -315
  48. package/dist/edge-wasm-middleware.mjs.map +0 -1
  49. package/dist/enhanced-middleware.d.mts +0 -153
  50. package/dist/enhanced-middleware.d.ts +0 -153
  51. package/dist/enhanced-middleware.js +0 -1082
  52. package/dist/enhanced-middleware.js.map +0 -1
  53. package/dist/enhanced-middleware.mjs +0 -1080
  54. package/dist/enhanced-middleware.mjs.map +0 -1
  55. package/dist/index.d.mts +0 -24
  56. package/dist/index.d.ts +0 -24
  57. package/dist/index.js +0 -2717
  58. package/dist/index.js.map +0 -1
  59. package/dist/index.mjs +0 -2662
  60. package/dist/index.mjs.map +0 -1
  61. package/dist/middleware.d.mts +0 -21
  62. package/dist/middleware.d.ts +0 -21
  63. package/dist/middleware.js +0 -1362
  64. package/dist/middleware.js.map +0 -1
  65. package/dist/middleware.mjs +0 -1339
  66. package/dist/middleware.mjs.map +0 -1
  67. package/dist/nodejs-wasm-loader.d.mts +0 -25
  68. package/dist/nodejs-wasm-loader.d.ts +0 -25
  69. package/dist/nodejs-wasm-loader.js +0 -78
  70. package/dist/nodejs-wasm-loader.js.map +0 -1
  71. package/dist/nodejs-wasm-loader.mjs +0 -68
  72. package/dist/nodejs-wasm-loader.mjs.map +0 -1
  73. package/dist/policy.d.mts +0 -162
  74. package/dist/policy.d.ts +0 -162
  75. package/dist/policy.js +0 -189
  76. package/dist/policy.js.map +0 -1
  77. package/dist/policy.mjs +0 -165
  78. package/dist/policy.mjs.map +0 -1
  79. package/dist/session-tracker.d.mts +0 -55
  80. package/dist/session-tracker.d.ts +0 -55
  81. package/dist/session-tracker.js +0 -170
  82. package/dist/session-tracker.js.map +0 -1
  83. package/dist/session-tracker.mjs +0 -167
  84. package/dist/session-tracker.mjs.map +0 -1
  85. package/dist/signature-verifier.d.mts +0 -33
  86. package/dist/signature-verifier.d.ts +0 -33
  87. package/dist/signature-verifier.js +0 -386
  88. package/dist/signature-verifier.js.map +0 -1
  89. package/dist/signature-verifier.mjs +0 -362
  90. package/dist/signature-verifier.mjs.map +0 -1
  91. package/dist/types-DVmy9NE3.d.mts +0 -105
  92. package/dist/types-DVmy9NE3.d.ts +0 -105
  93. package/dist/wasm-middleware.d.mts +0 -63
  94. package/dist/wasm-middleware.d.ts +0 -63
  95. package/dist/wasm-middleware.js +0 -98
  96. package/dist/wasm-middleware.js.map +0 -1
  97. package/dist/wasm-middleware.mjs +0 -95
  98. package/dist/wasm-middleware.mjs.map +0 -1
  99. package/dist/wasm-setup.d.mts +0 -46
  100. package/dist/wasm-setup.d.ts +0 -46
  101. package/dist/wasm-setup.js +0 -157
  102. package/dist/wasm-setup.js.map +0 -1
  103. package/dist/wasm-setup.mjs +0 -148
  104. package/dist/wasm-setup.mjs.map +0 -1
  105. package/templates/middleware-wasm-100.ts +0 -151
  106. package/wasm/agentshield_wasm.d.ts +0 -479
  107. package/wasm/agentshield_wasm.js +0 -1536
  108. package/wasm/agentshield_wasm_bg.wasm +0 -0
  109. package/wasm/package.json +0 -30
  110. package/wasm.d.ts +0 -21
@@ -1,318 +0,0 @@
1
- 'use strict';
2
-
3
- var server = require('next/server');
4
- var agentshieldShared = require('@kya-os/agentshield-shared');
5
-
6
- // src/edge-wasm-middleware.ts
7
- var wasmExports = null;
8
- var wasmInitPromise = null;
9
- var heap = new Array(128).fill(void 0);
10
- heap.push(void 0, null, true, false);
11
- var heap_next = heap.length;
12
- function addHeapObject(obj) {
13
- if (heap_next === heap.length) heap.push(heap.length + 1);
14
- const idx = heap_next;
15
- heap_next = heap[idx];
16
- heap[idx] = obj;
17
- return idx;
18
- }
19
- function getObject(idx) {
20
- return heap[idx];
21
- }
22
- function dropObject(idx) {
23
- if (idx < 132) return;
24
- heap[idx] = heap_next;
25
- heap_next = idx;
26
- }
27
- function takeObject(idx) {
28
- const ret = getObject(idx);
29
- dropObject(idx);
30
- return ret;
31
- }
32
- var cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
33
- var cachedTextEncoder = new TextEncoder();
34
- var cachedUint8ArrayMemory0 = null;
35
- function getUint8ArrayMemory0() {
36
- if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
37
- cachedUint8ArrayMemory0 = new Uint8Array(wasmExports.memory.buffer);
38
- }
39
- return cachedUint8ArrayMemory0;
40
- }
41
- function getStringFromWasm0(ptr, len) {
42
- ptr = ptr >>> 0;
43
- return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
44
- }
45
- var WASM_VECTOR_LEN = 0;
46
- function passStringToWasm0(arg, malloc, realloc) {
47
- if (realloc === void 0) {
48
- const buf = cachedTextEncoder.encode(arg);
49
- const ptr2 = malloc(buf.length, 1) >>> 0;
50
- getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf);
51
- WASM_VECTOR_LEN = buf.length;
52
- return ptr2;
53
- }
54
- let len = arg.length;
55
- let ptr = malloc(len, 1) >>> 0;
56
- const mem = getUint8ArrayMemory0();
57
- let offset = 0;
58
- for (; offset < len; offset++) {
59
- const code = arg.charCodeAt(offset);
60
- if (code > 127) break;
61
- mem[ptr + offset] = code;
62
- }
63
- if (offset !== len) {
64
- if (offset !== 0) {
65
- arg = arg.slice(offset);
66
- }
67
- ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
68
- const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
69
- const ret = cachedTextEncoder.encodeInto(arg, view);
70
- offset += ret.written;
71
- }
72
- WASM_VECTOR_LEN = offset;
73
- return ptr;
74
- }
75
- var cachedDataViewMemory0 = null;
76
- function getDataViewMemory0() {
77
- if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer !== wasmExports.memory.buffer) {
78
- cachedDataViewMemory0 = new DataView(wasmExports.memory.buffer);
79
- }
80
- return cachedDataViewMemory0;
81
- }
82
- async function initializeEdgeWasm(wasmModule) {
83
- if (wasmInitPromise) {
84
- return wasmInitPromise;
85
- }
86
- wasmInitPromise = (async () => {
87
- try {
88
- const imports = {
89
- "./agentshield_wasm_bg.js": {
90
- __wbindgen_object_drop_ref: function(arg0) {
91
- dropObject(arg0);
92
- },
93
- __wbindgen_string_new: function(arg0, arg1) {
94
- const ret = getStringFromWasm0(arg0, arg1);
95
- return addHeapObject(ret);
96
- },
97
- __wbindgen_string_get: function(arg0, arg1) {
98
- const obj = getObject(arg1);
99
- const ret = typeof obj === "string" ? obj : void 0;
100
- const ptr1 = ret ? passStringToWasm0(
101
- ret,
102
- wasmExports.__wbindgen_malloc,
103
- wasmExports.__wbindgen_realloc
104
- ) : 0;
105
- const len1 = WASM_VECTOR_LEN;
106
- getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
107
- getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
108
- },
109
- __wbindgen_throw: function(arg0, arg1) {
110
- throw new Error(getStringFromWasm0(arg0, arg1));
111
- }
112
- },
113
- wbg: {
114
- __wbindgen_object_drop_ref: function(arg0) {
115
- dropObject(arg0);
116
- },
117
- __wbindgen_string_new: function(arg0, arg1) {
118
- const ret = getStringFromWasm0(arg0, arg1);
119
- return addHeapObject(ret);
120
- },
121
- __wbindgen_string_get: function(arg0, arg1) {
122
- const obj = getObject(arg1);
123
- const ret = typeof obj === "string" ? obj : void 0;
124
- const ptr1 = ret ? passStringToWasm0(
125
- ret,
126
- wasmExports.__wbindgen_malloc,
127
- wasmExports.__wbindgen_realloc
128
- ) : 0;
129
- const len1 = WASM_VECTOR_LEN;
130
- getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
131
- getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
132
- },
133
- __wbindgen_throw: function(arg0, arg1) {
134
- throw new Error(getStringFromWasm0(arg0, arg1));
135
- }
136
- }
137
- };
138
- const instance = await WebAssembly.instantiate(wasmModule, imports);
139
- wasmExports = instance.exports;
140
- if (wasmExports.__wbindgen_start) {
141
- wasmExports.__wbindgen_start();
142
- }
143
- console.log(
144
- "\u2705 AgentShield: WASM module loaded successfully in Edge Runtime (95-100% confidence enabled)"
145
- );
146
- } catch (error) {
147
- console.error("\u274C AgentShield: Failed to initialize WASM in Edge Runtime:", error);
148
- throw error;
149
- }
150
- })();
151
- return wasmInitPromise;
152
- }
153
- async function detectWithWasm(metadata) {
154
- if (!wasmExports) {
155
- throw new Error("WASM not initialized. Call initializeEdgeWasm first.");
156
- }
157
- try {
158
- const userAgent = metadata.userAgent || "";
159
- const ipAddress = metadata.ipAddress || "";
160
- const headers = JSON.stringify(metadata.headers);
161
- const timestamp = metadata.timestamp;
162
- const url = metadata.url || "";
163
- const method = metadata.method || "";
164
- const clientFingerprint = metadata.clientFingerprint || "";
165
- const ptr0 = passStringToWasm0(
166
- userAgent,
167
- wasmExports.__wbindgen_malloc,
168
- wasmExports.__wbindgen_realloc
169
- );
170
- const len0 = WASM_VECTOR_LEN;
171
- const ptr1 = passStringToWasm0(
172
- ipAddress,
173
- wasmExports.__wbindgen_malloc,
174
- wasmExports.__wbindgen_realloc
175
- );
176
- const len1 = WASM_VECTOR_LEN;
177
- const ptr2 = passStringToWasm0(
178
- headers,
179
- wasmExports.__wbindgen_malloc,
180
- wasmExports.__wbindgen_realloc
181
- );
182
- const len2 = WASM_VECTOR_LEN;
183
- const ptr3 = passStringToWasm0(
184
- timestamp,
185
- wasmExports.__wbindgen_malloc,
186
- wasmExports.__wbindgen_realloc
187
- );
188
- const len3 = WASM_VECTOR_LEN;
189
- const ptr4 = passStringToWasm0(
190
- url,
191
- wasmExports.__wbindgen_malloc,
192
- wasmExports.__wbindgen_realloc
193
- );
194
- const len4 = WASM_VECTOR_LEN;
195
- const ptr5 = passStringToWasm0(
196
- method,
197
- wasmExports.__wbindgen_malloc,
198
- wasmExports.__wbindgen_realloc
199
- );
200
- const len5 = WASM_VECTOR_LEN;
201
- const ptr6 = passStringToWasm0(
202
- clientFingerprint,
203
- wasmExports.__wbindgen_malloc,
204
- wasmExports.__wbindgen_realloc
205
- );
206
- const len6 = WASM_VECTOR_LEN;
207
- const metadataPtr = wasmExports.jsrequestmetadata_new(
208
- ptr0,
209
- len0,
210
- ptr1,
211
- len1,
212
- ptr2,
213
- len2,
214
- ptr3,
215
- len3,
216
- ptr4,
217
- len4,
218
- ptr5,
219
- len5,
220
- ptr6,
221
- len6
222
- );
223
- const resultPtr = wasmExports.detect_agent(metadataPtr);
224
- const result = takeObject(resultPtr);
225
- wasmExports.__wbg_jsrequestmetadata_free(metadataPtr, 0);
226
- const parsedResult = typeof result === "string" ? JSON.parse(result) : result;
227
- return {
228
- isAgent: parsedResult.is_agent || false,
229
- isAiCrawler: parsedResult.is_ai_crawler || false,
230
- confidence: parsedResult.confidence || 0,
231
- agent: parsedResult.agent,
232
- verificationMethod: parsedResult.verification_method || "wasm",
233
- riskLevel: parsedResult.risk_level || "low",
234
- timestamp: parsedResult.timestamp || metadata.timestamp,
235
- reasons: parsedResult.reasons || []
236
- };
237
- } catch (error) {
238
- console.error("WASM detection failed:", error);
239
- return {
240
- isAgent: false,
241
- confidence: 0,
242
- verificationMethod: "pattern",
243
- riskLevel: "low",
244
- timestamp: metadata.timestamp
245
- };
246
- }
247
- }
248
- function createEdgeWasmMiddleware(config) {
249
- const {
250
- wasmModule,
251
- onAgentDetected,
252
- blockOnHighConfidence = false,
253
- confidenceThreshold: configThreshold = 0.9,
254
- skipPaths = [],
255
- blockedResponse = {
256
- status: 403,
257
- message: "AI agent access restricted",
258
- headers: { "Content-Type": "application/json" }
259
- }
260
- } = config;
261
- const confidenceThreshold = agentshieldShared.normalizeConfidence(configThreshold, "confidenceThreshold");
262
- const initPromise = initializeEdgeWasm(wasmModule);
263
- return async function middleware(request) {
264
- const path = request.nextUrl.pathname;
265
- if (skipPaths.some((skip) => path.startsWith(skip))) {
266
- return server.NextResponse.next();
267
- }
268
- try {
269
- await initPromise;
270
- const metadata = {
271
- userAgent: request.headers.get("user-agent") || void 0,
272
- ipAddress: request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0,
273
- headers: Object.fromEntries(request.headers.entries()),
274
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
275
- };
276
- const result = await detectWithWasm(metadata);
277
- const decision = agentshieldShared.evaluateEnforcement(
278
- { ...result, confidence: result.confidence * 100 },
279
- {
280
- confidenceThreshold: confidenceThreshold * 100,
281
- defaultAction: blockOnHighConfidence ? "block" : "allow"
282
- }
283
- );
284
- if (onAgentDetected && agentshieldShared.shouldEnforce(result)) {
285
- await onAgentDetected(result);
286
- }
287
- if (decision.action === "block") {
288
- return server.NextResponse.json(
289
- {
290
- error: blockedResponse.message,
291
- agent: result.agent,
292
- confidence: agentshieldShared.toPercent(result.confidence)
293
- // Convert to 0-100 for display
294
- },
295
- {
296
- status: blockedResponse.status || 403,
297
- headers: blockedResponse.headers || {}
298
- }
299
- );
300
- }
301
- const response = server.NextResponse.next();
302
- if (result.isAgent) {
303
- response.headers.set("X-Agent-Detected", result.agent || "unknown");
304
- response.headers.set("X-Agent-Confidence", String(agentshieldShared.toPercent(result.confidence)));
305
- response.headers.set("X-Agent-Verification", result.verificationMethod);
306
- }
307
- return response;
308
- } catch (error) {
309
- console.error("Edge WASM middleware error:", error);
310
- return server.NextResponse.next();
311
- }
312
- };
313
- }
314
-
315
- exports.createEdgeWasmMiddleware = createEdgeWasmMiddleware;
316
- exports.initializeEdgeWasm = initializeEdgeWasm;
317
- //# sourceMappingURL=edge-wasm-middleware.js.map
318
- //# sourceMappingURL=edge-wasm-middleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/edge-wasm-middleware.ts"],"names":["ptr","normalizeConfidence","NextResponse","evaluateEnforcement","shouldEnforce","toPercent"],"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';\nimport {\n toPercent,\n normalizeConfidence,\n evaluateEnforcement,\n shouldEnforce,\n} from '@kya-os/agentshield-shared';\n\n// Type definitions\nexport interface EdgeWasmDetectionResult {\n isAgent: boolean;\n isAiCrawler?: 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 /**\n * Confidence threshold for blocking (0.0-1.0 scale).\n * Detection confidence above this threshold will be blocked if blockOnHighConfidence is true.\n * @default 0.9 (90% confidence)\n * @example\n * confidenceThreshold: 0.9 // Block if >= 90% confident\n * confidenceThreshold: 0.7 // Block if >= 70% confident\n */\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) {\n return heap[idx];\n}\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()\n .subarray(ptr, ptr + buf.length)\n .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 (\n cachedDataViewMemory0 === null ||\n cachedDataViewMemory0.buffer !== wasmExports.memory.buffer\n ) {\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\n ? passStringToWasm0(\n ret,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n )\n : 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\n ? passStringToWasm0(\n ret,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n )\n : 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(\n '✅ AgentShield: WASM module loaded successfully in Edge Runtime (95-100% confidence enabled)'\n );\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 url?: string | undefined;\n method?: string | undefined;\n clientFingerprint?: string | undefined;\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 const url = metadata.url || '';\n const method = metadata.method || '';\n const clientFingerprint = metadata.clientFingerprint || '';\n\n // Call WASM function directly - pass all 7 string parameters\n const ptr0 = passStringToWasm0(\n userAgent,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n );\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(\n ipAddress,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n );\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(\n headers,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n );\n const len2 = WASM_VECTOR_LEN;\n const ptr3 = passStringToWasm0(\n timestamp,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n );\n const len3 = WASM_VECTOR_LEN;\n const ptr4 = passStringToWasm0(\n url,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n );\n const len4 = WASM_VECTOR_LEN;\n const ptr5 = passStringToWasm0(\n method,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n );\n const len5 = WASM_VECTOR_LEN;\n const ptr6 = passStringToWasm0(\n clientFingerprint,\n wasmExports.__wbindgen_malloc,\n wasmExports.__wbindgen_realloc\n );\n const len6 = WASM_VECTOR_LEN;\n\n // Create metadata object in WASM (7 strings = 14 parameters)\n const metadataPtr = wasmExports.jsrequestmetadata_new(\n ptr0,\n len0,\n ptr1,\n len1,\n ptr2,\n len2,\n ptr3,\n len3,\n ptr4,\n len4,\n ptr5,\n len5,\n ptr6,\n len6\n );\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 isAiCrawler: parsedResult.is_ai_crawler || 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 * // Note: result.confidence is 0.0-1.0 scale\n * console.log(`AI Agent: ${result.agent} (${Math.round(result.confidence * 100)}% confidence)`);\n * }\n * });\n * ```\n */\nexport function createEdgeWasmMiddleware(\n config: EdgeAgentShieldConfig & {\n wasmModule: WebAssembly.Module;\n }\n) {\n const {\n wasmModule,\n onAgentDetected,\n blockOnHighConfidence = false,\n confidenceThreshold: configThreshold = 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 // Normalize threshold to 0.0-1.0 scale (handles both 0.9 and 90 inputs)\n const confidenceThreshold = normalizeConfidence(configThreshold, 'confidenceThreshold');\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:\n request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || 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 // Evaluate enforcement decision\n // Note: this middleware uses 0-1 scale internally; convert to 0-100 for evaluateEnforcement\n const decision = evaluateEnforcement(\n { ...result, confidence: result.confidence * 100 },\n {\n confidenceThreshold: confidenceThreshold * 100,\n defaultAction: blockOnHighConfidence ? 'block' : 'allow',\n }\n );\n\n // Call user callback for any enforced agent (regardless of threshold)\n if (onAgentDetected && shouldEnforce(result)) {\n await onAgentDetected(result);\n }\n\n // Block if enforcement decision says to block\n if (decision.action === 'block') {\n return NextResponse.json(\n {\n error: blockedResponse.message,\n agent: result.agent,\n confidence: toPercent(result.confidence), // Convert to 0-100 for display\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(toPercent(result.confidence)));\n response.headers.set('X-Agent-Verification', result.verificationMethod);\n }\n\n return response;\n } catch (error) {\n console.error('Edge WASM middleware error:', error);\n // Continue without blocking on error\n return NextResponse.next();\n }\n };\n}\n"]}
@@ -1,315 +0,0 @@
1
- import { NextResponse } from 'next/server';
2
- import { normalizeConfidence, evaluateEnforcement, shouldEnforce, toPercent } from '@kya-os/agentshield-shared';
3
-
4
- // src/edge-wasm-middleware.ts
5
- var wasmExports = null;
6
- var wasmInitPromise = null;
7
- var heap = new Array(128).fill(void 0);
8
- heap.push(void 0, null, true, false);
9
- var heap_next = heap.length;
10
- function addHeapObject(obj) {
11
- if (heap_next === heap.length) heap.push(heap.length + 1);
12
- const idx = heap_next;
13
- heap_next = heap[idx];
14
- heap[idx] = obj;
15
- return idx;
16
- }
17
- function getObject(idx) {
18
- return heap[idx];
19
- }
20
- function dropObject(idx) {
21
- if (idx < 132) return;
22
- heap[idx] = heap_next;
23
- heap_next = idx;
24
- }
25
- function takeObject(idx) {
26
- const ret = getObject(idx);
27
- dropObject(idx);
28
- return ret;
29
- }
30
- var cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
31
- var cachedTextEncoder = new TextEncoder();
32
- var cachedUint8ArrayMemory0 = null;
33
- function getUint8ArrayMemory0() {
34
- if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
35
- cachedUint8ArrayMemory0 = new Uint8Array(wasmExports.memory.buffer);
36
- }
37
- return cachedUint8ArrayMemory0;
38
- }
39
- function getStringFromWasm0(ptr, len) {
40
- ptr = ptr >>> 0;
41
- return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
42
- }
43
- var WASM_VECTOR_LEN = 0;
44
- function passStringToWasm0(arg, malloc, realloc) {
45
- if (realloc === void 0) {
46
- const buf = cachedTextEncoder.encode(arg);
47
- const ptr2 = malloc(buf.length, 1) >>> 0;
48
- getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf);
49
- WASM_VECTOR_LEN = buf.length;
50
- return ptr2;
51
- }
52
- let len = arg.length;
53
- let ptr = malloc(len, 1) >>> 0;
54
- const mem = getUint8ArrayMemory0();
55
- let offset = 0;
56
- for (; offset < len; offset++) {
57
- const code = arg.charCodeAt(offset);
58
- if (code > 127) break;
59
- mem[ptr + offset] = code;
60
- }
61
- if (offset !== len) {
62
- if (offset !== 0) {
63
- arg = arg.slice(offset);
64
- }
65
- ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
66
- const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
67
- const ret = cachedTextEncoder.encodeInto(arg, view);
68
- offset += ret.written;
69
- }
70
- WASM_VECTOR_LEN = offset;
71
- return ptr;
72
- }
73
- var cachedDataViewMemory0 = null;
74
- function getDataViewMemory0() {
75
- if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer !== wasmExports.memory.buffer) {
76
- cachedDataViewMemory0 = new DataView(wasmExports.memory.buffer);
77
- }
78
- return cachedDataViewMemory0;
79
- }
80
- async function initializeEdgeWasm(wasmModule) {
81
- if (wasmInitPromise) {
82
- return wasmInitPromise;
83
- }
84
- wasmInitPromise = (async () => {
85
- try {
86
- const imports = {
87
- "./agentshield_wasm_bg.js": {
88
- __wbindgen_object_drop_ref: function(arg0) {
89
- dropObject(arg0);
90
- },
91
- __wbindgen_string_new: function(arg0, arg1) {
92
- const ret = getStringFromWasm0(arg0, arg1);
93
- return addHeapObject(ret);
94
- },
95
- __wbindgen_string_get: function(arg0, arg1) {
96
- const obj = getObject(arg1);
97
- const ret = typeof obj === "string" ? obj : void 0;
98
- const ptr1 = ret ? passStringToWasm0(
99
- ret,
100
- wasmExports.__wbindgen_malloc,
101
- wasmExports.__wbindgen_realloc
102
- ) : 0;
103
- const len1 = WASM_VECTOR_LEN;
104
- getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
105
- getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
106
- },
107
- __wbindgen_throw: function(arg0, arg1) {
108
- throw new Error(getStringFromWasm0(arg0, arg1));
109
- }
110
- },
111
- wbg: {
112
- __wbindgen_object_drop_ref: function(arg0) {
113
- dropObject(arg0);
114
- },
115
- __wbindgen_string_new: function(arg0, arg1) {
116
- const ret = getStringFromWasm0(arg0, arg1);
117
- return addHeapObject(ret);
118
- },
119
- __wbindgen_string_get: function(arg0, arg1) {
120
- const obj = getObject(arg1);
121
- const ret = typeof obj === "string" ? obj : void 0;
122
- const ptr1 = ret ? passStringToWasm0(
123
- ret,
124
- wasmExports.__wbindgen_malloc,
125
- wasmExports.__wbindgen_realloc
126
- ) : 0;
127
- const len1 = WASM_VECTOR_LEN;
128
- getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
129
- getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
130
- },
131
- __wbindgen_throw: function(arg0, arg1) {
132
- throw new Error(getStringFromWasm0(arg0, arg1));
133
- }
134
- }
135
- };
136
- const instance = await WebAssembly.instantiate(wasmModule, imports);
137
- wasmExports = instance.exports;
138
- if (wasmExports.__wbindgen_start) {
139
- wasmExports.__wbindgen_start();
140
- }
141
- console.log(
142
- "\u2705 AgentShield: WASM module loaded successfully in Edge Runtime (95-100% confidence enabled)"
143
- );
144
- } catch (error) {
145
- console.error("\u274C AgentShield: Failed to initialize WASM in Edge Runtime:", error);
146
- throw error;
147
- }
148
- })();
149
- return wasmInitPromise;
150
- }
151
- async function detectWithWasm(metadata) {
152
- if (!wasmExports) {
153
- throw new Error("WASM not initialized. Call initializeEdgeWasm first.");
154
- }
155
- try {
156
- const userAgent = metadata.userAgent || "";
157
- const ipAddress = metadata.ipAddress || "";
158
- const headers = JSON.stringify(metadata.headers);
159
- const timestamp = metadata.timestamp;
160
- const url = metadata.url || "";
161
- const method = metadata.method || "";
162
- const clientFingerprint = metadata.clientFingerprint || "";
163
- const ptr0 = passStringToWasm0(
164
- userAgent,
165
- wasmExports.__wbindgen_malloc,
166
- wasmExports.__wbindgen_realloc
167
- );
168
- const len0 = WASM_VECTOR_LEN;
169
- const ptr1 = passStringToWasm0(
170
- ipAddress,
171
- wasmExports.__wbindgen_malloc,
172
- wasmExports.__wbindgen_realloc
173
- );
174
- const len1 = WASM_VECTOR_LEN;
175
- const ptr2 = passStringToWasm0(
176
- headers,
177
- wasmExports.__wbindgen_malloc,
178
- wasmExports.__wbindgen_realloc
179
- );
180
- const len2 = WASM_VECTOR_LEN;
181
- const ptr3 = passStringToWasm0(
182
- timestamp,
183
- wasmExports.__wbindgen_malloc,
184
- wasmExports.__wbindgen_realloc
185
- );
186
- const len3 = WASM_VECTOR_LEN;
187
- const ptr4 = passStringToWasm0(
188
- url,
189
- wasmExports.__wbindgen_malloc,
190
- wasmExports.__wbindgen_realloc
191
- );
192
- const len4 = WASM_VECTOR_LEN;
193
- const ptr5 = passStringToWasm0(
194
- method,
195
- wasmExports.__wbindgen_malloc,
196
- wasmExports.__wbindgen_realloc
197
- );
198
- const len5 = WASM_VECTOR_LEN;
199
- const ptr6 = passStringToWasm0(
200
- clientFingerprint,
201
- wasmExports.__wbindgen_malloc,
202
- wasmExports.__wbindgen_realloc
203
- );
204
- const len6 = WASM_VECTOR_LEN;
205
- const metadataPtr = wasmExports.jsrequestmetadata_new(
206
- ptr0,
207
- len0,
208
- ptr1,
209
- len1,
210
- ptr2,
211
- len2,
212
- ptr3,
213
- len3,
214
- ptr4,
215
- len4,
216
- ptr5,
217
- len5,
218
- ptr6,
219
- len6
220
- );
221
- const resultPtr = wasmExports.detect_agent(metadataPtr);
222
- const result = takeObject(resultPtr);
223
- wasmExports.__wbg_jsrequestmetadata_free(metadataPtr, 0);
224
- const parsedResult = typeof result === "string" ? JSON.parse(result) : result;
225
- return {
226
- isAgent: parsedResult.is_agent || false,
227
- isAiCrawler: parsedResult.is_ai_crawler || false,
228
- confidence: parsedResult.confidence || 0,
229
- agent: parsedResult.agent,
230
- verificationMethod: parsedResult.verification_method || "wasm",
231
- riskLevel: parsedResult.risk_level || "low",
232
- timestamp: parsedResult.timestamp || metadata.timestamp,
233
- reasons: parsedResult.reasons || []
234
- };
235
- } catch (error) {
236
- console.error("WASM detection failed:", error);
237
- return {
238
- isAgent: false,
239
- confidence: 0,
240
- verificationMethod: "pattern",
241
- riskLevel: "low",
242
- timestamp: metadata.timestamp
243
- };
244
- }
245
- }
246
- function createEdgeWasmMiddleware(config) {
247
- const {
248
- wasmModule,
249
- onAgentDetected,
250
- blockOnHighConfidence = false,
251
- confidenceThreshold: configThreshold = 0.9,
252
- skipPaths = [],
253
- blockedResponse = {
254
- status: 403,
255
- message: "AI agent access restricted",
256
- headers: { "Content-Type": "application/json" }
257
- }
258
- } = config;
259
- const confidenceThreshold = normalizeConfidence(configThreshold, "confidenceThreshold");
260
- const initPromise = initializeEdgeWasm(wasmModule);
261
- return async function middleware(request) {
262
- const path = request.nextUrl.pathname;
263
- if (skipPaths.some((skip) => path.startsWith(skip))) {
264
- return NextResponse.next();
265
- }
266
- try {
267
- await initPromise;
268
- const metadata = {
269
- userAgent: request.headers.get("user-agent") || void 0,
270
- ipAddress: request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0,
271
- headers: Object.fromEntries(request.headers.entries()),
272
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
273
- };
274
- const result = await detectWithWasm(metadata);
275
- const decision = evaluateEnforcement(
276
- { ...result, confidence: result.confidence * 100 },
277
- {
278
- confidenceThreshold: confidenceThreshold * 100,
279
- defaultAction: blockOnHighConfidence ? "block" : "allow"
280
- }
281
- );
282
- if (onAgentDetected && shouldEnforce(result)) {
283
- await onAgentDetected(result);
284
- }
285
- if (decision.action === "block") {
286
- return NextResponse.json(
287
- {
288
- error: blockedResponse.message,
289
- agent: result.agent,
290
- confidence: toPercent(result.confidence)
291
- // Convert to 0-100 for display
292
- },
293
- {
294
- status: blockedResponse.status || 403,
295
- headers: blockedResponse.headers || {}
296
- }
297
- );
298
- }
299
- const response = NextResponse.next();
300
- if (result.isAgent) {
301
- response.headers.set("X-Agent-Detected", result.agent || "unknown");
302
- response.headers.set("X-Agent-Confidence", String(toPercent(result.confidence)));
303
- response.headers.set("X-Agent-Verification", result.verificationMethod);
304
- }
305
- return response;
306
- } catch (error) {
307
- console.error("Edge WASM middleware error:", error);
308
- return NextResponse.next();
309
- }
310
- };
311
- }
312
-
313
- export { createEdgeWasmMiddleware, initializeEdgeWasm };
314
- //# sourceMappingURL=edge-wasm-middleware.mjs.map
315
- //# sourceMappingURL=edge-wasm-middleware.mjs.map