@kya-os/agentshield-nextjs 0.3.3 → 0.3.5
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/README.md +21 -369
- package/index.js +9 -0
- package/package.json +7 -141
- package/EDGE_RUNTIME_WASM_SETUP.md +0 -348
- package/bin/setup-edge-wasm.js +0 -525
- package/dist/.tsbuildinfo +0 -1
- package/dist/api-client.d.mts +0 -196
- package/dist/api-client.d.ts +0 -196
- package/dist/api-client.js +0 -200
- package/dist/api-client.js.map +0 -1
- package/dist/api-client.mjs +0 -196
- package/dist/api-client.mjs.map +0 -1
- package/dist/api-middleware.d.mts +0 -140
- package/dist/api-middleware.d.ts +0 -140
- package/dist/api-middleware.js +0 -511
- package/dist/api-middleware.js.map +0 -1
- package/dist/api-middleware.mjs +0 -508
- package/dist/api-middleware.mjs.map +0 -1
- package/dist/create-middleware.d.mts +0 -17
- package/dist/create-middleware.d.ts +0 -17
- package/dist/create-middleware.js +0 -1381
- package/dist/create-middleware.js.map +0 -1
- package/dist/create-middleware.mjs +0 -1358
- package/dist/create-middleware.mjs.map +0 -1
- package/dist/edge/index.d.mts +0 -110
- package/dist/edge/index.d.ts +0 -110
- package/dist/edge/index.js +0 -277
- package/dist/edge/index.js.map +0 -1
- package/dist/edge/index.mjs +0 -275
- package/dist/edge/index.mjs.map +0 -1
- package/dist/edge-detector-wrapper.d.mts +0 -34
- package/dist/edge-detector-wrapper.d.ts +0 -34
- package/dist/edge-detector-wrapper.js +0 -596
- package/dist/edge-detector-wrapper.js.map +0 -1
- package/dist/edge-detector-wrapper.mjs +0 -574
- package/dist/edge-detector-wrapper.mjs.map +0 -1
- package/dist/edge-runtime-loader.d.mts +0 -50
- package/dist/edge-runtime-loader.d.ts +0 -50
- package/dist/edge-runtime-loader.js +0 -204
- package/dist/edge-runtime-loader.js.map +0 -1
- package/dist/edge-runtime-loader.mjs +0 -201
- package/dist/edge-runtime-loader.mjs.map +0 -1
- package/dist/edge-wasm-middleware.d.mts +0 -68
- package/dist/edge-wasm-middleware.d.ts +0 -68
- package/dist/edge-wasm-middleware.js +0 -318
- package/dist/edge-wasm-middleware.js.map +0 -1
- package/dist/edge-wasm-middleware.mjs +0 -315
- package/dist/edge-wasm-middleware.mjs.map +0 -1
- package/dist/enhanced-middleware.d.mts +0 -153
- package/dist/enhanced-middleware.d.ts +0 -153
- package/dist/enhanced-middleware.js +0 -1082
- package/dist/enhanced-middleware.js.map +0 -1
- package/dist/enhanced-middleware.mjs +0 -1080
- package/dist/enhanced-middleware.mjs.map +0 -1
- package/dist/index.d.mts +0 -24
- package/dist/index.d.ts +0 -24
- package/dist/index.js +0 -2717
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -2662
- package/dist/index.mjs.map +0 -1
- package/dist/middleware.d.mts +0 -21
- package/dist/middleware.d.ts +0 -21
- package/dist/middleware.js +0 -1362
- package/dist/middleware.js.map +0 -1
- package/dist/middleware.mjs +0 -1339
- package/dist/middleware.mjs.map +0 -1
- package/dist/nodejs-wasm-loader.d.mts +0 -25
- package/dist/nodejs-wasm-loader.d.ts +0 -25
- package/dist/nodejs-wasm-loader.js +0 -78
- package/dist/nodejs-wasm-loader.js.map +0 -1
- package/dist/nodejs-wasm-loader.mjs +0 -68
- package/dist/nodejs-wasm-loader.mjs.map +0 -1
- package/dist/policy.d.mts +0 -162
- package/dist/policy.d.ts +0 -162
- package/dist/policy.js +0 -189
- package/dist/policy.js.map +0 -1
- package/dist/policy.mjs +0 -165
- package/dist/policy.mjs.map +0 -1
- package/dist/session-tracker.d.mts +0 -55
- package/dist/session-tracker.d.ts +0 -55
- package/dist/session-tracker.js +0 -170
- package/dist/session-tracker.js.map +0 -1
- package/dist/session-tracker.mjs +0 -167
- package/dist/session-tracker.mjs.map +0 -1
- package/dist/signature-verifier.d.mts +0 -33
- package/dist/signature-verifier.d.ts +0 -33
- package/dist/signature-verifier.js +0 -386
- package/dist/signature-verifier.js.map +0 -1
- package/dist/signature-verifier.mjs +0 -362
- package/dist/signature-verifier.mjs.map +0 -1
- package/dist/types-DVmy9NE3.d.mts +0 -105
- package/dist/types-DVmy9NE3.d.ts +0 -105
- package/dist/wasm-middleware.d.mts +0 -63
- package/dist/wasm-middleware.d.ts +0 -63
- package/dist/wasm-middleware.js +0 -98
- package/dist/wasm-middleware.js.map +0 -1
- package/dist/wasm-middleware.mjs +0 -95
- package/dist/wasm-middleware.mjs.map +0 -1
- package/dist/wasm-setup.d.mts +0 -46
- package/dist/wasm-setup.d.ts +0 -46
- package/dist/wasm-setup.js +0 -157
- package/dist/wasm-setup.js.map +0 -1
- package/dist/wasm-setup.mjs +0 -148
- package/dist/wasm-setup.mjs.map +0 -1
- package/templates/middleware-wasm-100.ts +0 -151
- package/wasm/agentshield_wasm.d.ts +0 -479
- package/wasm/agentshield_wasm.js +0 -1536
- package/wasm/agentshield_wasm_bg.wasm +0 -0
- package/wasm/package.json +0 -30
- package/wasm.d.ts +0 -21
package/dist/types-DVmy9NE3.d.ts
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
-
import { AgentShieldConfig, DetectionResult } from '@kya-os/agentshield-shared';
|
|
3
|
-
import { AgentShieldEvents } from '@kya-os/agentshield';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Next.js-specific type definitions
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Next.js middleware configuration
|
|
11
|
-
*/
|
|
12
|
-
interface NextJSMiddlewareConfig extends Partial<AgentShieldConfig> {
|
|
13
|
-
/**
|
|
14
|
-
* Action to take when an agent is detected
|
|
15
|
-
*/
|
|
16
|
-
onAgentDetected?: 'block' | 'redirect' | 'rewrite' | 'allow' | 'log';
|
|
17
|
-
/**
|
|
18
|
-
* Custom handler for agent detection
|
|
19
|
-
* @deprecated Use 'events' instead. Will be removed in v1.0.0
|
|
20
|
-
*/
|
|
21
|
-
onDetection?: (req: NextRequest, result: DetectionResult) => NextResponse | Promise<NextResponse> | void | Promise<void>;
|
|
22
|
-
/**
|
|
23
|
-
* Event handlers for detection events
|
|
24
|
-
*/
|
|
25
|
-
events?: Partial<AgentShieldEvents>;
|
|
26
|
-
/**
|
|
27
|
-
* Path patterns to skip detection
|
|
28
|
-
*/
|
|
29
|
-
skipPaths?: string[] | RegExp[];
|
|
30
|
-
/**
|
|
31
|
-
* Response when blocking agents
|
|
32
|
-
*/
|
|
33
|
-
blockedResponse?: {
|
|
34
|
-
status: number;
|
|
35
|
-
message: string;
|
|
36
|
-
headers?: Record<string, string>;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* Redirect URL when redirecting detected agents
|
|
40
|
-
*/
|
|
41
|
-
redirectUrl?: string;
|
|
42
|
-
/**
|
|
43
|
-
* Rewrite URL when rewriting requests from detected agents
|
|
44
|
-
*/
|
|
45
|
-
rewriteUrl?: string;
|
|
46
|
-
/**
|
|
47
|
-
* Confidence threshold for agent detection
|
|
48
|
-
*/
|
|
49
|
-
confidenceThreshold?: number;
|
|
50
|
-
/**
|
|
51
|
-
* Enable WASM for enhanced detection
|
|
52
|
-
*/
|
|
53
|
-
enableWasm?: boolean;
|
|
54
|
-
/**
|
|
55
|
-
* Session tracking configuration
|
|
56
|
-
*/
|
|
57
|
-
sessionTracking?: {
|
|
58
|
-
/**
|
|
59
|
-
* Enable session tracking
|
|
60
|
-
*/
|
|
61
|
-
enabled: boolean;
|
|
62
|
-
/**
|
|
63
|
-
* Cookie name for session storage
|
|
64
|
-
* Default: '__agentshield_session'
|
|
65
|
-
*/
|
|
66
|
-
cookieName?: string;
|
|
67
|
-
/**
|
|
68
|
-
* Cookie max age in seconds
|
|
69
|
-
* Default: 3600 (1 hour)
|
|
70
|
-
*/
|
|
71
|
-
cookieMaxAge?: number;
|
|
72
|
-
/**
|
|
73
|
-
* Encryption key for session data
|
|
74
|
-
* Default: Uses AGENTSHIELD_SECRET env var or default key
|
|
75
|
-
*/
|
|
76
|
-
encryptionKey?: string;
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Extended NextRequest with AgentShield data
|
|
81
|
-
*/
|
|
82
|
-
interface AgentShieldRequest extends NextRequest {
|
|
83
|
-
agentShield?: {
|
|
84
|
-
result?: DetectionResult;
|
|
85
|
-
skipped: boolean;
|
|
86
|
-
session?: {
|
|
87
|
-
id: string;
|
|
88
|
-
agent: string;
|
|
89
|
-
confidence: number;
|
|
90
|
-
detectedAt: number;
|
|
91
|
-
expires: number;
|
|
92
|
-
};
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Detection context for hooks
|
|
97
|
-
*/
|
|
98
|
-
interface DetectionContext {
|
|
99
|
-
result: DetectionResult;
|
|
100
|
-
request: NextRequest;
|
|
101
|
-
userAgent?: string;
|
|
102
|
-
ip?: string;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export type { AgentShieldRequest as A, DetectionContext as D, NextJSMiddlewareConfig as N };
|
|
@@ -1,63 +0,0 @@
|
|
|
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
|
-
isAiCrawler?: boolean;
|
|
11
|
-
confidence: number;
|
|
12
|
-
agent?: string | undefined;
|
|
13
|
-
verificationMethod: 'signature' | 'pattern' | 'none';
|
|
14
|
-
riskLevel: 'low' | 'medium' | 'high';
|
|
15
|
-
timestamp: string;
|
|
16
|
-
}
|
|
17
|
-
interface AgentShieldConfig {
|
|
18
|
-
onAgentDetected?: (result: WasmDetectionResult) => void | Promise<void>;
|
|
19
|
-
blockOnHighConfidence?: boolean;
|
|
20
|
-
confidenceThreshold?: number;
|
|
21
|
-
skipPaths?: string[];
|
|
22
|
-
blockedResponse?: {
|
|
23
|
-
status?: number;
|
|
24
|
-
message?: string;
|
|
25
|
-
headers?: Record<string, string>;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Create a WASM-enabled AgentShield middleware
|
|
30
|
-
* This must be used with proper WASM module import at the top of middleware.ts
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```typescript
|
|
34
|
-
* // middleware.ts
|
|
35
|
-
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
36
|
-
* import { createWasmAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
|
|
37
|
-
*
|
|
38
|
-
* const wasmInstance = await WebAssembly.instantiate(wasmModule);
|
|
39
|
-
*
|
|
40
|
-
* export const middleware = createWasmAgentShieldMiddleware({
|
|
41
|
-
* wasmInstance,
|
|
42
|
-
* onAgentDetected: (result) => {
|
|
43
|
-
* console.log(`Detected ${result.agent} with ${result.confidence * 100}% confidence`);
|
|
44
|
-
* }
|
|
45
|
-
* });
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
declare function createWasmAgentShieldMiddleware(config: AgentShieldConfig & {
|
|
49
|
-
wasmInstance?: WebAssembly.Instance;
|
|
50
|
-
}): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
51
|
-
/**
|
|
52
|
-
* Helper to load and instantiate WASM module
|
|
53
|
-
* This should be called at the top of your middleware.ts file
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```typescript
|
|
57
|
-
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
58
|
-
* const wasmInstance = await instantiateWasm(wasmModule);
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
declare function instantiateWasm(wasmModule: WebAssembly.Module): Promise<WebAssembly.Instance>;
|
|
62
|
-
|
|
63
|
-
export { type AgentShieldConfig, type WasmDetectionResult, createWasmAgentShieldMiddleware, instantiateWasm };
|
|
@@ -1,63 +0,0 @@
|
|
|
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
|
-
isAiCrawler?: boolean;
|
|
11
|
-
confidence: number;
|
|
12
|
-
agent?: string | undefined;
|
|
13
|
-
verificationMethod: 'signature' | 'pattern' | 'none';
|
|
14
|
-
riskLevel: 'low' | 'medium' | 'high';
|
|
15
|
-
timestamp: string;
|
|
16
|
-
}
|
|
17
|
-
interface AgentShieldConfig {
|
|
18
|
-
onAgentDetected?: (result: WasmDetectionResult) => void | Promise<void>;
|
|
19
|
-
blockOnHighConfidence?: boolean;
|
|
20
|
-
confidenceThreshold?: number;
|
|
21
|
-
skipPaths?: string[];
|
|
22
|
-
blockedResponse?: {
|
|
23
|
-
status?: number;
|
|
24
|
-
message?: string;
|
|
25
|
-
headers?: Record<string, string>;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Create a WASM-enabled AgentShield middleware
|
|
30
|
-
* This must be used with proper WASM module import at the top of middleware.ts
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```typescript
|
|
34
|
-
* // middleware.ts
|
|
35
|
-
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
36
|
-
* import { createWasmAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
|
|
37
|
-
*
|
|
38
|
-
* const wasmInstance = await WebAssembly.instantiate(wasmModule);
|
|
39
|
-
*
|
|
40
|
-
* export const middleware = createWasmAgentShieldMiddleware({
|
|
41
|
-
* wasmInstance,
|
|
42
|
-
* onAgentDetected: (result) => {
|
|
43
|
-
* console.log(`Detected ${result.agent} with ${result.confidence * 100}% confidence`);
|
|
44
|
-
* }
|
|
45
|
-
* });
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
declare function createWasmAgentShieldMiddleware(config: AgentShieldConfig & {
|
|
49
|
-
wasmInstance?: WebAssembly.Instance;
|
|
50
|
-
}): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
51
|
-
/**
|
|
52
|
-
* Helper to load and instantiate WASM module
|
|
53
|
-
* This should be called at the top of your middleware.ts file
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```typescript
|
|
57
|
-
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
58
|
-
* const wasmInstance = await instantiateWasm(wasmModule);
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
declare function instantiateWasm(wasmModule: WebAssembly.Module): Promise<WebAssembly.Instance>;
|
|
62
|
-
|
|
63
|
-
export { type AgentShieldConfig, type WasmDetectionResult, createWasmAgentShieldMiddleware, instantiateWasm };
|
package/dist/wasm-middleware.js
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var server = require('next/server');
|
|
4
|
-
var agentshield = require('@kya-os/agentshield');
|
|
5
|
-
var agentshieldShared = require('@kya-os/agentshield-shared');
|
|
6
|
-
|
|
7
|
-
// src/wasm-middleware.ts
|
|
8
|
-
function createWasmAgentShieldMiddleware(config) {
|
|
9
|
-
const {
|
|
10
|
-
onAgentDetected,
|
|
11
|
-
blockOnHighConfidence = false,
|
|
12
|
-
confidenceThreshold = 80,
|
|
13
|
-
// Updated to 0-100 scale (was 0.8)
|
|
14
|
-
skipPaths = [],
|
|
15
|
-
blockedResponse = {
|
|
16
|
-
status: 403,
|
|
17
|
-
message: "Access denied: AI agent detected",
|
|
18
|
-
headers: { "Content-Type": "application/json" }
|
|
19
|
-
},
|
|
20
|
-
wasmInstance
|
|
21
|
-
} = config;
|
|
22
|
-
return async function middleware(request) {
|
|
23
|
-
const path = request.nextUrl.pathname;
|
|
24
|
-
if (skipPaths.some((skip) => path.startsWith(skip))) {
|
|
25
|
-
return server.NextResponse.next();
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
const detector = new agentshield.AgentDetector();
|
|
29
|
-
const hasWasm = !!wasmInstance;
|
|
30
|
-
const metadata = {
|
|
31
|
-
userAgent: request.headers.get("user-agent") || void 0,
|
|
32
|
-
ipAddress: request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0,
|
|
33
|
-
headers: Object.fromEntries(request.headers.entries()),
|
|
34
|
-
timestamp: /* @__PURE__ */ new Date()
|
|
35
|
-
};
|
|
36
|
-
const result = await detector.analyze(metadata);
|
|
37
|
-
const enhancedResult = {
|
|
38
|
-
isAgent: result.isAgent,
|
|
39
|
-
isAiCrawler: result.isAiCrawler,
|
|
40
|
-
confidence: hasWasm && result.confidence > 85 ? Math.min(result.confidence * 1.15, 100) : result.confidence,
|
|
41
|
-
agent: result.detectedAgent?.name || void 0,
|
|
42
|
-
verificationMethod: hasWasm && result.confidence > 85 ? "signature" : "pattern",
|
|
43
|
-
// Updated to 0-100 scale
|
|
44
|
-
riskLevel: result.confidence > 90 ? "high" : result.confidence > 70 ? "medium" : "low",
|
|
45
|
-
// Updated to 0-100 scale (was 0.7)
|
|
46
|
-
timestamp: result.timestamp instanceof Date ? result.timestamp.toISOString() : new Date(result.timestamp).toISOString()
|
|
47
|
-
};
|
|
48
|
-
const decision = agentshieldShared.evaluateEnforcement(enhancedResult, {
|
|
49
|
-
confidenceThreshold,
|
|
50
|
-
defaultAction: blockOnHighConfidence ? "block" : "allow"
|
|
51
|
-
});
|
|
52
|
-
if (onAgentDetected && agentshieldShared.shouldEnforce(enhancedResult)) {
|
|
53
|
-
await onAgentDetected(enhancedResult);
|
|
54
|
-
}
|
|
55
|
-
if (decision.action === "block") {
|
|
56
|
-
return server.NextResponse.json(
|
|
57
|
-
{
|
|
58
|
-
error: blockedResponse.message,
|
|
59
|
-
agent: enhancedResult.agent,
|
|
60
|
-
confidence: Math.round(enhancedResult.confidence)
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
status: blockedResponse.status || 403,
|
|
64
|
-
headers: blockedResponse.headers || {}
|
|
65
|
-
}
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
const response = server.NextResponse.next();
|
|
69
|
-
if (enhancedResult.isAgent) {
|
|
70
|
-
response.headers.set("X-Agent-Detected", enhancedResult.agent || "unknown");
|
|
71
|
-
response.headers.set(
|
|
72
|
-
"X-Agent-Confidence",
|
|
73
|
-
String(Math.round(enhancedResult.confidence * 100))
|
|
74
|
-
);
|
|
75
|
-
response.headers.set("X-Agent-Verification", enhancedResult.verificationMethod);
|
|
76
|
-
}
|
|
77
|
-
return response;
|
|
78
|
-
} catch (error) {
|
|
79
|
-
console.error("AgentShield middleware error:", error);
|
|
80
|
-
return server.NextResponse.next();
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
async function instantiateWasm(wasmModule) {
|
|
85
|
-
try {
|
|
86
|
-
const instance = await WebAssembly.instantiate(wasmModule);
|
|
87
|
-
console.log("\u2705 AgentShield: WASM module loaded for cryptographic verification");
|
|
88
|
-
return instance;
|
|
89
|
-
} catch (error) {
|
|
90
|
-
console.warn("\u26A0\uFE0F AgentShield: Failed to instantiate WASM module", error);
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
exports.createWasmAgentShieldMiddleware = createWasmAgentShieldMiddleware;
|
|
96
|
-
exports.instantiateWasm = instantiateWasm;
|
|
97
|
-
//# sourceMappingURL=wasm-middleware.js.map
|
|
98
|
-
//# sourceMappingURL=wasm-middleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wasm-middleware.ts"],"names":["NextResponse","AgentDetector","evaluateEnforcement","shouldEnforce"],"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';\nimport { evaluateEnforcement, shouldEnforce } from '@kya-os/agentshield-shared';\n\n// Type definitions for WASM detection result\nexport interface WasmDetectionResult {\n isAgent: boolean;\n isAiCrawler?: 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(\n config: AgentShieldConfig & {\n wasmInstance?: WebAssembly.Instance;\n }\n) {\n const {\n onAgentDetected,\n blockOnHighConfidence = false,\n confidenceThreshold = 80, // Updated to 0-100 scale (was 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:\n request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || 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 isAiCrawler: (result as unknown as Record<string, unknown>).isAiCrawler as\n | boolean\n | undefined,\n confidence:\n hasWasm && result.confidence > 85 // Updated to 0-100 scale (was 0.85)\n ? Math.min(result.confidence * 1.15, 100) // Boost confidence with WASM, cap at 100\n : result.confidence,\n agent: result.detectedAgent?.name || undefined,\n verificationMethod: hasWasm && result.confidence > 85 ? 'signature' : 'pattern', // Updated to 0-100 scale\n riskLevel:\n result.confidence > 90\n ? 'high' // Updated to 0-100 scale (was 0.9)\n : result.confidence > 70\n ? 'medium'\n : 'low', // Updated to 0-100 scale (was 0.7)\n timestamp:\n result.timestamp instanceof Date\n ? result.timestamp.toISOString()\n : new Date(result.timestamp).toISOString(),\n };\n\n // Evaluate enforcement decision\n const decision = evaluateEnforcement(enhancedResult, {\n confidenceThreshold,\n defaultAction: blockOnHighConfidence ? 'block' : 'allow',\n });\n\n // Call user callback for any enforced agent (regardless of threshold)\n if (onAgentDetected && shouldEnforce(enhancedResult)) {\n await onAgentDetected(enhancedResult);\n }\n\n // Block if enforcement decision says to block\n if (decision.action === 'block') {\n return NextResponse.json(\n {\n error: blockedResponse.message,\n agent: enhancedResult.agent,\n confidence: Math.round(enhancedResult.confidence),\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(\n 'X-Agent-Confidence',\n String(Math.round(enhancedResult.confidence * 100))\n );\n response.headers.set('X-Agent-Verification', enhancedResult.verificationMethod);\n }\n\n return response;\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(\n wasmModule: WebAssembly.Module\n): 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}\n"]}
|
package/dist/wasm-middleware.mjs
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { NextResponse } from 'next/server';
|
|
2
|
-
import { AgentDetector } from '@kya-os/agentshield';
|
|
3
|
-
import { evaluateEnforcement, shouldEnforce } from '@kya-os/agentshield-shared';
|
|
4
|
-
|
|
5
|
-
// src/wasm-middleware.ts
|
|
6
|
-
function createWasmAgentShieldMiddleware(config) {
|
|
7
|
-
const {
|
|
8
|
-
onAgentDetected,
|
|
9
|
-
blockOnHighConfidence = false,
|
|
10
|
-
confidenceThreshold = 80,
|
|
11
|
-
// Updated to 0-100 scale (was 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 NextResponse.next();
|
|
24
|
-
}
|
|
25
|
-
try {
|
|
26
|
-
const detector = new 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
|
-
isAiCrawler: result.isAiCrawler,
|
|
38
|
-
confidence: hasWasm && result.confidence > 85 ? Math.min(result.confidence * 1.15, 100) : result.confidence,
|
|
39
|
-
agent: result.detectedAgent?.name || void 0,
|
|
40
|
-
verificationMethod: hasWasm && result.confidence > 85 ? "signature" : "pattern",
|
|
41
|
-
// Updated to 0-100 scale
|
|
42
|
-
riskLevel: result.confidence > 90 ? "high" : result.confidence > 70 ? "medium" : "low",
|
|
43
|
-
// Updated to 0-100 scale (was 0.7)
|
|
44
|
-
timestamp: result.timestamp instanceof Date ? result.timestamp.toISOString() : new Date(result.timestamp).toISOString()
|
|
45
|
-
};
|
|
46
|
-
const decision = evaluateEnforcement(enhancedResult, {
|
|
47
|
-
confidenceThreshold,
|
|
48
|
-
defaultAction: blockOnHighConfidence ? "block" : "allow"
|
|
49
|
-
});
|
|
50
|
-
if (onAgentDetected && shouldEnforce(enhancedResult)) {
|
|
51
|
-
await onAgentDetected(enhancedResult);
|
|
52
|
-
}
|
|
53
|
-
if (decision.action === "block") {
|
|
54
|
-
return NextResponse.json(
|
|
55
|
-
{
|
|
56
|
-
error: blockedResponse.message,
|
|
57
|
-
agent: enhancedResult.agent,
|
|
58
|
-
confidence: Math.round(enhancedResult.confidence)
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
status: blockedResponse.status || 403,
|
|
62
|
-
headers: blockedResponse.headers || {}
|
|
63
|
-
}
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
const response = NextResponse.next();
|
|
67
|
-
if (enhancedResult.isAgent) {
|
|
68
|
-
response.headers.set("X-Agent-Detected", enhancedResult.agent || "unknown");
|
|
69
|
-
response.headers.set(
|
|
70
|
-
"X-Agent-Confidence",
|
|
71
|
-
String(Math.round(enhancedResult.confidence * 100))
|
|
72
|
-
);
|
|
73
|
-
response.headers.set("X-Agent-Verification", enhancedResult.verificationMethod);
|
|
74
|
-
}
|
|
75
|
-
return response;
|
|
76
|
-
} catch (error) {
|
|
77
|
-
console.error("AgentShield middleware error:", error);
|
|
78
|
-
return NextResponse.next();
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
async function instantiateWasm(wasmModule) {
|
|
83
|
-
try {
|
|
84
|
-
const instance = await WebAssembly.instantiate(wasmModule);
|
|
85
|
-
console.log("\u2705 AgentShield: WASM module loaded for cryptographic verification");
|
|
86
|
-
return instance;
|
|
87
|
-
} catch (error) {
|
|
88
|
-
console.warn("\u26A0\uFE0F AgentShield: Failed to instantiate WASM module", error);
|
|
89
|
-
throw error;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export { createWasmAgentShieldMiddleware, instantiateWasm };
|
|
94
|
-
//# sourceMappingURL=wasm-middleware.mjs.map
|
|
95
|
-
//# sourceMappingURL=wasm-middleware.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wasm-middleware.ts"],"names":[],"mappings":"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","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';\nimport { evaluateEnforcement, shouldEnforce } from '@kya-os/agentshield-shared';\n\n// Type definitions for WASM detection result\nexport interface WasmDetectionResult {\n isAgent: boolean;\n isAiCrawler?: 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(\n config: AgentShieldConfig & {\n wasmInstance?: WebAssembly.Instance;\n }\n) {\n const {\n onAgentDetected,\n blockOnHighConfidence = false,\n confidenceThreshold = 80, // Updated to 0-100 scale (was 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:\n request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || 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 isAiCrawler: (result as unknown as Record<string, unknown>).isAiCrawler as\n | boolean\n | undefined,\n confidence:\n hasWasm && result.confidence > 85 // Updated to 0-100 scale (was 0.85)\n ? Math.min(result.confidence * 1.15, 100) // Boost confidence with WASM, cap at 100\n : result.confidence,\n agent: result.detectedAgent?.name || undefined,\n verificationMethod: hasWasm && result.confidence > 85 ? 'signature' : 'pattern', // Updated to 0-100 scale\n riskLevel:\n result.confidence > 90\n ? 'high' // Updated to 0-100 scale (was 0.9)\n : result.confidence > 70\n ? 'medium'\n : 'low', // Updated to 0-100 scale (was 0.7)\n timestamp:\n result.timestamp instanceof Date\n ? result.timestamp.toISOString()\n : new Date(result.timestamp).toISOString(),\n };\n\n // Evaluate enforcement decision\n const decision = evaluateEnforcement(enhancedResult, {\n confidenceThreshold,\n defaultAction: blockOnHighConfidence ? 'block' : 'allow',\n });\n\n // Call user callback for any enforced agent (regardless of threshold)\n if (onAgentDetected && shouldEnforce(enhancedResult)) {\n await onAgentDetected(enhancedResult);\n }\n\n // Block if enforcement decision says to block\n if (decision.action === 'block') {\n return NextResponse.json(\n {\n error: blockedResponse.message,\n agent: enhancedResult.agent,\n confidence: Math.round(enhancedResult.confidence),\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(\n 'X-Agent-Confidence',\n String(Math.round(enhancedResult.confidence * 100))\n );\n response.headers.set('X-Agent-Verification', enhancedResult.verificationMethod);\n }\n\n return response;\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(\n wasmModule: WebAssembly.Module\n): 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}\n"]}
|
package/dist/wasm-setup.d.mts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WASM Setup for AgentShield in Next.js Edge Runtime
|
|
3
|
-
*
|
|
4
|
-
* This module handles WASM initialization for cryptographic signature verification.
|
|
5
|
-
* Designed to work without top-level await to avoid Next.js middleware issues.
|
|
6
|
-
*
|
|
7
|
-
* Usage in middleware.ts:
|
|
8
|
-
* ```typescript
|
|
9
|
-
* import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';
|
|
10
|
-
* import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
|
|
11
|
-
*
|
|
12
|
-
* export async function middleware(request: NextRequest) {
|
|
13
|
-
* // Initialize WASM inside the middleware function
|
|
14
|
-
* await setupWasm();
|
|
15
|
-
*
|
|
16
|
-
* const agentShieldMiddleware = createAgentShieldMiddleware({...});
|
|
17
|
-
* return agentShieldMiddleware(request);
|
|
18
|
-
* }
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Initialize WASM module for AgentShield
|
|
23
|
-
*
|
|
24
|
-
* This function:
|
|
25
|
-
* - Loads WASM in production/Edge Runtime for cryptographic verification
|
|
26
|
-
* - Skips WASM in test environments (Jest) automatically
|
|
27
|
-
* - Is safe to call multiple times (idempotent)
|
|
28
|
-
* - Handles errors gracefully with fallback to pattern detection
|
|
29
|
-
*
|
|
30
|
-
* @returns Promise that resolves when initialization is complete
|
|
31
|
-
*/
|
|
32
|
-
declare function setupWasm(): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Check if WASM has been initialized
|
|
35
|
-
*
|
|
36
|
-
* @returns true if WASM setup has been attempted (success or failure)
|
|
37
|
-
*/
|
|
38
|
-
declare function isWasmInitialized(): boolean;
|
|
39
|
-
/**
|
|
40
|
-
* Reset WASM initialization state (mainly for testing)
|
|
41
|
-
*
|
|
42
|
-
* @internal
|
|
43
|
-
*/
|
|
44
|
-
declare function resetWasmState(): void;
|
|
45
|
-
|
|
46
|
-
export { isWasmInitialized, resetWasmState, setupWasm };
|
package/dist/wasm-setup.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WASM Setup for AgentShield in Next.js Edge Runtime
|
|
3
|
-
*
|
|
4
|
-
* This module handles WASM initialization for cryptographic signature verification.
|
|
5
|
-
* Designed to work without top-level await to avoid Next.js middleware issues.
|
|
6
|
-
*
|
|
7
|
-
* Usage in middleware.ts:
|
|
8
|
-
* ```typescript
|
|
9
|
-
* import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';
|
|
10
|
-
* import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
|
|
11
|
-
*
|
|
12
|
-
* export async function middleware(request: NextRequest) {
|
|
13
|
-
* // Initialize WASM inside the middleware function
|
|
14
|
-
* await setupWasm();
|
|
15
|
-
*
|
|
16
|
-
* const agentShieldMiddleware = createAgentShieldMiddleware({...});
|
|
17
|
-
* return agentShieldMiddleware(request);
|
|
18
|
-
* }
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Initialize WASM module for AgentShield
|
|
23
|
-
*
|
|
24
|
-
* This function:
|
|
25
|
-
* - Loads WASM in production/Edge Runtime for cryptographic verification
|
|
26
|
-
* - Skips WASM in test environments (Jest) automatically
|
|
27
|
-
* - Is safe to call multiple times (idempotent)
|
|
28
|
-
* - Handles errors gracefully with fallback to pattern detection
|
|
29
|
-
*
|
|
30
|
-
* @returns Promise that resolves when initialization is complete
|
|
31
|
-
*/
|
|
32
|
-
declare function setupWasm(): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Check if WASM has been initialized
|
|
35
|
-
*
|
|
36
|
-
* @returns true if WASM setup has been attempted (success or failure)
|
|
37
|
-
*/
|
|
38
|
-
declare function isWasmInitialized(): boolean;
|
|
39
|
-
/**
|
|
40
|
-
* Reset WASM initialization state (mainly for testing)
|
|
41
|
-
*
|
|
42
|
-
* @internal
|
|
43
|
-
*/
|
|
44
|
-
declare function resetWasmState(): void;
|
|
45
|
-
|
|
46
|
-
export { isWasmInitialized, resetWasmState, setupWasm };
|