@kya-os/agentshield-nextjs 0.1.41 → 0.1.42

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 (79) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/api-client.d.mts +145 -0
  3. package/dist/api-client.d.ts +145 -0
  4. package/dist/api-client.js +130 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/api-client.mjs +126 -0
  7. package/dist/api-client.mjs.map +1 -0
  8. package/dist/api-middleware.d.mts +118 -0
  9. package/dist/api-middleware.d.ts +118 -0
  10. package/dist/api-middleware.js +295 -0
  11. package/dist/api-middleware.js.map +1 -0
  12. package/dist/api-middleware.mjs +292 -0
  13. package/dist/api-middleware.mjs.map +1 -0
  14. package/dist/create-middleware.d.mts +2 -1
  15. package/dist/create-middleware.d.ts +2 -1
  16. package/dist/create-middleware.js +474 -200
  17. package/dist/create-middleware.js.map +1 -1
  18. package/dist/create-middleware.mjs +454 -200
  19. package/dist/create-middleware.mjs.map +1 -1
  20. package/dist/edge/index.d.mts +110 -0
  21. package/dist/edge/index.d.ts +110 -0
  22. package/dist/edge/index.js +253 -0
  23. package/dist/edge/index.js.map +1 -0
  24. package/dist/edge/index.mjs +251 -0
  25. package/dist/edge/index.mjs.map +1 -0
  26. package/dist/edge-detector-wrapper.d.mts +6 -15
  27. package/dist/edge-detector-wrapper.d.ts +6 -15
  28. package/dist/edge-detector-wrapper.js +314 -95
  29. package/dist/edge-detector-wrapper.js.map +1 -1
  30. package/dist/edge-detector-wrapper.mjs +294 -95
  31. package/dist/edge-detector-wrapper.mjs.map +1 -1
  32. package/dist/edge-runtime-loader.d.mts +1 -1
  33. package/dist/edge-runtime-loader.d.ts +1 -1
  34. package/dist/edge-runtime-loader.js +10 -25
  35. package/dist/edge-runtime-loader.js.map +1 -1
  36. package/dist/edge-runtime-loader.mjs +11 -23
  37. package/dist/edge-runtime-loader.mjs.map +1 -1
  38. package/dist/edge-wasm-middleware.js +2 -1
  39. package/dist/edge-wasm-middleware.js.map +1 -1
  40. package/dist/edge-wasm-middleware.mjs +2 -1
  41. package/dist/edge-wasm-middleware.mjs.map +1 -1
  42. package/dist/enhanced-middleware.d.mts +153 -0
  43. package/dist/enhanced-middleware.d.ts +153 -0
  44. package/dist/enhanced-middleware.js +1074 -0
  45. package/dist/enhanced-middleware.js.map +1 -0
  46. package/dist/enhanced-middleware.mjs +1072 -0
  47. package/dist/enhanced-middleware.mjs.map +1 -0
  48. package/dist/index.d.mts +8 -153
  49. package/dist/index.d.ts +8 -153
  50. package/dist/index.js +821 -233
  51. package/dist/index.js.map +1 -1
  52. package/dist/index.mjs +797 -234
  53. package/dist/index.mjs.map +1 -1
  54. package/dist/middleware.d.mts +2 -1
  55. package/dist/middleware.d.ts +2 -1
  56. package/dist/middleware.js +474 -200
  57. package/dist/middleware.js.map +1 -1
  58. package/dist/middleware.mjs +454 -200
  59. package/dist/middleware.mjs.map +1 -1
  60. package/dist/session-tracker.d.mts +1 -1
  61. package/dist/session-tracker.d.ts +1 -1
  62. package/dist/session-tracker.js.map +1 -1
  63. package/dist/session-tracker.mjs.map +1 -1
  64. package/dist/signature-verifier.d.mts +1 -0
  65. package/dist/signature-verifier.d.ts +1 -0
  66. package/dist/signature-verifier.js +204 -44
  67. package/dist/signature-verifier.js.map +1 -1
  68. package/dist/signature-verifier.mjs +184 -44
  69. package/dist/signature-verifier.mjs.map +1 -1
  70. package/dist/{types-BJTEUa4T.d.mts → types-DVmy9NE3.d.mts} +19 -2
  71. package/dist/{types-BJTEUa4T.d.ts → types-DVmy9NE3.d.ts} +19 -2
  72. package/dist/wasm-middleware.js +15 -6
  73. package/dist/wasm-middleware.js.map +1 -1
  74. package/dist/wasm-middleware.mjs +15 -6
  75. package/dist/wasm-middleware.mjs.map +1 -1
  76. package/package.json +27 -6
  77. package/wasm/agentshield_wasm.js +209 -152
  78. package/wasm/agentshield_wasm_bg.wasm +0 -0
  79. package/wasm/package.json +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wasm-confidence.ts","../src/wasm-loader.ts","../src/edge-detector-with-wasm.ts","../src/edge-safe-detector.ts","../src/storage/memory-adapter.ts","../src/storage/redis-adapter.ts","../src/storage/index.ts","../src/enhanced-middleware.ts"],"names":["response","loadRulesSync","mapVerificationMethod","EdgeAgentDetectorWrapperWithWasm","NextResponse"],"mappings":"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","file":"enhanced-middleware.js","sourcesContent":["/**\n * Internal WASM confidence enhancement logic\n * This was previously in the user's lib/agentshield-simple-wasm.ts\n */\n\n/**\n * Check if WASM is available in the current environment\n */\nexport async function checkWasmAvailability(): Promise<boolean> {\n try {\n // Check if WebAssembly is available\n if (typeof WebAssembly === 'undefined') {\n return false;\n }\n\n // In Edge Runtime, we can't use WebAssembly.compile()\n // Instead, just check for the presence of WebAssembly object\n // The actual WASM module will be loaded separately\n \n // Check for basic WebAssembly API availability\n if (!WebAssembly.instantiate || !WebAssembly.Module) {\n return false;\n }\n \n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Determine if WASM verification should be indicated\n * Based on the detection confidence level\n */\nexport function shouldIndicateWasmVerification(confidence: number): boolean {\n // WASM verification is indicated for pattern-based detections\n // that achieve high confidence (>= 85 on 0-100 scale)\n return confidence >= 85 && confidence < 100; // Updated to 0-100 scale\n}\n\n/**\n * Apply WASM confidence boost for enhanced detection\n */\nexport function getWasmConfidenceBoost(\n baseConfidence: number,\n reasons: string[] = []\n): number {\n // If signature verification succeeded, always return 100%\n if (reasons.some(r =>\n r.includes('signature_agent') &&\n !r.includes('signature_headers_present')\n )) {\n return 100; // Updated to 0-100 scale (was 1.0)\n }\n\n // For high-confidence pattern detection, boost to 95%\n if (baseConfidence >= 85) { // Updated to 0-100 scale (was 0.85)\n return 95; // Updated to 0-100 scale (was 0.95)\n }\n\n // For medium-high confidence, apply smaller boost\n if (baseConfidence >= 70) { // Updated to 0-100 scale (was 0.7)\n return Math.min(baseConfidence * 1.1, 90); // Updated to 0-100 scale (was 0.9)\n }\n\n // No boost for lower confidence\n return baseConfidence;\n}\n\n/**\n * Get verification method based on detection\n */\nexport function getVerificationMethod(\n confidence: number,\n reasons: string[] = []\n): string {\n // Check for signature verification\n if (reasons.some(r => \n r.includes('signature_agent') && \n !r.includes('signature_headers_present')\n )) {\n return 'signature';\n }\n \n // Check for WASM enhancement\n if (shouldIndicateWasmVerification(confidence)) {\n return 'wasm-enhanced';\n }\n \n // Default to pattern matching\n return 'pattern';\n}","/**\n * WASM Loader for AgentShield in Edge Runtime\n * Handles loading and initialization of WebAssembly module\n *\n * IMPORTANT: wasm-bindgen Import Names Limitation\n * ================================================\n * The import function names (e.g., __wbg_log_1d3ae13c3d5e6b8e) are generated\n * by wasm-bindgen with hash suffixes that change with each WASM rebuild.\n * If the WASM module is rebuilt, these function names MUST be updated to match\n * the new exports from wasm-pack.\n *\n * To get the correct function names after a WASM rebuild:\n * 1. Run `wasm-pack build --target web` in the rust/crates/agentshield-wasm directory\n * 2. Check the generated `agentshield_wasm_bg.js` file for the actual export names\n * 3. Update the import object in this file to match\n *\n * TODO: Consider using the generated JS bindings from wasm-pack instead of\n * manually specifying imports, or add CI verification to catch mismatches.\n */\n\n// Dynamic WASM loading - no direct imports to avoid build issues\nlet wasmInstance: WebAssembly.Instance | null = null;\ninterface WasmExports {\n detect_agent: (ptr: number, len: number) => number;\n get_version: () => number;\n __wbindgen_malloc: (size: number) => number;\n __wbindgen_free: (ptr: number, size: number) => void;\n __wbindgen_realloc: (ptr: number, oldSize: number, newSize: number) => number;\n memory: WebAssembly.Memory;\n [key: string]: unknown;\n}\nlet wasmExports: WasmExports | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// Store the WASM module URL for runtime loading\nconst WASM_PATH = '/wasm/agentshield_wasm_bg.wasm';\n\n// Store base URL for constructing absolute URLs in Edge Runtime\nlet baseUrl: string | null = null;\n\n/**\n * Set the base URL for WASM loading (needed in Edge Runtime)\n */\nexport function setWasmBaseUrl(url: string) {\n baseUrl = url;\n}\n\n/**\n * Construct the full WASM URL based on context\n */\nfunction getWasmUrl(): string {\n // If we have a base URL (Edge Runtime), construct absolute URL\n if (baseUrl) {\n try {\n const url = new URL(baseUrl);\n // Use the origin to construct the full URL\n return `${url.origin}${WASM_PATH}`;\n } catch {\n // Fallback to relative path if URL construction fails\n return WASM_PATH;\n }\n }\n // Default to relative path\n return WASM_PATH;\n}\n\n/**\n * Initialize the WASM module\n * This is safe to call multiple times - it will only initialize once\n */\nexport async function initWasm(): Promise<boolean> {\n if (wasmExports) return true;\n if (initPromise) {\n await initPromise;\n return !!wasmExports;\n }\n\n initPromise = (async () => {\n try {\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000); // 3 second timeout\n\n try {\n const wasmUrl = getWasmUrl();\n\n // Try streaming compilation first (most efficient)\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n const response = await fetch(wasmUrl, { signal: controller.signal });\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.status}`);\n }\n\n // Clone response for streaming (in case we need to retry)\n const streamResponse = response.clone();\n\n // Use streaming compilation for best performance\n const { instance } = await WebAssembly.instantiateStreaming(streamResponse, {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('WASM:', ptr, len);\n }\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n },\n },\n });\n\n wasmInstance = instance;\n wasmExports = instance.exports as WasmExports;\n\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] ✅ WASM module initialized with streaming');\n }\n return;\n } catch (streamError) {\n // If not aborted, try fallback\n if (!controller.signal.aborted) {\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] Streaming compilation failed, falling back to standard compilation'\n );\n }\n } else {\n throw streamError;\n }\n }\n }\n\n // Fallback to standard compilation if streaming not available\n const response = await fetch(wasmUrl, { signal: controller.signal });\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.status}`);\n }\n\n const wasmArrayBuffer = await response.arrayBuffer();\n const compiledModule = await WebAssembly.compile(wasmArrayBuffer);\n\n const imports = {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('WASM:', ptr, len);\n }\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n },\n },\n };\n\n wasmInstance = await WebAssembly.instantiate(compiledModule, imports);\n wasmExports = wasmInstance.exports as WasmExports;\n\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] ✅ WASM module initialized via fallback');\n }\n } catch (fetchError: unknown) {\n const error = fetchError as { name?: string; message?: string };\n if (error.name === 'AbortError') {\n console.warn(\n '[AgentShield] WASM fetch timed out after 3 seconds - using pattern detection'\n );\n } else {\n console.warn(\n '[AgentShield] Failed to fetch WASM file:',\n error.message || 'Unknown error'\n );\n }\n wasmExports = null;\n }\n } catch (error) {\n console.error('[AgentShield] Failed to initialize WASM:', error);\n wasmExports = null;\n }\n })();\n\n await initPromise;\n return !!wasmExports;\n}\n\n/**\n * Detect agent using WASM\n * Returns null if WASM is not available\n */\nexport async function detectAgentWithWasm(\n userAgent: string | undefined,\n headers: Record<string, string>,\n ipAddress?: string\n): Promise<{\n isAgent: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: string;\n riskLevel: string;\n} | null> {\n // Ensure WASM is initialized\n const initialized = await initWasm();\n if (!initialized || !wasmExports) {\n return null;\n }\n\n try {\n // Note: The actual WASM exports will depend on how wasm-bindgen generates them\n // This is a simplified version - you may need to adjust based on actual exports\n\n // Prepare input for WASM\n const headersJson = JSON.stringify(headers);\n\n // Call WASM detection function (adjust function name based on actual exports)\n if (typeof wasmExports.detect_agent === 'function') {\n const result = wasmExports.detect_agent(\n userAgent || '',\n headersJson,\n ipAddress || '',\n new Date().toISOString()\n );\n\n // Parse result (format depends on WASM implementation)\n return {\n isAgent: result.is_agent || false,\n confidence: result.confidence || 0,\n agent: result.agent,\n verificationMethod: result.verification_method || 'wasm',\n riskLevel: result.risk_level || 'low',\n };\n }\n\n console.warn('[AgentShield] WASM exports do not include detect_agent function');\n return null;\n } catch (error) {\n console.error('[AgentShield] WASM detection failed:', error);\n return null;\n }\n}\n\n/**\n * Get WASM version\n */\nexport async function getWasmVersion(): Promise<string | null> {\n const initialized = await initWasm();\n if (!initialized || !wasmExports) {\n return null;\n }\n\n if (typeof wasmExports.version === 'function') {\n return wasmExports.version();\n }\n\n return 'unknown';\n}\n\n/**\n * Check if WASM is available and working\n */\nexport async function isWasmAvailable(): Promise<boolean> {\n try {\n const initialized = await initWasm();\n if (!initialized) return false;\n\n // Try to get version as a simple test\n const version = await getWasmVersion();\n return version !== null;\n } catch {\n return false;\n }\n}\n","/**\n * Enhanced EdgeAgentDetector with WASM support\n * Provides both pattern-based and WASM-based detection\n */\n\nimport { detectAgentWithWasm, initWasm, isWasmAvailable, setWasmBaseUrl } from './wasm-loader';\nimport {\n loadRulesSync,\n type DetectionRules,\n type DetectionResult,\n type DetectionInput,\n mapVerificationMethod,\n} from '@kya-os/agentshield-shared';\n\ntype EventHandler = (...args: unknown[]) => void;\n\n// Load centralized rules - this will fail fast if rules cannot be loaded\nconst rules: DetectionRules = loadRulesSync();\n\n/**\n * EdgeAgentDetector with WASM enhancement\n */\nexport class EdgeAgentDetectorWithWasm {\n private wasmEnabled: boolean = false;\n private initPromise: Promise<void> | null = null;\n private baseUrl: string | null = null;\n private rules: DetectionRules;\n\n constructor(private enableWasm: boolean = true) {\n this.rules = rules;\n }\n\n /**\n * Set the base URL for WASM loading in Edge Runtime\n */\n setBaseUrl(url: string) {\n this.baseUrl = url;\n setWasmBaseUrl(url);\n }\n\n /**\n * Initialize the detector (including WASM if enabled)\n */\n async init(): Promise<void> {\n if (!this.enableWasm) {\n this.wasmEnabled = false;\n return;\n }\n\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n\n this.initPromise = (async () => {\n try {\n // Try to initialize WASM\n const wasmAvailable = await isWasmAvailable();\n\n if (wasmAvailable) {\n // Set base URL if provided before initializing\n if (this.baseUrl) {\n setWasmBaseUrl(this.baseUrl);\n }\n await initWasm(); // Actually initialize WASM\n this.wasmEnabled = true;\n // WASM detection enabled\n } else {\n this.wasmEnabled = false;\n // WASM not available, using pattern detection\n }\n } catch (error) {\n console.error('[AgentShield] Failed to initialize WASM:', error);\n this.wasmEnabled = false;\n }\n })();\n\n await this.initPromise;\n }\n\n /**\n * Pattern-based detection (fallback)\n */\n private async patternDetection(input: DetectionInput): Promise<DetectionResult> {\n const reasons: string[] = [];\n let detectedAgent: { type: string; name: string } | undefined;\n let verificationMethod: string | undefined;\n let confidence = 0; // 0-100 scale\n\n const headers = input.headers || {};\n const normalizedHeaders: Record<string, string> = {};\n\n // Normalize header names to lowercase\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Check for HTTP Message Signatures (highest confidence)\n const signaturePresent = !!(\n normalizedHeaders['signature'] || normalizedHeaders['signature-input']\n );\n const signatureAgent = normalizedHeaders['signature-agent'];\n\n if (signatureAgent?.includes('chatgpt.com')) {\n confidence = 85; // High confidence for ChatGPT signature\n reasons.push('signature_agent:chatgpt');\n detectedAgent = { type: 'chatgpt', name: 'ChatGPT' };\n verificationMethod = 'signature';\n } else if (signaturePresent) {\n confidence = Math.max(confidence, 40); // Medium confidence for generic signature\n reasons.push('signature_present');\n }\n\n // Check User-Agent patterns using centralized rules\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n for (const [agentKey, agentRule] of Object.entries(this.rules.rules.userAgents)) {\n const matched = agentRule.patterns.some((pattern) => {\n const regex = new RegExp(pattern, 'i');\n return regex.test(userAgent);\n });\n\n if (matched) {\n const agentType = this.getAgentType(agentKey);\n const agentName = this.getAgentName(agentKey);\n\n confidence = Math.max(confidence, Math.round(agentRule.confidence * 0.85 * 100));\n reasons.push(`known_pattern:${agentType}`);\n if (!detectedAgent) {\n detectedAgent = { type: agentType, name: agentName };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers using centralized rules\n const suspiciousHeaders = this.rules.rules.headers.suspicious;\n const foundAiHeaders = suspiciousHeaders.filter(\n (headerRule) => normalizedHeaders[headerRule.name.toLowerCase()]\n );\n\n if (foundAiHeaders.length > 0) {\n const maxConfidence = Math.max(...foundAiHeaders.map((h) => h.confidence));\n confidence = Math.max(confidence, maxConfidence);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs using centralized rules\n const ip = input.ip || input.ipAddress;\n if (ip && !normalizedHeaders['x-forwarded-for'] && !normalizedHeaders['x-real-ip']) {\n // Handle both old (with providers) and new (direct) structures\n const ipRanges =\n 'providers' in this.rules.rules.ipRanges\n ? this.rules.rules.ipRanges.providers\n : this.rules.rules.ipRanges;\n\n for (const [provider, ipRule] of Object.entries(ipRanges)) {\n // Skip non-rule entries\n if (\n !ipRule ||\n typeof ipRule !== 'object' ||\n !('ranges' in ipRule) ||\n !Array.isArray(ipRule.ranges)\n )\n continue;\n\n const matched = ipRule.ranges.some((range: string) => {\n const prefix = range.split('/')[0];\n const prefixParts = prefix.split('.');\n const ipParts = ip.split('.');\n\n // Check if IP starts with the same octets\n for (let i = 0; i < Math.min(prefixParts.length - 1, 2); i++) {\n if (prefixParts[i] !== ipParts[i] && prefixParts[i] !== '0') {\n return false;\n }\n }\n return true;\n });\n\n if (matched) {\n confidence = Math.max(confidence, Math.round(ipRule.confidence * 0.4 * 100));\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n\n // Boost confidence for combinations\n if (reasons.length > 2) {\n confidence = Math.min(Math.round(confidence * 1.2), 95);\n }\n\n // Ensure confidence stays within 0-100 range\n confidence = Math.min(Math.max(confidence, 0), 100);\n\n return {\n isAgent: confidence > 30, // 30% threshold\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && {\n verificationMethod: mapVerificationMethod(verificationMethod),\n }),\n forgeabilityRisk: confidence > 80 ? 'medium' : 'high',\n timestamp: new Date(),\n };\n }\n\n /**\n * Analyze request with WASM enhancement when available\n */\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n // Ensure initialization\n await this.init();\n\n // Try WASM detection first if enabled\n if (this.wasmEnabled) {\n try {\n const wasmResult = await detectAgentWithWasm(\n input.userAgent || input.headers?.['user-agent'],\n input.headers || {},\n input.ip || input.ipAddress\n );\n\n if (wasmResult) {\n // WASM detection succeeded\n\n // Map WASM result to DetectionResult\n const detectedAgent = wasmResult.agent ? this.mapAgentName(wasmResult.agent) : undefined;\n\n return {\n isAgent: wasmResult.isAgent,\n confidence: wasmResult.confidence,\n detectionClass:\n wasmResult.isAgent && detectedAgent\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : wasmResult.isAgent\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons: [`wasm:${wasmResult.verificationMethod}`],\n verificationMethod: mapVerificationMethod(wasmResult.verificationMethod),\n forgeabilityRisk:\n wasmResult.verificationMethod === 'signature'\n ? 'low'\n : wasmResult.confidence > 90\n ? 'medium'\n : 'high',\n timestamp: new Date(),\n };\n }\n } catch (error) {\n console.error('[AgentShield] WASM detection error:', error);\n }\n }\n\n // Fall back to pattern detection\n const patternResult = await this.patternDetection(input);\n\n // If WASM is available but didn't detect anything, boost confidence slightly\n // to indicate WASM verification was performed\n if (this.wasmEnabled && patternResult.confidence >= 85) {\n patternResult.confidence = Math.min(95, patternResult.confidence + 10);\n patternResult.reasons.push('wasm_enhanced');\n // Note: Keep original verification method since 'wasm-enhanced' is not a valid type\n }\n\n return patternResult;\n }\n\n /**\n * Get agent type from rule key\n */\n private getAgentType(agentKey: string): string {\n const typeMap: Record<string, string> = {\n openai_gptbot: 'openai',\n anthropic_claude: 'anthropic',\n perplexity_bot: 'perplexity',\n google_ai: 'google',\n microsoft_ai: 'microsoft',\n meta_ai: 'meta',\n cohere_bot: 'cohere',\n huggingface_bot: 'huggingface',\n generic_bot: 'generic',\n dev_tools: 'dev',\n automation_tools: 'automation',\n };\n return typeMap[agentKey] || agentKey;\n }\n\n /**\n * Get agent name from rule key\n */\n private getAgentName(agentKey: string): string {\n const nameMap: Record<string, string> = {\n openai_gptbot: 'ChatGPT/GPTBot',\n anthropic_claude: 'Claude',\n perplexity_bot: 'Perplexity',\n google_ai: 'Google AI',\n microsoft_ai: 'Microsoft Copilot',\n meta_ai: 'Meta AI',\n cohere_bot: 'Cohere',\n huggingface_bot: 'HuggingFace',\n generic_bot: 'Generic Bot',\n dev_tools: 'Development Tool',\n automation_tools: 'Automation Tool',\n };\n return nameMap[agentKey] || agentKey;\n }\n\n /**\n * Map agent names from WASM to consistent format\n */\n private mapAgentName(agent: string): { type: string; name: string } | undefined {\n const lowerAgent = agent.toLowerCase();\n\n if (lowerAgent.includes('chatgpt')) {\n return { type: 'chatgpt', name: 'ChatGPT' };\n } else if (lowerAgent.includes('claude')) {\n return { type: 'claude', name: 'Claude' };\n } else if (lowerAgent.includes('perplexity')) {\n return { type: 'perplexity', name: 'Perplexity' };\n } else if (lowerAgent.includes('bing')) {\n return { type: 'bing', name: 'Bing AI' };\n } else if (lowerAgent.includes('anthropic')) {\n return { type: 'anthropic', name: 'Anthropic' };\n }\n\n return { type: 'unknown', name: agent };\n }\n}\n\n/**\n * Wrapper that provides event emitter functionality\n */\nexport class EdgeAgentDetectorWrapperWithWasm {\n private detector: EdgeAgentDetectorWithWasm;\n private events: Map<string, EventHandler[]> = new Map();\n\n constructor(config?: { enableWasm?: boolean; baseUrl?: string }) {\n this.detector = new EdgeAgentDetectorWithWasm(config?.enableWasm ?? true);\n if (config?.baseUrl) {\n this.detector.setBaseUrl(config.baseUrl);\n }\n }\n\n setBaseUrl(url: string) {\n this.detector.setBaseUrl(url);\n }\n\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n const result = await this.detector.analyze(input);\n\n // Emit events if there are listeners\n if (result.isAgent && this.events.has('agent.detected')) {\n const handlers = this.events.get('agent.detected') || [];\n handlers.forEach((handler) => handler(result, input));\n }\n\n return result;\n }\n\n on(event: string, handler: EventHandler): void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)!.push(handler);\n }\n\n emit(event: string, ...args: unknown[]): void {\n const handlers = this.events.get(event) || [];\n handlers.forEach((handler) => handler(...args));\n }\n\n async init(): Promise<void> {\n await this.detector.init();\n }\n}\n","/**\n * Edge-safe detector that doesn't use WebAssembly\n * This is used in Edge Runtime where dynamic code evaluation is not allowed\n */\n\nimport type { DetectionResult, DetectionInput } from '@kya-os/agentshield-shared';\n\n// Known AI agent patterns\nconst AI_AGENT_PATTERNS = [\n { pattern: /chatgpt-user/i, type: 'chatgpt', name: 'ChatGPT' },\n { pattern: /claude-web/i, type: 'claude', name: 'Claude' },\n { pattern: /perplexitybot/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity-user/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /bingbot/i, type: 'bing', name: 'Bing AI' },\n { pattern: /anthropic-ai/i, type: 'anthropic', name: 'Anthropic' },\n];\n\n/**\n * Edge-safe pattern detection without WASM\n */\nexport class EdgeSafeDetector {\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n const reasons: string[] = [];\n let detectedAgent: { type: string; name: string } | undefined;\n let confidence = 0;\n\n const headers = input.headers || {};\n const normalizedHeaders: Record<string, string> = {};\n\n // Normalize header names to lowercase\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Check User-Agent patterns\n const userAgent = input.userAgent || normalizedHeaders['user-agent'] || '';\n if (userAgent) {\n for (const { pattern, type, name } of AI_AGENT_PATTERNS) {\n if (pattern.test(userAgent)) {\n confidence = 85; // Updated to 0-100 scale (was 0.85)\n reasons.push(`known_pattern:${type}`);\n detectedAgent = { type, name };\n break;\n }\n }\n }\n\n // Check for browser UA without browser headers (Perplexity pattern)\n const hasChrome = userAgent.toLowerCase().includes('chrome');\n const hasFirefox = userAgent.toLowerCase().includes('firefox');\n const hasSafari = userAgent.toLowerCase().includes('safari');\n const hasBrowserUA = hasChrome || hasFirefox || hasSafari;\n\n if (hasBrowserUA) {\n const hasSecChUa = !!normalizedHeaders['sec-ch-ua'];\n const hasSecFetch = !!normalizedHeaders['sec-fetch-site'];\n const hasAcceptLanguage = !!normalizedHeaders['accept-language'];\n const hasCookies = !!normalizedHeaders['cookie'];\n\n const missingHeaders = [];\n if (!hasSecChUa && hasChrome) missingHeaders.push('sec-ch-ua');\n if (!hasSecFetch) missingHeaders.push('sec-fetch');\n if (!hasAcceptLanguage) missingHeaders.push('accept-language');\n if (!hasCookies) missingHeaders.push('cookies');\n\n if (missingHeaders.length >= 2) {\n confidence = Math.max(confidence, 85); // Updated to 0-100 scale (was 0.85)\n reasons.push('browser_ua_missing_headers');\n if (!detectedAgent && hasChrome && !hasSecChUa) {\n detectedAgent = { type: 'perplexity', name: 'Perplexity' };\n }\n }\n }\n\n // Check for AI-specific headers\n const aiHeaders = ['openai-conversation-id', 'anthropic-client-id', 'x-goog-api-client'];\n\n const foundAiHeaders = aiHeaders.filter((h) => normalizedHeaders[h]);\n if (foundAiHeaders.length > 0) {\n confidence = Math.max(confidence, 60); // Updated to 0-100 scale (was 0.6)\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n return {\n isAgent: confidence > 30, // Updated to 0-100 scale (was 0.3)\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent // Updated to 0-100 scale\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30 // Updated to 0-100 scale\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n detectedAgent,\n reasons,\n verificationMethod: 'pattern',\n timestamp: new Date(),\n confidenceLevel: confidence >= 80 ? 'high' : confidence >= 50 ? 'medium' : 'low', // Updated to 0-100 scale\n };\n }\n}\n","/**\n * In-memory storage adapter for development/testing\n */\n\nimport type { StorageAdapter, AgentDetectionEvent, AgentSession } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private events: Map<string, AgentDetectionEvent> = new Map();\n private sessions: Map<string, AgentSession> = new Map();\n private eventTimeline: Array<{ timestamp: number; eventId: string }> = [];\n private maxEvents: number = 1000;\n private maxSessions: number = 100;\n\n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n const eventKey = `${event.timestamp}:${event.eventId}`;\n this.events.set(eventKey, event);\n \n // Add to timeline\n this.eventTimeline.push({\n timestamp: Date.parse(event.timestamp),\n eventId: eventKey,\n });\n \n // Sort timeline by timestamp\n this.eventTimeline.sort((a, b) => b.timestamp - a.timestamp);\n \n // Maintain size limit\n if (this.eventTimeline.length > this.maxEvents) {\n const removed = this.eventTimeline.splice(this.maxEvents);\n removed.forEach(item => this.events.delete(item.eventId));\n }\n }\n\n async getRecentEvents(limit: number = 100): Promise<AgentDetectionEvent[]> {\n const recent = this.eventTimeline.slice(0, limit);\n return recent\n .map(item => this.events.get(item.eventId))\n .filter((event): event is AgentDetectionEvent => event !== undefined);\n }\n\n async getSessionEvents(sessionId: string): Promise<AgentDetectionEvent[]> {\n const events: AgentDetectionEvent[] = [];\n for (const event of this.events.values()) {\n if (event.sessionId === sessionId) {\n events.push(event);\n }\n }\n return events.sort((a, b) => \n Date.parse(b.timestamp) - Date.parse(a.timestamp)\n );\n }\n\n async storeSession(session: AgentSession): Promise<void> {\n this.sessions.set(session.sessionId, session);\n \n // Maintain size limit\n if (this.sessions.size > this.maxSessions) {\n // Remove oldest sessions\n const sortedSessions = Array.from(this.sessions.entries())\n .sort((a, b) => Date.parse(b[1].lastSeen) - Date.parse(a[1].lastSeen));\n \n const toRemove = sortedSessions.slice(this.maxSessions);\n toRemove.forEach(([id]) => this.sessions.delete(id));\n }\n }\n\n async getSession(sessionId: string): Promise<AgentSession | null> {\n return this.sessions.get(sessionId) || null;\n }\n\n async getRecentSessions(limit: number = 10): Promise<AgentSession[]> {\n const sorted = Array.from(this.sessions.values())\n .sort((a, b) => Date.parse(b.lastSeen) - Date.parse(a.lastSeen));\n return sorted.slice(0, limit);\n }\n\n async cleanup(olderThan: Date): Promise<void> {\n const cutoff = olderThan.getTime();\n \n // Clean up events\n this.eventTimeline = this.eventTimeline.filter(item => {\n if (item.timestamp < cutoff) {\n this.events.delete(item.eventId);\n return false;\n }\n return true;\n });\n \n // Clean up sessions\n for (const [id, session] of this.sessions.entries()) {\n if (Date.parse(session.lastSeen) < cutoff) {\n this.sessions.delete(id);\n }\n }\n }\n}","/**\n * Redis storage adapter for production use\n */\n\nimport type { StorageAdapter, AgentDetectionEvent, AgentSession } from './types';\n\nexport interface RedisClient {\n get<T>(key: string): Promise<T | null>;\n set(key: string, value: string | number | Buffer): Promise<string | null>;\n setex(key: string, ttl: number, value: string | number | Buffer): Promise<string | null>;\n zadd(key: string, options: { score: number; member: string }): Promise<number | null>;\n zrange(key: string, start: number, stop: number): Promise<string[]>;\n zrevrange(key: string, start: number, stop: number): Promise<string[]>;\n zcard(key: string): Promise<number | null>;\n zremrangebyrank(key: string, start: number, stop: number): Promise<number | null>;\n del(key: string | string[]): Promise<number>;\n scan(cursor: number, options?: { match?: string; count?: number }): Promise<[string, string[]]>;\n}\n\nexport class RedisStorageAdapter implements StorageAdapter {\n private redis: RedisClient;\n private ttl: number;\n private keyPrefix: string = 'agent-shield';\n\n constructor(redis: RedisClient, ttl: number = 86400) {\n this.redis = redis;\n this.ttl = ttl;\n }\n\n private eventKey(timestamp: string, eventId: string): string {\n return `${this.keyPrefix}:events:${timestamp}:${eventId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `${this.keyPrefix}:sessions:${sessionId}`;\n }\n\n private timelineKey(): string {\n return `${this.keyPrefix}:events:timeline`;\n }\n\n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n const key = this.eventKey(event.timestamp, event.eventId);\n\n // Store the event with TTL\n await this.redis.setex(key, this.ttl, JSON.stringify(event));\n\n // Add to timeline sorted set\n await this.redis.zadd(this.timelineKey(), {\n score: Date.parse(event.timestamp),\n member: key,\n });\n\n // Maintain timeline size (keep last 1000 events)\n const count = await this.redis.zcard(this.timelineKey());\n if (count && count > 1000) {\n await this.redis.zremrangebyrank(this.timelineKey(), 0, -1001);\n }\n }\n\n async getRecentEvents(limit: number = 100): Promise<AgentDetectionEvent[]> {\n // Get most recent event keys from timeline\n const keys = await this.redis.zrevrange(this.timelineKey(), 0, limit - 1);\n\n if (!keys || keys.length === 0) {\n return [];\n }\n\n // Fetch events\n const events: AgentDetectionEvent[] = [];\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const event = typeof data === 'string' ? JSON.parse(data) : data;\n events.push(event as AgentDetectionEvent);\n } catch (e) {\n console.error(`Failed to parse event ${key}:`, e);\n }\n }\n }\n\n return events;\n }\n\n async getSessionEvents(sessionId: string): Promise<AgentDetectionEvent[]> {\n // Get all event keys from timeline\n const keys = await this.redis.zrevrange(this.timelineKey(), 0, -1);\n\n if (!keys || keys.length === 0) {\n return [];\n }\n\n // Fetch and filter events\n const events: AgentDetectionEvent[] = [];\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const event = typeof data === 'string' ? JSON.parse(data) : data;\n if ((event as AgentDetectionEvent).sessionId === sessionId) {\n events.push(event as AgentDetectionEvent);\n }\n } catch (e) {\n console.error(`Failed to parse event ${key}:`, e);\n }\n }\n }\n\n return events;\n }\n\n async storeSession(session: AgentSession): Promise<void> {\n const key = this.sessionKey(session.sessionId);\n\n // Check if session exists\n const existing = await this.redis.get<string>(key);\n\n if (existing) {\n // Update existing session\n const existingSession = typeof existing === 'string' ? JSON.parse(existing) : existing;\n const methods = new Set([\n ...(existingSession.verificationMethods || []),\n ...session.verificationMethods,\n ]);\n\n const updatedSession: AgentSession = {\n ...existingSession,\n lastSeen: session.lastSeen,\n eventCount: session.eventCount,\n paths: Array.from(new Set([...existingSession.paths, ...session.paths])),\n averageConfidence: session.averageConfidence,\n verificationMethods: Array.from(methods),\n };\n\n await this.redis.setex(key, this.ttl, JSON.stringify(updatedSession));\n } else {\n // Store new session\n await this.redis.setex(key, this.ttl, JSON.stringify(session));\n }\n }\n\n async getSession(sessionId: string): Promise<AgentSession | null> {\n const key = this.sessionKey(sessionId);\n const data = await this.redis.get<string>(key);\n\n if (!data) {\n return null;\n }\n\n try {\n return typeof data === 'string' ? JSON.parse(data) : data;\n } catch (e) {\n console.error(`Failed to parse session ${sessionId}:`, e);\n return null;\n }\n }\n\n async getRecentSessions(limit: number = 10): Promise<AgentSession[]> {\n // Scan for session keys\n const pattern = `${this.keyPrefix}:sessions:*`;\n const sessions: AgentSession[] = [];\n let cursor = 0;\n\n do {\n const [nextCursor, keys] = await this.redis.scan(cursor, {\n match: pattern,\n count: 100,\n });\n\n cursor = parseInt(nextCursor);\n\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const session = typeof data === 'string' ? JSON.parse(data) : data;\n sessions.push(session as AgentSession);\n } catch (e) {\n console.error(`Failed to parse session from ${key}:`, e);\n }\n }\n }\n } while (cursor !== 0 && sessions.length < limit * 2); // Get extra to sort\n\n // Sort by lastSeen and return limit\n return sessions.sort((a, b) => Date.parse(b.lastSeen) - Date.parse(a.lastSeen)).slice(0, limit);\n }\n\n async cleanup(olderThan: Date): Promise<void> {\n // Note: With TTL, Redis automatically cleans up old data\n // This method is optional for manual cleanup\n\n const cutoff = olderThan.getTime();\n\n // Clean up old events from timeline\n await this.redis.zremrangebyrank(this.timelineKey(), 0, Math.floor(cutoff / 1000));\n\n // Sessions will expire automatically with TTL\n }\n}\n","/**\n * Storage adapter exports and factory\n */\n\nexport * from './types';\nexport { MemoryStorageAdapter } from './memory-adapter';\nexport { RedisStorageAdapter } from './redis-adapter';\n\nimport type { StorageAdapter, StorageConfig } from './types';\nimport { MemoryStorageAdapter } from './memory-adapter';\nimport { RedisStorageAdapter } from './redis-adapter';\nimport type { RedisClient } from './redis-adapter';\n\n/**\n * Create a storage adapter based on configuration\n */\nexport async function createStorageAdapter(config?: StorageConfig): Promise<StorageAdapter> {\n if (!config || config.type === 'memory') {\n return new MemoryStorageAdapter();\n }\n\n if (config.type === 'custom' && config.custom) {\n return config.custom;\n }\n\n if (config.type === 'redis' && config.redis) {\n // Dynamically import Redis client\n try {\n // @ts-expect-error - Optional peer dependency\n const { Redis } = await import('@upstash/redis');\n const redis = new Redis({\n url: config.redis.url,\n token: config.redis.token,\n });\n // Upstash Redis client matches our RedisClient interface\n return new RedisStorageAdapter(redis as unknown as RedisClient, config.ttl);\n } catch (error) {\n console.warn(\n '[AgentShield] Failed to initialize Redis storage, falling back to memory:',\n error\n );\n return new MemoryStorageAdapter();\n }\n }\n\n // Default to memory storage\n return new MemoryStorageAdapter();\n}\n","/**\n * Enhanced Next.js middleware with all features built-in\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { EdgeSafeDetector } from './edge-safe-detector';\nimport { createStorageAdapter } from './storage';\nimport type { StorageAdapter, StorageConfig, AgentDetectionEvent } from './storage/types';\nimport type { DetectionResult, DetectionInput } from '@kya-os/agentshield-shared';\nimport type { EdgeAgentDetectorWrapperWithWasm } from './edge-detector-with-wasm';\n\n/**\n * Enhanced configuration with built-in features\n */\nexport interface EnhancedMiddlewareConfig {\n /**\n * Storage configuration\n */\n storage?: StorageConfig;\n\n /**\n * Session tracking configuration\n */\n sessionTracking?: {\n enabled?: boolean;\n ttl?: number;\n };\n\n /**\n * Paths to skip detection\n */\n skipPaths?: string[];\n\n /**\n * Action when agent detected\n */\n onAgentDetected?: 'block' | 'log' | 'allow';\n\n /**\n * Custom handler for agent detection\n */\n onDetection?: (result: DetectionResult, context: DetectionInput) => void | Promise<void>;\n\n /**\n * Confidence threshold\n */\n confidenceThreshold?: number;\n\n /**\n * Response when blocking\n */\n blockedResponse?: {\n status?: number;\n message?: string;\n };\n}\n\n/**\n * Session tracking helper\n */\nclass SessionManager {\n private sessionLastActivity = new Map<string, number>();\n\n generateSessionId(ipAddress?: string, userAgent?: string): string {\n const now = Date.now();\n const timeWindow = Math.floor(now / (5 * 60 * 1000)); // 5-minute windows\n const baseKey = `${ipAddress || 'unknown'}:${userAgent || 'unknown'}`;\n const windowKey = `${baseKey}:${timeWindow}`;\n\n const lastActivity = this.sessionLastActivity.get(windowKey);\n const shouldCreateNewSession = !lastActivity || now - lastActivity > 30000;\n\n this.sessionLastActivity.set(windowKey, now);\n\n // Clean up old entries\n if (this.sessionLastActivity.size > 100) {\n const cutoff = now - 600000;\n for (const [key, time] of this.sessionLastActivity.entries()) {\n if (time < cutoff) {\n this.sessionLastActivity.delete(key);\n }\n }\n }\n\n const data = shouldCreateNewSession ? `${windowKey}:${now}` : `${windowKey}:${lastActivity}`;\n\n // Simple hash\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return Math.abs(hash).toString(16).padStart(12, '0').substring(0, 12);\n }\n}\n\n/**\n * Create enhanced AgentShield middleware with all features\n */\nexport function createEnhancedAgentShieldMiddleware(config: EnhancedMiddlewareConfig = {}) {\n // Initialize storage adapter\n let storageAdapter: StorageAdapter | null = null;\n let storageInitPromise: Promise<StorageAdapter> | null = null;\n\n const getStorage = async () => {\n if (storageAdapter) return storageAdapter;\n if (storageInitPromise) return storageInitPromise;\n\n storageInitPromise = createStorageAdapter(config.storage).then((adapter) => {\n storageAdapter = adapter;\n return adapter;\n });\n\n return storageInitPromise;\n };\n\n // Initialize detector - Edge Runtime safe\n type DetectorType = EdgeSafeDetector | EdgeAgentDetectorWrapperWithWasm;\n let detector: DetectorType | null = null;\n let detectorInitPromise: Promise<void> | null = null;\n let wasmConfidenceUtils: typeof import('./wasm-confidence') | null = null;\n\n const getDetector = async (requestUrl?: string) => {\n if (detector) {\n return detector;\n }\n if (detectorInitPromise) {\n await detectorInitPromise;\n return detector!;\n }\n\n detectorInitPromise = (async () => {\n // Check if we're in Edge Runtime\n const isEdgeRuntime =\n typeof (globalThis as { EdgeRuntime?: unknown }).EdgeRuntime !== 'undefined' ||\n process.env.NEXT_RUNTIME === 'edge';\n\n if (isEdgeRuntime) {\n // Use Edge-safe detector (no WASM)\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] Edge Runtime detected - using pattern detection');\n }\n detector = new EdgeSafeDetector();\n } else {\n try {\n // Try to load WASM confidence utilities first\n try {\n const wasmUtils = await import('./wasm-confidence');\n wasmConfidenceUtils = wasmUtils;\n const wasmAvailable = await wasmUtils.checkWasmAvailability();\n\n if (wasmAvailable) {\n // Dynamically import WASM detector only when not in Edge Runtime\n const { EdgeAgentDetectorWrapperWithWasm } = await import(\n './edge-detector-with-wasm'\n );\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] ✅ WASM support detected - enhanced detection enabled'\n );\n }\n detector = new EdgeAgentDetectorWrapperWithWasm({ enableWasm: true });\n if (requestUrl && 'setBaseUrl' in detector) {\n detector.setBaseUrl(requestUrl);\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] ℹ️ Using pattern-based detection (WASM not available)'\n );\n }\n detector = new EdgeSafeDetector();\n }\n } catch (wasmError) {\n // WASM utilities not available\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] WASM utilities not available, using pattern detection');\n }\n detector = new EdgeSafeDetector();\n }\n } catch (error) {\n // Fallback to Edge-safe detector\n console.warn('[AgentShield] Failed to initialize enhanced detector, using fallback');\n detector = new EdgeSafeDetector();\n }\n }\n })();\n\n await detectorInitPromise;\n return detector!;\n };\n\n // Session manager\n const sessionManager = new SessionManager();\n const sessionTrackingEnabled = config.sessionTracking?.enabled !== false;\n\n // Return the middleware function\n return async (request: NextRequest): Promise<NextResponse> => {\n const { pathname } = request.nextUrl;\n\n // Check if path should be skipped\n if (config.skipPaths?.some((path) => pathname.startsWith(path))) {\n return NextResponse.next();\n }\n\n // Extract request context\n const userAgent = request.headers.get('user-agent');\n const ipAddress = request.ip ?? request.headers.get('x-forwarded-for');\n const url = new URL(request.url);\n const pathWithQuery = url.pathname + url.search;\n\n const context = {\n userAgent: userAgent || '',\n ipAddress: ipAddress || '',\n headers: Object.fromEntries(request.headers.entries()),\n url: pathWithQuery,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Run detection with lazy-loaded detector (pass request URL for WASM loading)\n const activeDetector = await getDetector(request.url);\n const result = await activeDetector.analyze(context);\n\n // Apply WASM confidence boost if applicable\n let finalConfidence = result.confidence;\n let verificationMethod: string = result.verificationMethod || 'pattern';\n\n if (result.isAgent && wasmConfidenceUtils) {\n const reasons = result.reasons || [];\n\n if (wasmConfidenceUtils.shouldIndicateWasmVerification(result.confidence)) {\n finalConfidence = wasmConfidenceUtils.getWasmConfidenceBoost(result.confidence, reasons);\n verificationMethod = wasmConfidenceUtils.getVerificationMethod(finalConfidence, reasons);\n }\n }\n\n // Handle high-confidence detection\n if (result.isAgent && finalConfidence >= (config.confidenceThreshold ?? 0.7)) {\n // Store event if storage is configured and session tracking is enabled\n if (sessionTrackingEnabled) {\n const storage = await getStorage();\n const sessionId = sessionManager.generateSessionId(\n ipAddress || undefined,\n userAgent || undefined\n );\n\n // Create event\n const event: AgentDetectionEvent = {\n eventId: `agent_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\n sessionId,\n timestamp: new Date().toISOString(),\n agentType: result.detectedAgent?.type || 'unknown',\n agentName: result.detectedAgent?.name || 'Unknown',\n confidence: finalConfidence,\n path: pathWithQuery,\n ...(userAgent && { userAgent }),\n ...(ipAddress && { ipAddress }),\n method: request.method,\n detectionReasons: result.reasons || [],\n verificationMethod,\n detectionDetails: {\n patterns: (result.detectedAgent as { patterns?: string[] })?.patterns,\n behaviors: (result.detectedAgent as { behaviors?: string[] })?.behaviors,\n fingerprintMatches: (result.detectedAgent as { fingerprints?: string[] })?.fingerprints,\n },\n };\n\n // Store event\n try {\n await storage.storeEvent(event);\n\n // Get or create session\n let session = await storage.getSession(sessionId);\n\n if (session) {\n // Update existing session\n session.lastSeen = event.timestamp;\n session.eventCount++;\n if (!session.paths.includes(pathWithQuery)) {\n session.paths.push(pathWithQuery);\n }\n session.averageConfidence =\n (session.averageConfidence * (session.eventCount - 1) + finalConfidence) /\n session.eventCount;\n if (!session.verificationMethods.includes(verificationMethod)) {\n session.verificationMethods.push(verificationMethod);\n }\n } else {\n // Create new session\n session = {\n sessionId,\n ...(ipAddress && { ipAddress }),\n ...(userAgent && { userAgent }),\n agentType: result.detectedAgent?.type || 'unknown',\n agentName: result.detectedAgent?.name || 'Unknown',\n firstSeen: event.timestamp,\n lastSeen: event.timestamp,\n eventCount: 1,\n paths: [pathWithQuery],\n averageConfidence: finalConfidence,\n verificationMethods: [verificationMethod],\n };\n }\n\n if (session) {\n await storage.storeSession(session);\n }\n } catch (error) {\n console.error('[AgentShield] Failed to store event:', error);\n }\n }\n\n // Call custom handler if provided\n if (config.onDetection) {\n await config.onDetection(result, context);\n }\n\n // Handle based on configuration\n switch (config.onAgentDetected) {\n case 'block': {\n const { status = 403, message = 'Access denied: AI agent detected' } =\n config.blockedResponse || {};\n\n const response = NextResponse.json(\n { error: message, detected: true, confidence: finalConfidence },\n { status }\n );\n\n // Add detection headers\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set(\n 'x-agentshield-confidence',\n String(Math.round(finalConfidence * 100))\n );\n response.headers.set('x-agentshield-agent', result.detectedAgent?.name || 'Unknown');\n response.headers.set('x-agentshield-verification', verificationMethod);\n\n return response;\n }\n\n case 'log': {\n // Only log high-confidence or interesting detections\n const isInteresting =\n finalConfidence >= 0.9 ||\n result.detectedAgent?.name?.toLowerCase().includes('chatgpt') ||\n result.detectedAgent?.name?.toLowerCase().includes('perplexity') ||\n verificationMethod === 'signature';\n\n if (isInteresting && process.env.NODE_ENV !== 'production') {\n console.debug(`[AgentShield] 🤖 AI Agent detected (${verificationMethod}):`, {\n agent: result.detectedAgent?.name,\n confidence: `${(finalConfidence * 100).toFixed(0)}%`,\n path: pathWithQuery,\n verification: verificationMethod,\n });\n }\n break;\n }\n\n case 'allow':\n default:\n // Continue processing\n break;\n }\n }\n\n // Create response with detection headers\n const response = NextResponse.next();\n\n if (result.isAgent) {\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set('x-agentshield-confidence', String(Math.round(finalConfidence * 100)));\n response.headers.set('x-agentshield-agent', result.detectedAgent?.name || 'Unknown');\n response.headers.set('x-agentshield-verification', verificationMethod);\n\n // Add custom headers for high confidence\n if (finalConfidence > 0.9) {\n response.headers.set('x-ai-visitor', 'true');\n response.headers.set('x-ai-confidence', finalConfidence.toString());\n response.headers.set('x-ai-verification', verificationMethod);\n }\n }\n\n return response;\n };\n}\n\n/**\n * Export storage types for user access\n */\nexport type {\n StorageAdapter,\n StorageConfig,\n AgentDetectionEvent,\n AgentSession,\n} from './storage/types';\n"]}