@kya-os/agentshield-nextjs 0.1.47 → 0.2.0
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/.tsbuildinfo +1 -1
- package/dist/api-client.d.mts +8 -0
- package/dist/api-client.d.ts +8 -0
- package/dist/api-client.js +8 -2
- package/dist/api-client.js.map +1 -1
- package/dist/api-client.mjs +8 -2
- package/dist/api-client.mjs.map +1 -1
- package/dist/api-middleware.d.mts +8 -0
- package/dist/api-middleware.d.ts +8 -0
- package/dist/api-middleware.js +9 -2
- package/dist/api-middleware.js.map +1 -1
- package/dist/api-middleware.mjs +9 -2
- package/dist/api-middleware.mjs.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wasm-loader.ts","../src/edge-detector-with-wasm.ts","../src/wasm-confidence.ts","../src/signature-verifier.ts","../src/edge-detector-wrapper.ts","../src/middleware.ts","../src/session-tracker.ts","../src/create-middleware.ts","../src/edge-safe-detector.ts","../src/storage/memory-adapter.ts","../src/storage/redis-adapter.ts","../src/storage/index.ts","../src/enhanced-middleware.ts","../src/api-client.ts","../src/api-middleware.ts","../src/index.ts"],"names":["response","rules","loadRulesSync","baseUrl","now","context","initPromise","createAgentShieldMiddleware","agentShieldMiddleware","NextResponse","EdgeAgentDetectorWrapperWithWasm"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * WASM Loader for AgentShield in Edge Runtime\n * Handles loading and initialization of WebAssembly module\n *\n * IMPORTANT: wasm-bindgen Import Names Limitation\n * ================================================\n * The import function names (e.g., __wbg_log_1d3ae13c3d5e6b8e) are generated\n * by wasm-bindgen with hash suffixes that change with each WASM rebuild.\n * If the WASM module is rebuilt, these function names MUST be updated to match\n * the new exports from wasm-pack.\n *\n * To get the correct function names after a WASM rebuild:\n * 1. Run `wasm-pack build --target web` in the rust/crates/agentshield-wasm directory\n * 2. Check the generated `agentshield_wasm_bg.js` file for the actual export names\n * 3. Update the import object in this file to match\n *\n * TODO: Consider using the generated JS bindings from wasm-pack instead of\n * manually specifying imports, or add CI verification to catch mismatches.\n */\n\n// Dynamic WASM loading - no direct imports to avoid build issues\nlet wasmInstance: WebAssembly.Instance | null = null;\ninterface WasmExports {\n detect_agent: (ptr: number, len: number) => number;\n get_version: () => number;\n __wbindgen_malloc: (size: number) => number;\n __wbindgen_free: (ptr: number, size: number) => void;\n __wbindgen_realloc: (ptr: number, oldSize: number, newSize: number) => number;\n memory: WebAssembly.Memory;\n [key: string]: unknown;\n}\nlet wasmExports: WasmExports | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// Store the WASM module URL for runtime loading\nconst WASM_PATH = '/wasm/agentshield_wasm_bg.wasm';\n\n// Store base URL for constructing absolute URLs in Edge Runtime\nlet baseUrl: string | null = null;\n\n/**\n * Set the base URL for WASM loading (needed in Edge Runtime)\n */\nexport function setWasmBaseUrl(url: string) {\n baseUrl = url;\n}\n\n/**\n * Construct the full WASM URL based on context\n */\nfunction getWasmUrl(): string {\n // If we have a base URL (Edge Runtime), construct absolute URL\n if (baseUrl) {\n try {\n const url = new URL(baseUrl);\n // Use the origin to construct the full URL\n return `${url.origin}${WASM_PATH}`;\n } catch {\n // Fallback to relative path if URL construction fails\n return WASM_PATH;\n }\n }\n // Default to relative path\n return WASM_PATH;\n}\n\n/**\n * Initialize the WASM module\n * This is safe to call multiple times - it will only initialize once\n */\nexport async function initWasm(): Promise<boolean> {\n if (wasmExports) return true;\n if (initPromise) {\n await initPromise;\n return !!wasmExports;\n }\n\n initPromise = (async () => {\n try {\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000); // 3 second timeout\n\n try {\n const wasmUrl = getWasmUrl();\n\n // Try streaming compilation first (most efficient)\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n const response = await fetch(wasmUrl, { signal: controller.signal });\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.status}`);\n }\n\n // Clone response for streaming (in case we need to retry)\n const streamResponse = response.clone();\n\n // Use streaming compilation for best performance\n const { instance } = await WebAssembly.instantiateStreaming(streamResponse, {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('WASM:', ptr, len);\n }\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n },\n },\n });\n\n wasmInstance = instance;\n wasmExports = instance.exports as WasmExports;\n\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] ✅ WASM module initialized with streaming');\n }\n return;\n } catch (streamError) {\n // If not aborted, try fallback\n if (!controller.signal.aborted) {\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] Streaming compilation failed, falling back to standard compilation'\n );\n }\n } else {\n throw streamError;\n }\n }\n }\n\n // Fallback to standard compilation if streaming not available\n const response = await fetch(wasmUrl, { signal: controller.signal });\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.status}`);\n }\n\n const wasmArrayBuffer = await response.arrayBuffer();\n const compiledModule = await WebAssembly.compile(wasmArrayBuffer);\n\n const imports = {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('WASM:', ptr, len);\n }\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n },\n },\n };\n\n wasmInstance = await WebAssembly.instantiate(compiledModule, imports);\n wasmExports = wasmInstance.exports as WasmExports;\n\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] ✅ WASM module initialized via fallback');\n }\n } catch (fetchError: unknown) {\n const error = fetchError as { name?: string; message?: string };\n if (error.name === 'AbortError') {\n console.warn(\n '[AgentShield] WASM fetch timed out after 3 seconds - using pattern detection'\n );\n } else {\n console.warn(\n '[AgentShield] Failed to fetch WASM file:',\n error.message || 'Unknown error'\n );\n }\n wasmExports = null;\n }\n } catch (error) {\n console.error('[AgentShield] Failed to initialize WASM:', error);\n wasmExports = null;\n }\n })();\n\n await initPromise;\n return !!wasmExports;\n}\n\n/**\n * Detect agent using WASM\n * Returns null if WASM is not available\n */\nexport async function detectAgentWithWasm(\n userAgent: string | undefined,\n headers: Record<string, string>,\n ipAddress?: string\n): Promise<{\n isAgent: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: string;\n riskLevel: string;\n} | null> {\n // Ensure WASM is initialized\n const initialized = await initWasm();\n if (!initialized || !wasmExports) {\n return null;\n }\n\n try {\n // Note: The actual WASM exports will depend on how wasm-bindgen generates them\n // This is a simplified version - you may need to adjust based on actual exports\n\n // Prepare input for WASM\n const headersJson = JSON.stringify(headers);\n\n // Call WASM detection function (adjust function name based on actual exports)\n if (typeof wasmExports.detect_agent === 'function') {\n const result = wasmExports.detect_agent(\n userAgent || '',\n headersJson,\n ipAddress || '',\n new Date().toISOString()\n );\n\n // Parse result (format depends on WASM implementation)\n return {\n isAgent: result.is_agent || false,\n confidence: result.confidence || 0,\n agent: result.agent,\n verificationMethod: result.verification_method || 'wasm',\n riskLevel: result.risk_level || 'low',\n };\n }\n\n console.warn('[AgentShield] WASM exports do not include detect_agent function');\n return null;\n } catch (error) {\n console.error('[AgentShield] WASM detection failed:', error);\n return null;\n }\n}\n\n/**\n * Get WASM version\n */\nexport async function getWasmVersion(): Promise<string | null> {\n const initialized = await initWasm();\n if (!initialized || !wasmExports) {\n return null;\n }\n\n if (typeof wasmExports.version === 'function') {\n return wasmExports.version();\n }\n\n return 'unknown';\n}\n\n/**\n * Check if WASM is available and working\n */\nexport async function isWasmAvailable(): Promise<boolean> {\n try {\n const initialized = await initWasm();\n if (!initialized) return false;\n\n // Try to get version as a simple test\n const version = await getWasmVersion();\n return version !== null;\n } catch {\n return false;\n }\n}\n","/**\n * Enhanced EdgeAgentDetector with WASM support\n * Provides both pattern-based and WASM-based detection\n */\n\nimport { detectAgentWithWasm, initWasm, isWasmAvailable, setWasmBaseUrl } from './wasm-loader';\nimport {\n loadRulesSync,\n type DetectionRules,\n type DetectionResult,\n type DetectionInput,\n mapVerificationMethod,\n} from '@kya-os/agentshield-shared';\n\ntype EventHandler = (...args: unknown[]) => void;\n\n// Load centralized rules - this will fail fast if rules cannot be loaded\nconst rules: DetectionRules = loadRulesSync();\n\n/**\n * EdgeAgentDetector with WASM enhancement\n */\nexport class EdgeAgentDetectorWithWasm {\n private wasmEnabled: boolean = false;\n private initPromise: Promise<void> | null = null;\n private baseUrl: string | null = null;\n private rules: DetectionRules;\n\n constructor(private enableWasm: boolean = true) {\n this.rules = rules;\n }\n\n /**\n * Set the base URL for WASM loading in Edge Runtime\n */\n setBaseUrl(url: string) {\n this.baseUrl = url;\n setWasmBaseUrl(url);\n }\n\n /**\n * Initialize the detector (including WASM if enabled)\n */\n async init(): Promise<void> {\n if (!this.enableWasm) {\n this.wasmEnabled = false;\n return;\n }\n\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n\n this.initPromise = (async () => {\n try {\n // Try to initialize WASM\n const wasmAvailable = await isWasmAvailable();\n\n if (wasmAvailable) {\n // Set base URL if provided before initializing\n if (this.baseUrl) {\n setWasmBaseUrl(this.baseUrl);\n }\n await initWasm(); // Actually initialize WASM\n this.wasmEnabled = true;\n // WASM detection enabled\n } else {\n this.wasmEnabled = false;\n // WASM not available, using pattern detection\n }\n } catch (error) {\n console.error('[AgentShield] Failed to initialize WASM:', error);\n this.wasmEnabled = false;\n }\n })();\n\n await this.initPromise;\n }\n\n /**\n * Pattern-based detection (fallback)\n */\n private async patternDetection(input: DetectionInput): Promise<DetectionResult> {\n const reasons: string[] = [];\n let detectedAgent: { type: string; name: string } | undefined;\n let verificationMethod: string | undefined;\n let confidence = 0; // 0-100 scale\n\n const headers = input.headers || {};\n const normalizedHeaders: Record<string, string> = {};\n\n // Normalize header names to lowercase\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Check for HTTP Message Signatures (highest confidence)\n const signaturePresent = !!(\n normalizedHeaders['signature'] || normalizedHeaders['signature-input']\n );\n const signatureAgent = normalizedHeaders['signature-agent'];\n\n if (signatureAgent?.includes('chatgpt.com')) {\n confidence = 85; // High confidence for ChatGPT signature\n reasons.push('signature_agent:chatgpt');\n detectedAgent = { type: 'chatgpt', name: 'ChatGPT' };\n verificationMethod = 'signature';\n } else if (signaturePresent) {\n confidence = Math.max(confidence, 40); // Medium confidence for generic signature\n reasons.push('signature_present');\n }\n\n // Check User-Agent patterns using centralized rules\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n for (const [agentKey, agentRule] of Object.entries(this.rules.rules.userAgents)) {\n const matched = agentRule.patterns.some((pattern) => {\n const regex = new RegExp(pattern, 'i');\n return regex.test(userAgent);\n });\n\n if (matched) {\n const agentType = this.getAgentType(agentKey);\n const agentName = this.getAgentName(agentKey);\n\n confidence = Math.max(confidence, Math.round(agentRule.confidence * 0.85 * 100));\n reasons.push(`known_pattern:${agentType}`);\n if (!detectedAgent) {\n detectedAgent = { type: agentType, name: agentName };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers using centralized rules\n const suspiciousHeaders = this.rules.rules.headers.suspicious;\n const foundAiHeaders = suspiciousHeaders.filter(\n (headerRule) => normalizedHeaders[headerRule.name.toLowerCase()]\n );\n\n if (foundAiHeaders.length > 0) {\n const maxConfidence = Math.max(...foundAiHeaders.map((h) => h.confidence));\n confidence = Math.max(confidence, maxConfidence);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs using centralized rules\n const ip = input.ip || input.ipAddress;\n if (ip && !normalizedHeaders['x-forwarded-for'] && !normalizedHeaders['x-real-ip']) {\n // Handle both old (with providers) and new (direct) structures\n const ipRanges =\n 'providers' in this.rules.rules.ipRanges\n ? this.rules.rules.ipRanges.providers\n : this.rules.rules.ipRanges;\n\n for (const [provider, ipRule] of Object.entries(ipRanges)) {\n // Skip non-rule entries\n if (\n !ipRule ||\n typeof ipRule !== 'object' ||\n !('ranges' in ipRule) ||\n !Array.isArray(ipRule.ranges)\n )\n continue;\n\n const matched = ipRule.ranges.some((range: string) => {\n const prefix = range.split('/')[0];\n const prefixParts = prefix.split('.');\n const ipParts = ip.split('.');\n\n // Check if IP starts with the same octets\n for (let i = 0; i < Math.min(prefixParts.length - 1, 2); i++) {\n if (prefixParts[i] !== ipParts[i] && prefixParts[i] !== '0') {\n return false;\n }\n }\n return true;\n });\n\n if (matched) {\n confidence = Math.max(confidence, Math.round(ipRule.confidence * 0.4 * 100));\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n\n // Boost confidence for combinations\n if (reasons.length > 2) {\n confidence = Math.min(Math.round(confidence * 1.2), 95);\n }\n\n // Ensure confidence stays within 0-100 range\n confidence = Math.min(Math.max(confidence, 0), 100);\n\n return {\n isAgent: confidence > 30, // 30% threshold\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && {\n verificationMethod: mapVerificationMethod(verificationMethod),\n }),\n forgeabilityRisk: confidence > 80 ? 'medium' : 'high',\n timestamp: new Date(),\n };\n }\n\n /**\n * Analyze request with WASM enhancement when available\n */\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n // Ensure initialization\n await this.init();\n\n // Try WASM detection first if enabled\n if (this.wasmEnabled) {\n try {\n const wasmResult = await detectAgentWithWasm(\n input.userAgent || input.headers?.['user-agent'],\n input.headers || {},\n input.ip || input.ipAddress\n );\n\n if (wasmResult) {\n // WASM detection succeeded\n\n // Map WASM result to DetectionResult\n const detectedAgent = wasmResult.agent ? this.mapAgentName(wasmResult.agent) : undefined;\n\n return {\n isAgent: wasmResult.isAgent,\n confidence: wasmResult.confidence,\n detectionClass:\n wasmResult.isAgent && detectedAgent\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : wasmResult.isAgent\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons: [`wasm:${wasmResult.verificationMethod}`],\n verificationMethod: mapVerificationMethod(wasmResult.verificationMethod),\n forgeabilityRisk:\n wasmResult.verificationMethod === 'signature'\n ? 'low'\n : wasmResult.confidence > 90\n ? 'medium'\n : 'high',\n timestamp: new Date(),\n };\n }\n } catch (error) {\n console.error('[AgentShield] WASM detection error:', error);\n }\n }\n\n // Fall back to pattern detection\n const patternResult = await this.patternDetection(input);\n\n // If WASM is available but didn't detect anything, boost confidence slightly\n // to indicate WASM verification was performed\n if (this.wasmEnabled && patternResult.confidence >= 85) {\n patternResult.confidence = Math.min(95, patternResult.confidence + 10);\n patternResult.reasons.push('wasm_enhanced');\n // Note: Keep original verification method since 'wasm-enhanced' is not a valid type\n }\n\n return patternResult;\n }\n\n /**\n * Get agent type from rule key\n */\n private getAgentType(agentKey: string): string {\n const typeMap: Record<string, string> = {\n openai_gptbot: 'openai',\n anthropic_claude: 'anthropic',\n perplexity_bot: 'perplexity',\n google_ai: 'google',\n microsoft_ai: 'microsoft',\n meta_ai: 'meta',\n cohere_bot: 'cohere',\n huggingface_bot: 'huggingface',\n generic_bot: 'generic',\n dev_tools: 'dev',\n automation_tools: 'automation',\n };\n return typeMap[agentKey] || agentKey;\n }\n\n /**\n * Get agent name from rule key\n */\n private getAgentName(agentKey: string): string {\n const nameMap: Record<string, string> = {\n openai_gptbot: 'ChatGPT/GPTBot',\n anthropic_claude: 'Claude',\n perplexity_bot: 'Perplexity',\n google_ai: 'Google AI',\n microsoft_ai: 'Microsoft Copilot',\n meta_ai: 'Meta AI',\n cohere_bot: 'Cohere',\n huggingface_bot: 'HuggingFace',\n generic_bot: 'Generic Bot',\n dev_tools: 'Development Tool',\n automation_tools: 'Automation Tool',\n };\n return nameMap[agentKey] || agentKey;\n }\n\n /**\n * Map agent names from WASM to consistent format\n */\n private mapAgentName(agent: string): { type: string; name: string } | undefined {\n const lowerAgent = agent.toLowerCase();\n\n if (lowerAgent.includes('chatgpt')) {\n return { type: 'chatgpt', name: 'ChatGPT' };\n } else if (lowerAgent.includes('claude')) {\n return { type: 'claude', name: 'Claude' };\n } else if (lowerAgent.includes('perplexity')) {\n return { type: 'perplexity', name: 'Perplexity' };\n } else if (lowerAgent.includes('bing')) {\n return { type: 'bing', name: 'Bing AI' };\n } else if (lowerAgent.includes('anthropic')) {\n return { type: 'anthropic', name: 'Anthropic' };\n }\n\n return { type: 'unknown', name: agent };\n }\n}\n\n/**\n * Wrapper that provides event emitter functionality\n */\nexport class EdgeAgentDetectorWrapperWithWasm {\n private detector: EdgeAgentDetectorWithWasm;\n private events: Map<string, EventHandler[]> = new Map();\n\n constructor(config?: { enableWasm?: boolean; baseUrl?: string }) {\n this.detector = new EdgeAgentDetectorWithWasm(config?.enableWasm ?? true);\n if (config?.baseUrl) {\n this.detector.setBaseUrl(config.baseUrl);\n }\n }\n\n setBaseUrl(url: string) {\n this.detector.setBaseUrl(url);\n }\n\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n const result = await this.detector.analyze(input);\n\n // Emit events if there are listeners\n if (result.isAgent && this.events.has('agent.detected')) {\n const handlers = this.events.get('agent.detected') || [];\n handlers.forEach((handler) => handler(result, input));\n }\n\n return result;\n }\n\n on(event: string, handler: EventHandler): void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)!.push(handler);\n }\n\n emit(event: string, ...args: unknown[]): void {\n const handlers = this.events.get(event) || [];\n handlers.forEach((handler) => handler(...args));\n }\n\n async init(): Promise<void> {\n await this.detector.init();\n }\n}\n","/**\n * Internal WASM confidence enhancement logic\n * This was previously in the user's lib/agentshield-simple-wasm.ts\n */\n\n/**\n * Check if WASM is available in the current environment\n */\nexport async function checkWasmAvailability(): Promise<boolean> {\n try {\n // Check if WebAssembly is available\n if (typeof WebAssembly === 'undefined') {\n return false;\n }\n\n // In Edge Runtime, we can't use WebAssembly.compile()\n // Instead, just check for the presence of WebAssembly object\n // The actual WASM module will be loaded separately\n \n // Check for basic WebAssembly API availability\n if (!WebAssembly.instantiate || !WebAssembly.Module) {\n return false;\n }\n \n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Determine if WASM verification should be indicated\n * Based on the detection confidence level\n */\nexport function shouldIndicateWasmVerification(confidence: number): boolean {\n // WASM verification is indicated for pattern-based detections\n // that achieve high confidence (>= 85 on 0-100 scale)\n return confidence >= 85 && confidence < 100; // Updated to 0-100 scale\n}\n\n/**\n * Apply WASM confidence boost for enhanced detection\n */\nexport function getWasmConfidenceBoost(\n baseConfidence: number,\n reasons: string[] = []\n): number {\n // If signature verification succeeded, always return 100%\n if (reasons.some(r =>\n r.includes('signature_agent') &&\n !r.includes('signature_headers_present')\n )) {\n return 100; // Updated to 0-100 scale (was 1.0)\n }\n\n // For high-confidence pattern detection, boost to 95%\n if (baseConfidence >= 85) { // Updated to 0-100 scale (was 0.85)\n return 95; // Updated to 0-100 scale (was 0.95)\n }\n\n // For medium-high confidence, apply smaller boost\n if (baseConfidence >= 70) { // Updated to 0-100 scale (was 0.7)\n return Math.min(baseConfidence * 1.1, 90); // Updated to 0-100 scale (was 0.9)\n }\n\n // No boost for lower confidence\n return baseConfidence;\n}\n\n/**\n * Get verification method based on detection\n */\nexport function getVerificationMethod(\n confidence: number,\n reasons: string[] = []\n): string {\n // Check for signature verification\n if (reasons.some(r => \n r.includes('signature_agent') && \n !r.includes('signature_headers_present')\n )) {\n return 'signature';\n }\n \n // Check for WASM enhancement\n if (shouldIndicateWasmVerification(confidence)) {\n return 'wasm-enhanced';\n }\n \n // Default to pattern matching\n return 'pattern';\n}","/**\n * 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\nimport * as ed25519 from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha2.js';\n\n// Configure @noble/ed25519 to use sync SHA-512 from @noble/hashes\n// This works in all environments including Edge Runtime\ned25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));\n\n/**\n * Known public keys for AI agents (fallback)\n *\n * IMPORTANT: These keys are used as fallback when the API is unavailable.\n * The primary source of keys should be the /api/internal/signature-keys endpoint\n * which fetches from https://chatgpt.com/.well-known/http-message-signatures-directory\n *\n * TODO: Implement automated key rotation by:\n * 1. Setting up a cron job to fetch from OpenAI's well-known endpoint\n * 2. Storing keys in database/KV store with proper expiration handling\n * 3. Removing hardcoded fallback keys entirely\n */\nconst KNOWN_KEYS = {\n chatgpt: [\n {\n kid: 'otMqcjr17mGyruktGvJU8oojQTSMHlVm7uO-lrcqbdg',\n // ChatGPT's current Ed25519 public key (base64)\n // Source: https://chatgpt.com/.well-known/http-message-signatures-directory\n publicKey: '7F_3jDlxaquwh291MiACkcS3Opq88NksyHiakzS-Y1g',\n validFrom: 1735689600, // Jan 1, 2025 (from OpenAI's nbf)\n // Extended expiration as fallback safety - API fetch should provide fresh keys\n // Check OpenAI's well-known endpoint for actual expiration dates\n validUntil: 1799625600, // Jan 1, 2027 (extended for fallback safety)\n },\n ],\n};\n\n/**\n * In-memory cache for API-fetched keys\n */\ninterface CachedKeys {\n keys: Array<{\n kid: string;\n publicKey: string;\n validFrom: number;\n validUntil: number;\n }>;\n cachedAt: number;\n}\n\nconst keyCache = new Map<string, CachedKeys>();\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\nconst CACHE_MAX_SIZE = 100; // Maximum cache entries before cleanup\n\n/**\n * Get API base URL for fetching keys\n * Returns absolute URL for server-side, relative for browser\n */\nfunction getApiBaseUrl(): string {\n if (typeof window !== 'undefined') {\n // Browser: use relative path\n return '/api/internal';\n }\n\n // Server-side: must use absolute URL\n // Try environment variables first\n const baseUrl =\n process.env.NEXT_PUBLIC_APP_URL ||\n process.env.NEXT_PUBLIC_API_URL ||\n process.env.API_URL ||\n (process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : null);\n\n if (baseUrl) {\n return baseUrl.replace(/\\/$/, '') + '/api/internal';\n }\n\n // Fallback: try to construct from request context if available\n // For middleware/edge runtime, we may need to pass the request URL\n // For now, return relative path and log warning\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n '[Signature] No base URL configured for server-side fetch. Using localhost fallback.'\n );\n return 'http://localhost:3000/api/internal';\n }\n\n // Production fallback - should not reach here if properly configured\n console.error(\n '[Signature] CRITICAL: No base URL configured for server-side fetch in production!'\n );\n return '/api/internal'; // Will fail, but prevents silent success\n}\n\n/**\n * Clean up expired cache entries and enforce size limit\n * Called periodically to prevent unbounded memory growth\n * Uses LRU-style eviction: removes expired entries first, then oldest entries if still over limit\n */\nfunction cleanupExpiredCache(): void {\n const now = Date.now();\n const entriesToDelete: string[] = [];\n\n // First pass: remove expired entries\n for (const [agent, cached] of keyCache.entries()) {\n if (now - cached.cachedAt > CACHE_TTL_MS) {\n entriesToDelete.push(agent);\n }\n }\n\n for (const agent of entriesToDelete) {\n keyCache.delete(agent);\n }\n\n // Second pass: if still over limit, remove oldest entries (LRU eviction)\n if (keyCache.size > CACHE_MAX_SIZE) {\n // Convert entries to array with cachedAt timestamp for sorting\n const entries = Array.from(keyCache.entries()).map(([agent, cached]) => ({\n agent,\n cachedAt: cached.cachedAt,\n }));\n\n // Sort by cachedAt (oldest first)\n entries.sort((a, b) => a.cachedAt - b.cachedAt);\n\n // Remove oldest entries until we're under the limit\n const toRemove = entries.slice(0, keyCache.size - CACHE_MAX_SIZE);\n for (const entry of toRemove) {\n keyCache.delete(entry.agent);\n }\n }\n}\n\n/**\n * Fetch keys from API with caching\n */\nasync function fetchKeysFromApi(agent: string): Promise<Array<{\n kid: string;\n publicKey: string;\n validFrom: number;\n validUntil: number;\n}> | null> {\n // Periodic cleanup to prevent memory leaks\n if (keyCache.size > CACHE_MAX_SIZE) {\n cleanupExpiredCache();\n }\n\n // Check cache first\n const cached = keyCache.get(agent);\n if (cached && Date.now() - cached.cachedAt < CACHE_TTL_MS) {\n return cached.keys;\n }\n\n // Check if fetch is available (Edge Runtime compatibility)\n if (typeof fetch === 'undefined') {\n console.warn('[Signature] fetch() not available in this environment');\n return null;\n }\n\n try {\n const apiBaseUrl = getApiBaseUrl();\n const url = `${apiBaseUrl}/signature-keys?agent=${encodeURIComponent(agent)}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n // 5 second timeout\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n console.warn(`[Signature] Failed to fetch keys from API: ${response.status}`);\n return null;\n }\n\n const data = await response.json();\n\n if (!data.keys || !Array.isArray(data.keys) || data.keys.length === 0) {\n console.warn(`[Signature] No keys returned from API for agent: ${agent}`);\n return null;\n }\n\n // Cache the result\n keyCache.set(agent, {\n keys: data.keys,\n cachedAt: Date.now(),\n });\n\n return data.keys;\n } catch (error) {\n console.warn('[Signature] Error fetching keys from API, using fallback', {\n error: error instanceof Error ? error.message : 'Unknown error',\n agent,\n });\n return null;\n }\n}\n\n/**\n * Type guard to check if agent is a valid key in KNOWN_KEYS\n */\nfunction isValidAgent(agent: string): agent is keyof typeof KNOWN_KEYS {\n return agent in KNOWN_KEYS;\n}\n\n/**\n * Get keys for an agent (API first, then fallback)\n */\nasync function getKeysForAgent(agent: string): Promise<\n Array<{\n kid: string;\n publicKey: string;\n validFrom: number;\n validUntil: number;\n }>\n> {\n // Try API first\n const apiKeys = await fetchKeysFromApi(agent);\n if (apiKeys && apiKeys.length > 0) {\n return apiKeys;\n }\n\n // Fallback to hardcoded keys with type guard\n if (isValidAgent(agent)) {\n return KNOWN_KEYS[agent];\n }\n\n return [];\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((k) => k.toLowerCase() === headerName.toLowerCase());\n value = key ? headers[key] || '' : '';\n break;\n }\n }\n\n // Format according to RFC 9421\n components.push(`\"${headerName}\": ${value}`);\n }\n\n return components.join('\\n');\n}\n\n/**\n * Decode base64 (handles both standard and URL-safe variants)\n * URL-safe base64 uses - instead of + and _ instead of /\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n // Convert URL-safe base64 to standard base64\n let standardBase64 = base64.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if needed\n const padding = standardBase64.length % 4;\n if (padding) {\n standardBase64 += '='.repeat(4 - padding);\n }\n\n const binaryString = atob(standardBase64);\n return Uint8Array.from(binaryString, (c) => c.charCodeAt(0));\n}\n\n/**\n * Verify Ed25519 signature using @noble/ed25519 (works in all environments including Edge Runtime)\n * Falls back to Web Crypto API if available\n */\nasync function verifyEd25519Signature(\n publicKeyBase64: string,\n signatureBase64: string,\n message: string\n): Promise<boolean> {\n try {\n // Decode base64 to Uint8Array (handles URL-safe base64)\n const publicKeyBytes = base64ToBytes(publicKeyBase64);\n const signatureBytes = base64ToBytes(signatureBase64);\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 // Use @noble/ed25519 with sync SHA-512 - works in all environments including Edge Runtime\n return ed25519.verify(signatureBytes, messageBytes, publicKeyBytes);\n } catch (nobleError) {\n console.warn('[Signature] @noble/ed25519 failed, trying Web Crypto fallback:', nobleError);\n\n // Fallback to Web Crypto API (may not work in Edge Runtime)\n try {\n const publicKeyBytes = base64ToBytes(publicKeyBase64);\n const signatureBytes = base64ToBytes(signatureBase64);\n const messageBytes = new TextEncoder().encode(message);\n\n const publicKey = await crypto.subtle.importKey(\n 'raw',\n publicKeyBytes.buffer as ArrayBuffer,\n {\n name: 'Ed25519',\n namedCurve: 'Ed25519',\n },\n false,\n ['verify']\n );\n\n return await crypto.subtle.verify(\n 'Ed25519',\n publicKey,\n signatureBytes.buffer as ArrayBuffer,\n messageBytes\n );\n } catch (cryptoError) {\n console.error('[Signature] Both @noble/ed25519 and Web Crypto failed:', {\n nobleError: nobleError instanceof Error ? nobleError.message : 'Unknown',\n cryptoError: cryptoError instanceof Error ? cryptoError.message : 'Unknown',\n });\n return false;\n }\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 agentKey: string | undefined;\n\n if (signatureAgent === '\"https://chatgpt.com\"' || signatureAgent?.includes('chatgpt.com')) {\n agent = 'ChatGPT';\n agentKey = 'chatgpt';\n }\n // Add other agents here as needed\n\n if (!agent || !agentKey) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Unknown signature agent',\n verificationMethod: 'none',\n };\n }\n\n // Get keys (API first, then fallback)\n const knownKeys = await getKeysForAgent(agentKey);\n\n if (knownKeys.length === 0) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'No keys available for 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(key.publicKey, signatureValue, signatureBase);\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 * Uses secure URL parsing to prevent spoofing attacks\n */\nexport function isChatGPTSignature(headers: Record<string, string>): boolean {\n const signatureAgent = headers['signature-agent'] || headers['Signature-Agent'];\n\n if (!signatureAgent) {\n return false;\n }\n\n // Strip leading/trailing quotes if present\n const agentUrlStr = signatureAgent.replace(/^\"+|\"+$/g, '');\n\n // Exact match for the standard ChatGPT signature agent\n if (agentUrlStr === 'https://chatgpt.com') {\n return true;\n }\n\n // Parse URL and validate host to prevent spoofing\n try {\n const agentUrl = new URL(agentUrlStr);\n const allowedHosts = ['chatgpt.com', 'www.chatgpt.com'];\n return allowedHosts.includes(agentUrl.host);\n } catch {\n // Not a valid URL, return false for security\n return false;\n }\n}\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\n// Import the proper DetectionResult type from shared package\nimport type { DetectionResult } from '@kya-os/agentshield-shared';\n\ntype EventHandler = (...args: unknown[]) => void;\n\n// Import signature verifier\nimport {\n verifyAgentSignature,\n hasSignatureHeaders,\n isChatGPTSignature,\n} from './signature-verifier';\nimport {\n loadRulesSync,\n type DetectionRules,\n type UserAgentRule,\n type HeaderRule,\n type IpRangeRule,\n} from '@kya-os/agentshield-shared';\n\n// Load centralized rules - this will fail fast if rules cannot be loaded\nconst rules: DetectionRules = loadRulesSync();\n\n/**\n * Self-contained EdgeAgentDetector implementation with proper signature verification\n */\nclass EdgeAgentDetector {\n private rules: DetectionRules;\n\n constructor() {\n this.rules = rules;\n }\n\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 (convert 0-1 to 0-100)\n confidence = signatureResult.confidence * 100;\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 console.warn('[EdgeAgentDetector] Signature verification failed:', {\n reason: signatureResult.reason,\n agent: signatureResult.agent,\n hasSignatureAgent: !!headers['signature-agent'] || !!headers['Signature-Agent'],\n signatureAgentValue: headers['signature-agent'] || headers['Signature-Agent'],\n });\n confidence = Math.max(confidence, 30); // Updated to 0-100 scale (was 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, 20); // Updated to 0-100 scale (was 0.2)\n reasons.push('signature_verification_error');\n }\n }\n\n // Check User-Agent patterns using centralized rules\n // Sort rules to check more specific patterns first (generic_bot last)\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n const userAgentEntries = Object.entries(this.rules.rules.userAgents);\n // Sort: put generic_bot, dev_tools, automation_tools last since they have broad patterns\n const genericKeys = ['generic_bot', 'dev_tools', 'automation_tools'];\n const sortedEntries = userAgentEntries.sort((a, b) => {\n const aIsGeneric = genericKeys.includes(a[0]);\n const bIsGeneric = genericKeys.includes(b[0]);\n if (aIsGeneric && !bIsGeneric) return 1;\n if (!aIsGeneric && bIsGeneric) return -1;\n return 0;\n });\n\n for (const [agentKey, agentRule] of sortedEntries) {\n const rule = agentRule as UserAgentRule;\n const matched = rule.patterns.some((pattern: string) => {\n const regex = new RegExp(pattern, 'i');\n return regex.test(userAgent);\n });\n\n if (matched) {\n const agentType = this.getAgentType(agentKey);\n const agentName = this.getAgentName(agentKey);\n\n confidence = Math.max(confidence, rule.confidence * 100); // Convert 0-1 rule confidence to 0-100 scale\n reasons.push(`known_pattern:${agentType}`);\n if (!detectedAgent) {\n detectedAgent = { type: agentType, name: agentName };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers using centralized rules\n const suspiciousHeaders = this.rules.rules.headers.suspicious;\n const foundAiHeaders = suspiciousHeaders.filter(\n (headerRule: HeaderRule) => normalizedHeaders[headerRule.name.toLowerCase()]\n );\n\n if (foundAiHeaders.length > 0) {\n const maxConfidence = Math.max(...foundAiHeaders.map((h: HeaderRule) => h.confidence * 100)); // Convert 0-1 to 0-100\n confidence = Math.max(confidence, maxConfidence);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs using centralized rules\n const ip = input.ip || input.ipAddress;\n if (ip && !normalizedHeaders['x-forwarded-for'] && !normalizedHeaders['x-real-ip']) {\n // Handle both old (with providers) and new (direct) structures\n const ipRanges =\n 'providers' in this.rules.rules.ipRanges\n ? this.rules.rules.ipRanges.providers\n : this.rules.rules.ipRanges;\n\n for (const [provider, ipRule] of Object.entries(ipRanges)) {\n // Skip non-rule entries\n if (\n !ipRule ||\n typeof ipRule !== 'object' ||\n !('ranges' in ipRule) ||\n !Array.isArray(ipRule.ranges)\n )\n continue;\n\n const matched = ipRule.ranges.some((range: string) => {\n const prefix = range.split('/')[0];\n const prefixParts = prefix.split('.');\n const ipParts = ip.split('.');\n\n // Check if IP starts with the same octets\n for (let i = 0; i < Math.min(prefixParts.length - 1, 2); i++) {\n if (prefixParts[i] !== ipParts[i] && prefixParts[i] !== '0') {\n return false;\n }\n }\n return true;\n });\n\n if (matched) {\n const rule = ipRule as IpRangeRule;\n confidence = Math.max(confidence, rule.confidence * 40); // Convert 0-1 to 0-100 with 0.4 reduction factor\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n\n // Boost confidence for combinations (but not if already at 100 from signature)\n if (reasons.length > 2 && confidence < 100) {\n confidence = Math.min(confidence * 1.2, 95); // Cap at 95 to leave room for cryptographic verification\n }\n\n // Ensure confidence stays within 0-100 range\n confidence = Math.min(Math.max(confidence, 0), 100);\n\n return {\n isAgent: confidence > 30, // Updated to 0-100 scale (was 0.3)\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent // Updated to 0-100 scale\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30 // Updated to 0-100 scale\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && {\n verificationMethod: verificationMethod as\n | 'signature'\n | 'pattern'\n | 'behavioral'\n | 'network'\n | 'mcp_i_handshake'\n | 'none',\n }),\n forgeabilityRisk:\n verificationMethod === 'signature' ? 'low' : confidence > 80 ? 'medium' : 'high', // Updated to 0-100 scale\n timestamp: new Date(),\n };\n }\n\n /**\n * Get agent type from rule key\n */\n private getAgentType(agentKey: string): string {\n const typeMap: Record<string, string> = {\n openai_gptbot: 'openai',\n anthropic_claude: 'anthropic',\n perplexity_bot: 'perplexity',\n google_ai: 'google',\n microsoft_ai: 'microsoft',\n meta_ai: 'meta',\n cohere_bot: 'cohere',\n huggingface_bot: 'huggingface',\n generic_bot: 'generic',\n dev_tools: 'dev',\n automation_tools: 'automation',\n };\n return typeMap[agentKey] || agentKey;\n }\n\n /**\n * Get agent name from rule key\n */\n private getAgentName(agentKey: string): string {\n const nameMap: Record<string, string> = {\n openai_gptbot: 'ChatGPT/GPTBot',\n anthropic_claude: 'Claude',\n perplexity_bot: 'Perplexity',\n google_ai: 'Google AI',\n microsoft_ai: 'Microsoft Copilot',\n meta_ai: 'Meta AI',\n cohere_bot: 'Cohere',\n huggingface_bot: 'HuggingFace',\n generic_bot: 'Generic Bot',\n dev_tools: 'Development Tool',\n automation_tools: 'Automation Tool',\n };\n return nameMap[agentKey] || agentKey;\n }\n}\n\n/**\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?: unknown) {\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: unknown[]): 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 * 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, AgentShieldRequest } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(config: Partial<NextJSMiddlewareConfig> = {}) {\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 if (handler) {\n detector.on(event, handler as (...args: unknown[]) => void);\n }\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 AgentShieldRequest).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Check for existing session first\n const existingSession = sessionTracker ? await sessionTracker.check(request) : 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('x-agentshield-confidence', existingSession.confidence.toString());\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 AgentShieldRequest).agentShield = {\n result: {\n isAgent: true,\n confidence: existingSession.confidence,\n detectionClass: { type: 'AiAgent' },\n detectedAgent: {\n type: 'ai_agent',\n name: existingSession.agent,\n },\n timestamp: new Date(),\n verificationMethod: 'behavioral',\n reasons: ['Session continued'],\n signals: [],\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: (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 ?? 70) // Updated to 0-100 scale (was 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(([key, value]) => {\n response.headers.set(key, value);\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 // Use console.debug for development logging\n if (process.env.NODE_ENV !== 'production') {\n console.debug('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 }\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 ?? 70) // Updated to 0-100 scale (was 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 AgentShieldRequest).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('x-agentshield-confidence', result.confidence.toString());\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 ?? 70) // Updated to 0-100 scale (was 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 * 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-shared';\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 * 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\ntype MiddlewareFunction = (request: NextRequest) => Promise<NextResponse>;\n\nlet middlewareInstance: MiddlewareFunction | null = null;\nlet isInitializing = false;\nlet initPromise: Promise<MiddlewareFunction> | 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(request: NextRequest): 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 ? middlewareInstance(request) : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };\n","/**\n * Edge-safe detector that doesn't use WebAssembly\n * This is used in Edge Runtime where dynamic code evaluation is not allowed\n */\n\nimport type { DetectionResult, DetectionInput } from '@kya-os/agentshield-shared';\n\n// Known AI agent patterns\nconst AI_AGENT_PATTERNS = [\n { pattern: /chatgpt-user/i, type: 'chatgpt', name: 'ChatGPT' },\n { pattern: /claude-web/i, type: 'claude', name: 'Claude' },\n { pattern: /perplexitybot/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity-user/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /bingbot/i, type: 'bing', name: 'Bing AI' },\n { pattern: /anthropic-ai/i, type: 'anthropic', name: 'Anthropic' },\n];\n\n/**\n * Edge-safe pattern detection without WASM\n */\nexport class EdgeSafeDetector {\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n const reasons: string[] = [];\n let detectedAgent: { type: string; name: string } | undefined;\n let confidence = 0;\n\n const headers = input.headers || {};\n const normalizedHeaders: Record<string, string> = {};\n\n // Normalize header names to lowercase\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Check User-Agent patterns\n const userAgent = input.userAgent || normalizedHeaders['user-agent'] || '';\n if (userAgent) {\n for (const { pattern, type, name } of AI_AGENT_PATTERNS) {\n if (pattern.test(userAgent)) {\n confidence = 85; // Updated to 0-100 scale (was 0.85)\n reasons.push(`known_pattern:${type}`);\n detectedAgent = { type, name };\n break;\n }\n }\n }\n\n // Check for browser UA without browser headers (Perplexity pattern)\n const hasChrome = userAgent.toLowerCase().includes('chrome');\n const hasFirefox = userAgent.toLowerCase().includes('firefox');\n const hasSafari = userAgent.toLowerCase().includes('safari');\n const hasBrowserUA = hasChrome || hasFirefox || hasSafari;\n\n if (hasBrowserUA) {\n const hasSecChUa = !!normalizedHeaders['sec-ch-ua'];\n const hasSecFetch = !!normalizedHeaders['sec-fetch-site'];\n const hasAcceptLanguage = !!normalizedHeaders['accept-language'];\n const hasCookies = !!normalizedHeaders['cookie'];\n\n const missingHeaders = [];\n if (!hasSecChUa && hasChrome) missingHeaders.push('sec-ch-ua');\n if (!hasSecFetch) missingHeaders.push('sec-fetch');\n if (!hasAcceptLanguage) missingHeaders.push('accept-language');\n if (!hasCookies) missingHeaders.push('cookies');\n\n if (missingHeaders.length >= 2) {\n confidence = Math.max(confidence, 85); // Updated to 0-100 scale (was 0.85)\n reasons.push('browser_ua_missing_headers');\n if (!detectedAgent && hasChrome && !hasSecChUa) {\n detectedAgent = { type: 'perplexity', name: 'Perplexity' };\n }\n }\n }\n\n // Check for AI-specific headers\n const aiHeaders = ['openai-conversation-id', 'anthropic-client-id', 'x-goog-api-client'];\n\n const foundAiHeaders = aiHeaders.filter((h) => normalizedHeaders[h]);\n if (foundAiHeaders.length > 0) {\n confidence = Math.max(confidence, 60); // Updated to 0-100 scale (was 0.6)\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n return {\n isAgent: confidence > 30, // Updated to 0-100 scale (was 0.3)\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent // Updated to 0-100 scale\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30 // Updated to 0-100 scale\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n detectedAgent,\n reasons,\n verificationMethod: 'pattern',\n timestamp: new Date(),\n confidenceLevel: confidence >= 80 ? 'high' : confidence >= 50 ? 'medium' : 'low', // Updated to 0-100 scale\n };\n }\n}\n","/**\n * In-memory storage adapter for development/testing\n */\n\nimport type { StorageAdapter, AgentDetectionEvent, AgentSession } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private events: Map<string, AgentDetectionEvent> = new Map();\n private sessions: Map<string, AgentSession> = new Map();\n private eventTimeline: Array<{ timestamp: number; eventId: string }> = [];\n private maxEvents: number = 1000;\n private maxSessions: number = 100;\n\n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n const eventKey = `${event.timestamp}:${event.eventId}`;\n this.events.set(eventKey, event);\n \n // Add to timeline\n this.eventTimeline.push({\n timestamp: Date.parse(event.timestamp),\n eventId: eventKey,\n });\n \n // Sort timeline by timestamp\n this.eventTimeline.sort((a, b) => b.timestamp - a.timestamp);\n \n // Maintain size limit\n if (this.eventTimeline.length > this.maxEvents) {\n const removed = this.eventTimeline.splice(this.maxEvents);\n removed.forEach(item => this.events.delete(item.eventId));\n }\n }\n\n async getRecentEvents(limit: number = 100): Promise<AgentDetectionEvent[]> {\n const recent = this.eventTimeline.slice(0, limit);\n return recent\n .map(item => this.events.get(item.eventId))\n .filter((event): event is AgentDetectionEvent => event !== undefined);\n }\n\n async getSessionEvents(sessionId: string): Promise<AgentDetectionEvent[]> {\n const events: AgentDetectionEvent[] = [];\n for (const event of this.events.values()) {\n if (event.sessionId === sessionId) {\n events.push(event);\n }\n }\n return events.sort((a, b) => \n Date.parse(b.timestamp) - Date.parse(a.timestamp)\n );\n }\n\n async storeSession(session: AgentSession): Promise<void> {\n this.sessions.set(session.sessionId, session);\n \n // Maintain size limit\n if (this.sessions.size > this.maxSessions) {\n // Remove oldest sessions\n const sortedSessions = Array.from(this.sessions.entries())\n .sort((a, b) => Date.parse(b[1].lastSeen) - Date.parse(a[1].lastSeen));\n \n const toRemove = sortedSessions.slice(this.maxSessions);\n toRemove.forEach(([id]) => this.sessions.delete(id));\n }\n }\n\n async getSession(sessionId: string): Promise<AgentSession | null> {\n return this.sessions.get(sessionId) || null;\n }\n\n async getRecentSessions(limit: number = 10): Promise<AgentSession[]> {\n const sorted = Array.from(this.sessions.values())\n .sort((a, b) => Date.parse(b.lastSeen) - Date.parse(a.lastSeen));\n return sorted.slice(0, limit);\n }\n\n async cleanup(olderThan: Date): Promise<void> {\n const cutoff = olderThan.getTime();\n \n // Clean up events\n this.eventTimeline = this.eventTimeline.filter(item => {\n if (item.timestamp < cutoff) {\n this.events.delete(item.eventId);\n return false;\n }\n return true;\n });\n \n // Clean up sessions\n for (const [id, session] of this.sessions.entries()) {\n if (Date.parse(session.lastSeen) < cutoff) {\n this.sessions.delete(id);\n }\n }\n }\n}","/**\n * Redis storage adapter for production use\n */\n\nimport type { StorageAdapter, AgentDetectionEvent, AgentSession } from './types';\n\nexport interface RedisClient {\n get<T>(key: string): Promise<T | null>;\n set(key: string, value: string | number | Buffer): Promise<string | null>;\n setex(key: string, ttl: number, value: string | number | Buffer): Promise<string | null>;\n zadd(key: string, options: { score: number; member: string }): Promise<number | null>;\n zrange(key: string, start: number, stop: number): Promise<string[]>;\n zrevrange(key: string, start: number, stop: number): Promise<string[]>;\n zcard(key: string): Promise<number | null>;\n zremrangebyrank(key: string, start: number, stop: number): Promise<number | null>;\n del(key: string | string[]): Promise<number>;\n scan(cursor: number, options?: { match?: string; count?: number }): Promise<[string, string[]]>;\n}\n\nexport class RedisStorageAdapter implements StorageAdapter {\n private redis: RedisClient;\n private ttl: number;\n private keyPrefix: string = 'agent-shield';\n\n constructor(redis: RedisClient, ttl: number = 86400) {\n this.redis = redis;\n this.ttl = ttl;\n }\n\n private eventKey(timestamp: string, eventId: string): string {\n return `${this.keyPrefix}:events:${timestamp}:${eventId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `${this.keyPrefix}:sessions:${sessionId}`;\n }\n\n private timelineKey(): string {\n return `${this.keyPrefix}:events:timeline`;\n }\n\n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n const key = this.eventKey(event.timestamp, event.eventId);\n\n // Store the event with TTL\n await this.redis.setex(key, this.ttl, JSON.stringify(event));\n\n // Add to timeline sorted set\n await this.redis.zadd(this.timelineKey(), {\n score: Date.parse(event.timestamp),\n member: key,\n });\n\n // Maintain timeline size (keep last 1000 events)\n const count = await this.redis.zcard(this.timelineKey());\n if (count && count > 1000) {\n await this.redis.zremrangebyrank(this.timelineKey(), 0, -1001);\n }\n }\n\n async getRecentEvents(limit: number = 100): Promise<AgentDetectionEvent[]> {\n // Get most recent event keys from timeline\n const keys = await this.redis.zrevrange(this.timelineKey(), 0, limit - 1);\n\n if (!keys || keys.length === 0) {\n return [];\n }\n\n // Fetch events\n const events: AgentDetectionEvent[] = [];\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const event = typeof data === 'string' ? JSON.parse(data) : data;\n events.push(event as AgentDetectionEvent);\n } catch (e) {\n console.error(`Failed to parse event ${key}:`, e);\n }\n }\n }\n\n return events;\n }\n\n async getSessionEvents(sessionId: string): Promise<AgentDetectionEvent[]> {\n // Get all event keys from timeline\n const keys = await this.redis.zrevrange(this.timelineKey(), 0, -1);\n\n if (!keys || keys.length === 0) {\n return [];\n }\n\n // Fetch and filter events\n const events: AgentDetectionEvent[] = [];\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const event = typeof data === 'string' ? JSON.parse(data) : data;\n if ((event as AgentDetectionEvent).sessionId === sessionId) {\n events.push(event as AgentDetectionEvent);\n }\n } catch (e) {\n console.error(`Failed to parse event ${key}:`, e);\n }\n }\n }\n\n return events;\n }\n\n async storeSession(session: AgentSession): Promise<void> {\n const key = this.sessionKey(session.sessionId);\n\n // Check if session exists\n const existing = await this.redis.get<string>(key);\n\n if (existing) {\n // Update existing session\n const existingSession = typeof existing === 'string' ? JSON.parse(existing) : existing;\n const methods = new Set([\n ...(existingSession.verificationMethods || []),\n ...session.verificationMethods,\n ]);\n\n const updatedSession: AgentSession = {\n ...existingSession,\n lastSeen: session.lastSeen,\n eventCount: session.eventCount,\n paths: Array.from(new Set([...existingSession.paths, ...session.paths])),\n averageConfidence: session.averageConfidence,\n verificationMethods: Array.from(methods),\n };\n\n await this.redis.setex(key, this.ttl, JSON.stringify(updatedSession));\n } else {\n // Store new session\n await this.redis.setex(key, this.ttl, JSON.stringify(session));\n }\n }\n\n async getSession(sessionId: string): Promise<AgentSession | null> {\n const key = this.sessionKey(sessionId);\n const data = await this.redis.get<string>(key);\n\n if (!data) {\n return null;\n }\n\n try {\n return typeof data === 'string' ? JSON.parse(data) : data;\n } catch (e) {\n console.error(`Failed to parse session ${sessionId}:`, e);\n return null;\n }\n }\n\n async getRecentSessions(limit: number = 10): Promise<AgentSession[]> {\n // Scan for session keys\n const pattern = `${this.keyPrefix}:sessions:*`;\n const sessions: AgentSession[] = [];\n let cursor = 0;\n\n do {\n const [nextCursor, keys] = await this.redis.scan(cursor, {\n match: pattern,\n count: 100,\n });\n\n cursor = parseInt(nextCursor);\n\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const session = typeof data === 'string' ? JSON.parse(data) : data;\n sessions.push(session as AgentSession);\n } catch (e) {\n console.error(`Failed to parse session from ${key}:`, e);\n }\n }\n }\n } while (cursor !== 0 && sessions.length < limit * 2); // Get extra to sort\n\n // Sort by lastSeen and return limit\n return sessions.sort((a, b) => Date.parse(b.lastSeen) - Date.parse(a.lastSeen)).slice(0, limit);\n }\n\n async cleanup(olderThan: Date): Promise<void> {\n // Note: With TTL, Redis automatically cleans up old data\n // This method is optional for manual cleanup\n\n const cutoff = olderThan.getTime();\n\n // Clean up old events from timeline\n await this.redis.zremrangebyrank(this.timelineKey(), 0, Math.floor(cutoff / 1000));\n\n // Sessions will expire automatically with TTL\n }\n}\n","/**\n * Storage adapter exports and factory\n */\n\nexport * from './types';\nexport { MemoryStorageAdapter } from './memory-adapter';\nexport { RedisStorageAdapter } from './redis-adapter';\n\nimport type { StorageAdapter, StorageConfig } from './types';\nimport { MemoryStorageAdapter } from './memory-adapter';\nimport { RedisStorageAdapter } from './redis-adapter';\nimport type { RedisClient } from './redis-adapter';\n\n/**\n * Create a storage adapter based on configuration\n */\nexport async function createStorageAdapter(config?: StorageConfig): Promise<StorageAdapter> {\n if (!config || config.type === 'memory') {\n return new MemoryStorageAdapter();\n }\n\n if (config.type === 'custom' && config.custom) {\n return config.custom;\n }\n\n if (config.type === 'redis' && config.redis) {\n // Dynamically import Redis client using a pattern that prevents static analysis\n // This ensures the bundler doesn't try to resolve @upstash/redis at build time\n try {\n // Use variable to prevent static analysis by bundler\n const redisModuleName = '@upstash/redis';\n // @ts-expect-error - Optional peer dependency, dynamically loaded\n const redisModule = await import(/* webpackIgnore: true */ redisModuleName);\n const Redis = redisModule.Redis;\n const redis = new Redis({\n url: config.redis.url,\n token: config.redis.token,\n });\n // Upstash Redis client matches our RedisClient interface\n return new RedisStorageAdapter(redis as unknown as RedisClient, config.ttl);\n } catch (error) {\n console.warn(\n '[AgentShield] Redis storage requires @upstash/redis package. Install with: npm install @upstash/redis',\n '\\nFalling back to memory storage.'\n );\n return new MemoryStorageAdapter();\n }\n }\n\n // Default to memory storage\n return new MemoryStorageAdapter();\n}\n","/**\n * Enhanced Next.js middleware with all features built-in\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { EdgeSafeDetector } from './edge-safe-detector';\nimport { createStorageAdapter } from './storage';\nimport type { StorageAdapter, StorageConfig, AgentDetectionEvent } from './storage/types';\nimport type { DetectionResult, DetectionInput } from '@kya-os/agentshield-shared';\nimport type { EdgeAgentDetectorWrapperWithWasm } from './edge-detector-with-wasm';\n\n/**\n * Enhanced configuration with built-in features\n */\nexport interface EnhancedMiddlewareConfig {\n /**\n * Storage configuration\n */\n storage?: StorageConfig;\n\n /**\n * Session tracking configuration\n */\n sessionTracking?: {\n enabled?: boolean;\n ttl?: number;\n };\n\n /**\n * Paths to skip detection\n */\n skipPaths?: string[];\n\n /**\n * Action when agent detected\n */\n onAgentDetected?: 'block' | 'log' | 'allow';\n\n /**\n * Custom handler for agent detection\n */\n onDetection?: (result: DetectionResult, context: DetectionInput) => void | Promise<void>;\n\n /**\n * Confidence threshold\n */\n confidenceThreshold?: number;\n\n /**\n * Response when blocking\n */\n blockedResponse?: {\n status?: number;\n message?: string;\n };\n}\n\n/**\n * Session tracking helper\n */\nclass SessionManager {\n private sessionLastActivity = new Map<string, number>();\n\n generateSessionId(ipAddress?: string, userAgent?: string): string {\n const now = Date.now();\n const timeWindow = Math.floor(now / (5 * 60 * 1000)); // 5-minute windows\n const baseKey = `${ipAddress || 'unknown'}:${userAgent || 'unknown'}`;\n const windowKey = `${baseKey}:${timeWindow}`;\n\n const lastActivity = this.sessionLastActivity.get(windowKey);\n const shouldCreateNewSession = !lastActivity || now - lastActivity > 30000;\n\n this.sessionLastActivity.set(windowKey, now);\n\n // Clean up old entries\n if (this.sessionLastActivity.size > 100) {\n const cutoff = now - 600000;\n for (const [key, time] of this.sessionLastActivity.entries()) {\n if (time < cutoff) {\n this.sessionLastActivity.delete(key);\n }\n }\n }\n\n const data = shouldCreateNewSession ? `${windowKey}:${now}` : `${windowKey}:${lastActivity}`;\n\n // Simple hash\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return Math.abs(hash).toString(16).padStart(12, '0').substring(0, 12);\n }\n}\n\n/**\n * Create enhanced AgentShield middleware with all features\n */\nexport function createEnhancedAgentShieldMiddleware(config: EnhancedMiddlewareConfig = {}) {\n // Initialize storage adapter\n let storageAdapter: StorageAdapter | null = null;\n let storageInitPromise: Promise<StorageAdapter> | null = null;\n\n const getStorage = async () => {\n if (storageAdapter) return storageAdapter;\n if (storageInitPromise) return storageInitPromise;\n\n storageInitPromise = createStorageAdapter(config.storage).then((adapter) => {\n storageAdapter = adapter;\n return adapter;\n });\n\n return storageInitPromise;\n };\n\n // Initialize detector - Edge Runtime safe\n type DetectorType = EdgeSafeDetector | EdgeAgentDetectorWrapperWithWasm;\n let detector: DetectorType | null = null;\n let detectorInitPromise: Promise<void> | null = null;\n let wasmConfidenceUtils: typeof import('./wasm-confidence') | null = null;\n\n const getDetector = async (requestUrl?: string) => {\n if (detector) {\n return detector;\n }\n if (detectorInitPromise) {\n await detectorInitPromise;\n return detector!;\n }\n\n detectorInitPromise = (async () => {\n // Check if we're in Edge Runtime\n const isEdgeRuntime =\n typeof (globalThis as { EdgeRuntime?: unknown }).EdgeRuntime !== 'undefined' ||\n process.env.NEXT_RUNTIME === 'edge';\n\n if (isEdgeRuntime) {\n // Use Edge-safe detector (no WASM)\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] Edge Runtime detected - using pattern detection');\n }\n detector = new EdgeSafeDetector();\n } else {\n try {\n // Try to load WASM confidence utilities first\n try {\n const wasmUtils = await import('./wasm-confidence');\n wasmConfidenceUtils = wasmUtils;\n const wasmAvailable = await wasmUtils.checkWasmAvailability();\n\n if (wasmAvailable) {\n // Dynamically import WASM detector only when not in Edge Runtime\n const { EdgeAgentDetectorWrapperWithWasm } = await import(\n './edge-detector-with-wasm'\n );\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] ✅ WASM support detected - enhanced detection enabled'\n );\n }\n detector = new EdgeAgentDetectorWrapperWithWasm({ enableWasm: true });\n if (requestUrl && 'setBaseUrl' in detector) {\n detector.setBaseUrl(requestUrl);\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] ℹ️ Using pattern-based detection (WASM not available)'\n );\n }\n detector = new EdgeSafeDetector();\n }\n } catch (wasmError) {\n // WASM utilities not available\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] WASM utilities not available, using pattern detection');\n }\n detector = new EdgeSafeDetector();\n }\n } catch (error) {\n // Fallback to Edge-safe detector\n console.warn('[AgentShield] Failed to initialize enhanced detector, using fallback');\n detector = new EdgeSafeDetector();\n }\n }\n })();\n\n await detectorInitPromise;\n return detector!;\n };\n\n // Session manager\n const sessionManager = new SessionManager();\n const sessionTrackingEnabled = config.sessionTracking?.enabled !== false;\n\n // Return the middleware function\n return async (request: NextRequest): Promise<NextResponse> => {\n const { pathname } = request.nextUrl;\n\n // Check if path should be skipped\n if (config.skipPaths?.some((path) => pathname.startsWith(path))) {\n return NextResponse.next();\n }\n\n // Extract request context\n const userAgent = request.headers.get('user-agent');\n const ipAddress = request.ip ?? request.headers.get('x-forwarded-for');\n const url = new URL(request.url);\n const pathWithQuery = url.pathname + url.search;\n\n const context = {\n userAgent: userAgent || '',\n ipAddress: ipAddress || '',\n headers: Object.fromEntries(request.headers.entries()),\n url: pathWithQuery,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Run detection with lazy-loaded detector (pass request URL for WASM loading)\n const activeDetector = await getDetector(request.url);\n const result = await activeDetector.analyze(context);\n\n // Apply WASM confidence boost if applicable\n let finalConfidence = result.confidence;\n let verificationMethod: string = result.verificationMethod || 'pattern';\n\n if (result.isAgent && wasmConfidenceUtils) {\n const reasons = result.reasons || [];\n\n if (wasmConfidenceUtils.shouldIndicateWasmVerification(result.confidence)) {\n finalConfidence = wasmConfidenceUtils.getWasmConfidenceBoost(result.confidence, reasons);\n verificationMethod = wasmConfidenceUtils.getVerificationMethod(finalConfidence, reasons);\n }\n }\n\n // Handle high-confidence detection\n if (result.isAgent && finalConfidence >= (config.confidenceThreshold ?? 0.7)) {\n // Store event if storage is configured and session tracking is enabled\n if (sessionTrackingEnabled) {\n const storage = await getStorage();\n const sessionId = sessionManager.generateSessionId(\n ipAddress || undefined,\n userAgent || undefined\n );\n\n // Create event\n const event: AgentDetectionEvent = {\n eventId: `agent_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\n sessionId,\n timestamp: new Date().toISOString(),\n agentType: result.detectedAgent?.type || 'unknown',\n agentName: result.detectedAgent?.name || 'Unknown',\n confidence: finalConfidence,\n path: pathWithQuery,\n ...(userAgent && { userAgent }),\n ...(ipAddress && { ipAddress }),\n method: request.method,\n detectionReasons: result.reasons || [],\n verificationMethod,\n detectionDetails: {\n patterns: (result.detectedAgent as { patterns?: string[] })?.patterns,\n behaviors: (result.detectedAgent as { behaviors?: string[] })?.behaviors,\n fingerprintMatches: (result.detectedAgent as { fingerprints?: string[] })?.fingerprints,\n },\n };\n\n // Store event\n try {\n await storage.storeEvent(event);\n\n // Get or create session\n let session = await storage.getSession(sessionId);\n\n if (session) {\n // Update existing session\n session.lastSeen = event.timestamp;\n session.eventCount++;\n if (!session.paths.includes(pathWithQuery)) {\n session.paths.push(pathWithQuery);\n }\n session.averageConfidence =\n (session.averageConfidence * (session.eventCount - 1) + finalConfidence) /\n session.eventCount;\n if (!session.verificationMethods.includes(verificationMethod)) {\n session.verificationMethods.push(verificationMethod);\n }\n } else {\n // Create new session\n session = {\n sessionId,\n ...(ipAddress && { ipAddress }),\n ...(userAgent && { userAgent }),\n agentType: result.detectedAgent?.type || 'unknown',\n agentName: result.detectedAgent?.name || 'Unknown',\n firstSeen: event.timestamp,\n lastSeen: event.timestamp,\n eventCount: 1,\n paths: [pathWithQuery],\n averageConfidence: finalConfidence,\n verificationMethods: [verificationMethod],\n };\n }\n\n if (session) {\n await storage.storeSession(session);\n }\n } catch (error) {\n console.error('[AgentShield] Failed to store event:', error);\n }\n }\n\n // Call custom handler if provided\n if (config.onDetection) {\n await config.onDetection(result, context);\n }\n\n // Handle based on configuration\n switch (config.onAgentDetected) {\n case 'block': {\n const { status = 403, message = 'Access denied: AI agent detected' } =\n config.blockedResponse || {};\n\n const response = NextResponse.json(\n { error: message, detected: true, confidence: finalConfidence },\n { status }\n );\n\n // Add detection headers\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set(\n 'x-agentshield-confidence',\n String(Math.round(finalConfidence * 100))\n );\n response.headers.set('x-agentshield-agent', result.detectedAgent?.name || 'Unknown');\n response.headers.set('x-agentshield-verification', verificationMethod);\n\n return response;\n }\n\n case 'log': {\n // Only log high-confidence or interesting detections\n const isInteresting =\n finalConfidence >= 0.9 ||\n result.detectedAgent?.name?.toLowerCase().includes('chatgpt') ||\n result.detectedAgent?.name?.toLowerCase().includes('perplexity') ||\n verificationMethod === 'signature';\n\n if (isInteresting && process.env.NODE_ENV !== 'production') {\n console.debug(`[AgentShield] 🤖 AI Agent detected (${verificationMethod}):`, {\n agent: result.detectedAgent?.name,\n confidence: `${(finalConfidence * 100).toFixed(0)}%`,\n path: pathWithQuery,\n verification: verificationMethod,\n });\n }\n break;\n }\n\n case 'allow':\n default:\n // Continue processing\n break;\n }\n }\n\n // Create response with detection headers\n const response = NextResponse.next();\n\n if (result.isAgent) {\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set('x-agentshield-confidence', String(Math.round(finalConfidence * 100)));\n response.headers.set('x-agentshield-agent', result.detectedAgent?.name || 'Unknown');\n response.headers.set('x-agentshield-verification', verificationMethod);\n\n // Add custom headers for high confidence\n if (finalConfidence > 0.9) {\n response.headers.set('x-ai-visitor', 'true');\n response.headers.set('x-ai-confidence', finalConfidence.toString());\n response.headers.set('x-ai-verification', verificationMethod);\n }\n }\n\n return response;\n };\n}\n\n/**\n * Export storage types for user access\n */\nexport type {\n StorageAdapter,\n StorageConfig,\n AgentDetectionEvent,\n AgentSession,\n} from './storage/types';\n","/**\n * AgentShield API Client\n *\n * Lightweight client for calling the AgentShield enforce API from middleware.\n * Designed for Edge Runtime compatibility (no Node.js-specific APIs).\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * API client configuration\n */\nexport interface AgentShieldClientConfig {\n /** API key for authentication */\n apiKey: string;\n /** API base URL (defaults to production) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 5000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Enforcement action\n */\nexport type EnforcementAction = 'allow' | 'block' | 'redirect' | 'challenge' | 'log';\n\n/**\n * Enforcement decision from the API\n */\nexport interface EnforcementDecision {\n action: EnforcementAction;\n reason: string;\n isAgent: boolean;\n confidence: number;\n agentName?: string;\n agentType?: string;\n redirectUrl?: string;\n message?: string;\n metadata?: {\n policyVersion?: string;\n signatureVerified?: boolean;\n denyListMatch?: {\n clientDid?: string;\n agentDid?: string;\n clientName?: string;\n reason?: string;\n };\n };\n}\n\n/**\n * Detection result (optional in response)\n */\nexport interface DetectionResult {\n isAgent: boolean;\n confidence: number;\n agentName?: string;\n agentType?: string;\n verificationMethod?: string;\n reasons?: string[];\n /** Detection engine used: 'wasm' or 'javascript-fallback' */\n detectionMethod?: string;\n}\n\n/**\n * Enforce API response\n */\nexport interface EnforceResponse {\n success: boolean;\n data?: {\n decision: EnforcementDecision;\n processingTimeMs: number;\n requestId: string;\n detection?: DetectionResult;\n };\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * Request input for enforce API\n */\nexport interface EnforceInput {\n /** HTTP headers from the incoming request */\n headers?: Record<string, string>;\n /** User-Agent header */\n userAgent?: string;\n /** Client IP address */\n ipAddress?: string;\n /** Request path */\n path?: string;\n /** Request URL */\n url?: string;\n /** HTTP method */\n method?: string;\n /** Request ID for tracing */\n requestId?: string;\n /** Options */\n options?: {\n /** Include full detection result */\n includeDetectionResult?: boolean;\n /** Cache TTL override */\n cacheTTL?: number;\n };\n}\n\n// ============================================================================\n// Client Implementation\n// ============================================================================\n\nconst DEFAULT_BASE_URL = 'https://kya.vouched.id';\nconst DEFAULT_TIMEOUT = 5000;\n\n/**\n * AgentShield API Client\n *\n * @example\n * ```typescript\n * const client = new AgentShieldClient({\n * apiKey: process.env.AGENTSHIELD_API_KEY!,\n * });\n *\n * const result = await client.enforce({\n * headers: Object.fromEntries(request.headers),\n * path: request.nextUrl.pathname,\n * method: request.method,\n * });\n *\n * if (result.decision.action === 'block') {\n * return new Response('Access denied', { status: 403 });\n * }\n * ```\n */\nexport class AgentShieldClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n private debug: boolean;\n\n constructor(config: AgentShieldClientConfig) {\n if (!config.apiKey) {\n throw new Error('AgentShield API key is required');\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n this.debug = config.debug || false;\n }\n\n /**\n * Call the enforce API to check if a request should be allowed\n */\n async enforce(input: EnforceInput): Promise<EnforceResponse> {\n const startTime = Date.now();\n\n try {\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/api/v1/enforce`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Request-ID': input.requestId || crypto.randomUUID(),\n },\n body: JSON.stringify(input),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Parse response\n const data = (await response.json()) as EnforceResponse;\n\n if (this.debug) {\n console.log('[AgentShield] Enforce response:', {\n status: response.status,\n action: data.data?.decision.action,\n processingTimeMs: Date.now() - startTime,\n });\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: `HTTP_${response.status}`,\n message: data.error?.message || `HTTP error: ${response.status}`,\n },\n };\n }\n\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n } catch (error) {\n // Handle timeout\n if (error instanceof Error && error.name === 'AbortError') {\n if (this.debug) {\n console.warn('[AgentShield] Request timed out');\n }\n return {\n success: false,\n error: {\n code: 'TIMEOUT',\n message: `Request timed out after ${this.timeout}ms`,\n },\n };\n }\n\n // Handle network errors\n if (this.debug) {\n console.error('[AgentShield] Request failed:', error);\n }\n\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network request failed',\n },\n };\n }\n }\n\n /**\n * Quick check - returns just the action without full response parsing\n * Useful for very fast middleware that just needs allow/block\n */\n async quickCheck(input: EnforceInput): Promise<{\n action: EnforcementAction;\n error?: string;\n }> {\n const result = await this.enforce(input);\n\n if (!result.success || !result.data) {\n // On error, default to allow (fail-open)\n return {\n action: 'allow',\n error: result.error?.message,\n };\n }\n\n return {\n action: result.data.decision.action,\n };\n }\n}\n\n/**\n * Create a singleton client instance\n *\n * @example\n * ```typescript\n * // In middleware.ts\n * import { getAgentShieldClient } from '@kya-os/agentshield-nextjs';\n *\n * const client = getAgentShieldClient();\n * ```\n */\nlet clientInstance: AgentShieldClient | null = null;\n\nexport function getAgentShieldClient(config?: Partial<AgentShieldClientConfig>): AgentShieldClient {\n if (!clientInstance) {\n const apiKey = config?.apiKey || process.env.AGENTSHIELD_API_KEY;\n\n if (!apiKey) {\n throw new Error(\n 'AgentShield API key is required. Set AGENTSHIELD_API_KEY environment variable or pass apiKey in config.'\n );\n }\n\n clientInstance = new AgentShieldClient({\n apiKey,\n baseUrl: config?.baseUrl || process.env.AGENTSHIELD_API_URL,\n timeout: config?.timeout,\n debug: config?.debug || process.env.AGENTSHIELD_DEBUG === 'true',\n });\n }\n\n return clientInstance;\n}\n\n/**\n * Reset the singleton client (useful for testing)\n */\nexport function resetAgentShieldClient(): void {\n clientInstance = null;\n}\n","/**\n * API-based AgentShield Middleware for Next.js\n *\n * This middleware uses the AgentShield API for detection and enforcement,\n * instead of running detection locally. This approach:\n *\n * 1. Works reliably in Edge Runtime (no WASM loading issues)\n * 2. Ensures consistent detection across all platforms\n * 3. Applies centralized policies from the dashboard\n * 4. Supports deny lists, thresholds, and path rules\n *\n * @example\n * ```typescript\n * // middleware.ts\n * import { withAgentShield } from '@kya-os/agentshield-nextjs/api-middleware';\n *\n * export default withAgentShield({\n * apiKey: process.env.AGENTSHIELD_API_KEY!,\n * // Optional overrides:\n * onBlock: 'redirect', // 'block' | 'redirect' | 'challenge'\n * redirectUrl: '/blocked',\n * skipPaths: ['/api/health', '/_next/*'],\n * });\n *\n * export const config = {\n * matcher: ['/((?!_next/static|favicon.ico).*)'],\n * };\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentShieldClient, getAgentShieldClient, type EnforcementDecision } from './api-client';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Middleware configuration\n */\nexport interface AgentShieldMiddlewareConfig {\n /** API key (or use AGENTSHIELD_API_KEY env var) */\n apiKey?: string;\n /** API base URL (defaults to production) */\n apiUrl?: string;\n /** Request timeout in ms (default: 5000) */\n timeout?: number;\n\n /**\n * Action to take when an agent should be blocked\n * - 'block': Return 403 response\n * - 'redirect': Redirect to redirectUrl\n * - 'challenge': Show a challenge page (future)\n * Default: uses policy from dashboard\n */\n onBlock?: 'block' | 'redirect' | 'challenge';\n\n /**\n * URL to redirect to when blocking (if onBlock is 'redirect')\n * Default: uses redirectUrl from dashboard policy\n */\n redirectUrl?: string;\n\n /**\n * Custom blocked response\n */\n blockedResponse?: {\n status?: number;\n message?: string;\n headers?: Record<string, string>;\n };\n\n /**\n * Paths to skip (in addition to dashboard policy)\n * Supports glob patterns: '/api/*', '/_next/*'\n */\n skipPaths?: string[];\n\n /**\n * Only enforce on these paths (overrides dashboard policy)\n */\n includePaths?: string[];\n\n /**\n * Callback when an agent is detected\n */\n onAgentDetected?: (request: NextRequest, decision: EnforcementDecision) => void | Promise<void>;\n\n /**\n * Callback to customize the blocked response\n */\n customBlockedResponse?: (\n request: NextRequest,\n decision: EnforcementDecision\n ) => NextResponse | Promise<NextResponse>;\n\n /**\n * Whether to fail open (allow) on API errors\n * Default: true (recommended for production)\n */\n failOpen?: boolean;\n\n /**\n * Enable debug logging\n */\n debug?: boolean;\n}\n\n// ============================================================================\n// Path Matching\n// ============================================================================\n\n/**\n * Check if a path matches a pattern\n */\nfunction matchPath(path: string, pattern: string): boolean {\n // Handle exact match\n if (pattern === path) return true;\n\n // Handle glob patterns\n if (pattern.includes('*')) {\n const regexPattern = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex chars\n .replace(/\\*/g, '.*'); // Convert * to .*\n return new RegExp(`^${regexPattern}$`).test(path);\n }\n\n // Handle prefix match\n if (pattern.endsWith('/')) {\n return path.startsWith(pattern) || path === pattern.slice(0, -1);\n }\n\n return path.startsWith(pattern);\n}\n\n/**\n * Check if path should be skipped\n */\nfunction shouldSkipPath(path: string, skipPaths: string[]): boolean {\n return skipPaths.some((pattern) => matchPath(path, pattern));\n}\n\n/**\n * Check if path should be included (if includePaths is set)\n */\nfunction shouldIncludePath(path: string, includePaths?: string[]): boolean {\n if (!includePaths || includePaths.length === 0) return true;\n return includePaths.some((pattern) => matchPath(path, pattern));\n}\n\n// ============================================================================\n// Response Builders\n// ============================================================================\n\n/**\n * Build blocked response\n */\nfunction buildBlockedResponse(\n decision: EnforcementDecision,\n config: AgentShieldMiddlewareConfig\n): NextResponse {\n const status = config.blockedResponse?.status ?? 403;\n const message = config.blockedResponse?.message ?? decision.message ?? 'Access denied';\n\n const response = NextResponse.json(\n {\n error: message,\n code: 'AGENT_BLOCKED',\n reason: decision.reason,\n agentType: decision.agentType,\n },\n { status }\n );\n\n // Add custom headers\n if (config.blockedResponse?.headers) {\n for (const [key, value] of Object.entries(config.blockedResponse.headers)) {\n response.headers.set(key, value);\n }\n }\n\n // Add AgentShield headers\n response.headers.set('X-AgentShield-Action', decision.action);\n response.headers.set('X-AgentShield-Reason', decision.reason);\n\n return response;\n}\n\n/**\n * Build redirect response\n */\nfunction buildRedirectResponse(\n request: NextRequest,\n decision: EnforcementDecision,\n config: AgentShieldMiddlewareConfig\n): NextResponse {\n const redirectUrl = config.redirectUrl || decision.redirectUrl || '/blocked';\n const url = new URL(redirectUrl, request.url);\n\n // Add query params with detection info\n url.searchParams.set('reason', decision.reason);\n if (decision.agentType) {\n url.searchParams.set('agent', decision.agentType);\n }\n\n return NextResponse.redirect(url);\n}\n\n// ============================================================================\n// Middleware Factory\n// ============================================================================\n\n/**\n * Create AgentShield middleware with API-based detection\n *\n * @example\n * ```typescript\n * // middleware.ts\n * import { withAgentShield } from '@kya-os/agentshield-nextjs/api-middleware';\n *\n * export default withAgentShield({\n * onBlock: 'block',\n * skipPaths: ['/api/health'],\n * });\n * ```\n */\nexport function withAgentShield(config: AgentShieldMiddlewareConfig = {}) {\n // Initialize client (will use AGENTSHIELD_API_KEY env var if not provided)\n let client: AgentShieldClient | null = null;\n\n const getClient = () => {\n if (!client) {\n client = getAgentShieldClient({\n apiKey: config.apiKey,\n baseUrl: config.apiUrl,\n timeout: config.timeout,\n debug: config.debug,\n });\n }\n return client;\n };\n\n // Default skip paths (static assets, etc.)\n const defaultSkipPaths = [\n '/_next/static/*',\n '/_next/image/*',\n '/favicon.ico',\n '/robots.txt',\n '/sitemap.xml',\n ];\n\n const skipPaths = [...defaultSkipPaths, ...(config.skipPaths || [])];\n const failOpen = config.failOpen ?? true;\n\n return async function middleware(request: NextRequest): Promise<NextResponse> {\n const path = request.nextUrl.pathname;\n const startTime = Date.now();\n\n // Check skip paths\n if (shouldSkipPath(path, skipPaths)) {\n return NextResponse.next();\n }\n\n // Check include paths\n if (!shouldIncludePath(path, config.includePaths)) {\n return NextResponse.next();\n }\n\n try {\n // Call enforce API\n const result = await getClient().enforce({\n headers: Object.fromEntries(request.headers.entries()),\n userAgent: request.headers.get('user-agent') || undefined,\n ipAddress:\n request.ip ||\n request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n request.headers.get('x-real-ip') ||\n undefined,\n path,\n url: request.url,\n method: request.method,\n requestId: request.headers.get('x-request-id') || undefined,\n options: {\n includeDetectionResult: config.debug,\n },\n });\n\n // Handle API error\n if (!result.success || !result.data) {\n if (config.debug) {\n console.warn('[AgentShield] API error:', result.error);\n }\n\n if (failOpen) {\n return NextResponse.next();\n }\n\n // Fail closed - block on error\n return NextResponse.json(\n { error: 'Security check failed', code: 'API_ERROR' },\n { status: 503 }\n );\n }\n\n const decision = result.data.decision;\n\n // Log if debug enabled\n if (config.debug) {\n console.log('[AgentShield] Decision:', {\n path,\n action: decision.action,\n isAgent: decision.isAgent,\n confidence: decision.confidence,\n agentName: decision.agentName,\n detectionMethod: result.data.detection?.detectionMethod || 'not-included',\n processingTimeMs: Date.now() - startTime,\n });\n }\n\n // Handle agent detection callback\n if (decision.isAgent && config.onAgentDetected) {\n await config.onAgentDetected(request, decision);\n }\n\n // Handle enforcement action\n switch (decision.action) {\n case 'block': {\n // Use custom response if provided\n if (config.customBlockedResponse) {\n return config.customBlockedResponse(request, decision);\n }\n\n // Check if config overrides to redirect\n if (config.onBlock === 'redirect') {\n return buildRedirectResponse(request, decision, config);\n }\n\n return buildBlockedResponse(decision, config);\n }\n\n case 'redirect': {\n return buildRedirectResponse(request, decision, config);\n }\n\n case 'challenge': {\n // Future: implement challenge page\n // For now, treat as redirect\n return buildRedirectResponse(request, decision, config);\n }\n\n case 'log':\n case 'allow':\n default: {\n // Allow the request to proceed\n const response = NextResponse.next();\n\n // Add detection headers for downstream use\n if (decision.isAgent) {\n response.headers.set('X-AgentShield-Detected', 'true');\n response.headers.set('X-AgentShield-Confidence', decision.confidence.toString());\n if (decision.agentName) {\n response.headers.set('X-AgentShield-Agent', decision.agentName);\n }\n }\n\n return response;\n }\n }\n } catch (error) {\n // Unexpected error\n if (config.debug) {\n console.error('[AgentShield] Middleware error:', error);\n }\n\n if (failOpen) {\n return NextResponse.next();\n }\n\n return NextResponse.json(\n { error: 'Security check failed', code: 'MIDDLEWARE_ERROR' },\n { status: 503 }\n );\n }\n };\n}\n\n/**\n * Convenience export for simple setup\n *\n * @example\n * ```typescript\n * // middleware.ts\n * export { agentShieldMiddleware as default } from '@kya-os/agentshield-nextjs/api-middleware';\n * ```\n */\nexport const agentShieldMiddleware = withAgentShield();\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 { createAgentShieldMiddleware, createMiddleware } 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\n// Export API-based detection (recommended for production)\nexport { withAgentShield, agentShieldMiddleware } from './api-middleware';\nexport type { AgentShieldMiddlewareConfig } from './api-middleware';\nexport { AgentShieldClient, getAgentShieldClient, resetAgentShieldClient } from './api-client';\nexport type {\n AgentShieldClientConfig,\n EnforcementAction,\n EnforcementDecision,\n EnforceResponse,\n EnforceInput,\n} from './api-client';\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/wasm-loader.ts","../src/edge-detector-with-wasm.ts","../src/wasm-confidence.ts","../src/signature-verifier.ts","../src/edge-detector-wrapper.ts","../src/middleware.ts","../src/session-tracker.ts","../src/create-middleware.ts","../src/edge-safe-detector.ts","../src/storage/memory-adapter.ts","../src/storage/redis-adapter.ts","../src/storage/index.ts","../src/enhanced-middleware.ts","../src/api-client.ts","../src/api-middleware.ts","../src/index.ts"],"names":["response","rules","loadRulesSync","baseUrl","now","context","initPromise","createAgentShieldMiddleware","agentShieldMiddleware","NextResponse","EdgeAgentDetectorWrapperWithWasm"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * WASM Loader for AgentShield in Edge Runtime\n * Handles loading and initialization of WebAssembly module\n *\n * IMPORTANT: wasm-bindgen Import Names Limitation\n * ================================================\n * The import function names (e.g., __wbg_log_1d3ae13c3d5e6b8e) are generated\n * by wasm-bindgen with hash suffixes that change with each WASM rebuild.\n * If the WASM module is rebuilt, these function names MUST be updated to match\n * the new exports from wasm-pack.\n *\n * To get the correct function names after a WASM rebuild:\n * 1. Run `wasm-pack build --target web` in the rust/crates/agentshield-wasm directory\n * 2. Check the generated `agentshield_wasm_bg.js` file for the actual export names\n * 3. Update the import object in this file to match\n *\n * TODO: Consider using the generated JS bindings from wasm-pack instead of\n * manually specifying imports, or add CI verification to catch mismatches.\n */\n\n// Dynamic WASM loading - no direct imports to avoid build issues\nlet wasmInstance: WebAssembly.Instance | null = null;\ninterface WasmExports {\n detect_agent: (ptr: number, len: number) => number;\n get_version: () => number;\n __wbindgen_malloc: (size: number) => number;\n __wbindgen_free: (ptr: number, size: number) => void;\n __wbindgen_realloc: (ptr: number, oldSize: number, newSize: number) => number;\n memory: WebAssembly.Memory;\n [key: string]: unknown;\n}\nlet wasmExports: WasmExports | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// Store the WASM module URL for runtime loading\nconst WASM_PATH = '/wasm/agentshield_wasm_bg.wasm';\n\n// Store base URL for constructing absolute URLs in Edge Runtime\nlet baseUrl: string | null = null;\n\n/**\n * Set the base URL for WASM loading (needed in Edge Runtime)\n */\nexport function setWasmBaseUrl(url: string) {\n baseUrl = url;\n}\n\n/**\n * Construct the full WASM URL based on context\n */\nfunction getWasmUrl(): string {\n // If we have a base URL (Edge Runtime), construct absolute URL\n if (baseUrl) {\n try {\n const url = new URL(baseUrl);\n // Use the origin to construct the full URL\n return `${url.origin}${WASM_PATH}`;\n } catch {\n // Fallback to relative path if URL construction fails\n return WASM_PATH;\n }\n }\n // Default to relative path\n return WASM_PATH;\n}\n\n/**\n * Initialize the WASM module\n * This is safe to call multiple times - it will only initialize once\n */\nexport async function initWasm(): Promise<boolean> {\n if (wasmExports) return true;\n if (initPromise) {\n await initPromise;\n return !!wasmExports;\n }\n\n initPromise = (async () => {\n try {\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000); // 3 second timeout\n\n try {\n const wasmUrl = getWasmUrl();\n\n // Try streaming compilation first (most efficient)\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n const response = await fetch(wasmUrl, { signal: controller.signal });\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.status}`);\n }\n\n // Clone response for streaming (in case we need to retry)\n const streamResponse = response.clone();\n\n // Use streaming compilation for best performance\n const { instance } = await WebAssembly.instantiateStreaming(streamResponse, {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('WASM:', ptr, len);\n }\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n },\n },\n });\n\n wasmInstance = instance;\n wasmExports = instance.exports as WasmExports;\n\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] ✅ WASM module initialized with streaming');\n }\n return;\n } catch (streamError) {\n // If not aborted, try fallback\n if (!controller.signal.aborted) {\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] Streaming compilation failed, falling back to standard compilation'\n );\n }\n } else {\n throw streamError;\n }\n }\n }\n\n // Fallback to standard compilation if streaming not available\n const response = await fetch(wasmUrl, { signal: controller.signal });\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.status}`);\n }\n\n const wasmArrayBuffer = await response.arrayBuffer();\n const compiledModule = await WebAssembly.compile(wasmArrayBuffer);\n\n const imports = {\n wbg: {\n __wbg_log_1d3ae13c3d5e6b8e: (ptr: number, len: number) => {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('WASM:', ptr, len);\n }\n },\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(`WASM Error at ${ptr}, length ${len}`);\n },\n },\n };\n\n wasmInstance = await WebAssembly.instantiate(compiledModule, imports);\n wasmExports = wasmInstance.exports as WasmExports;\n\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] ✅ WASM module initialized via fallback');\n }\n } catch (fetchError: unknown) {\n const error = fetchError as { name?: string; message?: string };\n if (error.name === 'AbortError') {\n console.warn(\n '[AgentShield] WASM fetch timed out after 3 seconds - using pattern detection'\n );\n } else {\n console.warn(\n '[AgentShield] Failed to fetch WASM file:',\n error.message || 'Unknown error'\n );\n }\n wasmExports = null;\n }\n } catch (error) {\n console.error('[AgentShield] Failed to initialize WASM:', error);\n wasmExports = null;\n }\n })();\n\n await initPromise;\n return !!wasmExports;\n}\n\n/**\n * Detect agent using WASM\n * Returns null if WASM is not available\n */\nexport async function detectAgentWithWasm(\n userAgent: string | undefined,\n headers: Record<string, string>,\n ipAddress?: string\n): Promise<{\n isAgent: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: string;\n riskLevel: string;\n} | null> {\n // Ensure WASM is initialized\n const initialized = await initWasm();\n if (!initialized || !wasmExports) {\n return null;\n }\n\n try {\n // Note: The actual WASM exports will depend on how wasm-bindgen generates them\n // This is a simplified version - you may need to adjust based on actual exports\n\n // Prepare input for WASM\n const headersJson = JSON.stringify(headers);\n\n // Call WASM detection function (adjust function name based on actual exports)\n if (typeof wasmExports.detect_agent === 'function') {\n const result = wasmExports.detect_agent(\n userAgent || '',\n headersJson,\n ipAddress || '',\n new Date().toISOString()\n );\n\n // Parse result (format depends on WASM implementation)\n return {\n isAgent: result.is_agent || false,\n confidence: result.confidence || 0,\n agent: result.agent,\n verificationMethod: result.verification_method || 'wasm',\n riskLevel: result.risk_level || 'low',\n };\n }\n\n console.warn('[AgentShield] WASM exports do not include detect_agent function');\n return null;\n } catch (error) {\n console.error('[AgentShield] WASM detection failed:', error);\n return null;\n }\n}\n\n/**\n * Get WASM version\n */\nexport async function getWasmVersion(): Promise<string | null> {\n const initialized = await initWasm();\n if (!initialized || !wasmExports) {\n return null;\n }\n\n if (typeof wasmExports.version === 'function') {\n return wasmExports.version();\n }\n\n return 'unknown';\n}\n\n/**\n * Check if WASM is available and working\n */\nexport async function isWasmAvailable(): Promise<boolean> {\n try {\n const initialized = await initWasm();\n if (!initialized) return false;\n\n // Try to get version as a simple test\n const version = await getWasmVersion();\n return version !== null;\n } catch {\n return false;\n }\n}\n","/**\n * Enhanced EdgeAgentDetector with WASM support\n * Provides both pattern-based and WASM-based detection\n */\n\nimport { detectAgentWithWasm, initWasm, isWasmAvailable, setWasmBaseUrl } from './wasm-loader';\nimport {\n loadRulesSync,\n type DetectionRules,\n type DetectionResult,\n type DetectionInput,\n mapVerificationMethod,\n} from '@kya-os/agentshield-shared';\n\ntype EventHandler = (...args: unknown[]) => void;\n\n// Load centralized rules - this will fail fast if rules cannot be loaded\nconst rules: DetectionRules = loadRulesSync();\n\n/**\n * EdgeAgentDetector with WASM enhancement\n */\nexport class EdgeAgentDetectorWithWasm {\n private wasmEnabled: boolean = false;\n private initPromise: Promise<void> | null = null;\n private baseUrl: string | null = null;\n private rules: DetectionRules;\n\n constructor(private enableWasm: boolean = true) {\n this.rules = rules;\n }\n\n /**\n * Set the base URL for WASM loading in Edge Runtime\n */\n setBaseUrl(url: string) {\n this.baseUrl = url;\n setWasmBaseUrl(url);\n }\n\n /**\n * Initialize the detector (including WASM if enabled)\n */\n async init(): Promise<void> {\n if (!this.enableWasm) {\n this.wasmEnabled = false;\n return;\n }\n\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n\n this.initPromise = (async () => {\n try {\n // Try to initialize WASM\n const wasmAvailable = await isWasmAvailable();\n\n if (wasmAvailable) {\n // Set base URL if provided before initializing\n if (this.baseUrl) {\n setWasmBaseUrl(this.baseUrl);\n }\n await initWasm(); // Actually initialize WASM\n this.wasmEnabled = true;\n // WASM detection enabled\n } else {\n this.wasmEnabled = false;\n // WASM not available, using pattern detection\n }\n } catch (error) {\n console.error('[AgentShield] Failed to initialize WASM:', error);\n this.wasmEnabled = false;\n }\n })();\n\n await this.initPromise;\n }\n\n /**\n * Pattern-based detection (fallback)\n */\n private async patternDetection(input: DetectionInput): Promise<DetectionResult> {\n const reasons: string[] = [];\n let detectedAgent: { type: string; name: string } | undefined;\n let verificationMethod: string | undefined;\n let confidence = 0; // 0-100 scale\n\n const headers = input.headers || {};\n const normalizedHeaders: Record<string, string> = {};\n\n // Normalize header names to lowercase\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Check for HTTP Message Signatures (highest confidence)\n const signaturePresent = !!(\n normalizedHeaders['signature'] || normalizedHeaders['signature-input']\n );\n const signatureAgent = normalizedHeaders['signature-agent'];\n\n if (signatureAgent?.includes('chatgpt.com')) {\n confidence = 85; // High confidence for ChatGPT signature\n reasons.push('signature_agent:chatgpt');\n detectedAgent = { type: 'chatgpt', name: 'ChatGPT' };\n verificationMethod = 'signature';\n } else if (signaturePresent) {\n confidence = Math.max(confidence, 40); // Medium confidence for generic signature\n reasons.push('signature_present');\n }\n\n // Check User-Agent patterns using centralized rules\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n for (const [agentKey, agentRule] of Object.entries(this.rules.rules.userAgents)) {\n const matched = agentRule.patterns.some((pattern) => {\n const regex = new RegExp(pattern, 'i');\n return regex.test(userAgent);\n });\n\n if (matched) {\n const agentType = this.getAgentType(agentKey);\n const agentName = this.getAgentName(agentKey);\n\n confidence = Math.max(confidence, Math.round(agentRule.confidence * 0.85 * 100));\n reasons.push(`known_pattern:${agentType}`);\n if (!detectedAgent) {\n detectedAgent = { type: agentType, name: agentName };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers using centralized rules\n const suspiciousHeaders = this.rules.rules.headers.suspicious;\n const foundAiHeaders = suspiciousHeaders.filter(\n (headerRule) => normalizedHeaders[headerRule.name.toLowerCase()]\n );\n\n if (foundAiHeaders.length > 0) {\n const maxConfidence = Math.max(...foundAiHeaders.map((h) => h.confidence));\n confidence = Math.max(confidence, maxConfidence);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs using centralized rules\n const ip = input.ip || input.ipAddress;\n if (ip && !normalizedHeaders['x-forwarded-for'] && !normalizedHeaders['x-real-ip']) {\n // Handle both old (with providers) and new (direct) structures\n const ipRanges =\n 'providers' in this.rules.rules.ipRanges\n ? this.rules.rules.ipRanges.providers\n : this.rules.rules.ipRanges;\n\n for (const [provider, ipRule] of Object.entries(ipRanges)) {\n // Skip non-rule entries\n if (\n !ipRule ||\n typeof ipRule !== 'object' ||\n !('ranges' in ipRule) ||\n !Array.isArray(ipRule.ranges)\n )\n continue;\n\n const matched = ipRule.ranges.some((range: string) => {\n const prefix = range.split('/')[0];\n const prefixParts = prefix.split('.');\n const ipParts = ip.split('.');\n\n // Check if IP starts with the same octets\n for (let i = 0; i < Math.min(prefixParts.length - 1, 2); i++) {\n if (prefixParts[i] !== ipParts[i] && prefixParts[i] !== '0') {\n return false;\n }\n }\n return true;\n });\n\n if (matched) {\n confidence = Math.max(confidence, Math.round(ipRule.confidence * 0.4 * 100));\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n\n // Boost confidence for combinations\n if (reasons.length > 2) {\n confidence = Math.min(Math.round(confidence * 1.2), 95);\n }\n\n // Ensure confidence stays within 0-100 range\n confidence = Math.min(Math.max(confidence, 0), 100);\n\n return {\n isAgent: confidence > 30, // 30% threshold\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && {\n verificationMethod: mapVerificationMethod(verificationMethod),\n }),\n forgeabilityRisk: confidence > 80 ? 'medium' : 'high',\n timestamp: new Date(),\n };\n }\n\n /**\n * Analyze request with WASM enhancement when available\n */\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n // Ensure initialization\n await this.init();\n\n // Try WASM detection first if enabled\n if (this.wasmEnabled) {\n try {\n const wasmResult = await detectAgentWithWasm(\n input.userAgent || input.headers?.['user-agent'],\n input.headers || {},\n input.ip || input.ipAddress\n );\n\n if (wasmResult) {\n // WASM detection succeeded\n\n // Map WASM result to DetectionResult\n const detectedAgent = wasmResult.agent ? this.mapAgentName(wasmResult.agent) : undefined;\n\n return {\n isAgent: wasmResult.isAgent,\n confidence: wasmResult.confidence,\n detectionClass:\n wasmResult.isAgent && detectedAgent\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : wasmResult.isAgent\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons: [`wasm:${wasmResult.verificationMethod}`],\n verificationMethod: mapVerificationMethod(wasmResult.verificationMethod),\n forgeabilityRisk:\n wasmResult.verificationMethod === 'signature'\n ? 'low'\n : wasmResult.confidence > 90\n ? 'medium'\n : 'high',\n timestamp: new Date(),\n };\n }\n } catch (error) {\n console.error('[AgentShield] WASM detection error:', error);\n }\n }\n\n // Fall back to pattern detection\n const patternResult = await this.patternDetection(input);\n\n // If WASM is available but didn't detect anything, boost confidence slightly\n // to indicate WASM verification was performed\n if (this.wasmEnabled && patternResult.confidence >= 85) {\n patternResult.confidence = Math.min(95, patternResult.confidence + 10);\n patternResult.reasons.push('wasm_enhanced');\n // Note: Keep original verification method since 'wasm-enhanced' is not a valid type\n }\n\n return patternResult;\n }\n\n /**\n * Get agent type from rule key\n */\n private getAgentType(agentKey: string): string {\n const typeMap: Record<string, string> = {\n openai_gptbot: 'openai',\n anthropic_claude: 'anthropic',\n perplexity_bot: 'perplexity',\n google_ai: 'google',\n microsoft_ai: 'microsoft',\n meta_ai: 'meta',\n cohere_bot: 'cohere',\n huggingface_bot: 'huggingface',\n generic_bot: 'generic',\n dev_tools: 'dev',\n automation_tools: 'automation',\n };\n return typeMap[agentKey] || agentKey;\n }\n\n /**\n * Get agent name from rule key\n */\n private getAgentName(agentKey: string): string {\n const nameMap: Record<string, string> = {\n openai_gptbot: 'ChatGPT/GPTBot',\n anthropic_claude: 'Claude',\n perplexity_bot: 'Perplexity',\n google_ai: 'Google AI',\n microsoft_ai: 'Microsoft Copilot',\n meta_ai: 'Meta AI',\n cohere_bot: 'Cohere',\n huggingface_bot: 'HuggingFace',\n generic_bot: 'Generic Bot',\n dev_tools: 'Development Tool',\n automation_tools: 'Automation Tool',\n };\n return nameMap[agentKey] || agentKey;\n }\n\n /**\n * Map agent names from WASM to consistent format\n */\n private mapAgentName(agent: string): { type: string; name: string } | undefined {\n const lowerAgent = agent.toLowerCase();\n\n if (lowerAgent.includes('chatgpt')) {\n return { type: 'chatgpt', name: 'ChatGPT' };\n } else if (lowerAgent.includes('claude')) {\n return { type: 'claude', name: 'Claude' };\n } else if (lowerAgent.includes('perplexity')) {\n return { type: 'perplexity', name: 'Perplexity' };\n } else if (lowerAgent.includes('bing')) {\n return { type: 'bing', name: 'Bing AI' };\n } else if (lowerAgent.includes('anthropic')) {\n return { type: 'anthropic', name: 'Anthropic' };\n }\n\n return { type: 'unknown', name: agent };\n }\n}\n\n/**\n * Wrapper that provides event emitter functionality\n */\nexport class EdgeAgentDetectorWrapperWithWasm {\n private detector: EdgeAgentDetectorWithWasm;\n private events: Map<string, EventHandler[]> = new Map();\n\n constructor(config?: { enableWasm?: boolean; baseUrl?: string }) {\n this.detector = new EdgeAgentDetectorWithWasm(config?.enableWasm ?? true);\n if (config?.baseUrl) {\n this.detector.setBaseUrl(config.baseUrl);\n }\n }\n\n setBaseUrl(url: string) {\n this.detector.setBaseUrl(url);\n }\n\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n const result = await this.detector.analyze(input);\n\n // Emit events if there are listeners\n if (result.isAgent && this.events.has('agent.detected')) {\n const handlers = this.events.get('agent.detected') || [];\n handlers.forEach((handler) => handler(result, input));\n }\n\n return result;\n }\n\n on(event: string, handler: EventHandler): void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)!.push(handler);\n }\n\n emit(event: string, ...args: unknown[]): void {\n const handlers = this.events.get(event) || [];\n handlers.forEach((handler) => handler(...args));\n }\n\n async init(): Promise<void> {\n await this.detector.init();\n }\n}\n","/**\n * Internal WASM confidence enhancement logic\n * This was previously in the user's lib/agentshield-simple-wasm.ts\n */\n\n/**\n * Check if WASM is available in the current environment\n */\nexport async function checkWasmAvailability(): Promise<boolean> {\n try {\n // Check if WebAssembly is available\n if (typeof WebAssembly === 'undefined') {\n return false;\n }\n\n // In Edge Runtime, we can't use WebAssembly.compile()\n // Instead, just check for the presence of WebAssembly object\n // The actual WASM module will be loaded separately\n \n // Check for basic WebAssembly API availability\n if (!WebAssembly.instantiate || !WebAssembly.Module) {\n return false;\n }\n \n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Determine if WASM verification should be indicated\n * Based on the detection confidence level\n */\nexport function shouldIndicateWasmVerification(confidence: number): boolean {\n // WASM verification is indicated for pattern-based detections\n // that achieve high confidence (>= 85 on 0-100 scale)\n return confidence >= 85 && confidence < 100; // Updated to 0-100 scale\n}\n\n/**\n * Apply WASM confidence boost for enhanced detection\n */\nexport function getWasmConfidenceBoost(\n baseConfidence: number,\n reasons: string[] = []\n): number {\n // If signature verification succeeded, always return 100%\n if (reasons.some(r =>\n r.includes('signature_agent') &&\n !r.includes('signature_headers_present')\n )) {\n return 100; // Updated to 0-100 scale (was 1.0)\n }\n\n // For high-confidence pattern detection, boost to 95%\n if (baseConfidence >= 85) { // Updated to 0-100 scale (was 0.85)\n return 95; // Updated to 0-100 scale (was 0.95)\n }\n\n // For medium-high confidence, apply smaller boost\n if (baseConfidence >= 70) { // Updated to 0-100 scale (was 0.7)\n return Math.min(baseConfidence * 1.1, 90); // Updated to 0-100 scale (was 0.9)\n }\n\n // No boost for lower confidence\n return baseConfidence;\n}\n\n/**\n * Get verification method based on detection\n */\nexport function getVerificationMethod(\n confidence: number,\n reasons: string[] = []\n): string {\n // Check for signature verification\n if (reasons.some(r => \n r.includes('signature_agent') && \n !r.includes('signature_headers_present')\n )) {\n return 'signature';\n }\n \n // Check for WASM enhancement\n if (shouldIndicateWasmVerification(confidence)) {\n return 'wasm-enhanced';\n }\n \n // Default to pattern matching\n return 'pattern';\n}","/**\n * 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\nimport * as ed25519 from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha2.js';\n\n// Configure @noble/ed25519 to use sync SHA-512 from @noble/hashes\n// This works in all environments including Edge Runtime\ned25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));\n\n/**\n * Known public keys for AI agents (fallback)\n *\n * IMPORTANT: These keys are used as fallback when the API is unavailable.\n * The primary source of keys should be the /api/internal/signature-keys endpoint\n * which fetches from https://chatgpt.com/.well-known/http-message-signatures-directory\n *\n * TODO: Implement automated key rotation by:\n * 1. Setting up a cron job to fetch from OpenAI's well-known endpoint\n * 2. Storing keys in database/KV store with proper expiration handling\n * 3. Removing hardcoded fallback keys entirely\n */\nconst KNOWN_KEYS = {\n chatgpt: [\n {\n kid: 'otMqcjr17mGyruktGvJU8oojQTSMHlVm7uO-lrcqbdg',\n // ChatGPT's current Ed25519 public key (base64)\n // Source: https://chatgpt.com/.well-known/http-message-signatures-directory\n publicKey: '7F_3jDlxaquwh291MiACkcS3Opq88NksyHiakzS-Y1g',\n validFrom: 1735689600, // Jan 1, 2025 (from OpenAI's nbf)\n // Extended expiration as fallback safety - API fetch should provide fresh keys\n // Check OpenAI's well-known endpoint for actual expiration dates\n validUntil: 1799625600, // Jan 1, 2027 (extended for fallback safety)\n },\n ],\n};\n\n/**\n * In-memory cache for API-fetched keys\n */\ninterface CachedKeys {\n keys: Array<{\n kid: string;\n publicKey: string;\n validFrom: number;\n validUntil: number;\n }>;\n cachedAt: number;\n}\n\nconst keyCache = new Map<string, CachedKeys>();\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\nconst CACHE_MAX_SIZE = 100; // Maximum cache entries before cleanup\n\n/**\n * Get API base URL for fetching keys\n * Returns absolute URL for server-side, relative for browser\n */\nfunction getApiBaseUrl(): string {\n if (typeof window !== 'undefined') {\n // Browser: use relative path\n return '/api/internal';\n }\n\n // Server-side: must use absolute URL\n // Try environment variables first\n const baseUrl =\n process.env.NEXT_PUBLIC_APP_URL ||\n process.env.NEXT_PUBLIC_API_URL ||\n process.env.API_URL ||\n (process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : null);\n\n if (baseUrl) {\n return baseUrl.replace(/\\/$/, '') + '/api/internal';\n }\n\n // Fallback: try to construct from request context if available\n // For middleware/edge runtime, we may need to pass the request URL\n // For now, return relative path and log warning\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n '[Signature] No base URL configured for server-side fetch. Using localhost fallback.'\n );\n return 'http://localhost:3000/api/internal';\n }\n\n // Production fallback - should not reach here if properly configured\n console.error(\n '[Signature] CRITICAL: No base URL configured for server-side fetch in production!'\n );\n return '/api/internal'; // Will fail, but prevents silent success\n}\n\n/**\n * Clean up expired cache entries and enforce size limit\n * Called periodically to prevent unbounded memory growth\n * Uses LRU-style eviction: removes expired entries first, then oldest entries if still over limit\n */\nfunction cleanupExpiredCache(): void {\n const now = Date.now();\n const entriesToDelete: string[] = [];\n\n // First pass: remove expired entries\n for (const [agent, cached] of keyCache.entries()) {\n if (now - cached.cachedAt > CACHE_TTL_MS) {\n entriesToDelete.push(agent);\n }\n }\n\n for (const agent of entriesToDelete) {\n keyCache.delete(agent);\n }\n\n // Second pass: if still over limit, remove oldest entries (LRU eviction)\n if (keyCache.size > CACHE_MAX_SIZE) {\n // Convert entries to array with cachedAt timestamp for sorting\n const entries = Array.from(keyCache.entries()).map(([agent, cached]) => ({\n agent,\n cachedAt: cached.cachedAt,\n }));\n\n // Sort by cachedAt (oldest first)\n entries.sort((a, b) => a.cachedAt - b.cachedAt);\n\n // Remove oldest entries until we're under the limit\n const toRemove = entries.slice(0, keyCache.size - CACHE_MAX_SIZE);\n for (const entry of toRemove) {\n keyCache.delete(entry.agent);\n }\n }\n}\n\n/**\n * Fetch keys from API with caching\n */\nasync function fetchKeysFromApi(agent: string): Promise<Array<{\n kid: string;\n publicKey: string;\n validFrom: number;\n validUntil: number;\n}> | null> {\n // Periodic cleanup to prevent memory leaks\n if (keyCache.size > CACHE_MAX_SIZE) {\n cleanupExpiredCache();\n }\n\n // Check cache first\n const cached = keyCache.get(agent);\n if (cached && Date.now() - cached.cachedAt < CACHE_TTL_MS) {\n return cached.keys;\n }\n\n // Check if fetch is available (Edge Runtime compatibility)\n if (typeof fetch === 'undefined') {\n console.warn('[Signature] fetch() not available in this environment');\n return null;\n }\n\n try {\n const apiBaseUrl = getApiBaseUrl();\n const url = `${apiBaseUrl}/signature-keys?agent=${encodeURIComponent(agent)}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n // 5 second timeout\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n console.warn(`[Signature] Failed to fetch keys from API: ${response.status}`);\n return null;\n }\n\n const data = await response.json();\n\n if (!data.keys || !Array.isArray(data.keys) || data.keys.length === 0) {\n console.warn(`[Signature] No keys returned from API for agent: ${agent}`);\n return null;\n }\n\n // Cache the result\n keyCache.set(agent, {\n keys: data.keys,\n cachedAt: Date.now(),\n });\n\n return data.keys;\n } catch (error) {\n console.warn('[Signature] Error fetching keys from API, using fallback', {\n error: error instanceof Error ? error.message : 'Unknown error',\n agent,\n });\n return null;\n }\n}\n\n/**\n * Type guard to check if agent is a valid key in KNOWN_KEYS\n */\nfunction isValidAgent(agent: string): agent is keyof typeof KNOWN_KEYS {\n return agent in KNOWN_KEYS;\n}\n\n/**\n * Get keys for an agent (API first, then fallback)\n */\nasync function getKeysForAgent(agent: string): Promise<\n Array<{\n kid: string;\n publicKey: string;\n validFrom: number;\n validUntil: number;\n }>\n> {\n // Try API first\n const apiKeys = await fetchKeysFromApi(agent);\n if (apiKeys && apiKeys.length > 0) {\n return apiKeys;\n }\n\n // Fallback to hardcoded keys with type guard\n if (isValidAgent(agent)) {\n return KNOWN_KEYS[agent];\n }\n\n return [];\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((k) => k.toLowerCase() === headerName.toLowerCase());\n value = key ? headers[key] || '' : '';\n break;\n }\n }\n\n // Format according to RFC 9421\n components.push(`\"${headerName}\": ${value}`);\n }\n\n return components.join('\\n');\n}\n\n/**\n * Decode base64 (handles both standard and URL-safe variants)\n * URL-safe base64 uses - instead of + and _ instead of /\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n // Convert URL-safe base64 to standard base64\n let standardBase64 = base64.replace(/-/g, '+').replace(/_/g, '/');\n\n // Add padding if needed\n const padding = standardBase64.length % 4;\n if (padding) {\n standardBase64 += '='.repeat(4 - padding);\n }\n\n const binaryString = atob(standardBase64);\n return Uint8Array.from(binaryString, (c) => c.charCodeAt(0));\n}\n\n/**\n * Verify Ed25519 signature using @noble/ed25519 (works in all environments including Edge Runtime)\n * Falls back to Web Crypto API if available\n */\nasync function verifyEd25519Signature(\n publicKeyBase64: string,\n signatureBase64: string,\n message: string\n): Promise<boolean> {\n try {\n // Decode base64 to Uint8Array (handles URL-safe base64)\n const publicKeyBytes = base64ToBytes(publicKeyBase64);\n const signatureBytes = base64ToBytes(signatureBase64);\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 // Use @noble/ed25519 with sync SHA-512 - works in all environments including Edge Runtime\n return ed25519.verify(signatureBytes, messageBytes, publicKeyBytes);\n } catch (nobleError) {\n console.warn('[Signature] @noble/ed25519 failed, trying Web Crypto fallback:', nobleError);\n\n // Fallback to Web Crypto API (may not work in Edge Runtime)\n try {\n const publicKeyBytes = base64ToBytes(publicKeyBase64);\n const signatureBytes = base64ToBytes(signatureBase64);\n const messageBytes = new TextEncoder().encode(message);\n\n const publicKey = await crypto.subtle.importKey(\n 'raw',\n publicKeyBytes.buffer as ArrayBuffer,\n {\n name: 'Ed25519',\n namedCurve: 'Ed25519',\n },\n false,\n ['verify']\n );\n\n return await crypto.subtle.verify(\n 'Ed25519',\n publicKey,\n signatureBytes.buffer as ArrayBuffer,\n messageBytes\n );\n } catch (cryptoError) {\n console.error('[Signature] Both @noble/ed25519 and Web Crypto failed:', {\n nobleError: nobleError instanceof Error ? nobleError.message : 'Unknown',\n cryptoError: cryptoError instanceof Error ? cryptoError.message : 'Unknown',\n });\n return false;\n }\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 agentKey: string | undefined;\n\n if (signatureAgent === '\"https://chatgpt.com\"' || signatureAgent?.includes('chatgpt.com')) {\n agent = 'ChatGPT';\n agentKey = 'chatgpt';\n }\n // Add other agents here as needed\n\n if (!agent || !agentKey) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'Unknown signature agent',\n verificationMethod: 'none',\n };\n }\n\n // Get keys (API first, then fallback)\n const knownKeys = await getKeysForAgent(agentKey);\n\n if (knownKeys.length === 0) {\n return {\n isValid: false,\n confidence: 0,\n reason: 'No keys available for 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(key.publicKey, signatureValue, signatureBase);\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 * Uses secure URL parsing to prevent spoofing attacks\n */\nexport function isChatGPTSignature(headers: Record<string, string>): boolean {\n const signatureAgent = headers['signature-agent'] || headers['Signature-Agent'];\n\n if (!signatureAgent) {\n return false;\n }\n\n // Strip leading/trailing quotes if present\n const agentUrlStr = signatureAgent.replace(/^\"+|\"+$/g, '');\n\n // Exact match for the standard ChatGPT signature agent\n if (agentUrlStr === 'https://chatgpt.com') {\n return true;\n }\n\n // Parse URL and validate host to prevent spoofing\n try {\n const agentUrl = new URL(agentUrlStr);\n const allowedHosts = ['chatgpt.com', 'www.chatgpt.com'];\n return allowedHosts.includes(agentUrl.host);\n } catch {\n // Not a valid URL, return false for security\n return false;\n }\n}\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\n// Import the proper DetectionResult type from shared package\nimport type { DetectionResult } from '@kya-os/agentshield-shared';\n\ntype EventHandler = (...args: unknown[]) => void;\n\n// Import signature verifier\nimport {\n verifyAgentSignature,\n hasSignatureHeaders,\n isChatGPTSignature,\n} from './signature-verifier';\nimport {\n loadRulesSync,\n type DetectionRules,\n type UserAgentRule,\n type HeaderRule,\n type IpRangeRule,\n} from '@kya-os/agentshield-shared';\n\n// Load centralized rules - this will fail fast if rules cannot be loaded\nconst rules: DetectionRules = loadRulesSync();\n\n/**\n * Self-contained EdgeAgentDetector implementation with proper signature verification\n */\nclass EdgeAgentDetector {\n private rules: DetectionRules;\n\n constructor() {\n this.rules = rules;\n }\n\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 (convert 0-1 to 0-100)\n confidence = signatureResult.confidence * 100;\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 console.warn('[EdgeAgentDetector] Signature verification failed:', {\n reason: signatureResult.reason,\n agent: signatureResult.agent,\n hasSignatureAgent: !!headers['signature-agent'] || !!headers['Signature-Agent'],\n signatureAgentValue: headers['signature-agent'] || headers['Signature-Agent'],\n });\n confidence = Math.max(confidence, 30); // Updated to 0-100 scale (was 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, 20); // Updated to 0-100 scale (was 0.2)\n reasons.push('signature_verification_error');\n }\n }\n\n // Check User-Agent patterns using centralized rules\n // Sort rules to check more specific patterns first (generic_bot last)\n const userAgent = input.userAgent || input.headers?.['user-agent'] || '';\n if (userAgent) {\n const userAgentEntries = Object.entries(this.rules.rules.userAgents);\n // Sort: put generic_bot, dev_tools, automation_tools last since they have broad patterns\n const genericKeys = ['generic_bot', 'dev_tools', 'automation_tools'];\n const sortedEntries = userAgentEntries.sort((a, b) => {\n const aIsGeneric = genericKeys.includes(a[0]);\n const bIsGeneric = genericKeys.includes(b[0]);\n if (aIsGeneric && !bIsGeneric) return 1;\n if (!aIsGeneric && bIsGeneric) return -1;\n return 0;\n });\n\n for (const [agentKey, agentRule] of sortedEntries) {\n const rule = agentRule as UserAgentRule;\n const matched = rule.patterns.some((pattern: string) => {\n const regex = new RegExp(pattern, 'i');\n return regex.test(userAgent);\n });\n\n if (matched) {\n const agentType = this.getAgentType(agentKey);\n const agentName = this.getAgentName(agentKey);\n\n confidence = Math.max(confidence, rule.confidence * 100); // Convert 0-1 rule confidence to 0-100 scale\n reasons.push(`known_pattern:${agentType}`);\n if (!detectedAgent) {\n detectedAgent = { type: agentType, name: agentName };\n verificationMethod = 'pattern';\n }\n break;\n }\n }\n }\n\n // Check AI-specific headers using centralized rules\n const suspiciousHeaders = this.rules.rules.headers.suspicious;\n const foundAiHeaders = suspiciousHeaders.filter(\n (headerRule: HeaderRule) => normalizedHeaders[headerRule.name.toLowerCase()]\n );\n\n if (foundAiHeaders.length > 0) {\n const maxConfidence = Math.max(...foundAiHeaders.map((h: HeaderRule) => h.confidence * 100)); // Convert 0-1 to 0-100\n confidence = Math.max(confidence, maxConfidence);\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n // Check cloud provider IPs using centralized rules\n const ip = input.ip || input.ipAddress;\n if (ip && !normalizedHeaders['x-forwarded-for'] && !normalizedHeaders['x-real-ip']) {\n // Handle both old (with providers) and new (direct) structures\n const ipRanges =\n 'providers' in this.rules.rules.ipRanges\n ? this.rules.rules.ipRanges.providers\n : this.rules.rules.ipRanges;\n\n for (const [provider, ipRule] of Object.entries(ipRanges)) {\n // Skip non-rule entries\n if (\n !ipRule ||\n typeof ipRule !== 'object' ||\n !('ranges' in ipRule) ||\n !Array.isArray(ipRule.ranges)\n )\n continue;\n\n const matched = ipRule.ranges.some((range: string) => {\n const prefix = range.split('/')[0];\n const prefixParts = prefix.split('.');\n const ipParts = ip.split('.');\n\n // Check if IP starts with the same octets\n for (let i = 0; i < Math.min(prefixParts.length - 1, 2); i++) {\n if (prefixParts[i] !== ipParts[i] && prefixParts[i] !== '0') {\n return false;\n }\n }\n return true;\n });\n\n if (matched) {\n const rule = ipRule as IpRangeRule;\n confidence = Math.max(confidence, rule.confidence * 40); // Convert 0-1 to 0-100 with 0.4 reduction factor\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n\n // Boost confidence for combinations (but not if already at 100 from signature)\n if (reasons.length > 2 && confidence < 100) {\n confidence = Math.min(confidence * 1.2, 95); // Cap at 95 to leave room for cryptographic verification\n }\n\n // Ensure confidence stays within 0-100 range\n confidence = Math.min(Math.max(confidence, 0), 100);\n\n return {\n isAgent: confidence > 30, // Updated to 0-100 scale (was 0.3)\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent // Updated to 0-100 scale\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30 // Updated to 0-100 scale\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n ...(detectedAgent && { detectedAgent }),\n reasons,\n ...(verificationMethod && {\n verificationMethod: verificationMethod as\n | 'signature'\n | 'pattern'\n | 'behavioral'\n | 'network'\n | 'mcp_i_handshake'\n | 'none',\n }),\n forgeabilityRisk:\n verificationMethod === 'signature' ? 'low' : confidence > 80 ? 'medium' : 'high', // Updated to 0-100 scale\n timestamp: new Date(),\n };\n }\n\n /**\n * Get agent type from rule key\n */\n private getAgentType(agentKey: string): string {\n const typeMap: Record<string, string> = {\n openai_gptbot: 'openai',\n anthropic_claude: 'anthropic',\n perplexity_bot: 'perplexity',\n google_ai: 'google',\n microsoft_ai: 'microsoft',\n meta_ai: 'meta',\n cohere_bot: 'cohere',\n huggingface_bot: 'huggingface',\n generic_bot: 'generic',\n dev_tools: 'dev',\n automation_tools: 'automation',\n };\n return typeMap[agentKey] || agentKey;\n }\n\n /**\n * Get agent name from rule key\n */\n private getAgentName(agentKey: string): string {\n const nameMap: Record<string, string> = {\n openai_gptbot: 'ChatGPT/GPTBot',\n anthropic_claude: 'Claude',\n perplexity_bot: 'Perplexity',\n google_ai: 'Google AI',\n microsoft_ai: 'Microsoft Copilot',\n meta_ai: 'Meta AI',\n cohere_bot: 'Cohere',\n huggingface_bot: 'HuggingFace',\n generic_bot: 'Generic Bot',\n dev_tools: 'Development Tool',\n automation_tools: 'Automation Tool',\n };\n return nameMap[agentKey] || agentKey;\n }\n}\n\n/**\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?: unknown) {\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: unknown[]): 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 * 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, AgentShieldRequest } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(config: Partial<NextJSMiddlewareConfig> = {}) {\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 if (handler) {\n detector.on(event, handler as (...args: unknown[]) => void);\n }\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 AgentShieldRequest).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Check for existing session first\n const existingSession = sessionTracker ? await sessionTracker.check(request) : 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('x-agentshield-confidence', existingSession.confidence.toString());\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 AgentShieldRequest).agentShield = {\n result: {\n isAgent: true,\n confidence: existingSession.confidence,\n detectionClass: { type: 'AiAgent' },\n detectedAgent: {\n type: 'ai_agent',\n name: existingSession.agent,\n },\n timestamp: new Date(),\n verificationMethod: 'behavioral',\n reasons: ['Session continued'],\n signals: [],\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: (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 ?? 70) // Updated to 0-100 scale (was 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(([key, value]) => {\n response.headers.set(key, value);\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 // Use console.debug for development logging\n if (process.env.NODE_ENV !== 'production') {\n console.debug('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 }\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 ?? 70) // Updated to 0-100 scale (was 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 AgentShieldRequest).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('x-agentshield-confidence', result.confidence.toString());\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 ?? 70) // Updated to 0-100 scale (was 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 * 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-shared';\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 * 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\ntype MiddlewareFunction = (request: NextRequest) => Promise<NextResponse>;\n\nlet middlewareInstance: MiddlewareFunction | null = null;\nlet isInitializing = false;\nlet initPromise: Promise<MiddlewareFunction> | 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(request: NextRequest): 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 ? middlewareInstance(request) : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };\n","/**\n * Edge-safe detector that doesn't use WebAssembly\n * This is used in Edge Runtime where dynamic code evaluation is not allowed\n */\n\nimport type { DetectionResult, DetectionInput } from '@kya-os/agentshield-shared';\n\n// Known AI agent patterns\nconst AI_AGENT_PATTERNS = [\n { pattern: /chatgpt-user/i, type: 'chatgpt', name: 'ChatGPT' },\n { pattern: /claude-web/i, type: 'claude', name: 'Claude' },\n { pattern: /perplexitybot/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity-user/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /perplexity/i, type: 'perplexity', name: 'Perplexity' },\n { pattern: /bingbot/i, type: 'bing', name: 'Bing AI' },\n { pattern: /anthropic-ai/i, type: 'anthropic', name: 'Anthropic' },\n];\n\n/**\n * Edge-safe pattern detection without WASM\n */\nexport class EdgeSafeDetector {\n async analyze(input: DetectionInput): Promise<DetectionResult> {\n const reasons: string[] = [];\n let detectedAgent: { type: string; name: string } | undefined;\n let confidence = 0;\n\n const headers = input.headers || {};\n const normalizedHeaders: Record<string, string> = {};\n\n // Normalize header names to lowercase\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Check User-Agent patterns\n const userAgent = input.userAgent || normalizedHeaders['user-agent'] || '';\n if (userAgent) {\n for (const { pattern, type, name } of AI_AGENT_PATTERNS) {\n if (pattern.test(userAgent)) {\n confidence = 85; // Updated to 0-100 scale (was 0.85)\n reasons.push(`known_pattern:${type}`);\n detectedAgent = { type, name };\n break;\n }\n }\n }\n\n // Check for browser UA without browser headers (Perplexity pattern)\n const hasChrome = userAgent.toLowerCase().includes('chrome');\n const hasFirefox = userAgent.toLowerCase().includes('firefox');\n const hasSafari = userAgent.toLowerCase().includes('safari');\n const hasBrowserUA = hasChrome || hasFirefox || hasSafari;\n\n if (hasBrowserUA) {\n const hasSecChUa = !!normalizedHeaders['sec-ch-ua'];\n const hasSecFetch = !!normalizedHeaders['sec-fetch-site'];\n const hasAcceptLanguage = !!normalizedHeaders['accept-language'];\n const hasCookies = !!normalizedHeaders['cookie'];\n\n const missingHeaders = [];\n if (!hasSecChUa && hasChrome) missingHeaders.push('sec-ch-ua');\n if (!hasSecFetch) missingHeaders.push('sec-fetch');\n if (!hasAcceptLanguage) missingHeaders.push('accept-language');\n if (!hasCookies) missingHeaders.push('cookies');\n\n if (missingHeaders.length >= 2) {\n confidence = Math.max(confidence, 85); // Updated to 0-100 scale (was 0.85)\n reasons.push('browser_ua_missing_headers');\n if (!detectedAgent && hasChrome && !hasSecChUa) {\n detectedAgent = { type: 'perplexity', name: 'Perplexity' };\n }\n }\n }\n\n // Check for AI-specific headers\n const aiHeaders = ['openai-conversation-id', 'anthropic-client-id', 'x-goog-api-client'];\n\n const foundAiHeaders = aiHeaders.filter((h) => normalizedHeaders[h]);\n if (foundAiHeaders.length > 0) {\n confidence = Math.max(confidence, 60); // Updated to 0-100 scale (was 0.6)\n reasons.push(`ai_headers:${foundAiHeaders.length}`);\n }\n\n return {\n isAgent: confidence > 30, // Updated to 0-100 scale (was 0.3)\n confidence,\n detectionClass:\n confidence > 30 && detectedAgent // Updated to 0-100 scale\n ? { type: 'AiAgent' as const, agentType: detectedAgent.name }\n : confidence > 30 // Updated to 0-100 scale\n ? { type: 'Unknown' as const }\n : { type: 'Human' as const },\n signals: [], // Will be populated by enhanced detection engine in future tasks\n detectedAgent,\n reasons,\n verificationMethod: 'pattern',\n timestamp: new Date(),\n confidenceLevel: confidence >= 80 ? 'high' : confidence >= 50 ? 'medium' : 'low', // Updated to 0-100 scale\n };\n }\n}\n","/**\n * In-memory storage adapter for development/testing\n */\n\nimport type { StorageAdapter, AgentDetectionEvent, AgentSession } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private events: Map<string, AgentDetectionEvent> = new Map();\n private sessions: Map<string, AgentSession> = new Map();\n private eventTimeline: Array<{ timestamp: number; eventId: string }> = [];\n private maxEvents: number = 1000;\n private maxSessions: number = 100;\n\n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n const eventKey = `${event.timestamp}:${event.eventId}`;\n this.events.set(eventKey, event);\n \n // Add to timeline\n this.eventTimeline.push({\n timestamp: Date.parse(event.timestamp),\n eventId: eventKey,\n });\n \n // Sort timeline by timestamp\n this.eventTimeline.sort((a, b) => b.timestamp - a.timestamp);\n \n // Maintain size limit\n if (this.eventTimeline.length > this.maxEvents) {\n const removed = this.eventTimeline.splice(this.maxEvents);\n removed.forEach(item => this.events.delete(item.eventId));\n }\n }\n\n async getRecentEvents(limit: number = 100): Promise<AgentDetectionEvent[]> {\n const recent = this.eventTimeline.slice(0, limit);\n return recent\n .map(item => this.events.get(item.eventId))\n .filter((event): event is AgentDetectionEvent => event !== undefined);\n }\n\n async getSessionEvents(sessionId: string): Promise<AgentDetectionEvent[]> {\n const events: AgentDetectionEvent[] = [];\n for (const event of this.events.values()) {\n if (event.sessionId === sessionId) {\n events.push(event);\n }\n }\n return events.sort((a, b) => \n Date.parse(b.timestamp) - Date.parse(a.timestamp)\n );\n }\n\n async storeSession(session: AgentSession): Promise<void> {\n this.sessions.set(session.sessionId, session);\n \n // Maintain size limit\n if (this.sessions.size > this.maxSessions) {\n // Remove oldest sessions\n const sortedSessions = Array.from(this.sessions.entries())\n .sort((a, b) => Date.parse(b[1].lastSeen) - Date.parse(a[1].lastSeen));\n \n const toRemove = sortedSessions.slice(this.maxSessions);\n toRemove.forEach(([id]) => this.sessions.delete(id));\n }\n }\n\n async getSession(sessionId: string): Promise<AgentSession | null> {\n return this.sessions.get(sessionId) || null;\n }\n\n async getRecentSessions(limit: number = 10): Promise<AgentSession[]> {\n const sorted = Array.from(this.sessions.values())\n .sort((a, b) => Date.parse(b.lastSeen) - Date.parse(a.lastSeen));\n return sorted.slice(0, limit);\n }\n\n async cleanup(olderThan: Date): Promise<void> {\n const cutoff = olderThan.getTime();\n \n // Clean up events\n this.eventTimeline = this.eventTimeline.filter(item => {\n if (item.timestamp < cutoff) {\n this.events.delete(item.eventId);\n return false;\n }\n return true;\n });\n \n // Clean up sessions\n for (const [id, session] of this.sessions.entries()) {\n if (Date.parse(session.lastSeen) < cutoff) {\n this.sessions.delete(id);\n }\n }\n }\n}","/**\n * Redis storage adapter for production use\n */\n\nimport type { StorageAdapter, AgentDetectionEvent, AgentSession } from './types';\n\nexport interface RedisClient {\n get<T>(key: string): Promise<T | null>;\n set(key: string, value: string | number | Buffer): Promise<string | null>;\n setex(key: string, ttl: number, value: string | number | Buffer): Promise<string | null>;\n zadd(key: string, options: { score: number; member: string }): Promise<number | null>;\n zrange(key: string, start: number, stop: number): Promise<string[]>;\n zrevrange(key: string, start: number, stop: number): Promise<string[]>;\n zcard(key: string): Promise<number | null>;\n zremrangebyrank(key: string, start: number, stop: number): Promise<number | null>;\n del(key: string | string[]): Promise<number>;\n scan(cursor: number, options?: { match?: string; count?: number }): Promise<[string, string[]]>;\n}\n\nexport class RedisStorageAdapter implements StorageAdapter {\n private redis: RedisClient;\n private ttl: number;\n private keyPrefix: string = 'agent-shield';\n\n constructor(redis: RedisClient, ttl: number = 86400) {\n this.redis = redis;\n this.ttl = ttl;\n }\n\n private eventKey(timestamp: string, eventId: string): string {\n return `${this.keyPrefix}:events:${timestamp}:${eventId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `${this.keyPrefix}:sessions:${sessionId}`;\n }\n\n private timelineKey(): string {\n return `${this.keyPrefix}:events:timeline`;\n }\n\n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n const key = this.eventKey(event.timestamp, event.eventId);\n\n // Store the event with TTL\n await this.redis.setex(key, this.ttl, JSON.stringify(event));\n\n // Add to timeline sorted set\n await this.redis.zadd(this.timelineKey(), {\n score: Date.parse(event.timestamp),\n member: key,\n });\n\n // Maintain timeline size (keep last 1000 events)\n const count = await this.redis.zcard(this.timelineKey());\n if (count && count > 1000) {\n await this.redis.zremrangebyrank(this.timelineKey(), 0, -1001);\n }\n }\n\n async getRecentEvents(limit: number = 100): Promise<AgentDetectionEvent[]> {\n // Get most recent event keys from timeline\n const keys = await this.redis.zrevrange(this.timelineKey(), 0, limit - 1);\n\n if (!keys || keys.length === 0) {\n return [];\n }\n\n // Fetch events\n const events: AgentDetectionEvent[] = [];\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const event = typeof data === 'string' ? JSON.parse(data) : data;\n events.push(event as AgentDetectionEvent);\n } catch (e) {\n console.error(`Failed to parse event ${key}:`, e);\n }\n }\n }\n\n return events;\n }\n\n async getSessionEvents(sessionId: string): Promise<AgentDetectionEvent[]> {\n // Get all event keys from timeline\n const keys = await this.redis.zrevrange(this.timelineKey(), 0, -1);\n\n if (!keys || keys.length === 0) {\n return [];\n }\n\n // Fetch and filter events\n const events: AgentDetectionEvent[] = [];\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const event = typeof data === 'string' ? JSON.parse(data) : data;\n if ((event as AgentDetectionEvent).sessionId === sessionId) {\n events.push(event as AgentDetectionEvent);\n }\n } catch (e) {\n console.error(`Failed to parse event ${key}:`, e);\n }\n }\n }\n\n return events;\n }\n\n async storeSession(session: AgentSession): Promise<void> {\n const key = this.sessionKey(session.sessionId);\n\n // Check if session exists\n const existing = await this.redis.get<string>(key);\n\n if (existing) {\n // Update existing session\n const existingSession = typeof existing === 'string' ? JSON.parse(existing) : existing;\n const methods = new Set([\n ...(existingSession.verificationMethods || []),\n ...session.verificationMethods,\n ]);\n\n const updatedSession: AgentSession = {\n ...existingSession,\n lastSeen: session.lastSeen,\n eventCount: session.eventCount,\n paths: Array.from(new Set([...existingSession.paths, ...session.paths])),\n averageConfidence: session.averageConfidence,\n verificationMethods: Array.from(methods),\n };\n\n await this.redis.setex(key, this.ttl, JSON.stringify(updatedSession));\n } else {\n // Store new session\n await this.redis.setex(key, this.ttl, JSON.stringify(session));\n }\n }\n\n async getSession(sessionId: string): Promise<AgentSession | null> {\n const key = this.sessionKey(sessionId);\n const data = await this.redis.get<string>(key);\n\n if (!data) {\n return null;\n }\n\n try {\n return typeof data === 'string' ? JSON.parse(data) : data;\n } catch (e) {\n console.error(`Failed to parse session ${sessionId}:`, e);\n return null;\n }\n }\n\n async getRecentSessions(limit: number = 10): Promise<AgentSession[]> {\n // Scan for session keys\n const pattern = `${this.keyPrefix}:sessions:*`;\n const sessions: AgentSession[] = [];\n let cursor = 0;\n\n do {\n const [nextCursor, keys] = await this.redis.scan(cursor, {\n match: pattern,\n count: 100,\n });\n\n cursor = parseInt(nextCursor);\n\n for (const key of keys) {\n const data = await this.redis.get<string>(key);\n if (data) {\n try {\n const session = typeof data === 'string' ? JSON.parse(data) : data;\n sessions.push(session as AgentSession);\n } catch (e) {\n console.error(`Failed to parse session from ${key}:`, e);\n }\n }\n }\n } while (cursor !== 0 && sessions.length < limit * 2); // Get extra to sort\n\n // Sort by lastSeen and return limit\n return sessions.sort((a, b) => Date.parse(b.lastSeen) - Date.parse(a.lastSeen)).slice(0, limit);\n }\n\n async cleanup(olderThan: Date): Promise<void> {\n // Note: With TTL, Redis automatically cleans up old data\n // This method is optional for manual cleanup\n\n const cutoff = olderThan.getTime();\n\n // Clean up old events from timeline\n await this.redis.zremrangebyrank(this.timelineKey(), 0, Math.floor(cutoff / 1000));\n\n // Sessions will expire automatically with TTL\n }\n}\n","/**\n * Storage adapter exports and factory\n */\n\nexport * from './types';\nexport { MemoryStorageAdapter } from './memory-adapter';\nexport { RedisStorageAdapter } from './redis-adapter';\n\nimport type { StorageAdapter, StorageConfig } from './types';\nimport { MemoryStorageAdapter } from './memory-adapter';\nimport { RedisStorageAdapter } from './redis-adapter';\nimport type { RedisClient } from './redis-adapter';\n\n/**\n * Create a storage adapter based on configuration\n */\nexport async function createStorageAdapter(config?: StorageConfig): Promise<StorageAdapter> {\n if (!config || config.type === 'memory') {\n return new MemoryStorageAdapter();\n }\n\n if (config.type === 'custom' && config.custom) {\n return config.custom;\n }\n\n if (config.type === 'redis' && config.redis) {\n // Dynamically import Redis client using a pattern that prevents static analysis\n // This ensures the bundler doesn't try to resolve @upstash/redis at build time\n try {\n // Use variable to prevent static analysis by bundler\n const redisModuleName = '@upstash/redis';\n // @ts-expect-error - Optional peer dependency, dynamically loaded\n const redisModule = await import(/* webpackIgnore: true */ redisModuleName);\n const Redis = redisModule.Redis;\n const redis = new Redis({\n url: config.redis.url,\n token: config.redis.token,\n });\n // Upstash Redis client matches our RedisClient interface\n return new RedisStorageAdapter(redis as unknown as RedisClient, config.ttl);\n } catch (error) {\n console.warn(\n '[AgentShield] Redis storage requires @upstash/redis package. Install with: npm install @upstash/redis',\n '\\nFalling back to memory storage.'\n );\n return new MemoryStorageAdapter();\n }\n }\n\n // Default to memory storage\n return new MemoryStorageAdapter();\n}\n","/**\n * Enhanced Next.js middleware with all features built-in\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { EdgeSafeDetector } from './edge-safe-detector';\nimport { createStorageAdapter } from './storage';\nimport type { StorageAdapter, StorageConfig, AgentDetectionEvent } from './storage/types';\nimport type { DetectionResult, DetectionInput } from '@kya-os/agentshield-shared';\nimport type { EdgeAgentDetectorWrapperWithWasm } from './edge-detector-with-wasm';\n\n/**\n * Enhanced configuration with built-in features\n */\nexport interface EnhancedMiddlewareConfig {\n /**\n * Storage configuration\n */\n storage?: StorageConfig;\n\n /**\n * Session tracking configuration\n */\n sessionTracking?: {\n enabled?: boolean;\n ttl?: number;\n };\n\n /**\n * Paths to skip detection\n */\n skipPaths?: string[];\n\n /**\n * Action when agent detected\n */\n onAgentDetected?: 'block' | 'log' | 'allow';\n\n /**\n * Custom handler for agent detection\n */\n onDetection?: (result: DetectionResult, context: DetectionInput) => void | Promise<void>;\n\n /**\n * Confidence threshold\n */\n confidenceThreshold?: number;\n\n /**\n * Response when blocking\n */\n blockedResponse?: {\n status?: number;\n message?: string;\n };\n}\n\n/**\n * Session tracking helper\n */\nclass SessionManager {\n private sessionLastActivity = new Map<string, number>();\n\n generateSessionId(ipAddress?: string, userAgent?: string): string {\n const now = Date.now();\n const timeWindow = Math.floor(now / (5 * 60 * 1000)); // 5-minute windows\n const baseKey = `${ipAddress || 'unknown'}:${userAgent || 'unknown'}`;\n const windowKey = `${baseKey}:${timeWindow}`;\n\n const lastActivity = this.sessionLastActivity.get(windowKey);\n const shouldCreateNewSession = !lastActivity || now - lastActivity > 30000;\n\n this.sessionLastActivity.set(windowKey, now);\n\n // Clean up old entries\n if (this.sessionLastActivity.size > 100) {\n const cutoff = now - 600000;\n for (const [key, time] of this.sessionLastActivity.entries()) {\n if (time < cutoff) {\n this.sessionLastActivity.delete(key);\n }\n }\n }\n\n const data = shouldCreateNewSession ? `${windowKey}:${now}` : `${windowKey}:${lastActivity}`;\n\n // Simple hash\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return Math.abs(hash).toString(16).padStart(12, '0').substring(0, 12);\n }\n}\n\n/**\n * Create enhanced AgentShield middleware with all features\n */\nexport function createEnhancedAgentShieldMiddleware(config: EnhancedMiddlewareConfig = {}) {\n // Initialize storage adapter\n let storageAdapter: StorageAdapter | null = null;\n let storageInitPromise: Promise<StorageAdapter> | null = null;\n\n const getStorage = async () => {\n if (storageAdapter) return storageAdapter;\n if (storageInitPromise) return storageInitPromise;\n\n storageInitPromise = createStorageAdapter(config.storage).then((adapter) => {\n storageAdapter = adapter;\n return adapter;\n });\n\n return storageInitPromise;\n };\n\n // Initialize detector - Edge Runtime safe\n type DetectorType = EdgeSafeDetector | EdgeAgentDetectorWrapperWithWasm;\n let detector: DetectorType | null = null;\n let detectorInitPromise: Promise<void> | null = null;\n let wasmConfidenceUtils: typeof import('./wasm-confidence') | null = null;\n\n const getDetector = async (requestUrl?: string) => {\n if (detector) {\n return detector;\n }\n if (detectorInitPromise) {\n await detectorInitPromise;\n return detector!;\n }\n\n detectorInitPromise = (async () => {\n // Check if we're in Edge Runtime\n const isEdgeRuntime =\n typeof (globalThis as { EdgeRuntime?: unknown }).EdgeRuntime !== 'undefined' ||\n process.env.NEXT_RUNTIME === 'edge';\n\n if (isEdgeRuntime) {\n // Use Edge-safe detector (no WASM)\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] Edge Runtime detected - using pattern detection');\n }\n detector = new EdgeSafeDetector();\n } else {\n try {\n // Try to load WASM confidence utilities first\n try {\n const wasmUtils = await import('./wasm-confidence');\n wasmConfidenceUtils = wasmUtils;\n const wasmAvailable = await wasmUtils.checkWasmAvailability();\n\n if (wasmAvailable) {\n // Dynamically import WASM detector only when not in Edge Runtime\n const { EdgeAgentDetectorWrapperWithWasm } = await import(\n './edge-detector-with-wasm'\n );\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] ✅ WASM support detected - enhanced detection enabled'\n );\n }\n detector = new EdgeAgentDetectorWrapperWithWasm({ enableWasm: true });\n if (requestUrl && 'setBaseUrl' in detector) {\n detector.setBaseUrl(requestUrl);\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n console.debug(\n '[AgentShield] ℹ️ Using pattern-based detection (WASM not available)'\n );\n }\n detector = new EdgeSafeDetector();\n }\n } catch (wasmError) {\n // WASM utilities not available\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[AgentShield] WASM utilities not available, using pattern detection');\n }\n detector = new EdgeSafeDetector();\n }\n } catch (error) {\n // Fallback to Edge-safe detector\n console.warn('[AgentShield] Failed to initialize enhanced detector, using fallback');\n detector = new EdgeSafeDetector();\n }\n }\n })();\n\n await detectorInitPromise;\n return detector!;\n };\n\n // Session manager\n const sessionManager = new SessionManager();\n const sessionTrackingEnabled = config.sessionTracking?.enabled !== false;\n\n // Return the middleware function\n return async (request: NextRequest): Promise<NextResponse> => {\n const { pathname } = request.nextUrl;\n\n // Check if path should be skipped\n if (config.skipPaths?.some((path) => pathname.startsWith(path))) {\n return NextResponse.next();\n }\n\n // Extract request context\n const userAgent = request.headers.get('user-agent');\n const ipAddress = request.ip ?? request.headers.get('x-forwarded-for');\n const url = new URL(request.url);\n const pathWithQuery = url.pathname + url.search;\n\n const context = {\n userAgent: userAgent || '',\n ipAddress: ipAddress || '',\n headers: Object.fromEntries(request.headers.entries()),\n url: pathWithQuery,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Run detection with lazy-loaded detector (pass request URL for WASM loading)\n const activeDetector = await getDetector(request.url);\n const result = await activeDetector.analyze(context);\n\n // Apply WASM confidence boost if applicable\n let finalConfidence = result.confidence;\n let verificationMethod: string = result.verificationMethod || 'pattern';\n\n if (result.isAgent && wasmConfidenceUtils) {\n const reasons = result.reasons || [];\n\n if (wasmConfidenceUtils.shouldIndicateWasmVerification(result.confidence)) {\n finalConfidence = wasmConfidenceUtils.getWasmConfidenceBoost(result.confidence, reasons);\n verificationMethod = wasmConfidenceUtils.getVerificationMethod(finalConfidence, reasons);\n }\n }\n\n // Handle high-confidence detection\n if (result.isAgent && finalConfidence >= (config.confidenceThreshold ?? 0.7)) {\n // Store event if storage is configured and session tracking is enabled\n if (sessionTrackingEnabled) {\n const storage = await getStorage();\n const sessionId = sessionManager.generateSessionId(\n ipAddress || undefined,\n userAgent || undefined\n );\n\n // Create event\n const event: AgentDetectionEvent = {\n eventId: `agent_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\n sessionId,\n timestamp: new Date().toISOString(),\n agentType: result.detectedAgent?.type || 'unknown',\n agentName: result.detectedAgent?.name || 'Unknown',\n confidence: finalConfidence,\n path: pathWithQuery,\n ...(userAgent && { userAgent }),\n ...(ipAddress && { ipAddress }),\n method: request.method,\n detectionReasons: result.reasons || [],\n verificationMethod,\n detectionDetails: {\n patterns: (result.detectedAgent as { patterns?: string[] })?.patterns,\n behaviors: (result.detectedAgent as { behaviors?: string[] })?.behaviors,\n fingerprintMatches: (result.detectedAgent as { fingerprints?: string[] })?.fingerprints,\n },\n };\n\n // Store event\n try {\n await storage.storeEvent(event);\n\n // Get or create session\n let session = await storage.getSession(sessionId);\n\n if (session) {\n // Update existing session\n session.lastSeen = event.timestamp;\n session.eventCount++;\n if (!session.paths.includes(pathWithQuery)) {\n session.paths.push(pathWithQuery);\n }\n session.averageConfidence =\n (session.averageConfidence * (session.eventCount - 1) + finalConfidence) /\n session.eventCount;\n if (!session.verificationMethods.includes(verificationMethod)) {\n session.verificationMethods.push(verificationMethod);\n }\n } else {\n // Create new session\n session = {\n sessionId,\n ...(ipAddress && { ipAddress }),\n ...(userAgent && { userAgent }),\n agentType: result.detectedAgent?.type || 'unknown',\n agentName: result.detectedAgent?.name || 'Unknown',\n firstSeen: event.timestamp,\n lastSeen: event.timestamp,\n eventCount: 1,\n paths: [pathWithQuery],\n averageConfidence: finalConfidence,\n verificationMethods: [verificationMethod],\n };\n }\n\n if (session) {\n await storage.storeSession(session);\n }\n } catch (error) {\n console.error('[AgentShield] Failed to store event:', error);\n }\n }\n\n // Call custom handler if provided\n if (config.onDetection) {\n await config.onDetection(result, context);\n }\n\n // Handle based on configuration\n switch (config.onAgentDetected) {\n case 'block': {\n const { status = 403, message = 'Access denied: AI agent detected' } =\n config.blockedResponse || {};\n\n const response = NextResponse.json(\n { error: message, detected: true, confidence: finalConfidence },\n { status }\n );\n\n // Add detection headers\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set(\n 'x-agentshield-confidence',\n String(Math.round(finalConfidence * 100))\n );\n response.headers.set('x-agentshield-agent', result.detectedAgent?.name || 'Unknown');\n response.headers.set('x-agentshield-verification', verificationMethod);\n\n return response;\n }\n\n case 'log': {\n // Only log high-confidence or interesting detections\n const isInteresting =\n finalConfidence >= 0.9 ||\n result.detectedAgent?.name?.toLowerCase().includes('chatgpt') ||\n result.detectedAgent?.name?.toLowerCase().includes('perplexity') ||\n verificationMethod === 'signature';\n\n if (isInteresting && process.env.NODE_ENV !== 'production') {\n console.debug(`[AgentShield] 🤖 AI Agent detected (${verificationMethod}):`, {\n agent: result.detectedAgent?.name,\n confidence: `${(finalConfidence * 100).toFixed(0)}%`,\n path: pathWithQuery,\n verification: verificationMethod,\n });\n }\n break;\n }\n\n case 'allow':\n default:\n // Continue processing\n break;\n }\n }\n\n // Create response with detection headers\n const response = NextResponse.next();\n\n if (result.isAgent) {\n response.headers.set('x-agentshield-detected', 'true');\n response.headers.set('x-agentshield-confidence', String(Math.round(finalConfidence * 100)));\n response.headers.set('x-agentshield-agent', result.detectedAgent?.name || 'Unknown');\n response.headers.set('x-agentshield-verification', verificationMethod);\n\n // Add custom headers for high confidence\n if (finalConfidence > 0.9) {\n response.headers.set('x-ai-visitor', 'true');\n response.headers.set('x-ai-confidence', finalConfidence.toString());\n response.headers.set('x-ai-verification', verificationMethod);\n }\n }\n\n return response;\n };\n}\n\n/**\n * Export storage types for user access\n */\nexport type {\n StorageAdapter,\n StorageConfig,\n AgentDetectionEvent,\n AgentSession,\n} from './storage/types';\n","/**\n * AgentShield API Client\n *\n * Lightweight client for calling the AgentShield enforce API from middleware.\n * Designed for Edge Runtime compatibility (no Node.js-specific APIs).\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * API client configuration\n */\nexport interface AgentShieldClientConfig {\n /** API key for authentication */\n apiKey: string;\n /** API base URL (defaults to production) */\n baseUrl?: string;\n /**\n * Use edge detection for lower latency (~30-50ms vs ~150ms) and better coverage.\n * Edge detection can identify non-JS clients (curl, Python, Claude Code WebFetch)\n * that the pixel cannot detect since they don't execute JavaScript.\n * @default true\n */\n useEdge?: boolean;\n /** Request timeout in milliseconds (default: 5000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Enforcement action\n */\nexport type EnforcementAction = 'allow' | 'block' | 'redirect' | 'challenge' | 'log';\n\n/**\n * Enforcement decision from the API\n */\nexport interface EnforcementDecision {\n action: EnforcementAction;\n reason: string;\n isAgent: boolean;\n confidence: number;\n agentName?: string;\n agentType?: string;\n redirectUrl?: string;\n message?: string;\n metadata?: {\n policyVersion?: string;\n signatureVerified?: boolean;\n denyListMatch?: {\n clientDid?: string;\n agentDid?: string;\n clientName?: string;\n reason?: string;\n };\n };\n}\n\n/**\n * Detection result (optional in response)\n */\nexport interface DetectionResult {\n isAgent: boolean;\n confidence: number;\n agentName?: string;\n agentType?: string;\n verificationMethod?: string;\n reasons?: string[];\n /** Detection engine used: 'wasm' or 'javascript-fallback' */\n detectionMethod?: string;\n}\n\n/**\n * Enforce API response\n */\nexport interface EnforceResponse {\n success: boolean;\n data?: {\n decision: EnforcementDecision;\n processingTimeMs: number;\n requestId: string;\n detection?: DetectionResult;\n };\n error?: {\n code: string;\n message: string;\n };\n}\n\n/**\n * Request input for enforce API\n */\nexport interface EnforceInput {\n /** HTTP headers from the incoming request */\n headers?: Record<string, string>;\n /** User-Agent header */\n userAgent?: string;\n /** Client IP address */\n ipAddress?: string;\n /** Request path */\n path?: string;\n /** Request URL */\n url?: string;\n /** HTTP method */\n method?: string;\n /** Request ID for tracing */\n requestId?: string;\n /** Options */\n options?: {\n /** Include full detection result */\n includeDetectionResult?: boolean;\n /** Cache TTL override */\n cacheTTL?: number;\n };\n}\n\n// ============================================================================\n// Client Implementation\n// ============================================================================\n\nconst DEFAULT_BASE_URL = 'https://kya.vouched.id';\nconst EDGE_DETECT_URL = 'https://detect.kya-os.ai';\nconst DEFAULT_TIMEOUT = 5000;\n\n/**\n * AgentShield API Client\n *\n * @example\n * ```typescript\n * const client = new AgentShieldClient({\n * apiKey: process.env.AGENTSHIELD_API_KEY!,\n * });\n *\n * const result = await client.enforce({\n * headers: Object.fromEntries(request.headers),\n * path: request.nextUrl.pathname,\n * method: request.method,\n * });\n *\n * if (result.decision.action === 'block') {\n * return new Response('Access denied', { status: 403 });\n * }\n * ```\n */\nexport class AgentShieldClient {\n private apiKey: string;\n private baseUrl: string;\n private useEdge: boolean;\n private timeout: number;\n private debug: boolean;\n\n constructor(config: AgentShieldClientConfig) {\n if (!config.apiKey) {\n throw new Error('AgentShield API key is required');\n }\n\n this.apiKey = config.apiKey;\n // Default to edge detection for better coverage (detects non-JS clients)\n this.useEdge = config.useEdge !== false; // true by default\n this.baseUrl = config.baseUrl || (this.useEdge ? EDGE_DETECT_URL : DEFAULT_BASE_URL);\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n this.debug = config.debug || false;\n }\n\n /**\n * Call the enforce API to check if a request should be allowed\n */\n async enforce(input: EnforceInput): Promise<EnforceResponse> {\n const startTime = Date.now();\n\n try {\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Use edge endpoint or Vercel API based on configuration\n const endpoint = this.useEdge\n ? `${this.baseUrl}/__detect/enforce`\n : `${this.baseUrl}/api/v1/enforce`;\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Request-ID': input.requestId || crypto.randomUUID(),\n },\n body: JSON.stringify(input),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Parse response\n const data = (await response.json()) as EnforceResponse;\n\n if (this.debug) {\n console.log('[AgentShield] Enforce response:', {\n status: response.status,\n action: data.data?.decision.action,\n processingTimeMs: Date.now() - startTime,\n });\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: `HTTP_${response.status}`,\n message: data.error?.message || `HTTP error: ${response.status}`,\n },\n };\n }\n\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n } catch (error) {\n // Handle timeout\n if (error instanceof Error && error.name === 'AbortError') {\n if (this.debug) {\n console.warn('[AgentShield] Request timed out');\n }\n return {\n success: false,\n error: {\n code: 'TIMEOUT',\n message: `Request timed out after ${this.timeout}ms`,\n },\n };\n }\n\n // Handle network errors\n if (this.debug) {\n console.error('[AgentShield] Request failed:', error);\n }\n\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: error instanceof Error ? error.message : 'Network request failed',\n },\n };\n }\n }\n\n /**\n * Quick check - returns just the action without full response parsing\n * Useful for very fast middleware that just needs allow/block\n */\n async quickCheck(input: EnforceInput): Promise<{\n action: EnforcementAction;\n error?: string;\n }> {\n const result = await this.enforce(input);\n\n if (!result.success || !result.data) {\n // On error, default to allow (fail-open)\n return {\n action: 'allow',\n error: result.error?.message,\n };\n }\n\n return {\n action: result.data.decision.action,\n };\n }\n}\n\n/**\n * Create a singleton client instance\n *\n * @example\n * ```typescript\n * // In middleware.ts\n * import { getAgentShieldClient } from '@kya-os/agentshield-nextjs';\n *\n * const client = getAgentShieldClient();\n * ```\n */\nlet clientInstance: AgentShieldClient | null = null;\n\nexport function getAgentShieldClient(config?: Partial<AgentShieldClientConfig>): AgentShieldClient {\n if (!clientInstance) {\n const apiKey = config?.apiKey || process.env.AGENTSHIELD_API_KEY;\n\n if (!apiKey) {\n throw new Error(\n 'AgentShield API key is required. Set AGENTSHIELD_API_KEY environment variable or pass apiKey in config.'\n );\n }\n\n clientInstance = new AgentShieldClient({\n apiKey,\n baseUrl: config?.baseUrl || process.env.AGENTSHIELD_API_URL,\n // Default to edge detection unless explicitly disabled\n useEdge: config?.useEdge ?? process.env.AGENTSHIELD_USE_EDGE !== 'false',\n timeout: config?.timeout,\n debug: config?.debug || process.env.AGENTSHIELD_DEBUG === 'true',\n });\n }\n\n return clientInstance;\n}\n\n/**\n * Reset the singleton client (useful for testing)\n */\nexport function resetAgentShieldClient(): void {\n clientInstance = null;\n}\n","/**\n * API-based AgentShield Middleware for Next.js\n *\n * This middleware uses the AgentShield API for detection and enforcement,\n * instead of running detection locally. This approach:\n *\n * 1. Works reliably in Edge Runtime (no WASM loading issues)\n * 2. Ensures consistent detection across all platforms\n * 3. Applies centralized policies from the dashboard\n * 4. Supports deny lists, thresholds, and path rules\n *\n * @example\n * ```typescript\n * // middleware.ts\n * import { withAgentShield } from '@kya-os/agentshield-nextjs/api-middleware';\n *\n * export default withAgentShield({\n * apiKey: process.env.AGENTSHIELD_API_KEY!,\n * // Optional overrides:\n * onBlock: 'redirect', // 'block' | 'redirect' | 'challenge'\n * redirectUrl: '/blocked',\n * skipPaths: ['/api/health', '/_next/*'],\n * });\n *\n * export const config = {\n * matcher: ['/((?!_next/static|favicon.ico).*)'],\n * };\n * ```\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentShieldClient, getAgentShieldClient, type EnforcementDecision } from './api-client';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Middleware configuration\n */\nexport interface AgentShieldMiddlewareConfig {\n /** API key (or use AGENTSHIELD_API_KEY env var) */\n apiKey?: string;\n /** API base URL (defaults to production) */\n apiUrl?: string;\n /**\n * Use edge detection for lower latency (~30-50ms vs ~150ms) and better coverage.\n * Edge detection can identify non-JS clients (curl, Python, Claude Code WebFetch)\n * that the pixel cannot detect since they don't execute JavaScript.\n * Set to false to use the Vercel API instead.\n * @default true\n */\n useEdge?: boolean;\n /** Request timeout in ms (default: 5000) */\n timeout?: number;\n\n /**\n * Action to take when an agent should be blocked\n * - 'block': Return 403 response\n * - 'redirect': Redirect to redirectUrl\n * - 'challenge': Show a challenge page (future)\n * Default: uses policy from dashboard\n */\n onBlock?: 'block' | 'redirect' | 'challenge';\n\n /**\n * URL to redirect to when blocking (if onBlock is 'redirect')\n * Default: uses redirectUrl from dashboard policy\n */\n redirectUrl?: string;\n\n /**\n * Custom blocked response\n */\n blockedResponse?: {\n status?: number;\n message?: string;\n headers?: Record<string, string>;\n };\n\n /**\n * Paths to skip (in addition to dashboard policy)\n * Supports glob patterns: '/api/*', '/_next/*'\n */\n skipPaths?: string[];\n\n /**\n * Only enforce on these paths (overrides dashboard policy)\n */\n includePaths?: string[];\n\n /**\n * Callback when an agent is detected\n */\n onAgentDetected?: (request: NextRequest, decision: EnforcementDecision) => void | Promise<void>;\n\n /**\n * Callback to customize the blocked response\n */\n customBlockedResponse?: (\n request: NextRequest,\n decision: EnforcementDecision\n ) => NextResponse | Promise<NextResponse>;\n\n /**\n * Whether to fail open (allow) on API errors\n * Default: true (recommended for production)\n */\n failOpen?: boolean;\n\n /**\n * Enable debug logging\n */\n debug?: boolean;\n}\n\n// ============================================================================\n// Path Matching\n// ============================================================================\n\n/**\n * Check if a path matches a pattern\n */\nfunction matchPath(path: string, pattern: string): boolean {\n // Handle exact match\n if (pattern === path) return true;\n\n // Handle glob patterns\n if (pattern.includes('*')) {\n const regexPattern = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex chars\n .replace(/\\*/g, '.*'); // Convert * to .*\n return new RegExp(`^${regexPattern}$`).test(path);\n }\n\n // Handle prefix match\n if (pattern.endsWith('/')) {\n return path.startsWith(pattern) || path === pattern.slice(0, -1);\n }\n\n return path.startsWith(pattern);\n}\n\n/**\n * Check if path should be skipped\n */\nfunction shouldSkipPath(path: string, skipPaths: string[]): boolean {\n return skipPaths.some((pattern) => matchPath(path, pattern));\n}\n\n/**\n * Check if path should be included (if includePaths is set)\n */\nfunction shouldIncludePath(path: string, includePaths?: string[]): boolean {\n if (!includePaths || includePaths.length === 0) return true;\n return includePaths.some((pattern) => matchPath(path, pattern));\n}\n\n// ============================================================================\n// Response Builders\n// ============================================================================\n\n/**\n * Build blocked response\n */\nfunction buildBlockedResponse(\n decision: EnforcementDecision,\n config: AgentShieldMiddlewareConfig\n): NextResponse {\n const status = config.blockedResponse?.status ?? 403;\n const message = config.blockedResponse?.message ?? decision.message ?? 'Access denied';\n\n const response = NextResponse.json(\n {\n error: message,\n code: 'AGENT_BLOCKED',\n reason: decision.reason,\n agentType: decision.agentType,\n },\n { status }\n );\n\n // Add custom headers\n if (config.blockedResponse?.headers) {\n for (const [key, value] of Object.entries(config.blockedResponse.headers)) {\n response.headers.set(key, value);\n }\n }\n\n // Add AgentShield headers\n response.headers.set('X-AgentShield-Action', decision.action);\n response.headers.set('X-AgentShield-Reason', decision.reason);\n\n return response;\n}\n\n/**\n * Build redirect response\n */\nfunction buildRedirectResponse(\n request: NextRequest,\n decision: EnforcementDecision,\n config: AgentShieldMiddlewareConfig\n): NextResponse {\n const redirectUrl = config.redirectUrl || decision.redirectUrl || '/blocked';\n const url = new URL(redirectUrl, request.url);\n\n // Add query params with detection info\n url.searchParams.set('reason', decision.reason);\n if (decision.agentType) {\n url.searchParams.set('agent', decision.agentType);\n }\n\n return NextResponse.redirect(url);\n}\n\n// ============================================================================\n// Middleware Factory\n// ============================================================================\n\n/**\n * Create AgentShield middleware with API-based detection\n *\n * @example\n * ```typescript\n * // middleware.ts\n * import { withAgentShield } from '@kya-os/agentshield-nextjs/api-middleware';\n *\n * export default withAgentShield({\n * onBlock: 'block',\n * skipPaths: ['/api/health'],\n * });\n * ```\n */\nexport function withAgentShield(config: AgentShieldMiddlewareConfig = {}) {\n // Initialize client (will use AGENTSHIELD_API_KEY env var if not provided)\n let client: AgentShieldClient | null = null;\n\n const getClient = () => {\n if (!client) {\n client = getAgentShieldClient({\n apiKey: config.apiKey,\n baseUrl: config.apiUrl,\n useEdge: config.useEdge,\n timeout: config.timeout,\n debug: config.debug,\n });\n }\n return client;\n };\n\n // Default skip paths (static assets, etc.)\n const defaultSkipPaths = [\n '/_next/static/*',\n '/_next/image/*',\n '/favicon.ico',\n '/robots.txt',\n '/sitemap.xml',\n ];\n\n const skipPaths = [...defaultSkipPaths, ...(config.skipPaths || [])];\n const failOpen = config.failOpen ?? true;\n\n return async function middleware(request: NextRequest): Promise<NextResponse> {\n const path = request.nextUrl.pathname;\n const startTime = Date.now();\n\n // Check skip paths\n if (shouldSkipPath(path, skipPaths)) {\n return NextResponse.next();\n }\n\n // Check include paths\n if (!shouldIncludePath(path, config.includePaths)) {\n return NextResponse.next();\n }\n\n try {\n // Call enforce API\n const result = await getClient().enforce({\n headers: Object.fromEntries(request.headers.entries()),\n userAgent: request.headers.get('user-agent') || undefined,\n ipAddress:\n request.ip ||\n request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n request.headers.get('x-real-ip') ||\n undefined,\n path,\n url: request.url,\n method: request.method,\n requestId: request.headers.get('x-request-id') || undefined,\n options: {\n includeDetectionResult: config.debug,\n },\n });\n\n // Handle API error\n if (!result.success || !result.data) {\n if (config.debug) {\n console.warn('[AgentShield] API error:', result.error);\n }\n\n if (failOpen) {\n return NextResponse.next();\n }\n\n // Fail closed - block on error\n return NextResponse.json(\n { error: 'Security check failed', code: 'API_ERROR' },\n { status: 503 }\n );\n }\n\n const decision = result.data.decision;\n\n // Log if debug enabled\n if (config.debug) {\n console.log('[AgentShield] Decision:', {\n path,\n action: decision.action,\n isAgent: decision.isAgent,\n confidence: decision.confidence,\n agentName: decision.agentName,\n detectionMethod: result.data.detection?.detectionMethod || 'not-included',\n processingTimeMs: Date.now() - startTime,\n });\n }\n\n // Handle agent detection callback\n if (decision.isAgent && config.onAgentDetected) {\n await config.onAgentDetected(request, decision);\n }\n\n // Handle enforcement action\n switch (decision.action) {\n case 'block': {\n // Use custom response if provided\n if (config.customBlockedResponse) {\n return config.customBlockedResponse(request, decision);\n }\n\n // Check if config overrides to redirect\n if (config.onBlock === 'redirect') {\n return buildRedirectResponse(request, decision, config);\n }\n\n return buildBlockedResponse(decision, config);\n }\n\n case 'redirect': {\n return buildRedirectResponse(request, decision, config);\n }\n\n case 'challenge': {\n // Future: implement challenge page\n // For now, treat as redirect\n return buildRedirectResponse(request, decision, config);\n }\n\n case 'log':\n case 'allow':\n default: {\n // Allow the request to proceed\n const response = NextResponse.next();\n\n // Add detection headers for downstream use\n if (decision.isAgent) {\n response.headers.set('X-AgentShield-Detected', 'true');\n response.headers.set('X-AgentShield-Confidence', decision.confidence.toString());\n if (decision.agentName) {\n response.headers.set('X-AgentShield-Agent', decision.agentName);\n }\n }\n\n return response;\n }\n }\n } catch (error) {\n // Unexpected error\n if (config.debug) {\n console.error('[AgentShield] Middleware error:', error);\n }\n\n if (failOpen) {\n return NextResponse.next();\n }\n\n return NextResponse.json(\n { error: 'Security check failed', code: 'MIDDLEWARE_ERROR' },\n { status: 503 }\n );\n }\n };\n}\n\n/**\n * Convenience export for simple setup\n *\n * @example\n * ```typescript\n * // middleware.ts\n * export { agentShieldMiddleware as default } from '@kya-os/agentshield-nextjs/api-middleware';\n * ```\n */\nexport const agentShieldMiddleware = withAgentShield();\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 { createAgentShieldMiddleware, createMiddleware } 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\n// Export API-based detection (recommended for production)\nexport { withAgentShield, agentShieldMiddleware } from './api-middleware';\nexport type { AgentShieldMiddlewareConfig } from './api-middleware';\nexport { AgentShieldClient, getAgentShieldClient, resetAgentShieldClient } from './api-client';\nexport type {\n AgentShieldClientConfig,\n EnforcementAction,\n EnforcementDecision,\n EnforceResponse,\n EnforceInput,\n} from './api-client';\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"]}
|