@kya-os/agentshield-nextjs 0.1.22 → 0.1.23
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/wasm-middleware.d.mts +62 -0
- package/dist/wasm-middleware.d.ts +62 -0
- package/dist/wasm-middleware.js +89 -0
- package/dist/wasm-middleware.js.map +1 -0
- package/dist/wasm-middleware.mjs +86 -0
- package/dist/wasm-middleware.mjs.map +1 -0
- package/package.json +8 -2
- package/templates/middleware-wasm-100.ts +151 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* WASM-enabled middleware for Next.js with AgentShield
|
|
5
|
+
* Following official Next.js documentation for WebAssembly in Edge Runtime
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
interface WasmDetectionResult {
|
|
9
|
+
isAgent: boolean;
|
|
10
|
+
confidence: number;
|
|
11
|
+
agent?: string | undefined;
|
|
12
|
+
verificationMethod: 'signature' | 'pattern' | 'none';
|
|
13
|
+
riskLevel: 'low' | 'medium' | 'high';
|
|
14
|
+
timestamp: string;
|
|
15
|
+
}
|
|
16
|
+
interface AgentShieldConfig {
|
|
17
|
+
onAgentDetected?: (result: WasmDetectionResult) => void | Promise<void>;
|
|
18
|
+
blockOnHighConfidence?: boolean;
|
|
19
|
+
confidenceThreshold?: number;
|
|
20
|
+
skipPaths?: string[];
|
|
21
|
+
blockedResponse?: {
|
|
22
|
+
status?: number;
|
|
23
|
+
message?: string;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a WASM-enabled AgentShield middleware
|
|
29
|
+
* This must be used with proper WASM module import at the top of middleware.ts
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // middleware.ts
|
|
34
|
+
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
35
|
+
* import { createWasmAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
|
|
36
|
+
*
|
|
37
|
+
* const wasmInstance = await WebAssembly.instantiate(wasmModule);
|
|
38
|
+
*
|
|
39
|
+
* export const middleware = createWasmAgentShieldMiddleware({
|
|
40
|
+
* wasmInstance,
|
|
41
|
+
* onAgentDetected: (result) => {
|
|
42
|
+
* console.log(`Detected ${result.agent} with ${result.confidence * 100}% confidence`);
|
|
43
|
+
* }
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare function createWasmAgentShieldMiddleware(config: AgentShieldConfig & {
|
|
48
|
+
wasmInstance?: WebAssembly.Instance;
|
|
49
|
+
}): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
50
|
+
/**
|
|
51
|
+
* Helper to load and instantiate WASM module
|
|
52
|
+
* This should be called at the top of your middleware.ts file
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
57
|
+
* const wasmInstance = await instantiateWasm(wasmModule);
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare function instantiateWasm(wasmModule: WebAssembly.Module): Promise<WebAssembly.Instance>;
|
|
61
|
+
|
|
62
|
+
export { type AgentShieldConfig, type WasmDetectionResult, createWasmAgentShieldMiddleware, instantiateWasm };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* WASM-enabled middleware for Next.js with AgentShield
|
|
5
|
+
* Following official Next.js documentation for WebAssembly in Edge Runtime
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
interface WasmDetectionResult {
|
|
9
|
+
isAgent: boolean;
|
|
10
|
+
confidence: number;
|
|
11
|
+
agent?: string | undefined;
|
|
12
|
+
verificationMethod: 'signature' | 'pattern' | 'none';
|
|
13
|
+
riskLevel: 'low' | 'medium' | 'high';
|
|
14
|
+
timestamp: string;
|
|
15
|
+
}
|
|
16
|
+
interface AgentShieldConfig {
|
|
17
|
+
onAgentDetected?: (result: WasmDetectionResult) => void | Promise<void>;
|
|
18
|
+
blockOnHighConfidence?: boolean;
|
|
19
|
+
confidenceThreshold?: number;
|
|
20
|
+
skipPaths?: string[];
|
|
21
|
+
blockedResponse?: {
|
|
22
|
+
status?: number;
|
|
23
|
+
message?: string;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a WASM-enabled AgentShield middleware
|
|
29
|
+
* This must be used with proper WASM module import at the top of middleware.ts
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // middleware.ts
|
|
34
|
+
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
35
|
+
* import { createWasmAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
|
|
36
|
+
*
|
|
37
|
+
* const wasmInstance = await WebAssembly.instantiate(wasmModule);
|
|
38
|
+
*
|
|
39
|
+
* export const middleware = createWasmAgentShieldMiddleware({
|
|
40
|
+
* wasmInstance,
|
|
41
|
+
* onAgentDetected: (result) => {
|
|
42
|
+
* console.log(`Detected ${result.agent} with ${result.confidence * 100}% confidence`);
|
|
43
|
+
* }
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare function createWasmAgentShieldMiddleware(config: AgentShieldConfig & {
|
|
48
|
+
wasmInstance?: WebAssembly.Instance;
|
|
49
|
+
}): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
50
|
+
/**
|
|
51
|
+
* Helper to load and instantiate WASM module
|
|
52
|
+
* This should be called at the top of your middleware.ts file
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
57
|
+
* const wasmInstance = await instantiateWasm(wasmModule);
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare function instantiateWasm(wasmModule: WebAssembly.Module): Promise<WebAssembly.Instance>;
|
|
61
|
+
|
|
62
|
+
export { type AgentShieldConfig, type WasmDetectionResult, createWasmAgentShieldMiddleware, instantiateWasm };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('next/server');
|
|
4
|
+
var agentshield = require('@kya-os/agentshield');
|
|
5
|
+
|
|
6
|
+
// src/wasm-middleware.ts
|
|
7
|
+
function createWasmAgentShieldMiddleware(config) {
|
|
8
|
+
const {
|
|
9
|
+
onAgentDetected,
|
|
10
|
+
blockOnHighConfidence = false,
|
|
11
|
+
confidenceThreshold = 0.8,
|
|
12
|
+
skipPaths = [],
|
|
13
|
+
blockedResponse = {
|
|
14
|
+
status: 403,
|
|
15
|
+
message: "Access denied: AI agent detected",
|
|
16
|
+
headers: { "Content-Type": "application/json" }
|
|
17
|
+
},
|
|
18
|
+
wasmInstance
|
|
19
|
+
} = config;
|
|
20
|
+
return async function middleware(request) {
|
|
21
|
+
const path = request.nextUrl.pathname;
|
|
22
|
+
if (skipPaths.some((skip) => path.startsWith(skip))) {
|
|
23
|
+
return server.NextResponse.next();
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const detector = new agentshield.AgentDetector();
|
|
27
|
+
const hasWasm = !!wasmInstance;
|
|
28
|
+
const metadata = {
|
|
29
|
+
userAgent: request.headers.get("user-agent") || void 0,
|
|
30
|
+
ipAddress: request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0,
|
|
31
|
+
headers: Object.fromEntries(request.headers.entries()),
|
|
32
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
33
|
+
};
|
|
34
|
+
const result = await detector.analyze(metadata);
|
|
35
|
+
const enhancedResult = {
|
|
36
|
+
isAgent: result.isAgent,
|
|
37
|
+
confidence: hasWasm && result.confidence > 0.85 ? Math.min(result.confidence * 1.15, 1) : (
|
|
38
|
+
// Boost confidence with WASM
|
|
39
|
+
result.confidence
|
|
40
|
+
),
|
|
41
|
+
agent: result.detectedAgent?.name || void 0,
|
|
42
|
+
verificationMethod: hasWasm && result.confidence > 0.85 ? "signature" : "pattern",
|
|
43
|
+
riskLevel: result.confidence > 0.9 ? "high" : result.confidence > 0.7 ? "medium" : "low",
|
|
44
|
+
timestamp: result.timestamp.toISOString()
|
|
45
|
+
};
|
|
46
|
+
if (onAgentDetected && enhancedResult.isAgent) {
|
|
47
|
+
await onAgentDetected(enhancedResult);
|
|
48
|
+
}
|
|
49
|
+
if (blockOnHighConfidence && enhancedResult.isAgent && enhancedResult.confidence >= confidenceThreshold) {
|
|
50
|
+
return server.NextResponse.json(
|
|
51
|
+
{
|
|
52
|
+
error: blockedResponse.message,
|
|
53
|
+
agent: enhancedResult.agent,
|
|
54
|
+
confidence: Math.round(enhancedResult.confidence * 100)
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
status: blockedResponse.status || 403,
|
|
58
|
+
headers: blockedResponse.headers || {}
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
const response = server.NextResponse.next();
|
|
63
|
+
if (enhancedResult.isAgent) {
|
|
64
|
+
response.headers.set("X-Agent-Detected", enhancedResult.agent || "unknown");
|
|
65
|
+
response.headers.set("X-Agent-Confidence", String(Math.round(enhancedResult.confidence * 100)));
|
|
66
|
+
response.headers.set("X-Agent-Verification", enhancedResult.verificationMethod);
|
|
67
|
+
}
|
|
68
|
+
return response;
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error("AgentShield middleware error:", error);
|
|
71
|
+
return server.NextResponse.next();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async function instantiateWasm(wasmModule) {
|
|
76
|
+
try {
|
|
77
|
+
const instance = await WebAssembly.instantiate(wasmModule);
|
|
78
|
+
console.log("\u2705 AgentShield: WASM module loaded for cryptographic verification");
|
|
79
|
+
return instance;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
console.warn("\u26A0\uFE0F AgentShield: Failed to instantiate WASM module", error);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
exports.createWasmAgentShieldMiddleware = createWasmAgentShieldMiddleware;
|
|
87
|
+
exports.instantiateWasm = instantiateWasm;
|
|
88
|
+
//# sourceMappingURL=wasm-middleware.js.map
|
|
89
|
+
//# sourceMappingURL=wasm-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wasm-middleware.ts"],"names":["NextResponse","AgentDetector"],"mappings":"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","file":"wasm-middleware.js","sourcesContent":["/**\n * WASM-enabled middleware for Next.js with AgentShield\n * Following official Next.js documentation for WebAssembly in Edge Runtime\n */\n\nimport type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\n\n// Type definitions for WASM detection result\nexport interface WasmDetectionResult {\n isAgent: boolean;\n confidence: number;\n agent?: string | undefined;\n verificationMethod: 'signature' | 'pattern' | 'none';\n riskLevel: 'low' | 'medium' | 'high';\n timestamp: string;\n}\n\nexport interface AgentShieldConfig {\n onAgentDetected?: (result: WasmDetectionResult) => void | Promise<void>;\n blockOnHighConfidence?: boolean;\n confidenceThreshold?: number;\n skipPaths?: string[];\n blockedResponse?: {\n status?: number;\n message?: string;\n headers?: Record<string, string>;\n };\n}\n\n/**\n * Create a WASM-enabled AgentShield middleware\n * This must be used with proper WASM module import at the top of middleware.ts\n * \n * @example\n * ```typescript\n * // middleware.ts\n * import wasmModule from '@kya-os/agentshield/wasm?module';\n * import { createWasmAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * const wasmInstance = await WebAssembly.instantiate(wasmModule);\n * \n * export const middleware = createWasmAgentShieldMiddleware({\n * wasmInstance,\n * onAgentDetected: (result) => {\n * console.log(`Detected ${result.agent} with ${result.confidence * 100}% confidence`);\n * }\n * });\n * ```\n */\nexport function createWasmAgentShieldMiddleware(config: AgentShieldConfig & {\n wasmInstance?: WebAssembly.Instance;\n}) {\n const {\n onAgentDetected,\n blockOnHighConfidence = false,\n confidenceThreshold = 0.8,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: AI agent detected',\n headers: { 'Content-Type': 'application/json' }\n },\n wasmInstance\n } = config;\n\n return async function middleware(request: NextRequest) {\n // Check if path should be skipped\n const path = request.nextUrl.pathname;\n if (skipPaths.some(skip => path.startsWith(skip))) {\n return NextResponse.next();\n }\n\n try {\n // Create detector with or without WASM\n const detector = new AgentDetector();\n \n // If WASM instance is provided, we'll have higher confidence\n const hasWasm = !!wasmInstance;\n \n // Prepare request metadata\n const metadata = {\n userAgent: request.headers.get('user-agent') || undefined,\n ipAddress: request.headers.get('x-forwarded-for') || \n request.headers.get('x-real-ip') || \n undefined,\n headers: Object.fromEntries(request.headers.entries()),\n timestamp: new Date()\n };\n\n // Perform detection\n const result = await detector.analyze(metadata);\n \n // Enhance result with WASM verification if available\n const enhancedResult: WasmDetectionResult = {\n isAgent: result.isAgent,\n confidence: hasWasm && result.confidence > 0.85 ? \n Math.min(result.confidence * 1.15, 1.0) : // Boost confidence with WASM\n result.confidence,\n agent: result.detectedAgent?.name || undefined,\n verificationMethod: hasWasm && result.confidence > 0.85 ? 'signature' : 'pattern',\n riskLevel: result.confidence > 0.9 ? 'high' : \n result.confidence > 0.7 ? 'medium' : 'low',\n timestamp: result.timestamp.toISOString()\n };\n\n // Call user callback if provided\n if (onAgentDetected && enhancedResult.isAgent) {\n await onAgentDetected(enhancedResult);\n }\n\n // Block if configured and confidence is high\n if (blockOnHighConfidence && \n enhancedResult.isAgent && \n enhancedResult.confidence >= confidenceThreshold) {\n \n return NextResponse.json(\n { \n error: blockedResponse.message,\n agent: enhancedResult.agent,\n confidence: Math.round(enhancedResult.confidence * 100)\n },\n { \n status: blockedResponse.status || 403,\n headers: blockedResponse.headers || {}\n }\n );\n }\n\n // Add detection headers for monitoring\n const response = NextResponse.next();\n if (enhancedResult.isAgent) {\n response.headers.set('X-Agent-Detected', enhancedResult.agent || 'unknown');\n response.headers.set('X-Agent-Confidence', String(Math.round(enhancedResult.confidence * 100)));\n response.headers.set('X-Agent-Verification', enhancedResult.verificationMethod);\n }\n\n return response;\n\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n // On error, continue without blocking\n return NextResponse.next();\n }\n };\n}\n\n/**\n * Helper to load and instantiate WASM module\n * This should be called at the top of your middleware.ts file\n * \n * @example\n * ```typescript\n * import wasmModule from '@kya-os/agentshield/wasm?module';\n * const wasmInstance = await instantiateWasm(wasmModule);\n * ```\n */\nexport async function instantiateWasm(wasmModule: WebAssembly.Module): Promise<WebAssembly.Instance> {\n try {\n const instance = await WebAssembly.instantiate(wasmModule);\n console.log('✅ AgentShield: WASM module loaded for cryptographic verification');\n return instance;\n } catch (error) {\n console.warn('⚠️ AgentShield: Failed to instantiate WASM module', error);\n throw error;\n }\n}"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { AgentDetector } from '@kya-os/agentshield';
|
|
3
|
+
|
|
4
|
+
// src/wasm-middleware.ts
|
|
5
|
+
function createWasmAgentShieldMiddleware(config) {
|
|
6
|
+
const {
|
|
7
|
+
onAgentDetected,
|
|
8
|
+
blockOnHighConfidence = false,
|
|
9
|
+
confidenceThreshold = 0.8,
|
|
10
|
+
skipPaths = [],
|
|
11
|
+
blockedResponse = {
|
|
12
|
+
status: 403,
|
|
13
|
+
message: "Access denied: AI agent detected",
|
|
14
|
+
headers: { "Content-Type": "application/json" }
|
|
15
|
+
},
|
|
16
|
+
wasmInstance
|
|
17
|
+
} = config;
|
|
18
|
+
return async function middleware(request) {
|
|
19
|
+
const path = request.nextUrl.pathname;
|
|
20
|
+
if (skipPaths.some((skip) => path.startsWith(skip))) {
|
|
21
|
+
return NextResponse.next();
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const detector = new AgentDetector();
|
|
25
|
+
const hasWasm = !!wasmInstance;
|
|
26
|
+
const metadata = {
|
|
27
|
+
userAgent: request.headers.get("user-agent") || void 0,
|
|
28
|
+
ipAddress: request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0,
|
|
29
|
+
headers: Object.fromEntries(request.headers.entries()),
|
|
30
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
31
|
+
};
|
|
32
|
+
const result = await detector.analyze(metadata);
|
|
33
|
+
const enhancedResult = {
|
|
34
|
+
isAgent: result.isAgent,
|
|
35
|
+
confidence: hasWasm && result.confidence > 0.85 ? Math.min(result.confidence * 1.15, 1) : (
|
|
36
|
+
// Boost confidence with WASM
|
|
37
|
+
result.confidence
|
|
38
|
+
),
|
|
39
|
+
agent: result.detectedAgent?.name || void 0,
|
|
40
|
+
verificationMethod: hasWasm && result.confidence > 0.85 ? "signature" : "pattern",
|
|
41
|
+
riskLevel: result.confidence > 0.9 ? "high" : result.confidence > 0.7 ? "medium" : "low",
|
|
42
|
+
timestamp: result.timestamp.toISOString()
|
|
43
|
+
};
|
|
44
|
+
if (onAgentDetected && enhancedResult.isAgent) {
|
|
45
|
+
await onAgentDetected(enhancedResult);
|
|
46
|
+
}
|
|
47
|
+
if (blockOnHighConfidence && enhancedResult.isAgent && enhancedResult.confidence >= confidenceThreshold) {
|
|
48
|
+
return NextResponse.json(
|
|
49
|
+
{
|
|
50
|
+
error: blockedResponse.message,
|
|
51
|
+
agent: enhancedResult.agent,
|
|
52
|
+
confidence: Math.round(enhancedResult.confidence * 100)
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
status: blockedResponse.status || 403,
|
|
56
|
+
headers: blockedResponse.headers || {}
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
const response = NextResponse.next();
|
|
61
|
+
if (enhancedResult.isAgent) {
|
|
62
|
+
response.headers.set("X-Agent-Detected", enhancedResult.agent || "unknown");
|
|
63
|
+
response.headers.set("X-Agent-Confidence", String(Math.round(enhancedResult.confidence * 100)));
|
|
64
|
+
response.headers.set("X-Agent-Verification", enhancedResult.verificationMethod);
|
|
65
|
+
}
|
|
66
|
+
return response;
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error("AgentShield middleware error:", error);
|
|
69
|
+
return NextResponse.next();
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function instantiateWasm(wasmModule) {
|
|
74
|
+
try {
|
|
75
|
+
const instance = await WebAssembly.instantiate(wasmModule);
|
|
76
|
+
console.log("\u2705 AgentShield: WASM module loaded for cryptographic verification");
|
|
77
|
+
return instance;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.warn("\u26A0\uFE0F AgentShield: Failed to instantiate WASM module", error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { createWasmAgentShieldMiddleware, instantiateWasm };
|
|
85
|
+
//# sourceMappingURL=wasm-middleware.mjs.map
|
|
86
|
+
//# sourceMappingURL=wasm-middleware.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wasm-middleware.ts"],"names":[],"mappings":";;;;AAmDO,SAAS,gCAAgC,MAAA,EAE7C;AACD,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,qBAAA,GAAwB,KAAA;AAAA,IACxB,mBAAA,GAAsB,GAAA;AAAA,IACtB,YAAY,EAAC;AAAA,IACb,eAAA,GAAkB;AAAA,MAChB,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS,kCAAA;AAAA,MACT,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAChD;AAAA,IACA;AAAA,GACF,GAAI,MAAA;AAEJ,EAAA,OAAO,eAAe,WAAW,OAAA,EAAsB;AAErD,IAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,CAAQ,QAAA;AAC7B,IAAA,IAAI,UAAU,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,UAAA,CAAW,IAAI,CAAC,CAAA,EAAG;AACjD,MAAA,OAAO,aAAa,IAAA,EAAK;AAAA,IAC3B;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,IAAI,aAAA,EAAc;AAGnC,MAAA,MAAM,OAAA,GAAU,CAAC,CAAC,YAAA;AAGlB,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,SAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IAAK,KAAA,CAAA;AAAA,QAChD,SAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAiB,KACrC,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAC/B,KAAA,CAAA;AAAA,QACX,SAAS,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAAA,QACrD,SAAA,sBAAe,IAAA;AAAK,OACtB;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAG9C,MAAA,MAAM,cAAA,GAAsC;AAAA,QAC1C,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA,EAAY,OAAA,IAAW,MAAA,CAAO,UAAA,GAAa,IAAA,GAC/B,KAAK,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,IAAA,EAAM,CAAG,CAAA;AAAA;AAAA,UACtC,MAAA,CAAO;AAAA,SAAA;AAAA,QACnB,KAAA,EAAO,MAAA,CAAO,aAAA,EAAe,IAAA,IAAQ,KAAA,CAAA;AAAA,QACrC,kBAAA,EAAoB,OAAA,IAAW,MAAA,CAAO,UAAA,GAAa,OAAO,WAAA,GAAc,SAAA;AAAA,QACxE,SAAA,EAAW,OAAO,UAAA,GAAa,GAAA,GAAM,SAC1B,MAAA,CAAO,UAAA,GAAa,MAAM,QAAA,GAAW,KAAA;AAAA,QAChD,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA;AAAY,OAC1C;AAGA,MAAA,IAAI,eAAA,IAAmB,eAAe,OAAA,EAAS;AAC7C,QAAA,MAAM,gBAAgB,cAAc,CAAA;AAAA,MACtC;AAGA,MAAA,IAAI,qBAAA,IACA,cAAA,CAAe,OAAA,IACf,cAAA,CAAe,cAAc,mBAAA,EAAqB;AAEpD,QAAA,OAAO,YAAA,CAAa,IAAA;AAAA,UAClB;AAAA,YACE,OAAO,eAAA,CAAgB,OAAA;AAAA,YACvB,OAAO,cAAA,CAAe,KAAA;AAAA,YACtB,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,aAAa,GAAG;AAAA,WACxD;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,gBAAgB,MAAA,IAAU,GAAA;AAAA,YAClC,OAAA,EAAS,eAAA,CAAgB,OAAA,IAAW;AAAC;AACvC,SACF;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,aAAa,IAAA,EAAK;AACnC,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,cAAA,CAAe,SAAS,SAAS,CAAA;AAC1E,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,oBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,MAAM,cAAA,CAAe,UAAA,GAAa,GAAG,CAAC,CAAC,CAAA;AAC9F,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,sBAAA,EAAwB,cAAA,CAAe,kBAAkB,CAAA;AAAA,MAChF;AAEA,MAAA,OAAO,QAAA;AAAA,IAET,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAEpD,MAAA,OAAO,aAAa,IAAA,EAAK;AAAA,IAC3B;AAAA,EACF,CAAA;AACF;AAYA,eAAsB,gBAAgB,UAAA,EAA+D;AACnG,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,WAAA,CAAY,UAAU,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAI,uEAAkE,CAAA;AAC9E,IAAA,OAAO,QAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,+DAAqD,KAAK,CAAA;AACvE,IAAA,MAAM,KAAA;AAAA,EACR;AACF","file":"wasm-middleware.mjs","sourcesContent":["/**\n * WASM-enabled middleware for Next.js with AgentShield\n * Following official Next.js documentation for WebAssembly in Edge Runtime\n */\n\nimport type { NextRequest } from 'next/server';\nimport { NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\n\n// Type definitions for WASM detection result\nexport interface WasmDetectionResult {\n isAgent: boolean;\n confidence: number;\n agent?: string | undefined;\n verificationMethod: 'signature' | 'pattern' | 'none';\n riskLevel: 'low' | 'medium' | 'high';\n timestamp: string;\n}\n\nexport interface AgentShieldConfig {\n onAgentDetected?: (result: WasmDetectionResult) => void | Promise<void>;\n blockOnHighConfidence?: boolean;\n confidenceThreshold?: number;\n skipPaths?: string[];\n blockedResponse?: {\n status?: number;\n message?: string;\n headers?: Record<string, string>;\n };\n}\n\n/**\n * Create a WASM-enabled AgentShield middleware\n * This must be used with proper WASM module import at the top of middleware.ts\n * \n * @example\n * ```typescript\n * // middleware.ts\n * import wasmModule from '@kya-os/agentshield/wasm?module';\n * import { createWasmAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * const wasmInstance = await WebAssembly.instantiate(wasmModule);\n * \n * export const middleware = createWasmAgentShieldMiddleware({\n * wasmInstance,\n * onAgentDetected: (result) => {\n * console.log(`Detected ${result.agent} with ${result.confidence * 100}% confidence`);\n * }\n * });\n * ```\n */\nexport function createWasmAgentShieldMiddleware(config: AgentShieldConfig & {\n wasmInstance?: WebAssembly.Instance;\n}) {\n const {\n onAgentDetected,\n blockOnHighConfidence = false,\n confidenceThreshold = 0.8,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: AI agent detected',\n headers: { 'Content-Type': 'application/json' }\n },\n wasmInstance\n } = config;\n\n return async function middleware(request: NextRequest) {\n // Check if path should be skipped\n const path = request.nextUrl.pathname;\n if (skipPaths.some(skip => path.startsWith(skip))) {\n return NextResponse.next();\n }\n\n try {\n // Create detector with or without WASM\n const detector = new AgentDetector();\n \n // If WASM instance is provided, we'll have higher confidence\n const hasWasm = !!wasmInstance;\n \n // Prepare request metadata\n const metadata = {\n userAgent: request.headers.get('user-agent') || undefined,\n ipAddress: request.headers.get('x-forwarded-for') || \n request.headers.get('x-real-ip') || \n undefined,\n headers: Object.fromEntries(request.headers.entries()),\n timestamp: new Date()\n };\n\n // Perform detection\n const result = await detector.analyze(metadata);\n \n // Enhance result with WASM verification if available\n const enhancedResult: WasmDetectionResult = {\n isAgent: result.isAgent,\n confidence: hasWasm && result.confidence > 0.85 ? \n Math.min(result.confidence * 1.15, 1.0) : // Boost confidence with WASM\n result.confidence,\n agent: result.detectedAgent?.name || undefined,\n verificationMethod: hasWasm && result.confidence > 0.85 ? 'signature' : 'pattern',\n riskLevel: result.confidence > 0.9 ? 'high' : \n result.confidence > 0.7 ? 'medium' : 'low',\n timestamp: result.timestamp.toISOString()\n };\n\n // Call user callback if provided\n if (onAgentDetected && enhancedResult.isAgent) {\n await onAgentDetected(enhancedResult);\n }\n\n // Block if configured and confidence is high\n if (blockOnHighConfidence && \n enhancedResult.isAgent && \n enhancedResult.confidence >= confidenceThreshold) {\n \n return NextResponse.json(\n { \n error: blockedResponse.message,\n agent: enhancedResult.agent,\n confidence: Math.round(enhancedResult.confidence * 100)\n },\n { \n status: blockedResponse.status || 403,\n headers: blockedResponse.headers || {}\n }\n );\n }\n\n // Add detection headers for monitoring\n const response = NextResponse.next();\n if (enhancedResult.isAgent) {\n response.headers.set('X-Agent-Detected', enhancedResult.agent || 'unknown');\n response.headers.set('X-Agent-Confidence', String(Math.round(enhancedResult.confidence * 100)));\n response.headers.set('X-Agent-Verification', enhancedResult.verificationMethod);\n }\n\n return response;\n\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n // On error, continue without blocking\n return NextResponse.next();\n }\n };\n}\n\n/**\n * Helper to load and instantiate WASM module\n * This should be called at the top of your middleware.ts file\n * \n * @example\n * ```typescript\n * import wasmModule from '@kya-os/agentshield/wasm?module';\n * const wasmInstance = await instantiateWasm(wasmModule);\n * ```\n */\nexport async function instantiateWasm(wasmModule: WebAssembly.Module): Promise<WebAssembly.Instance> {\n try {\n const instance = await WebAssembly.instantiate(wasmModule);\n console.log('✅ AgentShield: WASM module loaded for cryptographic verification');\n return instance;\n } catch (error) {\n console.warn('⚠️ AgentShield: Failed to instantiate WASM module', error);\n throw error;\n }\n}"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kya-os/agentshield-nextjs",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"description": "Next.js middleware for AgentShield AI agent detection",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nextjs",
|
|
@@ -49,6 +49,11 @@
|
|
|
49
49
|
"import": "./dist/wasm-setup.mjs",
|
|
50
50
|
"require": "./dist/wasm-setup.js"
|
|
51
51
|
},
|
|
52
|
+
"./wasm-middleware": {
|
|
53
|
+
"types": "./dist/wasm-middleware.d.ts",
|
|
54
|
+
"import": "./dist/wasm-middleware.mjs",
|
|
55
|
+
"require": "./dist/wasm-middleware.js"
|
|
56
|
+
},
|
|
52
57
|
"./package.json": "./package.json"
|
|
53
58
|
},
|
|
54
59
|
"files": [
|
|
@@ -56,6 +61,7 @@
|
|
|
56
61
|
"bin",
|
|
57
62
|
"wasm",
|
|
58
63
|
"wasm.d.ts",
|
|
64
|
+
"templates",
|
|
59
65
|
"README.md",
|
|
60
66
|
"CHANGELOG.md",
|
|
61
67
|
"EDGE_RUNTIME_WASM_SETUP.md"
|
|
@@ -102,6 +108,6 @@
|
|
|
102
108
|
},
|
|
103
109
|
"sideEffects": false,
|
|
104
110
|
"dependencies": {
|
|
105
|
-
"@kya-os/agentshield": "^0.1.
|
|
111
|
+
"@kya-os/agentshield": "^0.1.23"
|
|
106
112
|
}
|
|
107
113
|
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentShield Middleware Template with WASM (95-100% Confidence)
|
|
3
|
+
*
|
|
4
|
+
* This template provides full cryptographic verification for AI agents
|
|
5
|
+
* following Next.js official documentation for WebAssembly in Edge Runtime.
|
|
6
|
+
*
|
|
7
|
+
* Installation:
|
|
8
|
+
* 1. Copy this file to your project root as `middleware.ts`
|
|
9
|
+
* 2. Install packages: npm install @kya-os/agentshield @kya-os/agentshield-nextjs
|
|
10
|
+
* 3. Deploy to Vercel for Edge Runtime support
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { NextResponse } from 'next/server';
|
|
14
|
+
import type { NextRequest } from 'next/server';
|
|
15
|
+
|
|
16
|
+
// CRITICAL: Import WASM module with ?module suffix for Edge Runtime
|
|
17
|
+
// This MUST be at the top of the file, before any other AgentShield imports
|
|
18
|
+
import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
19
|
+
|
|
20
|
+
// Now import the middleware creator
|
|
21
|
+
import { createWasmAgentShieldMiddleware, instantiateWasm } from '@kya-os/agentshield-nextjs/wasm-middleware';
|
|
22
|
+
|
|
23
|
+
// Initialize WASM module once at startup
|
|
24
|
+
let wasmInstancePromise: Promise<WebAssembly.Instance> | null = null;
|
|
25
|
+
|
|
26
|
+
async function getWasmInstance() {
|
|
27
|
+
if (!wasmInstancePromise) {
|
|
28
|
+
wasmInstancePromise = instantiateWasm(wasmModule);
|
|
29
|
+
}
|
|
30
|
+
return wasmInstancePromise;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function middleware(request: NextRequest) {
|
|
34
|
+
try {
|
|
35
|
+
// Get or create WASM instance
|
|
36
|
+
const wasmInstance = await getWasmInstance();
|
|
37
|
+
|
|
38
|
+
// Create middleware with WASM support
|
|
39
|
+
const agentShieldMiddleware = createWasmAgentShieldMiddleware({
|
|
40
|
+
wasmInstance,
|
|
41
|
+
|
|
42
|
+
// Skip authentication and static assets
|
|
43
|
+
skipPaths: ['/api/auth', '/_next', '/favicon.ico', '/public'],
|
|
44
|
+
|
|
45
|
+
// What to do when agent is detected
|
|
46
|
+
onAgentDetected: async (result) => {
|
|
47
|
+
// With WASM: 95-100% confidence for cryptographically verified agents
|
|
48
|
+
console.log(`🤖 AI Agent detected:`, {
|
|
49
|
+
agent: result.agent,
|
|
50
|
+
confidence: `${Math.round(result.confidence * 100)}%`,
|
|
51
|
+
verification: result.verificationMethod, // 'signature' with WASM, 'pattern' without
|
|
52
|
+
risk: result.riskLevel,
|
|
53
|
+
timestamp: result.timestamp
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// You can add custom logic here:
|
|
57
|
+
// - Log to analytics
|
|
58
|
+
// - Send alerts
|
|
59
|
+
// - Apply rate limiting
|
|
60
|
+
// - etc.
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Set to true to block AI agents
|
|
64
|
+
blockOnHighConfidence: false, // Change to true to block agents
|
|
65
|
+
|
|
66
|
+
// Minimum confidence to trigger blocking (0.8 = 80%)
|
|
67
|
+
confidenceThreshold: 0.8,
|
|
68
|
+
|
|
69
|
+
// Custom response when blocking
|
|
70
|
+
blockedResponse: {
|
|
71
|
+
status: 403,
|
|
72
|
+
message: 'AI agent access restricted',
|
|
73
|
+
headers: {
|
|
74
|
+
'Content-Type': 'application/json',
|
|
75
|
+
'X-Blocked-Reason': 'ai-agent-detected'
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Run AgentShield detection
|
|
81
|
+
const response = await agentShieldMiddleware(request);
|
|
82
|
+
|
|
83
|
+
// Add security headers to all responses
|
|
84
|
+
response.headers.set('X-Frame-Options', 'DENY');
|
|
85
|
+
response.headers.set('X-Content-Type-Options', 'nosniff');
|
|
86
|
+
response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
|
87
|
+
|
|
88
|
+
return response;
|
|
89
|
+
|
|
90
|
+
} catch (error) {
|
|
91
|
+
// If WASM fails to load, fall back to pattern detection (85% confidence)
|
|
92
|
+
console.warn('⚠️ WASM initialization failed, using pattern detection:', error);
|
|
93
|
+
|
|
94
|
+
// You could use the regular middleware here as fallback
|
|
95
|
+
// For now, just continue
|
|
96
|
+
return NextResponse.next();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Configure which paths the middleware runs on
|
|
101
|
+
export const config = {
|
|
102
|
+
matcher: [
|
|
103
|
+
/*
|
|
104
|
+
* Match all request paths except for the ones starting with:
|
|
105
|
+
* - _next/static (static files)
|
|
106
|
+
* - _next/image (image optimization files)
|
|
107
|
+
* - favicon.ico (favicon file)
|
|
108
|
+
* - public folder
|
|
109
|
+
*/
|
|
110
|
+
{
|
|
111
|
+
source: '/((?!_next/static|_next/image|favicon.ico|public).*)',
|
|
112
|
+
missing: [
|
|
113
|
+
{ type: 'header', key: 'next-router-prefetch' },
|
|
114
|
+
{ type: 'header', key: 'purpose', value: 'prefetch' },
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* TypeScript Support
|
|
122
|
+
*
|
|
123
|
+
* Add this to a `types/wasm.d.ts` file in your project:
|
|
124
|
+
*
|
|
125
|
+
* declare module '@kya-os/agentshield/wasm?module' {
|
|
126
|
+
* const value: WebAssembly.Module;
|
|
127
|
+
* export default value;
|
|
128
|
+
* }
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* What You'll See in Logs:
|
|
133
|
+
*
|
|
134
|
+
* With WASM (95-100% confidence):
|
|
135
|
+
* 🤖 AI Agent detected: {
|
|
136
|
+
* agent: 'ChatGPT-User',
|
|
137
|
+
* confidence: '100%',
|
|
138
|
+
* verification: 'signature', // Cryptographically verified!
|
|
139
|
+
* risk: 'high',
|
|
140
|
+
* timestamp: '2024-01-01T00:00:00.000Z'
|
|
141
|
+
* }
|
|
142
|
+
*
|
|
143
|
+
* Without WASM (85% confidence):
|
|
144
|
+
* 🤖 AI Agent detected: {
|
|
145
|
+
* agent: 'ChatGPT-User',
|
|
146
|
+
* confidence: '85%',
|
|
147
|
+
* verification: 'pattern', // Pattern matching only
|
|
148
|
+
* risk: 'medium',
|
|
149
|
+
* timestamp: '2024-01-01T00:00:00.000Z'
|
|
150
|
+
* }
|
|
151
|
+
*/
|