@kya-os/agentshield-nextjs 0.1.32 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signature-verifier.ts","../src/edge-detector-wrapper.ts","../src/wasm-loader.ts","../src/edge-detector-with-wasm.ts","../src/session-tracker.ts","../src/middleware.ts","../src/create-middleware.ts","../src/index.ts"],"names":["now","response","AI_AGENT_PATTERNS","CLOUD_PROVIDERS","NextResponse","context","initPromise","createAgentShieldMiddleware"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Ed25519 Signature Verification for HTTP Message Signatures\n * Implements proper cryptographic verification for ChatGPT and other agents\n * \n * Based on RFC 9421 (HTTP Message Signatures) and ChatGPT's implementation\n * Reference: https://help.openai.com/en/articles/9785974-chatgpt-user-allowlisting\n */\n\n/**\n * Known public keys for AI agents\n */\nconst KNOWN_KEYS = {\n chatgpt: [\n {\n kid: 'otMqcjr17mGyruktGvJU8oojQTSMHlVm7uO-lrcqbdg',\n // ChatGPT's current Ed25519 public key (base64)\n publicKey: '7F_3jDlxaquwh291MiACkcS3Opq88NksyHiakzS-Y1g',\n validFrom: new Date('2025-01-01').getTime() / 1000,\n validUntil: new Date('2025-04-11').getTime() / 1000,\n },\n ],\n};\n\n/**\n * Parse the Signature-Input header according to RFC 9421\n */\nfunction parseSignatureInput(signatureInput: string): {\n keyid: string;\n created?: number | undefined;\n expires?: number | undefined;\n signedHeaders: string[];\n} | null {\n try {\n // Example: sig1=(\"@method\" \"@path\" \"@authority\" \"date\");keyid=\"...\";created=1234567890\n const match = signatureInput.match(/sig1=\\((.*?)\\);(.+)/);\n if (!match) return null;\n\n const [, headersList, params] = match;\n \n // Parse signed headers\n const signedHeaders = headersList\n ? headersList\n .split(' ')\n .map(h => h.replace(/\"/g, '').trim())\n .filter(h => h.length > 0)\n : [];\n\n // Parse parameters\n const keyidMatch = params ? params.match(/keyid=\"([^\"]+)\"/) : null;\n const createdMatch = params ? params.match(/created=(\\d+)/) : null;\n const expiresMatch = params ? params.match(/expires=(\\d+)/) : null;\n\n if (!keyidMatch || !keyidMatch[1]) return null;\n\n return {\n keyid: keyidMatch[1],\n created: createdMatch && createdMatch[1] ? parseInt(createdMatch[1]) : undefined,\n expires: expiresMatch && expiresMatch[1] ? parseInt(expiresMatch[1]) : undefined,\n signedHeaders,\n };\n } catch (error) {\n console.error('[Signature] Failed to parse Signature-Input:', error);\n return null;\n }\n}\n\n/**\n * Build the signature base string according to RFC 9421\n * This is what gets signed\n */\nfunction buildSignatureBase(\n method: string,\n path: string,\n headers: Record<string, string>,\n signedHeaders: string[]\n): string {\n const components: string[] = [];\n \n for (const headerName of signedHeaders) {\n let value: string;\n \n switch (headerName) {\n case '@method':\n value = method.toUpperCase();\n break;\n case '@path':\n value = path;\n break;\n case '@authority':\n // Get from Host header or URL\n value = headers['host'] || headers['Host'] || '';\n break;\n default:\n // Regular headers (case-insensitive lookup)\n const key = Object.keys(headers).find(\n k => k.toLowerCase() === headerName.toLowerCase()\n );\n value = key ? headers[key] || '' : '';\n break;\n }\n \n // Format according to RFC 9421\n components.push(`\"${headerName}\": ${value}`);\n }\n \n return components.join('\\n');\n}\n\n/**\n * Verify Ed25519 signature using Web Crypto API\n */\nasync function verifyEd25519Signature(\n publicKeyBase64: string,\n signatureBase64: string,\n message: string\n): Promise<boolean> {\n try {\n // Decode base64 to Uint8Array\n const publicKeyBytes = Uint8Array.from(atob(publicKeyBase64), c => c.charCodeAt(0));\n const signatureBytes = Uint8Array.from(atob(signatureBase64), c => c.charCodeAt(0));\n const messageBytes = new TextEncoder().encode(message);\n \n // Check key and signature lengths\n if (publicKeyBytes.length !== 32) {\n console.error('[Signature] Invalid public key length:', publicKeyBytes.length);\n return false;\n }\n if (signatureBytes.length !== 64) {\n console.error('[Signature] Invalid signature length:', signatureBytes.length);\n return false;\n }\n \n // Import the public key\n const publicKey = await crypto.subtle.importKey(\n 'raw',\n publicKeyBytes,\n {\n name: 'Ed25519',\n namedCurve: 'Ed25519',\n },\n false,\n ['verify']\n );\n \n // Verify the signature\n const isValid = await crypto.subtle.verify(\n 'Ed25519',\n publicKey,\n signatureBytes,\n messageBytes\n );\n \n return isValid;\n } catch (error) {\n console.error('[Signature] Ed25519 verification failed:', error);\n \n // Fallback: Try with @noble/ed25519 if available (for environments without Ed25519 support)\n if (typeof window === 'undefined') {\n try {\n // In Node.js/Edge Runtime, we might need to use a polyfill\n // For now, we'll return false if Web Crypto doesn't support Ed25519\n console.warn('[Signature] Ed25519 not supported in this environment');\n return false;\n } catch {\n return false;\n }\n }\n \n return false;\n }\n}\n\n/**\n * Signature verification result\n */\nexport interface SignatureVerificationResult {\n isValid: boolean;\n agent?: string;\n keyid?: string;\n confidence: number;\n reason?: string;\n verificationMethod: 'signature' | 'none';\n}\n\n/**\n * Verify HTTP Message Signature for AI agents\n */\nexport async function verifyAgentSignature(\n method: string,\n path: string,\n headers: Record<string, string>\n): Promise<SignatureVerificationResult> {\n // Check for signature headers\n const signature = headers['signature'] || headers['Signature'];\n const signatureInput = headers['signature-input'] || headers['Signature-Input'];\n const signatureAgent = headers['signature-agent'] || headers['Signature-Agent'];\n \n // No signature present\n if (!signature || !signatureInput) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'No signature headers present',\n verificationMethod: 'none',\n };\n }\n \n // Parse Signature-Input header\n const parsed = parseSignatureInput(signatureInput);\n if (!parsed) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Invalid Signature-Input header',\n verificationMethod: 'none',\n };\n }\n \n // Check timestamp if present\n if (parsed.created) {\n const now = Math.floor(Date.now() / 1000);\n const age = now - parsed.created;\n \n // Reject signatures older than 5 minutes\n if (age > 300) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Signature expired (older than 5 minutes)',\n verificationMethod: 'none',\n };\n }\n \n // Reject signatures from the future (clock skew tolerance: 30 seconds)\n if (age < -30) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Signature timestamp is in the future',\n verificationMethod: 'none',\n };\n }\n }\n \n // Determine which agent based on signature-agent header\n let agent: string | undefined;\n let knownKeys: typeof KNOWN_KEYS.chatgpt | undefined;\n \n if (signatureAgent === '\"https://chatgpt.com\"' || signatureAgent?.includes('chatgpt.com')) {\n agent = 'ChatGPT';\n knownKeys = KNOWN_KEYS.chatgpt;\n }\n // Add other agents here as needed\n \n if (!agent || !knownKeys) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Unknown signature agent',\n verificationMethod: 'none',\n };\n }\n \n // Find the key by ID\n const key = knownKeys.find(k => k.kid === parsed.keyid);\n if (!key) {\n return {\n isValid: false,\n confidence: 0,\n reason: `Unknown key ID: ${parsed.keyid}`,\n verificationMethod: 'none',\n };\n }\n \n // Check key validity period\n const now = Math.floor(Date.now() / 1000);\n if (now < key.validFrom || now > key.validUntil) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Key is not valid at current time',\n verificationMethod: 'none',\n };\n }\n \n // Build the signature base string\n const signatureBase = buildSignatureBase(method, path, headers, parsed.signedHeaders);\n \n // Extract the actual signature value (remove \"sig1=:\" prefix and \"::\" suffix if present)\n let signatureValue = signature;\n if (signatureValue.startsWith('sig1=:')) {\n signatureValue = signatureValue.substring(6);\n }\n if (signatureValue.endsWith(':')) {\n signatureValue = signatureValue.slice(0, -1);\n }\n \n // Verify the signature\n const isValid = await verifyEd25519Signature(\n key.publicKey,\n signatureValue,\n signatureBase\n );\n \n if (isValid) {\n return {\n isValid: true,\n agent,\n keyid: parsed.keyid,\n confidence: 1.0, // 100% confidence for valid signature\n verificationMethod: 'signature',\n };\n } else {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Signature verification failed',\n verificationMethod: 'none',\n };\n }\n}\n\n/**\n * Quick check if signature headers are present (for performance)\n */\nexport function hasSignatureHeaders(headers: Record<string, string>): boolean {\n return !!(\n (headers['signature'] || headers['Signature']) &&\n (headers['signature-input'] || headers['Signature-Input'])\n );\n}\n\n/**\n * Check if this is a ChatGPT signature based on headers\n */\nexport function isChatGPTSignature(headers: Record<string, string>): boolean {\n const signatureAgent = headers['signature-agent'] || headers['Signature-Agent'];\n return signatureAgent === '\"https://chatgpt.com\"' || (signatureAgent?.includes('chatgpt.com') || false);\n}","/**\n * Wrapper for EdgeAgentDetector to match AgentDetector interface\n * This allows the middleware to work with EdgeAgentDetector in Edge Runtime\n *\n * This is a self-contained implementation to avoid import resolution issues\n * Includes proper Ed25519 signature verification for ChatGPT and other agents\n */\n\ntype DetectionInput = {\n userAgent?: string;\n ip?: string;\n ipAddress?: string;\n headers?: Record<string, string>;\n url?: string;\n method?: string;\n timestamp?: Date;\n};\n\ntype DetectionResult = {\n isAgent: boolean;\n confidence: number;\n detectedAgent?: {\n type: string;\n name: string;\n };\n reasons: string[];\n verificationMethod?: string;\n forgeabilityRisk?: 'low' | 'medium' | 'high';\n timestamp: Date;\n};\n\ntype EventHandler = (...args: any[]) => void;\n\n// Import signature verifier\nimport { verifyAgentSignature, hasSignatureHeaders, isChatGPTSignature } from './signature-verifier';\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-ai/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity/i, type: 'perplexity', name: 'Perplexity' }, // Fallback\n { pattern: /bingbot/i, type: 'bing', name: 'Bing AI' },\n { pattern: /anthropic-ai/i, type: 'anthropic', name: 'Anthropic' },\n];\n\n// Known cloud provider IP ranges (simplified)\nconst CLOUD_PROVIDERS = {\n aws: ['54.', '52.', '35.', '18.', '3.'],\n gcp: ['35.', '34.', '104.', '107.', '108.'],\n azure: ['13.', '20.', '40.', '52.', '104.'],\n};\n\n/**\n * Self-contained EdgeAgentDetector implementation with proper signature verification\n */\nclass EdgeAgentDetector {\n async analyze(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;\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 with proper cryptographic verification\n if (hasSignatureHeaders(headers)) {\n try {\n // Verify the signature cryptographically\n const signatureResult = await verifyAgentSignature(\n input.method || 'GET',\n input.url || '/',\n headers\n );\n\n if (signatureResult.isValid) {\n // Valid cryptographic signature - highest confidence\n confidence = signatureResult.confidence;\n reasons.push(`verified_signature:${signatureResult.agent?.toLowerCase() || 'unknown'}`);\n if (signatureResult.agent) {\n detectedAgent = { \n type: signatureResult.agent.toLowerCase(), \n name: signatureResult.agent \n };\n }\n verificationMethod = signatureResult.verificationMethod;\n \n // Add keyid to reasons for debugging\n if (signatureResult.keyid) {\n reasons.push(`keyid:${signatureResult.keyid}`);\n }\n } else {\n // Invalid signature - suspicious\n confidence = Math.max(confidence, 0.3);\n reasons.push('invalid_signature');\n if (signatureResult.reason) {\n reasons.push(`signature_error:${signatureResult.reason}`);\n }\n \n // Still check if it claims to be ChatGPT\n if (isChatGPTSignature(headers)) {\n reasons.push('claims_chatgpt');\n detectedAgent = { type: 'chatgpt', name: 'ChatGPT (unverified)' };\n }\n }\n } catch (error) {\n // Error during verification\n console.error('[EdgeAgentDetector] Signature verification error:', error);\n confidence = Math.max(confidence, 0.2);\n reasons.push('signature_verification_error');\n }\n }\n\n // Check User-Agent patterns\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n for (const { pattern, type, name } of AI_AGENT_PATTERNS) {\n if (pattern.test(userAgent)) {\n // Give higher confidence to well-known AI agents that properly identify themselves\n const highConfidenceAgents = [\n 'chatgpt',\n 'claude',\n 'perplexity',\n 'anthropic',\n ];\n const patternConfidence = highConfidenceAgents.includes(type)\n ? 0.85\n : 0.5;\n\n confidence = Math.max(confidence, patternConfidence);\n reasons.push(`known_pattern:${type}`);\n if (!detectedAgent) {\n detectedAgent = { type, name };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers\n const aiHeaders = [\n 'openai-conversation-id',\n 'openai-ephemeral-user-id',\n 'anthropic-client-id',\n 'x-goog-api-client',\n 'x-ms-copilot-id',\n ];\n\n const foundAiHeaders = aiHeaders.filter(\n header => normalizedHeaders[header]\n );\n if (foundAiHeaders.length > 0) {\n confidence = Math.max(confidence, 0.6);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs\n const ip = input.ip || input.ipAddress;\n if (\n ip &&\n !normalizedHeaders['x-forwarded-for'] &&\n !normalizedHeaders['x-real-ip']\n ) {\n for (const [provider, prefixes] of Object.entries(CLOUD_PROVIDERS)) {\n if (prefixes.some(prefix => ip.startsWith(prefix))) {\n confidence = Math.max(confidence, 0.4);\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n\n // Boost confidence for combinations (but not if already at 1.0 from signature)\n if (reasons.length > 2 && confidence < 1.0) {\n confidence = Math.min(confidence * 1.2, 0.95);\n }\n\n return {\n isAgent: confidence > 0.3,\n confidence,\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && { verificationMethod }),\n forgeabilityRisk: verificationMethod === 'signature' ? 'low' : (confidence > 0.8 ? 'medium' : 'high'),\n timestamp: new Date(),\n };\n }\n}\n\n/**\n * Wrapper that provides event emitter functionality\n */\nexport class EdgeAgentDetectorWrapper {\n private detector: EdgeAgentDetector;\n private events: Map<string, EventHandler[]> = new Map();\n\n constructor(_config?: any) {\n // Config is accepted but not used by EdgeAgentDetector\n this.detector = new EdgeAgentDetector();\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: any[]): void {\n const handlers = this.events.get(event) || [];\n handlers.forEach(handler => handler(...args));\n }\n\n async init(): Promise<void> {\n // EdgeAgentDetector doesn't need initialization\n return;\n }\n}\n","/**\n * WASM Loader for AgentShield in Edge Runtime\n * Handles loading and initialization of WebAssembly module\n */\n\n// Dynamic WASM loading - no direct imports to avoid build issues\nlet wasmInstance: WebAssembly.Instance | null = null;\nlet wasmExports: any = 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/**\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 // Try streaming compilation first (most efficient)\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n const response = await fetch(WASM_PATH);\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(\n streamResponse,\n {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n console.log('WASM:', ptr, len);\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n }\n }\n }\n );\n \n wasmInstance = instance;\n wasmExports = instance.exports;\n \n console.log('[AgentShield] ✅ WASM module initialized with streaming');\n return;\n } catch (streamError) {\n console.log('[AgentShield] Streaming compilation failed, falling back to standard compilation');\n }\n }\n \n // Fallback to standard compilation if streaming not available\n const response = await fetch(WASM_PATH);\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 console.log('WASM:', ptr, len);\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;\n \n console.log('[AgentShield] ✅ WASM module initialized via fallback');\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 * Enhanced EdgeAgentDetector with WASM support\n * Provides both pattern-based and WASM-based detection\n */\n\nimport { detectAgentWithWasm, initWasm, isWasmAvailable } from './wasm-loader';\n\ntype DetectionInput = {\n userAgent?: string;\n ip?: string;\n ipAddress?: string;\n headers?: Record<string, string>;\n url?: string;\n method?: string;\n timestamp?: Date;\n};\n\ntype DetectionResult = {\n isAgent: boolean;\n confidence: number;\n detectedAgent?: {\n type: string;\n name: string;\n };\n reasons: string[];\n verificationMethod?: string;\n forgeabilityRisk?: 'low' | 'medium' | 'high';\n timestamp: Date;\n};\n\ntype EventHandler = (...args: any[]) => void;\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-ai/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// Known cloud provider IP ranges (simplified)\nconst CLOUD_PROVIDERS = {\n aws: ['54.', '52.', '35.', '18.', '3.'],\n gcp: ['35.', '34.', '104.', '107.', '108.'],\n azure: ['13.', '20.', '40.', '52.', '104.'],\n};\n\n/**\n * EdgeAgentDetector with WASM enhancement\n */\nexport class EdgeAgentDetectorWithWasm {\n private wasmEnabled: boolean = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(private enableWasm: boolean = true) {}\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 this.wasmEnabled = wasmAvailable;\n \n if (this.wasmEnabled) {\n console.log('[AgentShield] WASM detection enabled');\n } else {\n console.log('[AgentShield] 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;\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 = 0.85;\n reasons.push('signature_agent:chatgpt');\n detectedAgent = { type: 'chatgpt', name: 'ChatGPT' };\n verificationMethod = 'signature';\n } else if (signaturePresent) {\n confidence = Math.max(confidence, 0.4);\n reasons.push('signature_present');\n }\n\n // Check User-Agent patterns\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n for (const { pattern, type, name } of AI_AGENT_PATTERNS) {\n if (pattern.test(userAgent)) {\n const highConfidenceAgents = [\n 'chatgpt',\n 'claude',\n 'perplexity',\n 'anthropic',\n ];\n const patternConfidence = highConfidenceAgents.includes(type)\n ? 0.85\n : 0.5;\n\n confidence = Math.max(confidence, patternConfidence);\n reasons.push(`known_pattern:${type}`);\n if (!detectedAgent) {\n detectedAgent = { type, name };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers\n const aiHeaders = [\n 'openai-conversation-id',\n 'openai-ephemeral-user-id',\n 'anthropic-client-id',\n 'x-goog-api-client',\n 'x-ms-copilot-id',\n ];\n\n const foundAiHeaders = aiHeaders.filter(\n header => normalizedHeaders[header]\n );\n if (foundAiHeaders.length > 0) {\n confidence = Math.max(confidence, 0.6);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs\n const ip = input.ip || input.ipAddress;\n if (\n ip &&\n !normalizedHeaders['x-forwarded-for'] &&\n !normalizedHeaders['x-real-ip']\n ) {\n for (const [provider, prefixes] of Object.entries(CLOUD_PROVIDERS)) {\n if (prefixes.some(prefix => ip.startsWith(prefix))) {\n confidence = Math.max(confidence, 0.4);\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(confidence * 1.2, 0.95);\n }\n\n return {\n isAgent: confidence > 0.3,\n confidence,\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && { verificationMethod }),\n forgeabilityRisk: confidence > 0.8 ? '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 console.log('[AgentShield] Using WASM detection result');\n \n // Map WASM result to DetectionResult\n const detectedAgent = wasmResult.agent \n ? this.mapAgentName(wasmResult.agent)\n : undefined;\n\n return {\n isAgent: wasmResult.isAgent,\n confidence: wasmResult.confidence,\n ...(detectedAgent && { detectedAgent }),\n reasons: [`wasm:${wasmResult.verificationMethod}`],\n verificationMethod: wasmResult.verificationMethod,\n forgeabilityRisk: \n wasmResult.verificationMethod === 'signature' ? 'low' :\n wasmResult.confidence > 0.9 ? 'medium' : '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 >= 0.85) {\n patternResult.confidence = Math.min(0.95, patternResult.confidence + 0.1);\n patternResult.reasons.push('wasm_enhanced');\n if (!patternResult.verificationMethod) {\n patternResult.verificationMethod = 'wasm-enhanced';\n }\n }\n\n return patternResult;\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 }) {\n this.detector = new EdgeAgentDetectorWithWasm(config?.enableWasm ?? true);\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: any[]): 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 * Edge-compatible session tracking for AI agents\n * Uses cookie-based storage to work in Edge Runtime\n */\n\nimport type { NextRequest, NextResponse } from 'next/server';\nimport type { DetectionResult } from '@kya-os/agentshield';\n\nexport interface SessionData {\n id: string;\n agent: string;\n confidence: number;\n detectedAt: number;\n expires: number;\n}\n\nexport interface SessionTrackingConfig {\n enabled: boolean;\n cookieName?: string;\n cookieMaxAge?: number; // in seconds\n encryptionKey?: string;\n}\n\nexport class EdgeSessionTracker {\n private readonly config: Required<SessionTrackingConfig>;\n\n constructor(config: SessionTrackingConfig) {\n this.config = {\n enabled: config.enabled,\n cookieName: config.cookieName || '__agentshield_session',\n cookieMaxAge: config.cookieMaxAge || 3600, // 1 hour default\n encryptionKey:\n config.encryptionKey ||\n process.env.AGENTSHIELD_SECRET ||\n 'agentshield-default-key',\n };\n }\n\n /**\n * Track a new AI agent session\n */\n async track(\n _request: NextRequest,\n response: NextResponse,\n result: DetectionResult\n ): Promise<NextResponse> {\n try {\n if (!this.config.enabled || !result.isAgent) {\n return response;\n }\n\n const sessionData: SessionData = {\n id: crypto.randomUUID(),\n agent: result.detectedAgent?.name || 'unknown',\n confidence: result.confidence,\n detectedAt: Date.now(),\n expires: Date.now() + this.config.cookieMaxAge * 1000,\n };\n\n // Encrypt session data for security\n const encrypted = await this.encrypt(JSON.stringify(sessionData));\n\n // Set secure httpOnly cookie\n response.cookies.set(this.config.cookieName, encrypted, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: this.config.cookieMaxAge,\n path: '/',\n });\n\n return response;\n } catch (error) {\n // Fail gracefully - log error but don't break request\n if (process.env.DEBUG_AGENTSHIELD) {\n console.warn('AgentShield: Failed to track session:', error);\n }\n return response;\n }\n }\n\n /**\n * Check for existing AI agent session\n */\n async check(request: NextRequest): Promise<SessionData | null> {\n try {\n if (!this.config.enabled) {\n return null;\n }\n\n const cookie = request.cookies.get(this.config.cookieName);\n if (!cookie?.value) {\n return null;\n }\n\n // Decrypt and parse session data\n const decrypted = await this.decrypt(cookie.value);\n const session: SessionData = JSON.parse(decrypted);\n\n // Check if session is expired\n if (session.expires < Date.now()) {\n return null;\n }\n\n return session;\n } catch (error) {\n // Fail gracefully - invalid or corrupted session\n if (process.env.DEBUG_AGENTSHIELD) {\n console.warn('AgentShield: Failed to check session:', error);\n }\n return null;\n }\n }\n\n /**\n * Clear an existing session\n */\n clear(response: NextResponse): NextResponse {\n try {\n response.cookies.delete(this.config.cookieName);\n } catch (error) {\n // Fail gracefully\n if (process.env.DEBUG_AGENTSHIELD) {\n console.warn('AgentShield: Failed to clear session:', error);\n }\n }\n return response;\n }\n\n /**\n * Simple encryption using Web Crypto API (Edge-compatible)\n */\n private async encrypt(data: string): Promise<string> {\n try {\n // For Edge Runtime, use simple base64 encoding with obfuscation\n // In production, consider using Web Crypto API subtle.encrypt()\n const key = this.config.encryptionKey;\n const encoded = new TextEncoder().encode(data);\n\n // Simple XOR obfuscation\n const obfuscated = new Uint8Array(encoded.length);\n for (let i = 0; i < encoded.length; i++) {\n obfuscated[i] = (encoded[i] || 0) ^ key.charCodeAt(i % key.length);\n }\n\n // Convert to base64\n return btoa(\n Array.from(obfuscated, byte => String.fromCharCode(byte)).join('')\n );\n } catch (error) {\n // Fallback to simple base64 if encryption fails\n return btoa(data);\n }\n }\n\n /**\n * Simple decryption (Edge-compatible)\n */\n private async decrypt(data: string): Promise<string> {\n try {\n const key = this.config.encryptionKey;\n const decoded = Uint8Array.from(atob(data), c => c.charCodeAt(0));\n\n // Reverse XOR obfuscation\n const deobfuscated = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) {\n deobfuscated[i] = (decoded[i] || 0) ^ key.charCodeAt(i % key.length);\n }\n\n return new TextDecoder().decode(deobfuscated);\n } catch (error) {\n // Fallback to simple base64 if decryption fails\n return atob(data);\n }\n }\n}\n\n/**\n * Stateless session checker for non-Next.js environments (Express, etc.)\n * Uses a combination of headers to identify continued sessions\n */\nexport class StatelessSessionChecker {\n static check(headers: Record<string, string>): SessionData | null {\n try {\n // Check for session headers (set by previous response)\n const agent = headers['x-agentshield-session-agent'];\n const confidence = headers['x-agentshield-session-confidence'];\n const sessionId = headers['x-agentshield-session-id'];\n\n if (agent && confidence && sessionId) {\n return {\n id: sessionId,\n agent,\n confidence: parseFloat(confidence),\n detectedAt: Date.now(),\n expires: Date.now() + 3600000, // 1 hour\n };\n }\n\n // Check for cookie-based session (if cookies are parsed)\n const cookieHeader = headers['cookie'];\n if (cookieHeader && cookieHeader.includes('__agentshield_session=')) {\n // Simple cookie parsing\n const match = cookieHeader.match(/__agentshield_session=([^;]+)/);\n if (match && match[1]) {\n try {\n const decoded = atob(match[1]);\n return JSON.parse(decoded);\n } catch {\n // Invalid session data\n }\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n static setHeaders(response: any, session: SessionData): void {\n try {\n // Set session headers for stateless tracking\n if (response.setHeader) {\n response.setHeader('X-AgentShield-Session-Agent', session.agent);\n response.setHeader(\n 'X-AgentShield-Session-Confidence',\n session.confidence.toString()\n );\n response.setHeader('X-AgentShield-Session-Id', session.id);\n } else if (response.headers && response.headers.set) {\n response.headers.set('x-agentshield-session-agent', session.agent);\n response.headers.set(\n 'x-agentshield-session-confidence',\n session.confidence.toString()\n );\n response.headers.set('x-agentshield-session-id', session.id);\n }\n } catch {\n // Fail gracefully\n }\n }\n}\n","/**\n * Next.js middleware for AgentShield\n *\n * Uses edge-safe imports to avoid WASM in Edge Runtime\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\n// Use wrapper for EdgeAgentDetector to match expected interface\nimport { EdgeAgentDetectorWrapper as AgentDetector } from './edge-detector-wrapper';\n// Import WASM-enhanced detector as an alternative\nimport { EdgeAgentDetectorWrapperWithWasm as WasmAgentDetector } from './edge-detector-with-wasm';\nimport { EdgeSessionTracker } from './session-tracker';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n // Use WASM-enhanced detector if enableWasm is true, otherwise use pattern-only detector\n const detector = config.enableWasm \n ? new WasmAgentDetector({ enableWasm: true })\n : new AgentDetector(config);\n\n // Initialize session tracker if enabled (or if WASM is enabled)\n const sessionTracker =\n config.sessionTracking?.enabled || config.enableWasm\n ? new EdgeSessionTracker({\n enabled: true,\n ...config.sessionTracking,\n })\n : null;\n\n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Check for existing session first\n const existingSession = sessionTracker\n ? await sessionTracker.check(request)\n : null;\n\n if (existingSession) {\n // This is a continued AI agent session\n const response = NextResponse.next();\n\n // Set headers to indicate continued session\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set('x-agentshield-agent', existingSession.agent);\n response.headers.set(\n 'x-agentshield-confidence',\n existingSession.confidence.toString()\n );\n response.headers.set('x-agentshield-session', 'continued');\n response.headers.set('x-agentshield-session-id', existingSession.id);\n\n // Mark request with session info\n (request as any).agentShield = {\n result: {\n isAgent: true,\n confidence: existingSession.confidence,\n detectedAgent: { name: existingSession.agent },\n timestamp: new Date(),\n verificationMethod: 'session',\n },\n session: existingSession,\n skipped: false,\n };\n\n // Emit session continued event\n const context = {\n userAgent: request.headers.get('user-agent') || '',\n ipAddress:\n (request.ip ?? request.headers.get('x-forwarded-for')) || '',\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n detector.emit('agent.session.continued', existingSession, context);\n\n return response;\n }\n\n // Prepare request context for new detection\n const userAgent = request.headers.get('user-agent');\n const ipAddress = request.ip ?? request.headers.get('x-forwarded-for');\n\n // Extract path from URL for signature verification\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, // Use path instead of full URL for signature verification\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n\n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n let response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n // Add agent name if detected\n if (result.detectedAgent?.name) {\n response.headers.set('x-agentshield-agent', result.detectedAgent.name);\n }\n\n // Track new AI agent sessions\n if (\n sessionTracker &&\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n response = await sessionTracker.track(request, response, result);\n response.headers.set('x-agentshield-session', 'new');\n\n // Emit new session event\n detector.emit('agent.session.started', result, context);\n }\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * Enhanced middleware creator for Edge Runtime\n * Uses EdgeAgentDetector which doesn't require WASM\n */\n\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { createAgentShieldMiddleware as createBaseMiddleware } from './middleware';\nimport type { NextJSMiddlewareConfig } from './types';\n\nlet middlewareInstance: any = null;\nlet isInitializing = false;\nlet initPromise: Promise<any> | null = null;\n\n/**\n * Create an AgentShield middleware with automatic WASM initialization\n * This version handles initialization internally to avoid top-level await\n */\nexport function createAgentShieldMiddleware(config: NextJSMiddlewareConfig) {\n return async function agentShieldMiddleware(\n request: NextRequest\n ): Promise<NextResponse> {\n // Initialize middleware on first request (no WASM needed in Edge Runtime)\n if (!middlewareInstance) {\n if (!isInitializing) {\n isInitializing = true;\n initPromise = (async () => {\n // No WASM initialization needed - EdgeAgentDetector works without it\n\n // Create the actual middleware instance\n middlewareInstance = createBaseMiddleware(config);\n return middlewareInstance;\n })();\n }\n\n // Wait for initialization to complete\n if (initPromise) {\n middlewareInstance = await initPromise;\n }\n }\n\n // Run the middleware\n return middlewareInstance\n ? middlewareInstance(request)\n : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };\n","/**\n * @fileoverview AgentShield Next.js Integration\n * @version 0.1.0\n * @license MIT OR Apache-2.0\n */\n\n// Export the enhanced middleware that handles initialization internally\nexport {\n createAgentShieldMiddleware,\n createMiddleware,\n} from './create-middleware';\n\n// Also export original middleware for advanced users\nexport { createAgentShieldMiddleware as createAgentShieldMiddlewareBase } from './middleware';\n\n// Export session tracking utilities\nexport { EdgeSessionTracker, StatelessSessionChecker } from './session-tracker';\nexport type { SessionData, SessionTrackingConfig } from './session-tracker';\n\nexport * from './types';\n// Hooks are not exported from main entry - they're client-only\n// If someone needs hooks, they should import from '@kya-os/agentshield-nextjs/hooks'\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n"]}
1
+ {"version":3,"sources":["../src/signature-verifier.ts","../src/edge-detector-wrapper.ts","../src/wasm-loader.ts","../src/edge-detector-with-wasm.ts","../src/session-tracker.ts","../src/middleware.ts","../src/create-middleware.ts","../src/wasm-confidence.ts","../src/storage/memory-adapter.ts","../src/storage/redis-adapter.ts","../src/storage/index.ts","../src/enhanced-middleware.ts","../src/index.ts"],"names":["now","response","AI_AGENT_PATTERNS","CLOUD_PROVIDERS","NextResponse","context","initPromise","createAgentShieldMiddleware"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Ed25519 Signature Verification for HTTP Message Signatures\n * Implements proper cryptographic verification for ChatGPT and other agents\n * \n * Based on RFC 9421 (HTTP Message Signatures) and ChatGPT's implementation\n * Reference: https://help.openai.com/en/articles/9785974-chatgpt-user-allowlisting\n */\n\n/**\n * Known public keys for AI agents\n */\nconst KNOWN_KEYS = {\n chatgpt: [\n {\n kid: 'otMqcjr17mGyruktGvJU8oojQTSMHlVm7uO-lrcqbdg',\n // ChatGPT's current Ed25519 public key (base64)\n publicKey: '7F_3jDlxaquwh291MiACkcS3Opq88NksyHiakzS-Y1g',\n validFrom: new Date('2025-01-01').getTime() / 1000,\n validUntil: new Date('2025-04-11').getTime() / 1000,\n },\n ],\n};\n\n/**\n * Parse the Signature-Input header according to RFC 9421\n */\nfunction parseSignatureInput(signatureInput: string): {\n keyid: string;\n created?: number | undefined;\n expires?: number | undefined;\n signedHeaders: string[];\n} | null {\n try {\n // Example: sig1=(\"@method\" \"@path\" \"@authority\" \"date\");keyid=\"...\";created=1234567890\n const match = signatureInput.match(/sig1=\\((.*?)\\);(.+)/);\n if (!match) return null;\n\n const [, headersList, params] = match;\n \n // Parse signed headers\n const signedHeaders = headersList\n ? headersList\n .split(' ')\n .map(h => h.replace(/\"/g, '').trim())\n .filter(h => h.length > 0)\n : [];\n\n // Parse parameters\n const keyidMatch = params ? params.match(/keyid=\"([^\"]+)\"/) : null;\n const createdMatch = params ? params.match(/created=(\\d+)/) : null;\n const expiresMatch = params ? params.match(/expires=(\\d+)/) : null;\n\n if (!keyidMatch || !keyidMatch[1]) return null;\n\n return {\n keyid: keyidMatch[1],\n created: createdMatch && createdMatch[1] ? parseInt(createdMatch[1]) : undefined,\n expires: expiresMatch && expiresMatch[1] ? parseInt(expiresMatch[1]) : undefined,\n signedHeaders,\n };\n } catch (error) {\n console.error('[Signature] Failed to parse Signature-Input:', error);\n return null;\n }\n}\n\n/**\n * Build the signature base string according to RFC 9421\n * This is what gets signed\n */\nfunction buildSignatureBase(\n method: string,\n path: string,\n headers: Record<string, string>,\n signedHeaders: string[]\n): string {\n const components: string[] = [];\n \n for (const headerName of signedHeaders) {\n let value: string;\n \n switch (headerName) {\n case '@method':\n value = method.toUpperCase();\n break;\n case '@path':\n value = path;\n break;\n case '@authority':\n // Get from Host header or URL\n value = headers['host'] || headers['Host'] || '';\n break;\n default:\n // Regular headers (case-insensitive lookup)\n const key = Object.keys(headers).find(\n k => k.toLowerCase() === headerName.toLowerCase()\n );\n value = key ? headers[key] || '' : '';\n break;\n }\n \n // Format according to RFC 9421\n components.push(`\"${headerName}\": ${value}`);\n }\n \n return components.join('\\n');\n}\n\n/**\n * Verify Ed25519 signature using Web Crypto API\n */\nasync function verifyEd25519Signature(\n publicKeyBase64: string,\n signatureBase64: string,\n message: string\n): Promise<boolean> {\n try {\n // Decode base64 to Uint8Array\n const publicKeyBytes = Uint8Array.from(atob(publicKeyBase64), c => c.charCodeAt(0));\n const signatureBytes = Uint8Array.from(atob(signatureBase64), c => c.charCodeAt(0));\n const messageBytes = new TextEncoder().encode(message);\n \n // Check key and signature lengths\n if (publicKeyBytes.length !== 32) {\n console.error('[Signature] Invalid public key length:', publicKeyBytes.length);\n return false;\n }\n if (signatureBytes.length !== 64) {\n console.error('[Signature] Invalid signature length:', signatureBytes.length);\n return false;\n }\n \n // Import the public key\n const publicKey = await crypto.subtle.importKey(\n 'raw',\n publicKeyBytes,\n {\n name: 'Ed25519',\n namedCurve: 'Ed25519',\n },\n false,\n ['verify']\n );\n \n // Verify the signature\n const isValid = await crypto.subtle.verify(\n 'Ed25519',\n publicKey,\n signatureBytes,\n messageBytes\n );\n \n return isValid;\n } catch (error) {\n console.error('[Signature] Ed25519 verification failed:', error);\n \n // Fallback: Try with @noble/ed25519 if available (for environments without Ed25519 support)\n if (typeof window === 'undefined') {\n try {\n // In Node.js/Edge Runtime, we might need to use a polyfill\n // For now, we'll return false if Web Crypto doesn't support Ed25519\n console.warn('[Signature] Ed25519 not supported in this environment');\n return false;\n } catch {\n return false;\n }\n }\n \n return false;\n }\n}\n\n/**\n * Signature verification result\n */\nexport interface SignatureVerificationResult {\n isValid: boolean;\n agent?: string;\n keyid?: string;\n confidence: number;\n reason?: string;\n verificationMethod: 'signature' | 'none';\n}\n\n/**\n * Verify HTTP Message Signature for AI agents\n */\nexport async function verifyAgentSignature(\n method: string,\n path: string,\n headers: Record<string, string>\n): Promise<SignatureVerificationResult> {\n // Check for signature headers\n const signature = headers['signature'] || headers['Signature'];\n const signatureInput = headers['signature-input'] || headers['Signature-Input'];\n const signatureAgent = headers['signature-agent'] || headers['Signature-Agent'];\n \n // No signature present\n if (!signature || !signatureInput) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'No signature headers present',\n verificationMethod: 'none',\n };\n }\n \n // Parse Signature-Input header\n const parsed = parseSignatureInput(signatureInput);\n if (!parsed) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Invalid Signature-Input header',\n verificationMethod: 'none',\n };\n }\n \n // Check timestamp if present\n if (parsed.created) {\n const now = Math.floor(Date.now() / 1000);\n const age = now - parsed.created;\n \n // Reject signatures older than 5 minutes\n if (age > 300) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Signature expired (older than 5 minutes)',\n verificationMethod: 'none',\n };\n }\n \n // Reject signatures from the future (clock skew tolerance: 30 seconds)\n if (age < -30) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Signature timestamp is in the future',\n verificationMethod: 'none',\n };\n }\n }\n \n // Determine which agent based on signature-agent header\n let agent: string | undefined;\n let knownKeys: typeof KNOWN_KEYS.chatgpt | undefined;\n \n if (signatureAgent === '\"https://chatgpt.com\"' || signatureAgent?.includes('chatgpt.com')) {\n agent = 'ChatGPT';\n knownKeys = KNOWN_KEYS.chatgpt;\n }\n // Add other agents here as needed\n \n if (!agent || !knownKeys) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Unknown signature agent',\n verificationMethod: 'none',\n };\n }\n \n // Find the key by ID\n const key = knownKeys.find(k => k.kid === parsed.keyid);\n if (!key) {\n return {\n isValid: false,\n confidence: 0,\n reason: `Unknown key ID: ${parsed.keyid}`,\n verificationMethod: 'none',\n };\n }\n \n // Check key validity period\n const now = Math.floor(Date.now() / 1000);\n if (now < key.validFrom || now > key.validUntil) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Key is not valid at current time',\n verificationMethod: 'none',\n };\n }\n \n // Build the signature base string\n const signatureBase = buildSignatureBase(method, path, headers, parsed.signedHeaders);\n \n // Extract the actual signature value (remove \"sig1=:\" prefix and \"::\" suffix if present)\n let signatureValue = signature;\n if (signatureValue.startsWith('sig1=:')) {\n signatureValue = signatureValue.substring(6);\n }\n if (signatureValue.endsWith(':')) {\n signatureValue = signatureValue.slice(0, -1);\n }\n \n // Verify the signature\n const isValid = await verifyEd25519Signature(\n key.publicKey,\n signatureValue,\n signatureBase\n );\n \n if (isValid) {\n return {\n isValid: true,\n agent,\n keyid: parsed.keyid,\n confidence: 1.0, // 100% confidence for valid signature\n verificationMethod: 'signature',\n };\n } else {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Signature verification failed',\n verificationMethod: 'none',\n };\n }\n}\n\n/**\n * Quick check if signature headers are present (for performance)\n */\nexport function hasSignatureHeaders(headers: Record<string, string>): boolean {\n return !!(\n (headers['signature'] || headers['Signature']) &&\n (headers['signature-input'] || headers['Signature-Input'])\n );\n}\n\n/**\n * Check if this is a ChatGPT signature based on headers\n */\nexport function isChatGPTSignature(headers: Record<string, string>): boolean {\n const signatureAgent = headers['signature-agent'] || headers['Signature-Agent'];\n return signatureAgent === '\"https://chatgpt.com\"' || (signatureAgent?.includes('chatgpt.com') || false);\n}","/**\n * Wrapper for EdgeAgentDetector to match AgentDetector interface\n * This allows the middleware to work with EdgeAgentDetector in Edge Runtime\n *\n * This is a self-contained implementation to avoid import resolution issues\n * Includes proper Ed25519 signature verification for ChatGPT and other agents\n */\n\ntype DetectionInput = {\n userAgent?: string;\n ip?: string;\n ipAddress?: string;\n headers?: Record<string, string>;\n url?: string;\n method?: string;\n timestamp?: Date;\n};\n\ntype DetectionResult = {\n isAgent: boolean;\n confidence: number;\n detectedAgent?: {\n type: string;\n name: string;\n };\n reasons: string[];\n verificationMethod?: string;\n forgeabilityRisk?: 'low' | 'medium' | 'high';\n timestamp: Date;\n};\n\ntype EventHandler = (...args: any[]) => void;\n\n// Import signature verifier\nimport { verifyAgentSignature, hasSignatureHeaders, isChatGPTSignature } from './signature-verifier';\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-ai/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity/i, type: 'perplexity', name: 'Perplexity' }, // Fallback\n { pattern: /bingbot/i, type: 'bing', name: 'Bing AI' },\n { pattern: /anthropic-ai/i, type: 'anthropic', name: 'Anthropic' },\n];\n\n// Known cloud provider IP ranges (simplified)\nconst CLOUD_PROVIDERS = {\n aws: ['54.', '52.', '35.', '18.', '3.'],\n gcp: ['35.', '34.', '104.', '107.', '108.'],\n azure: ['13.', '20.', '40.', '52.', '104.'],\n};\n\n/**\n * Self-contained EdgeAgentDetector implementation with proper signature verification\n */\nclass EdgeAgentDetector {\n async analyze(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;\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 with proper cryptographic verification\n if (hasSignatureHeaders(headers)) {\n try {\n // Verify the signature cryptographically\n const signatureResult = await verifyAgentSignature(\n input.method || 'GET',\n input.url || '/',\n headers\n );\n\n if (signatureResult.isValid) {\n // Valid cryptographic signature - highest confidence\n confidence = signatureResult.confidence;\n reasons.push(`verified_signature:${signatureResult.agent?.toLowerCase() || 'unknown'}`);\n if (signatureResult.agent) {\n detectedAgent = { \n type: signatureResult.agent.toLowerCase(), \n name: signatureResult.agent \n };\n }\n verificationMethod = signatureResult.verificationMethod;\n \n // Add keyid to reasons for debugging\n if (signatureResult.keyid) {\n reasons.push(`keyid:${signatureResult.keyid}`);\n }\n } else {\n // Invalid signature - suspicious\n confidence = Math.max(confidence, 0.3);\n reasons.push('invalid_signature');\n if (signatureResult.reason) {\n reasons.push(`signature_error:${signatureResult.reason}`);\n }\n \n // Still check if it claims to be ChatGPT\n if (isChatGPTSignature(headers)) {\n reasons.push('claims_chatgpt');\n detectedAgent = { type: 'chatgpt', name: 'ChatGPT (unverified)' };\n }\n }\n } catch (error) {\n // Error during verification\n console.error('[EdgeAgentDetector] Signature verification error:', error);\n confidence = Math.max(confidence, 0.2);\n reasons.push('signature_verification_error');\n }\n }\n\n // Check User-Agent patterns\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n for (const { pattern, type, name } of AI_AGENT_PATTERNS) {\n if (pattern.test(userAgent)) {\n // Give higher confidence to well-known AI agents that properly identify themselves\n const highConfidenceAgents = [\n 'chatgpt',\n 'claude',\n 'perplexity',\n 'anthropic',\n ];\n const patternConfidence = highConfidenceAgents.includes(type)\n ? 0.85\n : 0.5;\n\n confidence = Math.max(confidence, patternConfidence);\n reasons.push(`known_pattern:${type}`);\n if (!detectedAgent) {\n detectedAgent = { type, name };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers\n const aiHeaders = [\n 'openai-conversation-id',\n 'openai-ephemeral-user-id',\n 'anthropic-client-id',\n 'x-goog-api-client',\n 'x-ms-copilot-id',\n ];\n\n const foundAiHeaders = aiHeaders.filter(\n header => normalizedHeaders[header]\n );\n if (foundAiHeaders.length > 0) {\n confidence = Math.max(confidence, 0.6);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs\n const ip = input.ip || input.ipAddress;\n if (\n ip &&\n !normalizedHeaders['x-forwarded-for'] &&\n !normalizedHeaders['x-real-ip']\n ) {\n for (const [provider, prefixes] of Object.entries(CLOUD_PROVIDERS)) {\n if (prefixes.some(prefix => ip.startsWith(prefix))) {\n confidence = Math.max(confidence, 0.4);\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n\n // Boost confidence for combinations (but not if already at 1.0 from signature)\n if (reasons.length > 2 && confidence < 1.0) {\n confidence = Math.min(confidence * 1.2, 0.95);\n }\n\n return {\n isAgent: confidence > 0.3,\n confidence,\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && { verificationMethod }),\n forgeabilityRisk: verificationMethod === 'signature' ? 'low' : (confidence > 0.8 ? 'medium' : 'high'),\n timestamp: new Date(),\n };\n }\n}\n\n/**\n * Wrapper that provides event emitter functionality\n */\nexport class EdgeAgentDetectorWrapper {\n private detector: EdgeAgentDetector;\n private events: Map<string, EventHandler[]> = new Map();\n\n constructor(_config?: any) {\n // Config is accepted but not used by EdgeAgentDetector\n this.detector = new EdgeAgentDetector();\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: any[]): void {\n const handlers = this.events.get(event) || [];\n handlers.forEach(handler => handler(...args));\n }\n\n async init(): Promise<void> {\n // EdgeAgentDetector doesn't need initialization\n return;\n }\n}\n","/**\n * WASM Loader for AgentShield in Edge Runtime\n * Handles loading and initialization of WebAssembly module\n */\n\n// Dynamic WASM loading - no direct imports to avoid build issues\nlet wasmInstance: WebAssembly.Instance | null = null;\nlet wasmExports: any = 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/**\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 // Try streaming compilation first (most efficient)\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n const response = await fetch(WASM_PATH);\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(\n streamResponse,\n {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n console.log('WASM:', ptr, len);\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n }\n }\n }\n );\n \n wasmInstance = instance;\n wasmExports = instance.exports;\n \n console.log('[AgentShield] ✅ WASM module initialized with streaming');\n return;\n } catch (streamError) {\n console.log('[AgentShield] Streaming compilation failed, falling back to standard compilation');\n }\n }\n \n // Fallback to standard compilation if streaming not available\n const response = await fetch(WASM_PATH);\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 console.log('WASM:', ptr, len);\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;\n \n console.log('[AgentShield] ✅ WASM module initialized via fallback');\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 * Enhanced EdgeAgentDetector with WASM support\n * Provides both pattern-based and WASM-based detection\n */\n\nimport { detectAgentWithWasm, initWasm, isWasmAvailable } from './wasm-loader';\n\ntype DetectionInput = {\n userAgent?: string;\n ip?: string;\n ipAddress?: string;\n headers?: Record<string, string>;\n url?: string;\n method?: string;\n timestamp?: Date;\n};\n\ntype DetectionResult = {\n isAgent: boolean;\n confidence: number;\n detectedAgent?: {\n type: string;\n name: string;\n };\n reasons: string[];\n verificationMethod?: string;\n forgeabilityRisk?: 'low' | 'medium' | 'high';\n timestamp: Date;\n};\n\ntype EventHandler = (...args: any[]) => void;\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-ai/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// Known cloud provider IP ranges (simplified)\nconst CLOUD_PROVIDERS = {\n aws: ['54.', '52.', '35.', '18.', '3.'],\n gcp: ['35.', '34.', '104.', '107.', '108.'],\n azure: ['13.', '20.', '40.', '52.', '104.'],\n};\n\n/**\n * EdgeAgentDetector with WASM enhancement\n */\nexport class EdgeAgentDetectorWithWasm {\n private wasmEnabled: boolean = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(private enableWasm: boolean = true) {}\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 this.wasmEnabled = wasmAvailable;\n \n if (this.wasmEnabled) {\n console.log('[AgentShield] WASM detection enabled');\n } else {\n console.log('[AgentShield] 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;\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 = 0.85;\n reasons.push('signature_agent:chatgpt');\n detectedAgent = { type: 'chatgpt', name: 'ChatGPT' };\n verificationMethod = 'signature';\n } else if (signaturePresent) {\n confidence = Math.max(confidence, 0.4);\n reasons.push('signature_present');\n }\n\n // Check User-Agent patterns\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n for (const { pattern, type, name } of AI_AGENT_PATTERNS) {\n if (pattern.test(userAgent)) {\n const highConfidenceAgents = [\n 'chatgpt',\n 'claude',\n 'perplexity',\n 'anthropic',\n ];\n const patternConfidence = highConfidenceAgents.includes(type)\n ? 0.85\n : 0.5;\n\n confidence = Math.max(confidence, patternConfidence);\n reasons.push(`known_pattern:${type}`);\n if (!detectedAgent) {\n detectedAgent = { type, name };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers\n const aiHeaders = [\n 'openai-conversation-id',\n 'openai-ephemeral-user-id',\n 'anthropic-client-id',\n 'x-goog-api-client',\n 'x-ms-copilot-id',\n ];\n\n const foundAiHeaders = aiHeaders.filter(\n header => normalizedHeaders[header]\n );\n if (foundAiHeaders.length > 0) {\n confidence = Math.max(confidence, 0.6);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs\n const ip = input.ip || input.ipAddress;\n if (\n ip &&\n !normalizedHeaders['x-forwarded-for'] &&\n !normalizedHeaders['x-real-ip']\n ) {\n for (const [provider, prefixes] of Object.entries(CLOUD_PROVIDERS)) {\n if (prefixes.some(prefix => ip.startsWith(prefix))) {\n confidence = Math.max(confidence, 0.4);\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(confidence * 1.2, 0.95);\n }\n\n return {\n isAgent: confidence > 0.3,\n confidence,\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && { verificationMethod }),\n forgeabilityRisk: confidence > 0.8 ? '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 console.log('[AgentShield] Using WASM detection result');\n \n // Map WASM result to DetectionResult\n const detectedAgent = wasmResult.agent \n ? this.mapAgentName(wasmResult.agent)\n : undefined;\n\n return {\n isAgent: wasmResult.isAgent,\n confidence: wasmResult.confidence,\n ...(detectedAgent && { detectedAgent }),\n reasons: [`wasm:${wasmResult.verificationMethod}`],\n verificationMethod: wasmResult.verificationMethod,\n forgeabilityRisk: \n wasmResult.verificationMethod === 'signature' ? 'low' :\n wasmResult.confidence > 0.9 ? 'medium' : '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 >= 0.85) {\n patternResult.confidence = Math.min(0.95, patternResult.confidence + 0.1);\n patternResult.reasons.push('wasm_enhanced');\n if (!patternResult.verificationMethod) {\n patternResult.verificationMethod = 'wasm-enhanced';\n }\n }\n\n return patternResult;\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 }) {\n this.detector = new EdgeAgentDetectorWithWasm(config?.enableWasm ?? true);\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: any[]): 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 * Edge-compatible session tracking for AI agents\n * Uses cookie-based storage to work in Edge Runtime\n */\n\nimport type { NextRequest, NextResponse } from 'next/server';\nimport type { DetectionResult } from '@kya-os/agentshield';\n\nexport interface SessionData {\n id: string;\n agent: string;\n confidence: number;\n detectedAt: number;\n expires: number;\n}\n\nexport interface SessionTrackingConfig {\n enabled: boolean;\n cookieName?: string;\n cookieMaxAge?: number; // in seconds\n encryptionKey?: string;\n}\n\nexport class EdgeSessionTracker {\n private readonly config: Required<SessionTrackingConfig>;\n\n constructor(config: SessionTrackingConfig) {\n this.config = {\n enabled: config.enabled,\n cookieName: config.cookieName || '__agentshield_session',\n cookieMaxAge: config.cookieMaxAge || 3600, // 1 hour default\n encryptionKey:\n config.encryptionKey ||\n process.env.AGENTSHIELD_SECRET ||\n 'agentshield-default-key',\n };\n }\n\n /**\n * Track a new AI agent session\n */\n async track(\n _request: NextRequest,\n response: NextResponse,\n result: DetectionResult\n ): Promise<NextResponse> {\n try {\n if (!this.config.enabled || !result.isAgent) {\n return response;\n }\n\n const sessionData: SessionData = {\n id: crypto.randomUUID(),\n agent: result.detectedAgent?.name || 'unknown',\n confidence: result.confidence,\n detectedAt: Date.now(),\n expires: Date.now() + this.config.cookieMaxAge * 1000,\n };\n\n // Encrypt session data for security\n const encrypted = await this.encrypt(JSON.stringify(sessionData));\n\n // Set secure httpOnly cookie\n response.cookies.set(this.config.cookieName, encrypted, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: this.config.cookieMaxAge,\n path: '/',\n });\n\n return response;\n } catch (error) {\n // Fail gracefully - log error but don't break request\n if (process.env.DEBUG_AGENTSHIELD) {\n console.warn('AgentShield: Failed to track session:', error);\n }\n return response;\n }\n }\n\n /**\n * Check for existing AI agent session\n */\n async check(request: NextRequest): Promise<SessionData | null> {\n try {\n if (!this.config.enabled) {\n return null;\n }\n\n const cookie = request.cookies.get(this.config.cookieName);\n if (!cookie?.value) {\n return null;\n }\n\n // Decrypt and parse session data\n const decrypted = await this.decrypt(cookie.value);\n const session: SessionData = JSON.parse(decrypted);\n\n // Check if session is expired\n if (session.expires < Date.now()) {\n return null;\n }\n\n return session;\n } catch (error) {\n // Fail gracefully - invalid or corrupted session\n if (process.env.DEBUG_AGENTSHIELD) {\n console.warn('AgentShield: Failed to check session:', error);\n }\n return null;\n }\n }\n\n /**\n * Clear an existing session\n */\n clear(response: NextResponse): NextResponse {\n try {\n response.cookies.delete(this.config.cookieName);\n } catch (error) {\n // Fail gracefully\n if (process.env.DEBUG_AGENTSHIELD) {\n console.warn('AgentShield: Failed to clear session:', error);\n }\n }\n return response;\n }\n\n /**\n * Simple encryption using Web Crypto API (Edge-compatible)\n */\n private async encrypt(data: string): Promise<string> {\n try {\n // For Edge Runtime, use simple base64 encoding with obfuscation\n // In production, consider using Web Crypto API subtle.encrypt()\n const key = this.config.encryptionKey;\n const encoded = new TextEncoder().encode(data);\n\n // Simple XOR obfuscation\n const obfuscated = new Uint8Array(encoded.length);\n for (let i = 0; i < encoded.length; i++) {\n obfuscated[i] = (encoded[i] || 0) ^ key.charCodeAt(i % key.length);\n }\n\n // Convert to base64\n return btoa(\n Array.from(obfuscated, byte => String.fromCharCode(byte)).join('')\n );\n } catch (error) {\n // Fallback to simple base64 if encryption fails\n return btoa(data);\n }\n }\n\n /**\n * Simple decryption (Edge-compatible)\n */\n private async decrypt(data: string): Promise<string> {\n try {\n const key = this.config.encryptionKey;\n const decoded = Uint8Array.from(atob(data), c => c.charCodeAt(0));\n\n // Reverse XOR obfuscation\n const deobfuscated = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) {\n deobfuscated[i] = (decoded[i] || 0) ^ key.charCodeAt(i % key.length);\n }\n\n return new TextDecoder().decode(deobfuscated);\n } catch (error) {\n // Fallback to simple base64 if decryption fails\n return atob(data);\n }\n }\n}\n\n/**\n * Stateless session checker for non-Next.js environments (Express, etc.)\n * Uses a combination of headers to identify continued sessions\n */\nexport class StatelessSessionChecker {\n static check(headers: Record<string, string>): SessionData | null {\n try {\n // Check for session headers (set by previous response)\n const agent = headers['x-agentshield-session-agent'];\n const confidence = headers['x-agentshield-session-confidence'];\n const sessionId = headers['x-agentshield-session-id'];\n\n if (agent && confidence && sessionId) {\n return {\n id: sessionId,\n agent,\n confidence: parseFloat(confidence),\n detectedAt: Date.now(),\n expires: Date.now() + 3600000, // 1 hour\n };\n }\n\n // Check for cookie-based session (if cookies are parsed)\n const cookieHeader = headers['cookie'];\n if (cookieHeader && cookieHeader.includes('__agentshield_session=')) {\n // Simple cookie parsing\n const match = cookieHeader.match(/__agentshield_session=([^;]+)/);\n if (match && match[1]) {\n try {\n const decoded = atob(match[1]);\n return JSON.parse(decoded);\n } catch {\n // Invalid session data\n }\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n static setHeaders(response: any, session: SessionData): void {\n try {\n // Set session headers for stateless tracking\n if (response.setHeader) {\n response.setHeader('X-AgentShield-Session-Agent', session.agent);\n response.setHeader(\n 'X-AgentShield-Session-Confidence',\n session.confidence.toString()\n );\n response.setHeader('X-AgentShield-Session-Id', session.id);\n } else if (response.headers && response.headers.set) {\n response.headers.set('x-agentshield-session-agent', session.agent);\n response.headers.set(\n 'x-agentshield-session-confidence',\n session.confidence.toString()\n );\n response.headers.set('x-agentshield-session-id', session.id);\n }\n } catch {\n // Fail gracefully\n }\n }\n}\n","/**\n * Next.js middleware for AgentShield\n *\n * Uses edge-safe imports to avoid WASM in Edge Runtime\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\n// Use wrapper for EdgeAgentDetector to match expected interface\nimport { EdgeAgentDetectorWrapper as AgentDetector } from './edge-detector-wrapper';\n// Import WASM-enhanced detector as an alternative\nimport { EdgeAgentDetectorWrapperWithWasm as WasmAgentDetector } from './edge-detector-with-wasm';\nimport { EdgeSessionTracker } from './session-tracker';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n // Use WASM-enhanced detector if enableWasm is true, otherwise use pattern-only detector\n const detector = config.enableWasm \n ? new WasmAgentDetector({ enableWasm: true })\n : new AgentDetector(config);\n\n // Initialize session tracker if enabled (or if WASM is enabled)\n const sessionTracker =\n config.sessionTracking?.enabled || config.enableWasm\n ? new EdgeSessionTracker({\n enabled: true,\n ...config.sessionTracking,\n })\n : null;\n\n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Check for existing session first\n const existingSession = sessionTracker\n ? await sessionTracker.check(request)\n : null;\n\n if (existingSession) {\n // This is a continued AI agent session\n const response = NextResponse.next();\n\n // Set headers to indicate continued session\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set('x-agentshield-agent', existingSession.agent);\n response.headers.set(\n 'x-agentshield-confidence',\n existingSession.confidence.toString()\n );\n response.headers.set('x-agentshield-session', 'continued');\n response.headers.set('x-agentshield-session-id', existingSession.id);\n\n // Mark request with session info\n (request as any).agentShield = {\n result: {\n isAgent: true,\n confidence: existingSession.confidence,\n detectedAgent: { name: existingSession.agent },\n timestamp: new Date(),\n verificationMethod: 'session',\n },\n session: existingSession,\n skipped: false,\n };\n\n // Emit session continued event\n const context = {\n userAgent: request.headers.get('user-agent') || '',\n ipAddress:\n (request.ip ?? request.headers.get('x-forwarded-for')) || '',\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n detector.emit('agent.session.continued', existingSession, context);\n\n return response;\n }\n\n // Prepare request context for new detection\n const userAgent = request.headers.get('user-agent');\n const ipAddress = request.ip ?? request.headers.get('x-forwarded-for');\n\n // Extract path from URL for signature verification\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, // Use path instead of full URL for signature verification\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n\n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n let response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n // Add agent name if detected\n if (result.detectedAgent?.name) {\n response.headers.set('x-agentshield-agent', result.detectedAgent.name);\n }\n\n // Track new AI agent sessions\n if (\n sessionTracker &&\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n response = await sessionTracker.track(request, response, result);\n response.headers.set('x-agentshield-session', 'new');\n\n // Emit new session event\n detector.emit('agent.session.started', result, context);\n }\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * Enhanced middleware creator for Edge Runtime\n * Uses EdgeAgentDetector which doesn't require WASM\n */\n\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { createAgentShieldMiddleware as createBaseMiddleware } from './middleware';\nimport type { NextJSMiddlewareConfig } from './types';\n\nlet middlewareInstance: any = null;\nlet isInitializing = false;\nlet initPromise: Promise<any> | null = null;\n\n/**\n * Create an AgentShield middleware with automatic WASM initialization\n * This version handles initialization internally to avoid top-level await\n */\nexport function createAgentShieldMiddleware(config: NextJSMiddlewareConfig) {\n return async function agentShieldMiddleware(\n request: NextRequest\n ): Promise<NextResponse> {\n // Initialize middleware on first request (no WASM needed in Edge Runtime)\n if (!middlewareInstance) {\n if (!isInitializing) {\n isInitializing = true;\n initPromise = (async () => {\n // No WASM initialization needed - EdgeAgentDetector works without it\n\n // Create the actual middleware instance\n middlewareInstance = createBaseMiddleware(config);\n return middlewareInstance;\n })();\n }\n\n // Wait for initialization to complete\n if (initPromise) {\n middlewareInstance = await initPromise;\n }\n }\n\n // Run the middleware\n return middlewareInstance\n ? middlewareInstance(request)\n : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };\n","/**\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 // Try to instantiate a minimal WASM module\n const wasmCode = new Uint8Array([\n 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00,\n ]);\n \n const module = await WebAssembly.compile(wasmCode);\n await WebAssembly.instantiate(module);\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 (>= 0.85)\n return confidence >= 0.85 && confidence < 1.0;\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 1.0;\n }\n \n // For high-confidence pattern detection, boost to 95%\n if (baseConfidence >= 0.85) {\n return 0.95;\n }\n \n // For medium-high confidence, apply smaller boost\n if (baseConfidence >= 0.7) {\n return Math.min(baseConfidence * 1.1, 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 * 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\ninterface 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\n .sort((a, b) => Date.parse(b.lastSeen) - Date.parse(a.lastSeen))\n .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(\n this.timelineKey(),\n 0,\n Math.floor(cutoff / 1000)\n );\n \n // Sessions will expire automatically with TTL\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';\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-ignore - 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 return new RedisStorageAdapter(redis as any, config.ttl);\n } catch (error) {\n console.warn('[AgentShield] Failed to initialize Redis storage, falling back to memory:', error);\n return new MemoryStorageAdapter();\n }\n }\n \n // Default to memory storage\n return new MemoryStorageAdapter();\n}","/**\n * Enhanced Next.js middleware with all features built-in\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { EdgeAgentDetectorWrapperWithWasm as WasmAgentDetector } from './edge-detector-with-wasm';\nimport { EdgeAgentDetectorWrapper as AgentDetector } from './edge-detector-wrapper';\nimport { \n checkWasmAvailability, \n getWasmConfidenceBoost, \n getVerificationMethod,\n shouldIndicateWasmVerification \n} from './wasm-confidence';\nimport { createStorageAdapter } from './storage';\nimport type { \n StorageAdapter, \n StorageConfig, \n AgentDetectionEvent\n} from './storage/types';\nimport type { DetectionResult } from '@kya-os/agentshield';\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: any) => 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 \n ? `${windowKey}:${now}` \n : `${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 // Check WASM availability on startup\n let wasmAvailable = false;\n checkWasmAvailability().then(available => {\n wasmAvailable = available;\n if (available) {\n console.log('[AgentShield] ✅ WASM support detected - enhanced detection enabled');\n }\n });\n \n // Initialize detector (WASM-first with automatic fallback)\n const detector = wasmAvailable \n ? new WasmAgentDetector({ enableWasm: true })\n : new AgentDetector({});\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\n const result = await detector.analyze(context);\n \n // Apply WASM confidence boost if applicable\n let finalConfidence = result.confidence;\n let verificationMethod = result.verificationMethod || 'pattern';\n \n if (result.isAgent) {\n const reasons = (result as any).reasons || [];\n \n if (shouldIndicateWasmVerification(result.confidence)) {\n finalConfidence = getWasmConfidenceBoost(result.confidence, reasons);\n verificationMethod = 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(ipAddress || undefined, userAgent || undefined);\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 as any).reasons || [],\n verificationMethod,\n detectionDetails: {\n patterns: (result.detectedAgent as any)?.patterns,\n behaviors: (result.detectedAgent as any)?.behaviors,\n fingerprintMatches: (result.detectedAgent as any)?.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('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 return response;\n }\n \n case 'log':\n console.log(`[AgentShield] 🤖 AI Agent detected (${verificationMethod}):`, {\n agent: result.detectedAgent?.name,\n confidence: `${(finalConfidence * 100).toFixed(0)}%`,\n path: pathWithQuery,\n verification: verificationMethod,\n });\n break;\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 { StorageAdapter, StorageConfig, AgentDetectionEvent, AgentSession } from './storage/types';","/**\n * @fileoverview AgentShield Next.js Integration\n * @version 0.1.0\n * @license MIT OR Apache-2.0\n */\n\n// Export the enhanced middleware that handles initialization internally\nexport {\n createAgentShieldMiddleware,\n createMiddleware,\n} from './create-middleware';\n\n// Export enhanced middleware with built-in features\nexport { \n createEnhancedAgentShieldMiddleware,\n type EnhancedMiddlewareConfig,\n type StorageAdapter,\n type StorageConfig,\n type AgentDetectionEvent,\n type AgentSession,\n} from './enhanced-middleware';\n\n// Also export original middleware for advanced users\nexport { createAgentShieldMiddleware as createAgentShieldMiddlewareBase } from './middleware';\n\n// Export session tracking utilities\nexport { EdgeSessionTracker, StatelessSessionChecker } from './session-tracker';\nexport type { SessionData, SessionTrackingConfig } from './session-tracker';\n\nexport * from './types';\n// Hooks are not exported from main entry - they're client-only\n// If someone needs hooks, they should import from '@kya-os/agentshield-nextjs/hooks'\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n"]}