@kya-os/agentshield-nextjs 0.1.13 → 0.1.15

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.
@@ -0,0 +1,16 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { N as NextJSMiddlewareConfig } from './types-Hsgc8Gry.mjs';
3
+ import '@kya-os/agentshield';
4
+
5
+ /**
6
+ * Enhanced middleware creator that handles WASM initialization internally
7
+ * This avoids top-level await issues in Next.js middleware
8
+ */
9
+
10
+ /**
11
+ * Create an AgentShield middleware with automatic WASM initialization
12
+ * This version handles initialization internally to avoid top-level await
13
+ */
14
+ declare function createAgentShieldMiddleware(config: NextJSMiddlewareConfig): (request: NextRequest) => Promise<NextResponse>;
15
+
16
+ export { createAgentShieldMiddleware, createAgentShieldMiddleware as createMiddleware };
@@ -0,0 +1,16 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { N as NextJSMiddlewareConfig } from './types-Hsgc8Gry.js';
3
+ import '@kya-os/agentshield';
4
+
5
+ /**
6
+ * Enhanced middleware creator that handles WASM initialization internally
7
+ * This avoids top-level await issues in Next.js middleware
8
+ */
9
+
10
+ /**
11
+ * Create an AgentShield middleware with automatic WASM initialization
12
+ * This version handles initialization internally to avoid top-level await
13
+ */
14
+ declare function createAgentShieldMiddleware(config: NextJSMiddlewareConfig): (request: NextRequest) => Promise<NextResponse>;
15
+
16
+ export { createAgentShieldMiddleware, createAgentShieldMiddleware as createMiddleware };
@@ -0,0 +1,174 @@
1
+ 'use strict';
2
+
3
+ var server = require('next/server');
4
+ var agentshield = require('@kya-os/agentshield');
5
+
6
+ // src/create-middleware.ts
7
+
8
+ // src/wasm-setup.ts
9
+ var wasmInitialized = false;
10
+ var initPromise = null;
11
+ var initAttempted = false;
12
+ async function setupWasm() {
13
+ if (wasmInitialized) {
14
+ return;
15
+ }
16
+ if (initPromise) {
17
+ return initPromise;
18
+ }
19
+ initPromise = doSetupWasm();
20
+ return initPromise;
21
+ }
22
+ async function doSetupWasm() {
23
+ if (initAttempted) {
24
+ return;
25
+ }
26
+ initAttempted = true;
27
+ try {
28
+ if (typeof process !== "undefined" && process.env.NODE_ENV === "test") {
29
+ wasmInitialized = true;
30
+ return;
31
+ }
32
+ if (typeof process !== "undefined" && !process.env.NEXT_RUNTIME) {
33
+ wasmInitialized = true;
34
+ return;
35
+ }
36
+ wasmInitialized = true;
37
+ } catch (error) {
38
+ wasmInitialized = true;
39
+ }
40
+ }
41
+ function createAgentShieldMiddleware(config = {}) {
42
+ const detector = new agentshield.AgentDetector(config);
43
+ if (config.events) {
44
+ Object.entries(config.events).forEach(([event, handler]) => {
45
+ detector.on(event, handler);
46
+ });
47
+ }
48
+ const {
49
+ onAgentDetected = "log",
50
+ onDetection,
51
+ skipPaths = [],
52
+ blockedResponse = {
53
+ status: 403,
54
+ message: "Access denied: Automated agent detected",
55
+ headers: { "Content-Type": "application/json" }
56
+ },
57
+ redirectUrl = "/blocked",
58
+ rewriteUrl = "/blocked"
59
+ } = config;
60
+ return async (request) => {
61
+ try {
62
+ const shouldSkip = skipPaths.some((pattern) => {
63
+ if (typeof pattern === "string") {
64
+ return request.nextUrl.pathname.startsWith(pattern);
65
+ }
66
+ return pattern.test(request.nextUrl.pathname);
67
+ });
68
+ if (shouldSkip) {
69
+ request.agentShield = { skipped: true };
70
+ return server.NextResponse.next();
71
+ }
72
+ const context = {
73
+ userAgent: request.headers.get("user-agent") ?? void 0,
74
+ ipAddress: request.ip ?? request.headers.get("x-forwarded-for") ?? void 0,
75
+ headers: Object.fromEntries(request.headers.entries()),
76
+ url: request.url,
77
+ method: request.method,
78
+ timestamp: /* @__PURE__ */ new Date()
79
+ };
80
+ const result = await detector.analyze(context);
81
+ if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {
82
+ if (onDetection) {
83
+ const customResponse = await onDetection(request, result);
84
+ if (customResponse) {
85
+ return customResponse;
86
+ }
87
+ }
88
+ switch (onAgentDetected) {
89
+ case "block": {
90
+ const response2 = server.NextResponse.json(
91
+ {
92
+ error: blockedResponse.message,
93
+ detected: true,
94
+ confidence: result.confidence,
95
+ timestamp: result.timestamp
96
+ },
97
+ { status: blockedResponse.status }
98
+ );
99
+ if (blockedResponse.headers) {
100
+ Object.entries(blockedResponse.headers).forEach(
101
+ ([key, value]) => {
102
+ response2.headers.set(key, value);
103
+ }
104
+ );
105
+ }
106
+ detector.emit("agent.blocked", result, context);
107
+ return response2;
108
+ }
109
+ case "redirect":
110
+ return server.NextResponse.redirect(new URL(redirectUrl, request.url));
111
+ case "rewrite":
112
+ return server.NextResponse.rewrite(new URL(rewriteUrl, request.url));
113
+ case "log":
114
+ console.warn("AgentShield: Agent detected", {
115
+ ipAddress: context.ipAddress,
116
+ userAgent: context.userAgent,
117
+ confidence: result.confidence,
118
+ reasons: result.reasons,
119
+ pathname: request.nextUrl.pathname
120
+ });
121
+ break;
122
+ case "allow":
123
+ default:
124
+ if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {
125
+ detector.emit("agent.allowed", result, context);
126
+ }
127
+ break;
128
+ }
129
+ }
130
+ request.agentShield = {
131
+ result,
132
+ skipped: false
133
+ };
134
+ const response = server.NextResponse.next();
135
+ response.headers.set("x-agentshield-detected", result.isAgent.toString());
136
+ response.headers.set(
137
+ "x-agentshield-confidence",
138
+ result.confidence.toString()
139
+ );
140
+ return response;
141
+ } catch (error) {
142
+ console.error("AgentShield middleware error:", error);
143
+ return server.NextResponse.next();
144
+ }
145
+ };
146
+ }
147
+
148
+ // src/create-middleware.ts
149
+ var middlewareInstance = null;
150
+ var isInitializing = false;
151
+ var initPromise2 = null;
152
+ function createAgentShieldMiddleware2(config) {
153
+ return async function agentShieldMiddleware(request) {
154
+ if (!middlewareInstance) {
155
+ if (!isInitializing) {
156
+ isInitializing = true;
157
+ initPromise2 = (async () => {
158
+ await setupWasm();
159
+ middlewareInstance = createAgentShieldMiddleware(config);
160
+ return middlewareInstance;
161
+ })();
162
+ }
163
+ if (initPromise2) {
164
+ middlewareInstance = await initPromise2;
165
+ }
166
+ }
167
+ return middlewareInstance ? middlewareInstance(request) : server.NextResponse.next();
168
+ };
169
+ }
170
+
171
+ exports.createAgentShieldMiddleware = createAgentShieldMiddleware2;
172
+ exports.createMiddleware = createAgentShieldMiddleware2;
173
+ //# sourceMappingURL=create-middleware.js.map
174
+ //# sourceMappingURL=create-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wasm-setup.ts","../src/middleware.ts","../src/create-middleware.ts"],"names":["AgentDetector","NextResponse","response","initPromise","createAgentShieldMiddleware"],"mappings":"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","file":"create-middleware.js","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Designed to work without top-level await to avoid Next.js middleware issues.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * export async function middleware(request: NextRequest) {\n * // Initialize WASM inside the middleware function\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * return agentShieldMiddleware(request);\n * }\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\nlet initAttempted = false;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n // Prevent multiple initialization attempts\n if (initAttempted) {\n return;\n }\n initAttempted = true;\n\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // For now, just mark as initialized - WASM loading in Edge Runtime\n // has compatibility issues with Next.js middleware\n // The fallback pattern detection works excellently\n wasmInitialized = true;\n \n // Silently skip WASM loading - pattern detection will be used\n // This avoids the dynamic import errors in Edge Runtime\n } catch (error) {\n // Mark as initialized to prevent retries\n wasmInitialized = true;\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}","/**\n * Next.js middleware for AgentShield\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n const detector = new AgentDetector(config);\n \n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Prepare request context\n const context = {\n userAgent: request.headers.get('user-agent') ?? undefined,\n ipAddress: request.ip ?? request.headers.get('x-forwarded-for') ?? undefined,\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n \n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n const response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * Enhanced middleware creator that handles WASM initialization internally\n * This avoids top-level await issues in Next.js middleware\n */\n\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { setupWasm } from './wasm-setup';\nimport { createAgentShieldMiddleware as createBaseMiddleware } from './middleware';\nimport type { NextJSMiddlewareConfig } from './types';\n\nlet middlewareInstance: any = null;\nlet isInitializing = false;\nlet initPromise: Promise<any> | null = null;\n\n/**\n * Create an AgentShield middleware with automatic WASM initialization\n * This version handles initialization internally to avoid top-level await\n */\nexport function createAgentShieldMiddleware(config: NextJSMiddlewareConfig) {\n return async function agentShieldMiddleware(request: NextRequest): Promise<NextResponse> {\n // Initialize WASM and middleware on first request\n if (!middlewareInstance) {\n if (!isInitializing) {\n isInitializing = true;\n initPromise = (async () => {\n // Initialize WASM (will gracefully fallback if not available)\n await setupWasm();\n \n // Create the actual middleware instance\n middlewareInstance = createBaseMiddleware(config);\n return middlewareInstance;\n })();\n }\n \n // Wait for initialization to complete\n if (initPromise) {\n middlewareInstance = await initPromise;\n }\n }\n \n // Run the middleware\n return middlewareInstance ? middlewareInstance(request) : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };"]}
@@ -0,0 +1,171 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { AgentDetector } from '@kya-os/agentshield';
3
+
4
+ // src/create-middleware.ts
5
+
6
+ // src/wasm-setup.ts
7
+ var wasmInitialized = false;
8
+ var initPromise = null;
9
+ var initAttempted = false;
10
+ async function setupWasm() {
11
+ if (wasmInitialized) {
12
+ return;
13
+ }
14
+ if (initPromise) {
15
+ return initPromise;
16
+ }
17
+ initPromise = doSetupWasm();
18
+ return initPromise;
19
+ }
20
+ async function doSetupWasm() {
21
+ if (initAttempted) {
22
+ return;
23
+ }
24
+ initAttempted = true;
25
+ try {
26
+ if (typeof process !== "undefined" && process.env.NODE_ENV === "test") {
27
+ wasmInitialized = true;
28
+ return;
29
+ }
30
+ if (typeof process !== "undefined" && !process.env.NEXT_RUNTIME) {
31
+ wasmInitialized = true;
32
+ return;
33
+ }
34
+ wasmInitialized = true;
35
+ } catch (error) {
36
+ wasmInitialized = true;
37
+ }
38
+ }
39
+ function createAgentShieldMiddleware(config = {}) {
40
+ const detector = new AgentDetector(config);
41
+ if (config.events) {
42
+ Object.entries(config.events).forEach(([event, handler]) => {
43
+ detector.on(event, handler);
44
+ });
45
+ }
46
+ const {
47
+ onAgentDetected = "log",
48
+ onDetection,
49
+ skipPaths = [],
50
+ blockedResponse = {
51
+ status: 403,
52
+ message: "Access denied: Automated agent detected",
53
+ headers: { "Content-Type": "application/json" }
54
+ },
55
+ redirectUrl = "/blocked",
56
+ rewriteUrl = "/blocked"
57
+ } = config;
58
+ return async (request) => {
59
+ try {
60
+ const shouldSkip = skipPaths.some((pattern) => {
61
+ if (typeof pattern === "string") {
62
+ return request.nextUrl.pathname.startsWith(pattern);
63
+ }
64
+ return pattern.test(request.nextUrl.pathname);
65
+ });
66
+ if (shouldSkip) {
67
+ request.agentShield = { skipped: true };
68
+ return NextResponse.next();
69
+ }
70
+ const context = {
71
+ userAgent: request.headers.get("user-agent") ?? void 0,
72
+ ipAddress: request.ip ?? request.headers.get("x-forwarded-for") ?? void 0,
73
+ headers: Object.fromEntries(request.headers.entries()),
74
+ url: request.url,
75
+ method: request.method,
76
+ timestamp: /* @__PURE__ */ new Date()
77
+ };
78
+ const result = await detector.analyze(context);
79
+ if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {
80
+ if (onDetection) {
81
+ const customResponse = await onDetection(request, result);
82
+ if (customResponse) {
83
+ return customResponse;
84
+ }
85
+ }
86
+ switch (onAgentDetected) {
87
+ case "block": {
88
+ const response2 = NextResponse.json(
89
+ {
90
+ error: blockedResponse.message,
91
+ detected: true,
92
+ confidence: result.confidence,
93
+ timestamp: result.timestamp
94
+ },
95
+ { status: blockedResponse.status }
96
+ );
97
+ if (blockedResponse.headers) {
98
+ Object.entries(blockedResponse.headers).forEach(
99
+ ([key, value]) => {
100
+ response2.headers.set(key, value);
101
+ }
102
+ );
103
+ }
104
+ detector.emit("agent.blocked", result, context);
105
+ return response2;
106
+ }
107
+ case "redirect":
108
+ return NextResponse.redirect(new URL(redirectUrl, request.url));
109
+ case "rewrite":
110
+ return NextResponse.rewrite(new URL(rewriteUrl, request.url));
111
+ case "log":
112
+ console.warn("AgentShield: Agent detected", {
113
+ ipAddress: context.ipAddress,
114
+ userAgent: context.userAgent,
115
+ confidence: result.confidence,
116
+ reasons: result.reasons,
117
+ pathname: request.nextUrl.pathname
118
+ });
119
+ break;
120
+ case "allow":
121
+ default:
122
+ if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {
123
+ detector.emit("agent.allowed", result, context);
124
+ }
125
+ break;
126
+ }
127
+ }
128
+ request.agentShield = {
129
+ result,
130
+ skipped: false
131
+ };
132
+ const response = NextResponse.next();
133
+ response.headers.set("x-agentshield-detected", result.isAgent.toString());
134
+ response.headers.set(
135
+ "x-agentshield-confidence",
136
+ result.confidence.toString()
137
+ );
138
+ return response;
139
+ } catch (error) {
140
+ console.error("AgentShield middleware error:", error);
141
+ return NextResponse.next();
142
+ }
143
+ };
144
+ }
145
+
146
+ // src/create-middleware.ts
147
+ var middlewareInstance = null;
148
+ var isInitializing = false;
149
+ var initPromise2 = null;
150
+ function createAgentShieldMiddleware2(config) {
151
+ return async function agentShieldMiddleware(request) {
152
+ if (!middlewareInstance) {
153
+ if (!isInitializing) {
154
+ isInitializing = true;
155
+ initPromise2 = (async () => {
156
+ await setupWasm();
157
+ middlewareInstance = createAgentShieldMiddleware(config);
158
+ return middlewareInstance;
159
+ })();
160
+ }
161
+ if (initPromise2) {
162
+ middlewareInstance = await initPromise2;
163
+ }
164
+ }
165
+ return middlewareInstance ? middlewareInstance(request) : NextResponse.next();
166
+ };
167
+ }
168
+
169
+ export { createAgentShieldMiddleware2 as createAgentShieldMiddleware, createAgentShieldMiddleware2 as createMiddleware };
170
+ //# sourceMappingURL=create-middleware.mjs.map
171
+ //# sourceMappingURL=create-middleware.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wasm-setup.ts","../src/middleware.ts","../src/create-middleware.ts"],"names":["response","initPromise","createAgentShieldMiddleware","NextResponse"],"mappings":"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","file":"create-middleware.mjs","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Designed to work without top-level await to avoid Next.js middleware issues.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * export async function middleware(request: NextRequest) {\n * // Initialize WASM inside the middleware function\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * return agentShieldMiddleware(request);\n * }\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\nlet initAttempted = false;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n // Prevent multiple initialization attempts\n if (initAttempted) {\n return;\n }\n initAttempted = true;\n\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // For now, just mark as initialized - WASM loading in Edge Runtime\n // has compatibility issues with Next.js middleware\n // The fallback pattern detection works excellently\n wasmInitialized = true;\n \n // Silently skip WASM loading - pattern detection will be used\n // This avoids the dynamic import errors in Edge Runtime\n } catch (error) {\n // Mark as initialized to prevent retries\n wasmInitialized = true;\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}","/**\n * Next.js middleware for AgentShield\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n const detector = new AgentDetector(config);\n \n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Prepare request context\n const context = {\n userAgent: request.headers.get('user-agent') ?? undefined,\n ipAddress: request.ip ?? request.headers.get('x-forwarded-for') ?? undefined,\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n \n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n const response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * Enhanced middleware creator that handles WASM initialization internally\n * This avoids top-level await issues in Next.js middleware\n */\n\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { setupWasm } from './wasm-setup';\nimport { createAgentShieldMiddleware as createBaseMiddleware } from './middleware';\nimport type { NextJSMiddlewareConfig } from './types';\n\nlet middlewareInstance: any = null;\nlet isInitializing = false;\nlet initPromise: Promise<any> | null = null;\n\n/**\n * Create an AgentShield middleware with automatic WASM initialization\n * This version handles initialization internally to avoid top-level await\n */\nexport function createAgentShieldMiddleware(config: NextJSMiddlewareConfig) {\n return async function agentShieldMiddleware(request: NextRequest): Promise<NextResponse> {\n // Initialize WASM and middleware on first request\n if (!middlewareInstance) {\n if (!isInitializing) {\n isInitializing = true;\n initPromise = (async () => {\n // Initialize WASM (will gracefully fallback if not available)\n await setupWasm();\n \n // Create the actual middleware instance\n middlewareInstance = createBaseMiddleware(config);\n return middlewareInstance;\n })();\n }\n \n // Wait for initialization to complete\n if (initPromise) {\n middlewareInstance = await initPromise;\n }\n }\n \n // Run the middleware\n return middlewareInstance ? middlewareInstance(request) : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };"]}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,6 @@
1
- export { D as DetectionContext, N as NextJSMiddlewareConfig, a as agentShield, c as createAgentShieldMiddleware } from './middleware-OvcbG6s2.mjs';
1
+ export { createMiddleware as createAgentShieldMiddleware, createMiddleware } from './create-middleware.mjs';
2
+ export { createAgentShieldMiddleware as createAgentShieldMiddlewareBase } from './middleware.mjs';
3
+ export { D as DetectionContext, N as NextJSMiddlewareConfig } from './types-Hsgc8Gry.mjs';
2
4
  import 'next/server';
