@kya-os/checkpoint-nextjs 1.0.0

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.
Files changed (122) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/EDGE_RUNTIME_WASM_SETUP.md +348 -0
  3. package/README.md +414 -0
  4. package/bin/setup-edge-wasm.js +497 -0
  5. package/dist/.tsbuildinfo +1 -0
  6. package/dist/adapt.d.mts +39 -0
  7. package/dist/adapt.d.ts +39 -0
  8. package/dist/adapt.js +58 -0
  9. package/dist/adapt.js.map +1 -0
  10. package/dist/adapt.mjs +56 -0
  11. package/dist/adapt.mjs.map +1 -0
  12. package/dist/api-client.d.mts +204 -0
  13. package/dist/api-client.d.ts +204 -0
  14. package/dist/api-client.js +206 -0
  15. package/dist/api-client.js.map +1 -0
  16. package/dist/api-client.mjs +199 -0
  17. package/dist/api-client.mjs.map +1 -0
  18. package/dist/api-middleware.d.mts +156 -0
  19. package/dist/api-middleware.d.ts +156 -0
  20. package/dist/api-middleware.js +510 -0
  21. package/dist/api-middleware.js.map +1 -0
  22. package/dist/api-middleware.mjs +505 -0
  23. package/dist/api-middleware.mjs.map +1 -0
  24. package/dist/create-middleware.d.mts +17 -0
  25. package/dist/create-middleware.d.ts +17 -0
  26. package/dist/create-middleware.js +38 -0
  27. package/dist/create-middleware.js.map +1 -0
  28. package/dist/create-middleware.mjs +35 -0
  29. package/dist/create-middleware.mjs.map +1 -0
  30. package/dist/edge/index.d.mts +110 -0
  31. package/dist/edge/index.d.ts +110 -0
  32. package/dist/edge/index.js +277 -0
  33. package/dist/edge/index.js.map +1 -0
  34. package/dist/edge/index.mjs +275 -0
  35. package/dist/edge/index.mjs.map +1 -0
  36. package/dist/edge-runtime-loader.d.mts +50 -0
  37. package/dist/edge-runtime-loader.d.ts +50 -0
  38. package/dist/edge-runtime-loader.js +204 -0
  39. package/dist/edge-runtime-loader.js.map +1 -0
  40. package/dist/edge-runtime-loader.mjs +201 -0
  41. package/dist/edge-runtime-loader.mjs.map +1 -0
  42. package/dist/edge-wasm-middleware.d.mts +68 -0
  43. package/dist/edge-wasm-middleware.d.ts +68 -0
  44. package/dist/edge-wasm-middleware.js +318 -0
  45. package/dist/edge-wasm-middleware.js.map +1 -0
  46. package/dist/edge-wasm-middleware.mjs +315 -0
  47. package/dist/edge-wasm-middleware.mjs.map +1 -0
  48. package/dist/index.d.mts +25 -0
  49. package/dist/index.d.ts +25 -0
  50. package/dist/index.js +1019 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/index.mjs +979 -0
  53. package/dist/index.mjs.map +1 -0
  54. package/dist/middleware-edge.d.mts +46 -0
  55. package/dist/middleware-edge.d.ts +46 -0
  56. package/dist/middleware-edge.js +134 -0
  57. package/dist/middleware-edge.js.map +1 -0
  58. package/dist/middleware-edge.mjs +129 -0
  59. package/dist/middleware-edge.mjs.map +1 -0
  60. package/dist/middleware-node.d.mts +89 -0
  61. package/dist/middleware-node.d.ts +89 -0
  62. package/dist/middleware-node.js +127 -0
  63. package/dist/middleware-node.js.map +1 -0
  64. package/dist/middleware-node.mjs +124 -0
  65. package/dist/middleware-node.mjs.map +1 -0
  66. package/dist/middleware.d.mts +36 -0
  67. package/dist/middleware.d.ts +36 -0
  68. package/dist/middleware.js +15 -0
  69. package/dist/middleware.js.map +1 -0
  70. package/dist/middleware.mjs +12 -0
  71. package/dist/middleware.mjs.map +1 -0
  72. package/dist/nodejs-wasm-loader.d.mts +25 -0
  73. package/dist/nodejs-wasm-loader.d.ts +25 -0
  74. package/dist/nodejs-wasm-loader.js +95 -0
  75. package/dist/nodejs-wasm-loader.js.map +1 -0
  76. package/dist/nodejs-wasm-loader.mjs +85 -0
  77. package/dist/nodejs-wasm-loader.mjs.map +1 -0
  78. package/dist/policy.d.mts +162 -0
  79. package/dist/policy.d.ts +162 -0
  80. package/dist/policy.js +189 -0
  81. package/dist/policy.js.map +1 -0
  82. package/dist/policy.mjs +165 -0
  83. package/dist/policy.mjs.map +1 -0
  84. package/dist/session-tracker.d.mts +55 -0
  85. package/dist/session-tracker.d.ts +55 -0
  86. package/dist/session-tracker.js +170 -0
  87. package/dist/session-tracker.js.map +1 -0
  88. package/dist/session-tracker.mjs +167 -0
  89. package/dist/session-tracker.mjs.map +1 -0
  90. package/dist/signature-verifier.d.mts +33 -0
  91. package/dist/signature-verifier.d.ts +33 -0
  92. package/dist/signature-verifier.js +386 -0
  93. package/dist/signature-verifier.js.map +1 -0
  94. package/dist/signature-verifier.mjs +362 -0
  95. package/dist/signature-verifier.mjs.map +1 -0
  96. package/dist/translate.d.mts +33 -0
  97. package/dist/translate.d.ts +33 -0
  98. package/dist/translate.js +38 -0
  99. package/dist/translate.js.map +1 -0
  100. package/dist/translate.mjs +36 -0
  101. package/dist/translate.mjs.map +1 -0
  102. package/dist/types-C-xCUNTr.d.mts +105 -0
  103. package/dist/types-C-xCUNTr.d.ts +105 -0
  104. package/dist/wasm-middleware.d.mts +63 -0
  105. package/dist/wasm-middleware.d.ts +63 -0
  106. package/dist/wasm-middleware.js +98 -0
  107. package/dist/wasm-middleware.js.map +1 -0
  108. package/dist/wasm-middleware.mjs +95 -0
  109. package/dist/wasm-middleware.mjs.map +1 -0
  110. package/dist/wasm-setup.d.mts +46 -0
  111. package/dist/wasm-setup.d.ts +46 -0
  112. package/dist/wasm-setup.js +176 -0
  113. package/dist/wasm-setup.js.map +1 -0
  114. package/dist/wasm-setup.mjs +167 -0
  115. package/dist/wasm-setup.mjs.map +1 -0
  116. package/package.json +156 -0
  117. package/templates/middleware-wasm-100.ts +153 -0
  118. package/wasm/agentshield_wasm.d.ts +479 -0
  119. package/wasm/agentshield_wasm.js +1536 -0
  120. package/wasm/agentshield_wasm_bg.wasm +0 -0
  121. package/wasm/package.json +30 -0
  122. package/wasm.d.ts +21 -0
