@kya-os/agentshield-nextjs
Version:
Next.js middleware for AgentShield AI agent detection
106 lines (102 loc) • 2.73 kB
text/typescript
import { NextRequest, NextResponse } from 'next/server';
import { AgentShieldConfig, DetectionResult } from '@kya-os/agentshield-shared';
import { AgentShieldEvents } from '@kya-os/agentshield';
/**
* Next.js-specific type definitions
*/
/**
* Next.js middleware configuration
*/
interface NextJSMiddlewareConfig extends Partial<AgentShieldConfig> {
/**
* Action to take when an agent is detected
*/
onAgentDetected?: 'block' | 'redirect' | 'rewrite' | 'allow' | 'log';
/**
* Custom handler for agent detection
* @deprecated Use 'events' instead. Will be removed in v1.0.0
*/
onDetection?: (req: NextRequest, result: DetectionResult) => NextResponse | Promise<NextResponse> | void | Promise<void>;
/**
* Event handlers for detection events
*/
events?: Partial<AgentShieldEvents>;
/**
* Path patterns to skip detection
*/
skipPaths?: string[] | RegExp[];
/**
* Response when blocking agents
*/
blockedResponse?: {
status: number;
message: string;
headers?: Record<string, string>;
};
/**
* Redirect URL when redirecting detected agents
*/
redirectUrl?: string;
/**
* Rewrite URL when rewriting requests from detected agents
*/
rewriteUrl?: string;
/**
* Confidence threshold for agent detection
*/
confidenceThreshold?: number;
/**
* Enable WASM for enhanced detection
*/
enableWasm?: boolean;
/**
* Session tracking configuration
*/
sessionTracking?: {
/**
* Enable session tracking
*/
enabled: boolean;
/**
* Cookie name for session storage
* Default: '__agentshield_session'
*/
cookieName?: string;
/**
* Cookie max age in seconds
* Default: 3600 (1 hour)
*/
cookieMaxAge?: number;
/**
* Encryption key for session data
* Default: Uses AGENTSHIELD_SECRET env var or default key
*/
encryptionKey?: string;
};
}
/**
* Extended NextRequest with AgentShield data
*/
interface AgentShieldRequest extends NextRequest {
agentShield?: {
result?: DetectionResult;
skipped: boolean;
session?: {
id: string;
agent: string;
confidence: number;
detectedAt: number;
expires: number;
};
};
}
/**
* Detection context for hooks
*/
interface DetectionContext {
result: DetectionResult;
request: NextRequest;
userAgent?: string;
ip?: string;
}
export type { AgentShieldRequest as A, DetectionContext as D, NextJSMiddlewareConfig as N };