3
5
  import '@kya-os/agentshield';
4
6
 
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- export { D as DetectionContext, N as NextJSMiddlewareConfig, a as agentShield, c as createAgentShieldMiddleware } from './middleware-OvcbG6s2.js';
1
+ export { createMiddleware as createAgentShieldMiddleware, createMiddleware } from './create-middleware.js';
2
+ export { createAgentShieldMiddleware as createAgentShieldMiddlewareBase } from './middleware.js';
3
+ export { D as DetectionContext, N as NextJSMiddlewareConfig } from './types-Hsgc8Gry.js';
2
4
  import 'next/server';
3
5
  import '@kya-os/agentshield';
4
6
 
package/dist/index.js CHANGED
@@ -3,7 +3,41 @@
3
3
  var server = require('next/server');
4
4
  var agentshield = require('@kya-os/agentshield');
5
5
 
6
- // src/middleware.ts
6
+ // src/create-middleware.ts
7
+
8
+ // src/wasm-setup.ts
9
+ var wasmInitialized = false;
10
+ var initPromise = null;
11
+ var initAttempted = false;
12
+ async function setupWasm() {
13
+ if (wasmInitialized) {
14
+ return;
15
+ }
16
+ if (initPromise) {
17
+ return initPromise;
18
+ }
19
+ initPromise = doSetupWasm();
20
+ return initPromise;
21
+ }
22
+ async function doSetupWasm() {
23
+ if (initAttempted) {
24
+ return;
25
+ }
26
+ initAttempted = true;
27
+ try {
28
+ if (typeof process !== "undefined" && process.env.NODE_ENV === "test") {
29
+ wasmInitialized = true;
30
+ return;
31
+ }
32
+ if (typeof process !== "undefined" && !process.env.NEXT_RUNTIME) {
33
+ wasmInitialized = true;
34
+ return;
35
+ }
36
+ wasmInitialized = true;
37
+ } catch (error) {
38
+ wasmInitialized = true;
39
+ }
40
+ }
7
41
  function createAgentShieldMiddleware(config = {}) {
8
42
  const detector = new agentshield.AgentDetector(config);
9
43
  if (config.events) {
@@ -110,8 +144,28 @@ function createAgentShieldMiddleware(config = {}) {
110
144
  }
111
145
  };
112
146
  }