package/README.md ADDED
@@ -0,0 +1,414 @@
1
+ # @kya-os/checkpoint-nextjs
2
+
3
+ Next.js middleware and React hooks for Checkpoint AI agent detection and enforcement.
4
+
5
+ ## Features
6
+
7
+ - 🚀 **Next.js Middleware**: Edge-compatible middleware for all routes
8
+ - ⚛️ **React Hooks**: Client-side detection and monitoring
9
+ - 🎯 **Flexible Actions**: Block, redirect, rewrite, or log detected agents
10
+ - 🛡️ **Edge Runtime**: Optimized for Vercel Edge Functions
11
+ - 📊 **Built-in Analytics**: Track detection patterns and statistics
12
+
13
+ ## Two deployment shapes
14
+
15
+ This package ships two complementary middleware factories. Pick the one that
16
+ fits your runtime; both are first-class and supported.
17
+
18
+ | Shape | Factory | Where verification runs | Use when |
19
+ | ---------------- | ------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
20
+ | **Local engine** | `withCheckpoint` | In-process, via WASM (`kya-os-engine`) | You want the lowest possible latency, deterministic verdicts, no network round-trip per request, and your runtime can load the WASM artifact (Vercel Node, Vercel Edge with the bundled artifact, Cloudflare Workers with `nodejs_compat`). This is the canonical Phase D output. |
21
+ | **SaaS gateway** | `withCheckpointApi` | Cloudflare DNS gateway (`https://detect.checkpoint-gateway.ai`) | You want centralized policy + dashboard rules without a redeploy, you're on a runtime where the WASM artifact won't load (bare-Edge, browser embedding), or you want a single HTTPS hop with cached verdicts. Trades ~30–50ms of edge latency for zero local engine state. |
22
+
23
+ Both factories return a Next.js middleware function — the request/response
24
+ contract is identical. You can run both side-by-side in the same app on
25
+ different routes if your policy demands it.
26
+
27
+ ```ts
28
+ // middleware.ts — local engine
29
+ import { withCheckpoint } from '@kya-os/checkpoint-nextjs';
30
+ export default withCheckpoint({ tenantHost: 'demo.example' });
31
+
32
+ // middleware.ts — SaaS gateway
33
+ import { withCheckpointApi } from '@kya-os/checkpoint-nextjs';
34
+ export default withCheckpointApi({
35
+ apiKey: process.env.CHECKPOINT_API_KEY!,
36
+ onBlock: 'redirect',
37
+ redirectUrl: '/blocked',
38
+ });
39
+ ```
40
+
41
+ > Pre-Phase-D the SaaS-gateway factory shipped as `withAgentShield`; the
42
+ > name is preserved as a `@deprecated` alias for one release. Same for
43
+ > `AgentShieldClient` / `AgentShieldClientConfig` → `CheckpointApiClient`
44
+ > / `CheckpointApiClientConfig`. New code should import the
45
+ > `Checkpoint*` names.
46
+
47
+ ## Installation
48
+
49
+ ```bash
50
+ npm install @kya-os/checkpoint-nextjs
51
+ ```
52
+
53
+ ## Quick Start
54
+
55
+ ### Middleware Setup
56
+
57
+ Create `middleware.js` (or `middleware.ts`) in your project root:
58
+
59
+ ```javascript
60
+ import { agentShield } from '@kya-os/checkpoint-nextjs';
61
+
62
+ export default agentShield({
63
+ onAgentDetected: 'block',
64
+ confidenceThreshold: 0.8,
65
+
66
+ // NEW: Session tracking (v0.1.27+)
67
+ sessionTracking: {
68
+ enabled: true, // Track continued sessions from AI agents
69
+ },
70
+ });
71
+
72
+ export const config = {
73
+ matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
74
+ };
75
+ ```
76
+
77
+ ### React Hooks
78
+
79
+ ```javascript
80
+ 'use client';
81
+
82
+ import { useAgentDetection } from '@kya-os/checkpoint-nextjs';
83
+
84
+ export default function SecurityMonitor() {
85
+ const { detect, isDetecting, lastResult } = useAgentDetection({
86
+ confidenceThreshold: 0.7,
87
+ });
88
+
89
+ const handleCheck = async () => {
90
+ const result = await detect();
91
+ if (result.isAgent) {
92
+ alert('Agent detected!');
93
+ }
94
+ };
95
+
96
+ return (
97
+ <div>
98
+ <button onClick={handleCheck} disabled={isDetecting}>
99
+ {isDetecting ? 'Checking...' : 'Check for Agents'}
100
+ </button>
101
+
102
+ {lastResult && (
103
+ <div>
104
+ <p>Is Agent: {lastResult.isAgent ? 'Yes' : 'No'}</p>
105
+ <p>Confidence: {(lastResult.confidence * 100).toFixed(1)}%</p>
106
+ </div>
107
+ )}
108
+ </div>
109
+ );
110
+ }
111
+ ```
112
+
113
+ ## Middleware Configuration
114
+
115
+ ```javascript
116
+ import { agentShield } from '@kya-os/checkpoint-nextjs';
117
+
118
+ export default agentShield({
119
+ // Core detection options
120
+ confidenceThreshold: 0.7,
121
+ enablePatternMatching: true,
122
+ enableBehaviorAnalysis: true,
123
+
124
+ // Action when agent is detected
125
+ onAgentDetected: 'block', // 'block' | 'redirect' | 'rewrite' | 'allow' | 'log'
126
+
127
+ // Skip detection for paths
128
+ skipPaths: ['/api/webhooks', /^\/admin/],
129
+
130
+ // Custom responses
131
+ blockedResponse: {
132
+ status: 403,
133
+ message: 'Access denied',
134
+ },
135
+ redirectUrl: '/blocked',
136
+ rewriteUrl: '/blocked',
137
+
138
+ // Custom handler
139
+ onDetection: async (request, result) => {
140
+ console.log('Agent detected:', result);
141
+ // Return custom NextResponse or void
142
+ },
143
+ });
144
+ ```
145
+
146
+ ## Actions
147
+
148
+ ### Block Agents
149
+
150
+ ```javascript
151
+ export default agentShield({
152
+ onAgentDetected: 'block',
153
+ blockedResponse: {
154
+ status: 403,
155
+ message: 'Automated access not allowed',
156
+ headers: {
157
+ 'Content-Type': 'application/json',
158
+ 'X-Robots-Tag': 'noindex',
159
+ },
160
+ },
161
+ });
162
+ ```
163
+
164
+ ### Redirect Agents
165
+
166
+ ```javascript
167
+ export default agentShield({
168
+ onAgentDetected: 'redirect',
169
+ redirectUrl: '/blocked',
170
+ confidenceThreshold: 0.8,
171
+ });
172
+ ```
173
+
174
+ ### Rewrite Requests
175
+
176
+ ```javascript
177
+ export default agentShield({
178
+ onAgentDetected: 'rewrite',
179
+ rewriteUrl: '/bot-content',
180
+ confidenceThreshold: 0.6,
181
+ });
182
+ ```
183
+
184
+ ### Custom Logic
185
+
186
+ ```javascript
187
+ export default agentShield({
188
+ onDetection: async (request, result) => {
189
+ if (result.confidence > 0.9) {
190
+ // High confidence - block
191
+ return NextResponse.json({ error: 'Blocked' }, { status: 403 });
192
+ } else if (result.confidence > 0.5) {
193
+ // Medium confidence - redirect to captcha
194
+ return NextResponse.redirect(new URL('/verify', request.url));
195
+ }
196
+ // Low confidence - continue
197
+ },
198
+ });
199
+ ```
200
+
201
+ ## React Hooks
202
+
203
+ ### useAgentDetection
204
+
205
+ Client-side agent detection:
206
+
207
+ ```javascript
208
+ import { useAgentDetection } from '@kya-os/checkpoint-nextjs';
209
+
210
+ function SecurityComponent() {
211
+ const { detect, isDetecting, lastResult, detector } = useAgentDetection({
212
+ confidenceThreshold: 0.7,
213
+ });
214
+
215
+ useEffect(() => {
216
+ // Auto-detect on component mount
217
+ detect();
218
+ }, [detect]);
219
+
220
+ return (
221
+ <div>
222
+ {lastResult?.isAgent && (
223
+ <div className="alert">Agent detected with {lastResult.confidence} confidence</div>
224
+ )}
225
+ </div>
226
+ );
227
+ }
228
+ ```
229
+
230
+ ### useDetectionMonitor
231
+
232
+ Monitor and track detection events:
233
+
234
+ ```javascript
235
+ import { useDetectionMonitor } from '@kya-os/checkpoint-nextjs';
236
+
237
+ function AnalyticsDashboard() {
238
+ const { detectionHistory, getStats, clearHistory } = useDetectionMonitor((context) => {
239
+ // Handle each detection
240
+ console.log('Detection event:', context);
241
+ });
242
+
243
+ const stats = getStats();
244
+
245
+ return (
246
+ <div>
247
+ <h2>Detection Statistics</h2>
248
+ <p>Total Requests: {stats.total}</p>
249
+ <p>Agents Detected: {stats.detected}</p>
250
+ <p>Detection Rate: {(stats.detectionRate * 100).toFixed(1)}%</p>
251
+ <p>Average Confidence: {(stats.avgConfidence * 100).toFixed(1)}%</p>
252
+
253
+ <button onClick={clearHistory}>Clear History</button>
254
+ </div>
255
+ );
256
+ }
257
+ ```
258
+
259
+ ## API Routes Integration
260
+
261
+ Protect API routes with server-side detection:
262
+
263
+ ```javascript
264
+ // pages/api/protected.js or app/api/protected/route.js
265
+ import { AgentDetector } from '@kya-os/checkpoint';
266
+
267
+ const detector = new AgentDetector();
268
+
269
+ export async function GET(request) {
270
+ const context = {
271
+ userAgent: request.headers.get('user-agent'),
272
+ ip: request.ip,
273
+ headers: Object.fromEntries(request.headers.entries()),
274
+ };
275
+
276
+ const result = await detector.analyze(context);
277
+
278
+ if (result.isAgent && result.confidence > 0.7) {
279
+ return NextResponse.json({ error: 'Automated access detected' }, { status: 403 });
280
+ }
281
+
282
+ return NextResponse.json({ data: 'Protected content' });
283
+ }
284
+ ```
285
+
286
+ ## Advanced Usage
287
+
288
+ ### Path-Specific Configuration
289
+
290
+ ```javascript
291
+ import { NextRequest, NextResponse } from 'next/server';
292
+ import { AgentDetector } from '@kya-os/checkpoint';
293
+
294
+ const detector = new AgentDetector();
295
+
296
+ export async function middleware(request: NextRequest) {
297
+ const { pathname } = request.nextUrl;
298
+
299
+ // Different thresholds for different paths
300
+ let threshold = 0.7;
301
+ if (pathname.startsWith('/api/')) {
302
+ threshold = 0.5; // More sensitive for API
303
+ } else if (pathname.startsWith('/admin/')) {
304
+ threshold = 0.9; // Less sensitive for admin (humans expected)
305
+ }
306
+
307
+ const context = {
308
+ userAgent: request.headers.get('user-agent') ?? undefined,
309
+ ip: request.ip,
310
+ headers: Object.fromEntries(request.headers.entries()),
311
+ url: request.url,
312
+ };
313
+
314
+ const result = await detector.analyze(context);
315
+
316
+ if (result.isAgent && result.confidence >= threshold) {
317
+ return NextResponse.json(
318
+ { error: 'Access denied' },
319
+ { status: 403 }
320
+ );
321
+ }
322
+
323
+ return NextResponse.next();
324
+ }
325
+ ```
326
+
327
+ ### Server Components
328
+
329
+ Use detection results in Server Components:
330
+
331
+ ```javascript
332
+ // app/dashboard/page.tsx
333
+ import { headers } from 'next/headers';
334
+ import { AgentDetector } from '@kya-os/checkpoint';
335
+
336
+ export default async function Dashboard() {
337
+ const headersList = headers();
338
+ const detector = new AgentDetector();
339
+
340
+ const result = await detector.analyze({
341
+ userAgent: headersList.get('user-agent') ?? undefined,
342
+ headers: Object.fromEntries(headersList.entries()),
343
+ });
344
+
345
+ if (result.isAgent) {
346
+ return <div>Automated access detected</div>;
347
+ }
348
+
349
+ return <div>Welcome to the dashboard!</div>;
350
+ }
351
+ ```
352
+
353
+ ## TypeScript Support
354
+
355
+ Full TypeScript support with proper types:
356
+
357
+ ```typescript
358
+ import { NextRequest } from 'next/server';
359
+ import { agentShield, NextJSMiddlewareConfig } from '@kya-os/checkpoint-nextjs';
360
+
361
+ const config: NextJSMiddlewareConfig = {
362
+ onAgentDetected: 'block',
363
+ confidenceThreshold: 0.8,
364
+ onDetection: async (request: NextRequest, result) => {
365
+ // Fully typed parameters
366
+ console.log(result.confidence);
367
+ },
368
+ };
369
+
370
+ export default agentShield(config);
371
+ ```
372
+
373
+ ## Examples
374
+
375
+ ### E-commerce Protection
376
+
377
+ ```javascript
378
+ // Protect product pages from scrapers
379
+ export default agentShield({
380
+ onAgentDetected: 'redirect',
381
+ redirectUrl: '/captcha',
382
+ confidenceThreshold: 0.6,
383
+ skipPaths: ['/api/webhooks', '/health'],
384
+ });
385
+
386
+ export const config = {
387
+ matcher: ['/products/:path*', '/search/:path*'],
388
+ };
389
+ ```
390
+
391
+ ### Content Publishing
392
+
393
+ ```javascript
394
+ // Allow search engines, block other bots
395
+ export default agentShield({
396
+ onDetection: async (request, result) => {
397
+ const userAgent = request.headers.get('user-agent') || '';
398
+
399
+ // Allow known search engines
400
+ if (/googlebot|bingbot|slurp/i.test(userAgent)) {
401
+ return; // Continue
402
+ }
403
+
404
+ // Block other agents
405
+ if (result.isAgent && result.confidence > 0.5) {
406
+ return NextResponse.json({ error: 'Bot access restricted' }, { status: 403 });
407
+ }
408
+ },
409
+ });
410
+ ```
411
+
412
+ ## License
413
+
414
+ MIT OR Apache-2.0