@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
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
// src/utils.ts
|
|
2
|
-
function getClientIp(request) {
|
|
3
|
-
const forwardedFor = request.headers.get("x-forwarded-for");
|
|
4
|
-
if (forwardedFor) {
|
|
5
|
-
const ip = forwardedFor.split(",")[0]?.trim();
|
|
6
|
-
if (ip) return ip;
|
|
7
|
-
}
|
|
8
|
-
const realIp = request.headers.get("x-real-ip");
|
|
9
|
-
if (realIp) return realIp;
|
|
10
|
-
const cfIp = request.headers.get("cf-connecting-ip");
|
|
11
|
-
if (cfIp) return cfIp;
|
|
12
|
-
const clientIp = request.headers.get("x-client-ip");
|
|
13
|
-
if (clientIp) return clientIp;
|
|
14
|
-
return void 0;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// src/edge-runtime-loader.ts
|
|
18
|
-
var EdgeRuntimeAgentShield = class {
|
|
19
|
-
wasmInstance = null;
|
|
20
|
-
wasmMemory = null;
|
|
21
|
-
config;
|
|
22
|
-
initialized = false;
|
|
23
|
-
constructor(config = {}) {
|
|
24
|
-
this.config = config;
|
|
25
|
-
}
|
|
26
|
-
async init(wasmModule) {
|
|
27
|
-
if (this.initialized) return;
|
|
28
|
-
const module = wasmModule || this.config.wasmModule;
|
|
29
|
-
if (module && this.config.enableWasm !== false) {
|
|
30
|
-
try {
|
|
31
|
-
this.wasmMemory = new WebAssembly.Memory({ initial: 17, maximum: 256 });
|
|
32
|
-
const imports = {
|
|
33
|
-
wbg: {
|
|
34
|
-
__wbindgen_throw: (ptr, len) => {
|
|
35
|
-
throw new Error(this.readString(ptr, len));
|
|
36
|
-
},
|
|
37
|
-
__wbg_log_: (ptr, len) => {
|
|
38
|
-
if (this.config.debug) {
|
|
39
|
-
console.log(this.readString(ptr, len));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
env: {
|
|
44
|
-
memory: this.wasmMemory
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
this.wasmInstance = await WebAssembly.instantiate(module, imports);
|
|
48
|
-
this.initialized = true;
|
|
49
|
-
if (this.config.debug) {
|
|
50
|
-
console.log("\u2705 AgentShield WASM initialized in Edge Runtime");
|
|
51
|
-
}
|
|
52
|
-
} catch (error) {
|
|
53
|
-
console.warn("\u26A0\uFE0F WASM initialization failed, using pattern detection:", error);
|
|
54
|
-
this.initialized = true;
|
|
55
|
-
}
|
|
56
|
-
} else {
|
|
57
|
-
this.initialized = true;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
readString(ptr, len) {
|
|
61
|
-
if (!this.wasmInstance || !this.wasmMemory) {
|
|
62
|
-
throw new Error("WASM not initialized");
|
|
63
|
-
}
|
|
64
|
-
const memory = new Uint8Array(this.wasmMemory.buffer);
|
|
65
|
-
const bytes = memory.slice(ptr, ptr + len);
|
|
66
|
-
return new TextDecoder().decode(bytes);
|
|
67
|
-
}
|
|
68
|
-
writeString(str) {
|
|
69
|
-
if (!this.wasmInstance) {
|
|
70
|
-
throw new Error("WASM not initialized");
|
|
71
|
-
}
|
|
72
|
-
const exports$1 = this.wasmInstance.exports;
|
|
73
|
-
const encoded = new TextEncoder().encode(str);
|
|
74
|
-
const ptr = exports$1.__wbindgen_malloc(encoded.length);
|
|
75
|
-
const memory = new Uint8Array(exports$1.memory.buffer);
|
|
76
|
-
memory.set(encoded, ptr);
|
|
77
|
-
return [ptr, encoded.length];
|
|
78
|
-
}
|
|
79
|
-
async detect(request) {
|
|
80
|
-
if (!this.initialized) {
|
|
81
|
-
await this.init();
|
|
82
|
-
}
|
|
83
|
-
const metadata = {
|
|
84
|
-
userAgent: request.headers.get("user-agent") || "",
|
|
85
|
-
ipAddress: getClientIp(request) || "",
|
|
86
|
-
headers: Object.fromEntries(request.headers.entries())
|
|
87
|
-
};
|
|
88
|
-
if (this.wasmInstance && this.config.enableWasm !== false) {
|
|
89
|
-
try {
|
|
90
|
-
const exports$1 = this.wasmInstance.exports;
|
|
91
|
-
const [ptr, len] = this.writeString(JSON.stringify(metadata));
|
|
92
|
-
const resultPtr = exports$1.detect_agent(ptr, len);
|
|
93
|
-
let resultStr = "";
|
|
94
|
-
let offset = 0;
|
|
95
|
-
const memory = new Uint8Array(exports$1.memory.buffer);
|
|
96
|
-
while (offset < 4096) {
|
|
97
|
-
const byte = memory[resultPtr + offset];
|
|
98
|
-
if (byte === 0 || byte === void 0) break;
|
|
99
|
-
offset++;
|
|
100
|
-
}
|
|
101
|
-
if (offset > 0) {
|
|
102
|
-
resultStr = this.readString(resultPtr, offset);
|
|
103
|
-
}
|
|
104
|
-
exports$1.__wbindgen_free(ptr, len);
|
|
105
|
-
if (offset > 0) {
|
|
106
|
-
exports$1.__wbindgen_free(resultPtr, offset);
|
|
107
|
-
}
|
|
108
|
-
const result = JSON.parse(resultStr);
|
|
109
|
-
const detection = {
|
|
110
|
-
...result,
|
|
111
|
-
verificationMethod: "cryptographic",
|
|
112
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
113
|
-
};
|
|
114
|
-
if (this.config.onAgentDetected && detection.isAgent) {
|
|
115
|
-
this.config.onAgentDetected(detection);
|
|
116
|
-
}
|
|
117
|
-
return detection;
|
|
118
|
-
} catch (error) {
|
|
119
|
-
if (this.config.debug) {
|
|
120
|
-
console.error("WASM detection failed:", error);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return this.patternDetection(metadata);
|
|
125
|
-
}
|
|
126
|
-
patternDetection(metadata) {
|
|
127
|
-
const userAgent = metadata.userAgent.toLowerCase();
|
|
128
|
-
const patterns = [
|
|
129
|
-
// High confidence - explicit AI identifiers
|
|
130
|
-
{ pattern: /chatgpt-user/i, name: "ChatGPT", confidence: 0.95 },
|
|
131
|
-
{ pattern: /claude-web/i, name: "Claude", confidence: 0.95 },
|
|
132
|
-
{ pattern: /claude-user/i, name: "Claude", confidence: 0.95 },
|
|
133
|
-
{ pattern: /gpt-crawler/i, name: "GPT Crawler", confidence: 0.95 },
|
|
134
|
-
{ pattern: /perplexitybot/i, name: "Perplexity", confidence: 0.95 },
|
|
135
|
-
{ pattern: /perplexity-user/i, name: "Perplexity", confidence: 0.95 },
|
|
136
|
-
{ pattern: /perplexity-ai/i, name: "Perplexity", confidence: 0.95 },
|
|
137
|
-
// Medium-high confidence - company identifiers
|
|
138
|
-
{ pattern: /anthropic/i, name: "Anthropic", confidence: 0.9 },
|
|
139
|
-
{ pattern: /openai/i, name: "OpenAI", confidence: 0.9 },
|
|
140
|
-
// Medium confidence - product names
|
|
141
|
-
{ pattern: /copilot/i, name: "GitHub Copilot", confidence: 0.85 },
|
|
142
|
-
{ pattern: /bard/i, name: "Google Bard", confidence: 0.85 },
|
|
143
|
-
{ pattern: /gemini/i, name: "Google Gemini", confidence: 0.85 },
|
|
144
|
-
{ pattern: /perplexity/i, name: "Perplexity", confidence: 0.85 },
|
|
145
|
-
// Fallback
|
|
146
|
-
{ pattern: /\byou\.com\b/i, name: "You.com", confidence: 0.8 },
|
|
147
|
-
{ pattern: /\bphind\b/i, name: "Phind", confidence: 0.8 }
|
|
148
|
-
];
|
|
149
|
-
const suspiciousHeaders = ["x-openai-", "x-anthropic-", "x-ai-", "x-llm-", "x-gpt-"];
|
|
150
|
-
let headerBoost = 0;
|
|
151
|
-
for (const [key] of Object.entries(metadata.headers)) {
|
|
152
|
-
if (suspiciousHeaders.some((prefix) => key.toLowerCase().startsWith(prefix))) {
|
|
153
|
-
headerBoost = 0.1;
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
for (const { pattern, name, confidence } of patterns) {
|
|
158
|
-
if (pattern.test(userAgent)) {
|
|
159
|
-
const finalConfidence = Math.min(confidence + headerBoost, 1);
|
|
160
|
-
const result = {
|
|
161
|
-
isAgent: true,
|
|
162
|
-
confidence: finalConfidence,
|
|
163
|
-
agent: name,
|
|
164
|
-
verificationMethod: "pattern",
|
|
165
|
-
riskLevel: finalConfidence > 0.9 ? "high" : "medium",
|
|
166
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
167
|
-
};
|
|
168
|
-
if (this.config.onAgentDetected) {
|
|
169
|
-
this.config.onAgentDetected(result);
|
|
170
|
-
}
|
|
171
|
-
return result;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
return {
|
|
175
|
-
isAgent: false,
|
|
176
|
-
confidence: 0.85,
|
|
177
|
-
verificationMethod: "pattern",
|
|
178
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
isInitialized() {
|
|
182
|
-
return this.initialized;
|
|
183
|
-
}
|
|
184
|
-
getVerificationMethod() {
|
|
185
|
-
return this.wasmInstance ? "cryptographic" : "pattern";
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
function createEdgeAgentShield(config) {
|
|
189
|
-
return new EdgeRuntimeAgentShield(config);
|
|
190
|
-
}
|
|
191
|
-
var defaultInstance = null;
|
|
192
|
-
function getDefaultAgentShield(config) {
|
|
193
|
-
if (!defaultInstance) {
|
|
194
|
-
defaultInstance = new EdgeRuntimeAgentShield(config);
|
|
195
|
-
}
|
|
196
|
-
return defaultInstance;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
export { createEdgeAgentShield, getDefaultAgentShield };
|
|
200
|
-
//# sourceMappingURL=edge-runtime-loader.mjs.map
|
|
201
|
-
//# sourceMappingURL=edge-runtime-loader.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/edge-runtime-loader.ts"],"names":["exports"],"mappings":"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","file":"edge-runtime-loader.mjs","sourcesContent":["/**\n * Utility functions for agentshield-nextjs\n */\n\nimport type { NextRequest } from 'next/server';\n\n/**\n * Extract client IP address from a NextRequest.\n * In Next.js 15+, the `ip` property was removed from NextRequest.\n * This function uses headers to determine the client IP.\n *\n * @param request - The NextRequest object\n * @returns The client IP address or undefined if not available\n */\nexport function getClientIp(request: NextRequest): string | undefined {\n // Check x-forwarded-for header (standard for proxies/load balancers)\n const forwardedFor = request.headers.get('x-forwarded-for');\n if (forwardedFor) {\n // Take the first IP in the chain (original client)\n const ip = forwardedFor.split(',')[0]?.trim();\n if (ip) return ip;\n }\n\n // Check x-real-ip header (commonly used by nginx)\n const realIp = request.headers.get('x-real-ip');\n if (realIp) return realIp;\n\n // Check cf-connecting-ip header (Cloudflare)\n const cfIp = request.headers.get('cf-connecting-ip');\n if (cfIp) return cfIp;\n\n // Check x-client-ip header (some proxies use this)\n const clientIp = request.headers.get('x-client-ip');\n if (clientIp) return clientIp;\n\n return undefined;\n}\n\n/**\n * Safely extract the hostname from a URL string.\n * Returns a friendly fallback when parsing fails so UX copy doesn't leak\n * \"undefined\" or similar to end users.\n */\nexport function safeHostname(url: string): string {\n try {\n return new URL(url).hostname;\n } catch {\n return 'this site';\n }\n}\n","/**\n * Edge Runtime Compatible WASM Loader for AgentShield\n *\n * This module provides a pre-built solution for loading WASM in Edge Runtime.\n * It requires the WASM file to be manually placed in the project.\n */\n\nimport type { NextRequest } from 'next/server';\nimport { getClientIp } from './utils';\n\n// User must provide the WASM module via import\n// This is intentionally not imported here to allow user control\nexport interface WasmModule {\n default: WebAssembly.Module;\n}\n\nexport interface DetectionResult {\n isAgent: boolean;\n isAiCrawler?: boolean;\n confidence: number;\n agent?: string;\n verificationMethod: 'cryptographic' | 'pattern';\n riskLevel?: 'low' | 'medium' | 'high' | 'critical';\n timestamp: string;\n}\n\nexport interface AgentShieldConfig {\n wasmModule?: WebAssembly.Module;\n enableWasm?: boolean;\n onAgentDetected?: (result: DetectionResult) => void;\n blockAgents?: boolean;\n allowedAgents?: string[];\n debug?: boolean;\n}\n\ninterface WasmExports {\n detect_agent(metadataPtr: number, metadataLen: 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}\n\nclass EdgeRuntimeAgentShield {\n private wasmInstance: WebAssembly.Instance | null = null;\n private wasmMemory: WebAssembly.Memory | null = null;\n private config: AgentShieldConfig;\n private initialized = false;\n\n constructor(config: AgentShieldConfig = {}) {\n this.config = config;\n }\n\n async init(wasmModule?: WebAssembly.Module): Promise<void> {\n if (this.initialized) return;\n\n const module = wasmModule || this.config.wasmModule;\n\n if (module && this.config.enableWasm !== false) {\n try {\n this.wasmMemory = new WebAssembly.Memory({ initial: 17, maximum: 256 });\n\n const imports = {\n wbg: {\n __wbindgen_throw: (ptr: number, len: number) => {\n throw new Error(this.readString(ptr, len));\n },\n __wbg_log_: (ptr: number, len: number) => {\n if (this.config.debug) {\n console.log(this.readString(ptr, len));\n }\n },\n },\n env: {\n memory: this.wasmMemory,\n },\n };\n\n this.wasmInstance = await WebAssembly.instantiate(module, imports);\n this.initialized = true;\n\n if (this.config.debug) {\n console.log('✅ AgentShield WASM initialized in Edge Runtime');\n }\n } catch (error) {\n console.warn('⚠️ WASM initialization failed, using pattern detection:', error);\n this.initialized = true;\n }\n } else {\n this.initialized = true;\n }\n }\n\n private readString(ptr: number, len: number): string {\n if (!this.wasmInstance || !this.wasmMemory) {\n throw new Error('WASM not initialized');\n }\n const memory = new Uint8Array(this.wasmMemory.buffer);\n const bytes = memory.slice(ptr, ptr + len);\n return new TextDecoder().decode(bytes);\n }\n\n private writeString(str: string): [number, number] {\n if (!this.wasmInstance) {\n throw new Error('WASM not initialized');\n }\n const exports = this.wasmInstance.exports as unknown as WasmExports;\n\n const encoded = new TextEncoder().encode(str);\n const ptr = exports.__wbindgen_malloc(encoded.length);\n\n const memory = new Uint8Array(exports.memory.buffer);\n memory.set(encoded, ptr);\n\n return [ptr, encoded.length];\n }\n\n async detect(request: NextRequest): Promise<DetectionResult> {\n if (!this.initialized) {\n await this.init();\n }\n\n const metadata = {\n userAgent: request.headers.get('user-agent') || '',\n ipAddress: getClientIp(request) || '',\n headers: Object.fromEntries(request.headers.entries()),\n };\n\n // Try WASM detection first\n if (this.wasmInstance && this.config.enableWasm !== false) {\n try {\n const exports = this.wasmInstance.exports as unknown as WasmExports;\n const [ptr, len] = this.writeString(JSON.stringify(metadata));\n\n const resultPtr = exports.detect_agent(ptr, len);\n // Read result with dynamic size\n let resultStr = '';\n let offset = 0;\n const memory = new Uint8Array((exports.memory as WebAssembly.Memory).buffer);\n\n // Read until we find the end of the JSON string\n while (offset < 4096) {\n // Max 4KB result\n const byte = memory[resultPtr + offset];\n if (byte === 0 || byte === undefined) break;\n offset++;\n }\n\n if (offset > 0) {\n resultStr = this.readString(resultPtr, offset);\n }\n\n exports.__wbindgen_free(ptr, len);\n if (offset > 0) {\n exports.__wbindgen_free(resultPtr, offset);\n }\n\n const result = JSON.parse(resultStr);\n\n const detection: DetectionResult = {\n ...result,\n verificationMethod: 'cryptographic',\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.onAgentDetected && detection.isAgent) {\n this.config.onAgentDetected(detection);\n }\n\n return detection;\n } catch (error) {\n if (this.config.debug) {\n console.error('WASM detection failed:', error);\n }\n // Fall through to pattern detection\n }\n }\n\n // Fallback: Pattern-based detection\n return this.patternDetection(metadata);\n }\n\n private patternDetection(metadata: {\n userAgent: string;\n ipAddress: string;\n headers: Record<string, string>;\n }): DetectionResult {\n const userAgent = metadata.userAgent.toLowerCase();\n\n // Enhanced AI agent patterns with confidence scores\n const patterns = [\n // High confidence - explicit AI identifiers\n { pattern: /chatgpt-user/i, name: 'ChatGPT', confidence: 0.95 },\n { pattern: /claude-web/i, name: 'Claude', confidence: 0.95 },\n { pattern: /claude-user/i, name: 'Claude', confidence: 0.95 },\n { pattern: /gpt-crawler/i, name: 'GPT Crawler', confidence: 0.95 },\n { pattern: /perplexitybot/i, name: 'Perplexity', confidence: 0.95 },\n { pattern: /perplexity-user/i, name: 'Perplexity', confidence: 0.95 },\n { pattern: /perplexity-ai/i, name: 'Perplexity', confidence: 0.95 },\n\n // Medium-high confidence - company identifiers\n { pattern: /anthropic/i, name: 'Anthropic', confidence: 0.9 },\n { pattern: /openai/i, name: 'OpenAI', confidence: 0.9 },\n\n // Medium confidence - product names\n { pattern: /copilot/i, name: 'GitHub Copilot', confidence: 0.85 },\n { pattern: /bard/i, name: 'Google Bard', confidence: 0.85 },\n { pattern: /gemini/i, name: 'Google Gemini', confidence: 0.85 },\n { pattern: /perplexity/i, name: 'Perplexity', confidence: 0.85 }, // Fallback\n { pattern: /\\byou\\.com\\b/i, name: 'You.com', confidence: 0.8 },\n { pattern: /\\bphind\\b/i, name: 'Phind', confidence: 0.8 },\n ];\n\n // Check for suspicious headers\n const suspiciousHeaders = ['x-openai-', 'x-anthropic-', 'x-ai-', 'x-llm-', 'x-gpt-'];\n\n let headerBoost = 0;\n for (const [key] of Object.entries(metadata.headers)) {\n if (suspiciousHeaders.some((prefix) => key.toLowerCase().startsWith(prefix))) {\n headerBoost = 0.1;\n break;\n }\n }\n\n // Check patterns - patterns are ordered by confidence (highest first: 0.95, 0.90, 0.85...)\n // so breaking on first match returns the highest-confidence match\n for (const { pattern, name, confidence } of patterns) {\n if (pattern.test(userAgent)) {\n const finalConfidence = Math.min(confidence + headerBoost, 1.0);\n\n const result: DetectionResult = {\n isAgent: true,\n confidence: finalConfidence,\n agent: name,\n verificationMethod: 'pattern',\n riskLevel: finalConfidence > 0.9 ? 'high' : 'medium',\n timestamp: new Date().toISOString(),\n };\n\n if (this.config.onAgentDetected) {\n this.config.onAgentDetected(result);\n }\n\n return result;\n }\n }\n\n // Not detected\n return {\n isAgent: false,\n confidence: 0.85,\n verificationMethod: 'pattern',\n timestamp: new Date().toISOString(),\n };\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n getVerificationMethod(): 'cryptographic' | 'pattern' {\n return this.wasmInstance ? 'cryptographic' : 'pattern';\n }\n}\n\n/**\n * Factory function to create an AgentShield instance for Edge Runtime\n */\nexport function createEdgeAgentShield(config?: AgentShieldConfig) {\n return new EdgeRuntimeAgentShield(config);\n}\n\n/**\n * Singleton instance for simple usage\n */\nlet defaultInstance: EdgeRuntimeAgentShield | null = null;\n\nexport function getDefaultAgentShield(config?: AgentShieldConfig): EdgeRuntimeAgentShield {\n if (!defaultInstance) {\n defaultInstance = new EdgeRuntimeAgentShield(config);\n }\n return defaultInstance;\n}\n"]}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Edge Runtime Compatible WASM Middleware for AgentShield
|
|
5
|
-
*
|
|
6
|
-
* This module provides WASM-based AI agent detection with 95-100% confidence
|
|
7
|
-
* in Next.js Edge Runtime and Vercel Edge Functions.
|
|
8
|
-
*
|
|
9
|
-
* IMPORTANT: WebAssembly.instantiate(module) IS supported in Edge Runtime
|
|
10
|
-
* when using a pre-compiled module imported with ?module suffix.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
interface EdgeWasmDetectionResult {
|
|
14
|
-
isAgent: boolean;
|
|
15
|
-
isAiCrawler?: boolean;
|
|
16
|
-
confidence: number;
|
|
17
|
-
agent?: string;
|
|
18
|
-
verificationMethod: 'signature' | 'pattern' | 'wasm';
|
|
19
|
-
riskLevel: 'low' | 'medium' | 'high';
|
|
20
|
-
timestamp: string;
|
|
21
|
-
reasons?: string[];
|
|
22
|
-
}
|
|
23
|
-
interface EdgeAgentShieldConfig {
|
|
24
|
-
onAgentDetected?: (result: EdgeWasmDetectionResult) => void | Promise<void>;
|
|
25
|
-
blockOnHighConfidence?: boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Confidence threshold for blocking (0.0-1.0 scale).
|
|
28
|
-
* Detection confidence above this threshold will be blocked if blockOnHighConfidence is true.
|
|
29
|
-
* @default 0.9 (90% confidence)
|
|
30
|
-
* @example
|
|
31
|
-
* confidenceThreshold: 0.9 // Block if >= 90% confident
|
|
32
|
-
* confidenceThreshold: 0.7 // Block if >= 70% confident
|
|
33
|
-
*/
|
|
34
|
-
confidenceThreshold?: number;
|
|
35
|
-
skipPaths?: string[];
|
|
36
|
-
blockedResponse?: {
|
|
37
|
-
status?: number;
|
|
38
|
-
message?: string;
|
|
39
|
-
headers?: Record<string, string>;
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Initialize WASM module with proper imports for Edge Runtime
|
|
44
|
-
*/
|
|
45
|
-
declare function initializeEdgeWasm(wasmModule: WebAssembly.Module): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Create Edge Runtime compatible WASM middleware
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```typescript
|
|
51
|
-
* // middleware.ts
|
|
52
|
-
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
53
|
-
* import { createEdgeWasmMiddleware } from '@kya-os/agentshield-nextjs/edge-wasm-middleware';
|
|
54
|
-
*
|
|
55
|
-
* export const middleware = createEdgeWasmMiddleware({
|
|
56
|
-
* wasmModule,
|
|
57
|
-
* onAgentDetected: (result) => {
|
|
58
|
-
* // Note: result.confidence is 0.0-1.0 scale
|
|
59
|
-
* console.log(`AI Agent: ${result.agent} (${Math.round(result.confidence * 100)}% confidence)`);
|
|
60
|
-
* }
|
|
61
|
-
* });
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
declare function createEdgeWasmMiddleware(config: EdgeAgentShieldConfig & {
|
|
65
|
-
wasmModule: WebAssembly.Module;
|
|
66
|
-
}): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
67
|
-
|
|
68
|
-
export { type EdgeAgentShieldConfig, type EdgeWasmDetectionResult, createEdgeWasmMiddleware, initializeEdgeWasm };
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Edge Runtime Compatible WASM Middleware for AgentShield
|
|
5
|
-
*
|
|
6
|
-
* This module provides WASM-based AI agent detection with 95-100% confidence
|
|
7
|
-
* in Next.js Edge Runtime and Vercel Edge Functions.
|
|
8
|
-
*
|
|
9
|
-
* IMPORTANT: WebAssembly.instantiate(module) IS supported in Edge Runtime
|
|
10
|
-
* when using a pre-compiled module imported with ?module suffix.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
interface EdgeWasmDetectionResult {
|
|
14
|
-
isAgent: boolean;
|
|
15
|
-
isAiCrawler?: boolean;
|
|
16
|
-
confidence: number;
|
|
17
|
-
agent?: string;
|
|
18
|
-
verificationMethod: 'signature' | 'pattern' | 'wasm';
|
|
19
|
-
riskLevel: 'low' | 'medium' | 'high';
|
|
20
|
-
timestamp: string;
|
|
21
|
-
reasons?: string[];
|
|
22
|
-
}
|
|
23
|
-
interface EdgeAgentShieldConfig {
|
|
24
|
-
onAgentDetected?: (result: EdgeWasmDetectionResult) => void | Promise<void>;
|
|
25
|
-
blockOnHighConfidence?: boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Confidence threshold for blocking (0.0-1.0 scale).
|
|
28
|
-
* Detection confidence above this threshold will be blocked if blockOnHighConfidence is true.
|
|
29
|
-
* @default 0.9 (90% confidence)
|
|
30
|
-
* @example
|
|
31
|
-
* confidenceThreshold: 0.9 // Block if >= 90% confident
|
|
32
|
-
* confidenceThreshold: 0.7 // Block if >= 70% confident
|
|
33
|
-
*/
|
|
34
|
-
confidenceThreshold?: number;
|
|
35
|
-
skipPaths?: string[];
|
|
36
|
-
blockedResponse?: {
|
|
37
|
-
status?: number;
|
|
38
|
-
message?: string;
|
|
39
|
-
headers?: Record<string, string>;
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Initialize WASM module with proper imports for Edge Runtime
|
|
44
|
-
*/
|
|
45
|
-
declare function initializeEdgeWasm(wasmModule: WebAssembly.Module): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Create Edge Runtime compatible WASM middleware
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```typescript
|
|
51
|
-
* // middleware.ts
|
|
52
|
-
* import wasmModule from '@kya-os/agentshield/wasm?module';
|
|
53
|
-
* import { createEdgeWasmMiddleware } from '@kya-os/agentshield-nextjs/edge-wasm-middleware';
|
|
54
|
-
*
|
|
55
|
-
* export const middleware = createEdgeWasmMiddleware({
|
|
56
|
-
* wasmModule,
|
|
57
|
-
* onAgentDetected: (result) => {
|
|
58
|
-
* // Note: result.confidence is 0.0-1.0 scale
|
|
59
|
-
* console.log(`AI Agent: ${result.agent} (${Math.round(result.confidence * 100)}% confidence)`);
|
|
60
|
-
* }
|
|
61
|
-
* });
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
declare function createEdgeWasmMiddleware(config: EdgeAgentShieldConfig & {
|
|
65
|
-
wasmModule: WebAssembly.Module;
|
|
66
|
-
}): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
67
|
-
|
|
68
|
-
export { type EdgeAgentShieldConfig, type EdgeWasmDetectionResult, createEdgeWasmMiddleware, initializeEdgeWasm };
|