113
- function agentShield(config = {}) {
114
- return createAgentShieldMiddleware(config);
147
+
148
+ // src/create-middleware.ts
149
+ var middlewareInstance = null;
150
+ var isInitializing = false;
151
+ var initPromise2 = null;
152
+ function createAgentShieldMiddleware2(config) {
153
+ return async function agentShieldMiddleware(request) {
154
+ if (!middlewareInstance) {
155
+ if (!isInitializing) {
156
+ isInitializing = true;
157
+ initPromise2 = (async () => {
158
+ await setupWasm();
159
+ middlewareInstance = createAgentShieldMiddleware(config);
160
+ return middlewareInstance;
161
+ })();
162
+ }
163
+ if (initPromise2) {
164
+ middlewareInstance = await initPromise2;
165
+ }
166
+ }
167
+ return middlewareInstance ? middlewareInstance(request) : server.NextResponse.next();
168
+ };
115
169
  }
116
170
 
117
171
  // src/index.ts
@@ -123,7 +177,8 @@ var VERSION = "0.1.0";
123
177
  */
124
178
 
125
179
  exports.VERSION = VERSION;
126
- exports.agentShield = agentShield;
127
- exports.createAgentShieldMiddleware = createAgentShieldMiddleware;
180
+ exports.createAgentShieldMiddleware = createAgentShieldMiddleware2;
181
+ exports.createAgentShieldMiddlewareBase = createAgentShieldMiddleware;
182
+ exports.createMiddleware = createAgentShieldMiddleware2;
128
183
  //# sourceMappingURL=index.js.map
129
184
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/middleware.ts","../src/index.ts"],"names":["AgentDetector","NextResponse","response"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Next.js middleware for AgentShield\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n const detector = new AgentDetector(config);\n \n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Prepare request context\n const context = {\n userAgent: request.headers.get('user-agent') ?? undefined,\n ipAddress: request.ip ?? request.headers.get('x-forwarded-for') ?? undefined,\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n \n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n const response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * @fileoverview AgentShield Next.js Integration\n * @version 0.1.0\n * @license MIT OR Apache-2.0\n */\n\nexport * from './middleware';\nexport * from './types';\n// Hooks are not exported from main entry - they're client-only\n// If someone needs hooks, they should import from '@kya-os/agentshield-nextjs/hooks'\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n"]}
1
+ {"version":3,"sources":["../src/wasm-setup.ts","../src/middleware.ts","../src/create-middleware.ts","../src/index.ts"],"names":["AgentDetector","NextResponse","response","initPromise","createAgentShieldMiddleware"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Designed to work without top-level await to avoid Next.js middleware issues.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * export async function middleware(request: NextRequest) {\n * // Initialize WASM inside the middleware function\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * return agentShieldMiddleware(request);\n * }\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\nlet initAttempted = false;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n // Prevent multiple initialization attempts\n if (initAttempted) {\n return;\n }\n initAttempted = true;\n\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // For now, just mark as initialized - WASM loading in Edge Runtime\n // has compatibility issues with Next.js middleware\n // The fallback pattern detection works excellently\n wasmInitialized = true;\n \n // Silently skip WASM loading - pattern detection will be used\n // This avoids the dynamic import errors in Edge Runtime\n } catch (error) {\n // Mark as initialized to prevent retries\n wasmInitialized = true;\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}","/**\n * Next.js middleware for AgentShield\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n const detector = new AgentDetector(config);\n \n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Prepare request context\n const context = {\n userAgent: request.headers.get('user-agent') ?? undefined,\n ipAddress: request.ip ?? request.headers.get('x-forwarded-for') ?? undefined,\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n \n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n const response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * Enhanced middleware creator that handles WASM initialization internally\n * This avoids top-level await issues in Next.js middleware\n */\n\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { setupWasm } from './wasm-setup';\nimport { createAgentShieldMiddleware as createBaseMiddleware } from './middleware';\nimport type { NextJSMiddlewareConfig } from './types';\n\nlet middlewareInstance: any = null;\nlet isInitializing = false;\nlet initPromise: Promise<any> | null = null;\n\n/**\n * Create an AgentShield middleware with automatic WASM initialization\n * This version handles initialization internally to avoid top-level await\n */\nexport function createAgentShieldMiddleware(config: NextJSMiddlewareConfig) {\n return async function agentShieldMiddleware(request: NextRequest): Promise<NextResponse> {\n // Initialize WASM and middleware on first request\n if (!middlewareInstance) {\n if (!isInitializing) {\n isInitializing = true;\n initPromise = (async () => {\n // Initialize WASM (will gracefully fallback if not available)\n await setupWasm();\n \n // Create the actual middleware instance\n middlewareInstance = createBaseMiddleware(config);\n return middlewareInstance;\n })();\n }\n \n // Wait for initialization to complete\n if (initPromise) {\n middlewareInstance = await initPromise;\n }\n }\n \n // Run the middleware\n return middlewareInstance ? middlewareInstance(request) : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };","/**\n * @fileoverview AgentShield Next.js Integration\n * @version 0.1.0\n * @license MIT OR Apache-2.0\n */\n\n// Export the enhanced middleware that handles initialization internally\nexport { createAgentShieldMiddleware, createMiddleware } from './create-middleware';\n\n// Also export original middleware for advanced users\nexport { createAgentShieldMiddleware as createAgentShieldMiddlewareBase } from './middleware';\n\nexport * from './types';\n// Hooks are not exported from main entry - they're client-only\n// If someone needs hooks, they should import from '@kya-os/agentshield-nextjs/hooks'\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,41 @@
1
1
  import { NextResponse } from 'next/server';
2
2
  import { AgentDetector } from '@kya-os/agentshield';
3
3
 
4
- // src/middleware.ts
4
+ // src/create-middleware.ts
5
+
6
+ // src/wasm-setup.ts
7
+ var wasmInitialized = false;
8
+ var initPromise = null;
9
+ var initAttempted = false;
10
+ async function setupWasm() {
11
+ if (wasmInitialized) {
12
+ return;
13
+ }
14
+ if (initPromise) {
15
+ return initPromise;
16
+ }
17
+ initPromise = doSetupWasm();
18
+ return initPromise;
19
+ }
20
+ async function doSetupWasm() {
21
+ if (initAttempted) {
22
+ return;
23
+ }
24
+ initAttempted = true;
25
+ try {
26
+ if (typeof process !== "undefined" && process.env.NODE_ENV === "test") {
27
+ wasmInitialized = true;
28
+ return;
29
+ }
30
+ if (typeof process !== "undefined" && !process.env.NEXT_RUNTIME) {
31
+ wasmInitialized = true;
32
+ return;
33
+ }
34
+ wasmInitialized = true;
35
+ } catch (error) {
36
+ wasmInitialized = true;
37
+ }
38
+ }
5
39
  function createAgentShieldMiddleware(config = {}) {
6
40
  const detector = new AgentDetector(config);
7
41
  if (config.events) {
@@ -108,8 +142,28 @@ function createAgentShieldMiddleware(config = {}) {
108
142
  }
109
143
  };
110
144
  }
111
- function agentShield(config = {}) {
112
- return createAgentShieldMiddleware(config);
145
+
146
+ // src/create-middleware.ts
147
+ var middlewareInstance = null;
148
+ var isInitializing = false;
149
+ var initPromise2 = null;
150
+ function createAgentShieldMiddleware2(config) {
151
+ return async function agentShieldMiddleware(request) {
152
+ if (!middlewareInstance) {
153
+ if (!isInitializing) {
154
+ isInitializing = true;
155
+ initPromise2 = (async () => {
156
+ await setupWasm();
157
+ middlewareInstance = createAgentShieldMiddleware(config);
158
+ return middlewareInstance;
159
+ })();
160
+ }
161
+ if (initPromise2) {
162
+ middlewareInstance = await initPromise2;
163
+ }
164
+ }
165
+ return middlewareInstance ? middlewareInstance(request) : NextResponse.next();
166
+ };
113
167
  }
114
168
 
115
169
  // src/index.ts
@@ -120,6 +174,6 @@ var VERSION = "0.1.0";
120
174
  * @license MIT OR Apache-2.0
121
175
  */
122
176
 
123
- export { VERSION, agentShield, createAgentShieldMiddleware };
177
+ export { VERSION, createAgentShieldMiddleware2 as createAgentShieldMiddleware, createAgentShieldMiddleware as createAgentShieldMiddlewareBase, createAgentShieldMiddleware2 as createMiddleware };
124
178
  //# sourceMappingURL=index.mjs.map
125
179
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/middleware.ts","../src/index.ts"],"names":["response"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Next.js middleware for AgentShield\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n const detector = new AgentDetector(config);\n \n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Prepare request context\n const context = {\n userAgent: request.headers.get('user-agent') ?? undefined,\n ipAddress: request.ip ?? request.headers.get('x-forwarded-for') ?? undefined,\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n \n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n const response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * @fileoverview AgentShield Next.js Integration\n * @version 0.1.0\n * @license MIT OR Apache-2.0\n */\n\nexport * from './middleware';\nexport * from './types';\n// Hooks are not exported from main entry - they're client-only\n// If someone needs hooks, they should import from '@kya-os/agentshield-nextjs/hooks'\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n"]}
1
+ {"version":3,"sources":["../src/wasm-setup.ts","../src/middleware.ts","../src/create-middleware.ts","../src/index.ts"],"names":["response","initPromise","createAgentShieldMiddleware","NextResponse"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Designed to work without top-level await to avoid Next.js middleware issues.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * export async function middleware(request: NextRequest) {\n * // Initialize WASM inside the middleware function\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * return agentShieldMiddleware(request);\n * }\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\nlet initAttempted = false;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n // Prevent multiple initialization attempts\n if (initAttempted) {\n return;\n }\n initAttempted = true;\n\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // For now, just mark as initialized - WASM loading in Edge Runtime\n // has compatibility issues with Next.js middleware\n // The fallback pattern detection works excellently\n wasmInitialized = true;\n \n // Silently skip WASM loading - pattern detection will be used\n // This avoids the dynamic import errors in Edge Runtime\n } catch (error) {\n // Mark as initialized to prevent retries\n wasmInitialized = true;\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}","/**\n * Next.js middleware for AgentShield\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport type { NextJSMiddlewareConfig } from './types';\n\n/**\n * Create AgentShield middleware for Next.js\n */\nexport function createAgentShieldMiddleware(\n config: Partial<NextJSMiddlewareConfig> = {}\n) {\n const detector = new AgentDetector(config);\n \n // Wire up event handlers if provided\n if (config.events) {\n Object.entries(config.events).forEach(([event, handler]) => {\n detector.on(event as any, handler as any);\n });\n }\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n redirectUrl = '/blocked',\n rewriteUrl = '/blocked',\n } = config;\n\n return async (request: NextRequest): Promise<NextResponse> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return request.nextUrl.pathname.startsWith(pattern);\n }\n return pattern.test(request.nextUrl.pathname);\n });\n\n if (shouldSkip) {\n // Mark as skipped in request\n (request as any).agentShield = { skipped: true };\n return NextResponse.next();\n }\n\n // Prepare request context\n const context = {\n userAgent: request.headers.get('user-agent') ?? undefined,\n ipAddress: request.ip ?? request.headers.get('x-forwarded-for') ?? undefined,\n headers: Object.fromEntries(request.headers.entries()),\n url: request.url,\n method: request.method,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n const customResponse = await onDetection(request, result);\n if (customResponse) {\n return customResponse;\n }\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block': {\n const response = NextResponse.json(\n {\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n },\n { status: blockedResponse.status }\n );\n\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n response.headers.set(key, value);\n }\n );\n }\n \n // Emit blocked event\n detector.emit('agent.blocked', result, context);\n\n return response;\n }\n\n case 'redirect':\n return NextResponse.redirect(new URL(redirectUrl, request.url));\n\n case 'rewrite':\n return NextResponse.rewrite(new URL(rewriteUrl, request.url));\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n pathname: request.nextUrl.pathname,\n });\n break;\n\n case 'allow':\n default:\n // Emit allowed event for high-confidence agents\n if (result.isAgent && result.confidence >= (config.confidenceThreshold ?? 0.7)) {\n detector.emit('agent.allowed', result, context);\n }\n // Continue processing\n break;\n }\n }\n\n // Add detection result to request for API routes\n (request as any).agentShield = {\n result,\n skipped: false,\n };\n\n // Add detection result to response headers for debugging\n const response = NextResponse.next();\n response.headers.set('x-agentshield-detected', result.isAgent.toString());\n response.headers.set(\n 'x-agentshield-confidence',\n result.confidence.toString()\n );\n\n return response;\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n return NextResponse.next(); // Continue on error\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(config: Partial<NextJSMiddlewareConfig> = {}) {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * Enhanced middleware creator that handles WASM initialization internally\n * This avoids top-level await issues in Next.js middleware\n */\n\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { setupWasm } from './wasm-setup';\nimport { createAgentShieldMiddleware as createBaseMiddleware } from './middleware';\nimport type { NextJSMiddlewareConfig } from './types';\n\nlet middlewareInstance: any = null;\nlet isInitializing = false;\nlet initPromise: Promise<any> | null = null;\n\n/**\n * Create an AgentShield middleware with automatic WASM initialization\n * This version handles initialization internally to avoid top-level await\n */\nexport function createAgentShieldMiddleware(config: NextJSMiddlewareConfig) {\n return async function agentShieldMiddleware(request: NextRequest): Promise<NextResponse> {\n // Initialize WASM and middleware on first request\n if (!middlewareInstance) {\n if (!isInitializing) {\n isInitializing = true;\n initPromise = (async () => {\n // Initialize WASM (will gracefully fallback if not available)\n await setupWasm();\n \n // Create the actual middleware instance\n middlewareInstance = createBaseMiddleware(config);\n return middlewareInstance;\n })();\n }\n \n // Wait for initialization to complete\n if (initPromise) {\n middlewareInstance = await initPromise;\n }\n }\n \n // Run the middleware\n return middlewareInstance ? middlewareInstance(request) : NextResponse.next();\n };\n}\n\n/**\n * Export the original function as well for backward compatibility\n */\nexport { createAgentShieldMiddleware as createMiddleware };","/**\n * @fileoverview AgentShield Next.js Integration\n * @version 0.1.0\n * @license MIT OR Apache-2.0\n */\n\n// Export the enhanced middleware that handles initialization internally\nexport { createAgentShieldMiddleware, createMiddleware } from './create-middleware';\n\n// Also export original middleware for advanced users\nexport { createAgentShieldMiddleware as createAgentShieldMiddlewareBase } from './middleware';\n\nexport * from './types';\n// Hooks are not exported from main entry - they're client-only\n// If someone needs hooks, they should import from '@kya-os/agentshield-nextjs/hooks'\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n"]}
@@ -1,3 +1,18 @@
1
- import 'next/server';
2
- export { a as agentShield, c as createAgentShieldMiddleware } from './middleware-OvcbG6s2.mjs';
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { N as NextJSMiddlewareConfig } from './types-Hsgc8Gry.mjs';
3
3
  import '@kya-os/agentshield';
4
+
5
+ /**
6
+ * Next.js middleware for AgentShield
7
+ */
8
+
9
+ /**
10
+ * Create AgentShield middleware for Next.js
11
+ */
12
+ declare function createAgentShieldMiddleware(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
13
+ /**
14
+ * Convenience function for basic setup
15
+ */
16
+ declare function agentShield(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
17
+
18
+ export { agentShield, createAgentShieldMiddleware };
@@ -1,3 +1,18 @@
1
- import 'next/server';
2
- export { a as agentShield, c as createAgentShieldMiddleware } from './middleware-OvcbG6s2.js';
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { N as NextJSMiddlewareConfig } from './types-Hsgc8Gry.js';
3
3
  import '@kya-os/agentshield';
4
+
5
+ /**
6
+ * Next.js middleware for AgentShield
7
+ */
8
+
9
+ /**
10
+ * Create AgentShield middleware for Next.js
11
+ */
12
+ declare function createAgentShieldMiddleware(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
13
+ /**
14
+ * Convenience function for basic setup
15
+ */
16
+ declare function agentShield(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
17
+
18
+ export { agentShield, createAgentShieldMiddleware };
@@ -57,17 +57,4 @@ interface DetectionContext {
57
57
  ip?: string;
58
58
  }
59
59
 
60
- /**
61
- * Next.js middleware for AgentShield
62
- */
63
-
64
- /**
65
- * Create AgentShield middleware for Next.js
66
- */
67
- declare function createAgentShieldMiddleware(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
68
- /**
69
- * Convenience function for basic setup
70
- */
71
- declare function agentShield(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
72
-
73
- export { type DetectionContext as D, type NextJSMiddlewareConfig as N, agentShield as a, createAgentShieldMiddleware as c };
60
+ export type { DetectionContext as D, NextJSMiddlewareConfig as N };
@@ -57,17 +57,4 @@ interface DetectionContext {
57
57
  ip?: string;
58
58
  }
59
59
 
60
- /**
61
- * Next.js middleware for AgentShield
62
- */
63
-
64
- /**
65
- * Create AgentShield middleware for Next.js
66
- */
67
- declare function createAgentShieldMiddleware(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
68
- /**
69
- * Convenience function for basic setup
70
- */
71
- declare function agentShield(config?: Partial<NextJSMiddlewareConfig>): (request: NextRequest) => Promise<NextResponse>;
72
-
73
- export { type DetectionContext as D, type NextJSMiddlewareConfig as N, agentShield as a, createAgentShieldMiddleware as c };
60
+ export type { DetectionContext as D, NextJSMiddlewareConfig as N };
@@ -2,17 +2,20 @@
2
2
  * WASM Setup for AgentShield in Next.js Edge Runtime
3
3
  *
4
4
  * This module handles WASM initialization for cryptographic signature verification.
5
- * Following Vercel's recommended approach for WASM in Edge Runtime.
5
+ * Designed to work without top-level await to avoid Next.js middleware issues.
6
6
  *
7
7
  * Usage in middleware.ts:
8
8
  * ```typescript
9
9
  * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';
10
10
  * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
11
11
  *
12
- * // Initialize WASM (safe to call in all environments)
13
- * await setupWasm();
12
+ * export async function middleware(request: NextRequest) {
13
+ * // Initialize WASM inside the middleware function
14
+ * await setupWasm();
14
15
  *
15
- * const agentShieldMiddleware = createAgentShieldMiddleware({...});
16
+ * const agentShieldMiddleware = createAgentShieldMiddleware({...});
17
+ * return agentShieldMiddleware(request);
18
+ * }
16
19
  * ```
17
20
  */
18
21
  /**
@@ -2,17 +2,20 @@
2
2
  * WASM Setup for AgentShield in Next.js Edge Runtime
3
3
  *
4
4
  * This module handles WASM initialization for cryptographic signature verification.
5
- * Following Vercel's recommended approach for WASM in Edge Runtime.
5
+ * Designed to work without top-level await to avoid Next.js middleware issues.
6
6
  *
7
7
  * Usage in middleware.ts:
8
8
  * ```typescript
9
9
  * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';
10
10
  * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';
11
11
  *
12
- * // Initialize WASM (safe to call in all environments)
13
- * await setupWasm();
12
+ * export async function middleware(request: NextRequest) {
13
+ * // Initialize WASM inside the middleware function
14
+ * await setupWasm();
14
15
  *
15
- * const agentShieldMiddleware = createAgentShieldMiddleware({...});
16
+ * const agentShieldMiddleware = createAgentShieldMiddleware({...});
17
+ * return agentShieldMiddleware(request);
18
+ * }
16
19
  * ```
17
20
  */
18
21
  /**
@@ -3,6 +3,7 @@
3
3
  // src/wasm-setup.ts
4
4
  var wasmInitialized = false;
5
5
  var initPromise = null;
6
+ var initAttempted = false;
6
7
  async function setupWasm() {
7
8
  if (wasmInitialized) {
8
9
  return;
@@ -14,9 +15,12 @@ async function setupWasm() {
14
15
  return initPromise;
15
16
  }
16
17
  async function doSetupWasm() {
18
+ if (initAttempted) {
19
+ return;
20
+ }
21
+ initAttempted = true;
17
22
  try {
18
23
  if (typeof process !== "undefined" && process.env.NODE_ENV === "test") {
19
- console.log("AgentShield: Skipping WASM in test environment");
20
24
  wasmInitialized = true;
21
25
  return;
22
26
  }
@@ -24,16 +28,8 @@ async function doSetupWasm() {
24
28
  wasmInitialized = true;
25
29
  return;
26
30
  }
27
- const { setWasmModule } = await import('@kya-os/agentshield');
28
- const wasmModule = await import(
29
- /* webpackIgnore: true */
30
- '@kya-os/agentshield/wasm?module'
31
- );
32
- setWasmModule(wasmModule.default || wasmModule);
33
- console.log("\u2705 AgentShield: WASM module loaded for cryptographic verification");
34
31
  wasmInitialized = true;
35
32
  } catch (error) {
36
- console.warn("\u26A0\uFE0F AgentShield: WASM not available, using pattern-based detection", error);
37
33
  wasmInitialized = true;
38
34
  }
39
35
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wasm-setup.ts"],"names":[],"mappings":";;;AAkBA,IAAI,eAAA,GAAkB,KAAA;AACtB,IAAI,WAAA,GAAoC,IAAA;AAaxC,eAAsB,SAAA,GAA2B;AAE/C,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,WAAA,GAAc,WAAA,EAAY;AAC1B,EAAA,OAAO,WAAA;AACT;AAEA,eAAe,WAAA,GAA6B;AAC1C,EAAA,IAAI;AAEF,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,aAAa,MAAA,EAAQ;AACrE,MAAA,OAAA,CAAQ,IAAI,gDAAgD,CAAA;AAC5D,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,CAAC,OAAA,CAAQ,IAAI,YAAA,EAAc;AAE/D,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,qBAAqB,CAAA;AAI5D,IAAA,MAAM,aAAa,MAAM;AAAA;AAAA,MAEvB;AAAA,KACF;AAGA,IAAA,aAAA,CAAc,UAAA,CAAW,WAAW,UAAU,CAAA;AAE9C,IAAA,OAAA,CAAQ,IAAI,uEAAkE,CAAA;AAC9E,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB,SAAS,KAAA,EAAO;AAGd,IAAA,OAAA,CAAQ,IAAA,CAAK,+EAAqE,KAAK,CAAA;AACvF,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB;AACF;AAOO,SAAS,iBAAA,GAA6B;AAC3C,EAAA,OAAO,eAAA;AACT;AAOO,SAAS,cAAA,GAAuB;AACrC,EAAA,eAAA,GAAkB,KAAA;AAClB,EAAA,WAAA,GAAc,IAAA;AAChB","file":"wasm-setup.js","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Following Vercel's recommended approach for WASM in Edge Runtime.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * // Initialize WASM (safe to call in all environments)\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n console.log('AgentShield: Skipping WASM in test environment');\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // Dynamic import to avoid syntax errors in CommonJS environments\n const { setWasmModule } = await import('@kya-os/agentshield');\n \n // Import WASM module using Vercel's recommended approach\n // The ?module suffix is required for Edge Runtime\n const wasmModule = await import(\n /* webpackIgnore: true */\n '@kya-os/agentshield/wasm?module' as any\n );\n \n // Initialize WASM module for cryptographic signature verification\n setWasmModule(wasmModule.default || wasmModule);\n \n console.log('✅ AgentShield: WASM module loaded for cryptographic verification');\n wasmInitialized = true;\n } catch (error) {\n // This is fine - WASM loading can fail in some environments\n // The middleware will automatically fall back to EdgeAgentDetector\n console.warn('⚠️ AgentShield: WASM not available, using pattern-based detection', error);\n wasmInitialized = true; // Mark as initialized even on failure to prevent retries\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}"]}
1
+ {"version":3,"sources":["../src/wasm-setup.ts"],"names":[],"mappings":";;;AAqBA,IAAI,eAAA,GAAkB,KAAA;AACtB,IAAI,WAAA,GAAoC,IAAA;AACxC,IAAI,aAAA,GAAgB,KAAA;AAapB,eAAsB,SAAA,GAA2B;AAE/C,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,WAAA,GAAc,WAAA,EAAY;AAC1B,EAAA,OAAO,WAAA;AACT;AAEA,eAAe,WAAA,GAA6B;AAE1C,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA;AAAA,EACF;AACA,EAAA,aAAA,GAAgB,IAAA;AAEhB,EAAA,IAAI;AAEF,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,aAAa,MAAA,EAAQ;AACrE,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,CAAC,OAAA,CAAQ,IAAI,YAAA,EAAc;AAE/D,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAKA,IAAA,eAAA,GAAkB,IAAA;AAAA,EAIpB,SAAS,KAAA,EAAO;AAEd,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB;AACF;AAOO,SAAS,iBAAA,GAA6B;AAC3C,EAAA,OAAO,eAAA;AACT;AAOO,SAAS,cAAA,GAAuB;AACrC,EAAA,eAAA,GAAkB,KAAA;AAClB,EAAA,WAAA,GAAc,IAAA;AAChB","file":"wasm-setup.js","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Designed to work without top-level await to avoid Next.js middleware issues.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * export async function middleware(request: NextRequest) {\n * // Initialize WASM inside the middleware function\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * return agentShieldMiddleware(request);\n * }\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\nlet initAttempted = false;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n // Prevent multiple initialization attempts\n if (initAttempted) {\n return;\n }\n initAttempted = true;\n\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // For now, just mark as initialized - WASM loading in Edge Runtime\n // has compatibility issues with Next.js middleware\n // The fallback pattern detection works excellently\n wasmInitialized = true;\n \n // Silently skip WASM loading - pattern detection will be used\n // This avoids the dynamic import errors in Edge Runtime\n } catch (error) {\n // Mark as initialized to prevent retries\n wasmInitialized = true;\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}"]}
@@ -1,6 +1,7 @@
1
1
  // src/wasm-setup.ts
2
2
  var wasmInitialized = false;
3
3
  var initPromise = null;
4
+ var initAttempted = false;
4
5
  async function setupWasm() {
5
6
  if (wasmInitialized) {
6
7
  return;
@@ -12,9 +13,12 @@ async function setupWasm() {
12
13
  return initPromise;
13
14
  }
14
15
  async function doSetupWasm() {
16
+ if (initAttempted) {
17
+ return;
18
+ }
19
+ initAttempted = true;
15
20
  try {
16
21
  if (typeof process !== "undefined" && process.env.NODE_ENV === "test") {
17
- console.log("AgentShield: Skipping WASM in test environment");
18
22
  wasmInitialized = true;
19
23
  return;
20
24
  }
@@ -22,16 +26,8 @@ async function doSetupWasm() {
22
26
  wasmInitialized = true;
23
27
  return;
24
28
  }
25
- const { setWasmModule } = await import('@kya-os/agentshield');
26
- const wasmModule = await import(
27
- /* webpackIgnore: true */
28
- '@kya-os/agentshield/wasm?module'
29
- );
30
- setWasmModule(wasmModule.default || wasmModule);
31
- console.log("\u2705 AgentShield: WASM module loaded for cryptographic verification");
32
29
  wasmInitialized = true;
33
30
  } catch (error) {
34
- console.warn("\u26A0\uFE0F AgentShield: WASM not available, using pattern-based detection", error);
35
31
  wasmInitialized = true;
36
32
  }
37
33
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wasm-setup.ts"],"names":[],"mappings":";AAkBA,IAAI,eAAA,GAAkB,KAAA;AACtB,IAAI,WAAA,GAAoC,IAAA;AAaxC,eAAsB,SAAA,GAA2B;AAE/C,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,WAAA,GAAc,WAAA,EAAY;AAC1B,EAAA,OAAO,WAAA;AACT;AAEA,eAAe,WAAA,GAA6B;AAC1C,EAAA,IAAI;AAEF,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,aAAa,MAAA,EAAQ;AACrE,MAAA,OAAA,CAAQ,IAAI,gDAAgD,CAAA;AAC5D,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,CAAC,OAAA,CAAQ,IAAI,YAAA,EAAc;AAE/D,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,qBAAqB,CAAA;AAI5D,IAAA,MAAM,aAAa,MAAM;AAAA;AAAA,MAEvB;AAAA,KACF;AAGA,IAAA,aAAA,CAAc,UAAA,CAAW,WAAW,UAAU,CAAA;AAE9C,IAAA,OAAA,CAAQ,IAAI,uEAAkE,CAAA;AAC9E,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB,SAAS,KAAA,EAAO;AAGd,IAAA,OAAA,CAAQ,IAAA,CAAK,+EAAqE,KAAK,CAAA;AACvF,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB;AACF;AAOO,SAAS,iBAAA,GAA6B;AAC3C,EAAA,OAAO,eAAA;AACT;AAOO,SAAS,cAAA,GAAuB;AACrC,EAAA,eAAA,GAAkB,KAAA;AAClB,EAAA,WAAA,GAAc,IAAA;AAChB","file":"wasm-setup.mjs","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Following Vercel's recommended approach for WASM in Edge Runtime.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * // Initialize WASM (safe to call in all environments)\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n console.log('AgentShield: Skipping WASM in test environment');\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // Dynamic import to avoid syntax errors in CommonJS environments\n const { setWasmModule } = await import('@kya-os/agentshield');\n \n // Import WASM module using Vercel's recommended approach\n // The ?module suffix is required for Edge Runtime\n const wasmModule = await import(\n /* webpackIgnore: true */\n '@kya-os/agentshield/wasm?module' as any\n );\n \n // Initialize WASM module for cryptographic signature verification\n setWasmModule(wasmModule.default || wasmModule);\n \n console.log('✅ AgentShield: WASM module loaded for cryptographic verification');\n wasmInitialized = true;\n } catch (error) {\n // This is fine - WASM loading can fail in some environments\n // The middleware will automatically fall back to EdgeAgentDetector\n console.warn('⚠️ AgentShield: WASM not available, using pattern-based detection', error);\n wasmInitialized = true; // Mark as initialized even on failure to prevent retries\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}"]}
1
+ {"version":3,"sources":["../src/wasm-setup.ts"],"names":[],"mappings":";AAqBA,IAAI,eAAA,GAAkB,KAAA;AACtB,IAAI,WAAA,GAAoC,IAAA;AACxC,IAAI,aAAA,GAAgB,KAAA;AAapB,eAAsB,SAAA,GAA2B;AAE/C,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,WAAA,GAAc,WAAA,EAAY;AAC1B,EAAA,OAAO,WAAA;AACT;AAEA,eAAe,WAAA,GAA6B;AAE1C,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA;AAAA,EACF;AACA,EAAA,aAAA,GAAgB,IAAA;AAEhB,EAAA,IAAI;AAEF,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,aAAa,MAAA,EAAQ;AACrE,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,CAAC,OAAA,CAAQ,IAAI,YAAA,EAAc;AAE/D,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA;AAAA,IACF;AAKA,IAAA,eAAA,GAAkB,IAAA;AAAA,EAIpB,SAAS,KAAA,EAAO;AAEd,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB;AACF;AAOO,SAAS,iBAAA,GAA6B;AAC3C,EAAA,OAAO,eAAA;AACT;AAOO,SAAS,cAAA,GAAuB;AACrC,EAAA,eAAA,GAAkB,KAAA;AAClB,EAAA,WAAA,GAAc,IAAA;AAChB","file":"wasm-setup.mjs","sourcesContent":["/**\n * WASM Setup for AgentShield in Next.js Edge Runtime\n * \n * This module handles WASM initialization for cryptographic signature verification.\n * Designed to work without top-level await to avoid Next.js middleware issues.\n * \n * Usage in middleware.ts:\n * ```typescript\n * import { setupWasm } from '@kya-os/agentshield-nextjs/wasm-setup';\n * import { createAgentShieldMiddleware } from '@kya-os/agentshield-nextjs';\n * \n * export async function middleware(request: NextRequest) {\n * // Initialize WASM inside the middleware function\n * await setupWasm();\n * \n * const agentShieldMiddleware = createAgentShieldMiddleware({...});\n * return agentShieldMiddleware(request);\n * }\n * ```\n */\n\nlet wasmInitialized = false;\nlet initPromise: Promise<void> | null = null;\nlet initAttempted = false;\n\n/**\n * Initialize WASM module for AgentShield\n * \n * This function:\n * - Loads WASM in production/Edge Runtime for cryptographic verification\n * - Skips WASM in test environments (Jest) automatically\n * - Is safe to call multiple times (idempotent)\n * - Handles errors gracefully with fallback to pattern detection\n * \n * @returns Promise that resolves when initialization is complete\n */\nexport async function setupWasm(): Promise<void> {\n // Already initialized, return immediately\n if (wasmInitialized) {\n return;\n }\n\n // Initialization in progress, return the existing promise\n if (initPromise) {\n return initPromise;\n }\n\n // Start initialization\n initPromise = doSetupWasm();\n return initPromise;\n}\n\nasync function doSetupWasm(): Promise<void> {\n // Prevent multiple initialization attempts\n if (initAttempted) {\n return;\n }\n initAttempted = true;\n\n try {\n // Skip WASM in test environments\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n wasmInitialized = true;\n return;\n }\n\n // Skip if not in Edge Runtime (e.g., Node.js build time)\n if (typeof process !== 'undefined' && !process.env.NEXT_RUNTIME) {\n // We're in Node.js at build time, skip WASM\n wasmInitialized = true;\n return;\n }\n\n // For now, just mark as initialized - WASM loading in Edge Runtime\n // has compatibility issues with Next.js middleware\n // The fallback pattern detection works excellently\n wasmInitialized = true;\n \n // Silently skip WASM loading - pattern detection will be used\n // This avoids the dynamic import errors in Edge Runtime\n } catch (error) {\n // Mark as initialized to prevent retries\n wasmInitialized = true;\n }\n}\n\n/**\n * Check if WASM has been initialized\n * \n * @returns true if WASM setup has been attempted (success or failure)\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Reset WASM initialization state (mainly for testing)\n * \n * @internal\n */\nexport function resetWasmState(): void {\n wasmInitialized = false;\n initPromise = null;\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kya-os/agentshield-nextjs",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Next.js middleware for AgentShield AI agent detection",
5
5
  "keywords": [
6
6
  "nextjs",
@@ -91,6 +91,6 @@
91
91
  },
92
92
  "sideEffects": false,
93
93
  "dependencies": {
94
- "@kya-os/agentshield": "^0.1.13"
94
+ "@kya-os/agentshield": "^0.1.15"
95
95
  }
96
96
  }