@dupecom/botcha 0.19.0 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -17
- package/dist/lib/client/index.d.ts +5 -3
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +101 -69
- package/dist/lib/client/types.d.ts +1 -0
- package/dist/lib/client/types.d.ts.map +1 -1
- package/dist/src/middleware/tap-enhanced-verify.d.ts +1 -0
- package/dist/src/middleware/tap-enhanced-verify.d.ts.map +1 -1
- package/dist/src/middleware/tap-enhanced-verify.js +4 -4
- package/package.json +1 -1
- package/dist/src/index.d.ts +0 -4
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -408
package/README.md
CHANGED
|
@@ -58,34 +58,45 @@ pip install botcha
|
|
|
58
58
|
|
|
59
59
|
## Quick Start
|
|
60
60
|
|
|
61
|
-
###
|
|
61
|
+
### Protect Your API (Server-Side)
|
|
62
62
|
|
|
63
63
|
```typescript
|
|
64
64
|
import express from 'express';
|
|
65
|
-
import {
|
|
65
|
+
import { botchaVerify } from '@dupecom/botcha-verify/express';
|
|
66
66
|
|
|
67
67
|
const app = express();
|
|
68
68
|
|
|
69
|
-
//
|
|
70
|
-
app.
|
|
71
|
-
|
|
69
|
+
// Verify tokens via JWKS - no shared secret needed!
|
|
70
|
+
app.use('/api', botchaVerify({
|
|
71
|
+
jwksUrl: 'https://botcha.ai/.well-known/jwks',
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
app.get('/api/data', (req, res) => {
|
|
75
|
+
res.json({ message: 'Welcome, verified AI agent! 🤖' });
|
|
72
76
|
});
|
|
73
77
|
|
|
74
78
|
app.listen(3000);
|
|
75
79
|
```
|
|
76
80
|
|
|
77
|
-
###
|
|
81
|
+
### Access Protected APIs (Agent-Side)
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
import { BotchaClient } from '@dupecom/botcha/client';
|
|
78
85
|
|
|
86
|
+
const client = new BotchaClient();
|
|
87
|
+
|
|
88
|
+
// Automatically solves challenges and includes tokens
|
|
89
|
+
const response = await client.fetch('https://api.example.com/api/data');
|
|
90
|
+
const data = await response.json();
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Python:**
|
|
79
94
|
```python
|
|
80
|
-
from botcha import BotchaClient
|
|
95
|
+
from botcha import BotchaClient
|
|
81
96
|
|
|
82
|
-
# Client SDK for AI agents
|
|
83
97
|
async with BotchaClient() as client:
|
|
84
|
-
#
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
# Or auto-solve and fetch protected endpoints
|
|
88
|
-
response = await client.fetch("https://api.example.com/agent-only")
|
|
98
|
+
# Automatically solves challenges and includes tokens
|
|
99
|
+
response = await client.fetch("https://api.example.com/api/data")
|
|
89
100
|
data = await response.json()
|
|
90
101
|
```
|
|
91
102
|
|
|
@@ -127,7 +138,7 @@ BOTCHA uses **OAuth2-style token rotation** with short-lived access tokens and l
|
|
|
127
138
|
### Token Flow
|
|
128
139
|
|
|
129
140
|
```
|
|
130
|
-
1. Solve challenge → receive access_token (
|
|
141
|
+
1. Solve challenge → receive access_token (1hr) + refresh_token (1hr) + human_link
|
|
131
142
|
2. Use access_token for API calls
|
|
132
143
|
3. Give human_link to your human → they click it → instant browser access via /go/:code
|
|
133
144
|
4. When access_token expires → POST /v1/token/refresh with refresh_token
|
|
@@ -138,8 +149,8 @@ BOTCHA uses **OAuth2-style token rotation** with short-lived access tokens and l
|
|
|
138
149
|
|
|
139
150
|
| Feature | What it does |
|
|
140
151
|
|---------|-------------|
|
|
141
|
-
| **
|
|
142
|
-
| **Refresh tokens (1hr)** |
|
|
152
|
+
| **1-hour access tokens** | Short-lived tokens limit compromise window |
|
|
153
|
+
| **Refresh tokens (1hr)** | Seamless token renewal without re-solving challenges |
|
|
143
154
|
| **Audience (`aud`) scoping** | Token for `api.stripe.com` is rejected by `api.github.com` |
|
|
144
155
|
| **Client IP binding** | Optional — solve on machine A, can't use on machine B |
|
|
145
156
|
| **Token revocation** | `POST /v1/token/revoke` — KV-backed, fail-open |
|
|
@@ -925,7 +936,7 @@ You can use the library freely, report issues, and discuss features. To contribu
|
|
|
925
936
|
|
|
926
937
|
## Server-Side Verification (for API Providers)
|
|
927
938
|
|
|
928
|
-
If you're building an API that accepts BOTCHA tokens from agents, use the verification SDKs. **BOTCHA
|
|
939
|
+
If you're building an API that accepts BOTCHA tokens from agents, use the verification SDKs. **BOTCHA signs tokens with ES256 (asymmetric)** — verify them using the public JWKS endpoint. No shared secret needed.
|
|
929
940
|
|
|
930
941
|
### JWKS Verification (Recommended)
|
|
931
942
|
|
|
@@ -94,17 +94,19 @@ export declare class BotchaClient {
|
|
|
94
94
|
* A 6-digit verification code will be sent to the provided email.
|
|
95
95
|
*
|
|
96
96
|
* @param email - Email address for the app owner
|
|
97
|
-
* @
|
|
97
|
+
* @param name - Optional human-readable label for the app (e.g., "My Shopping App")
|
|
98
|
+
* @returns App creation response including app_id, name, and app_secret
|
|
98
99
|
* @throws Error if app creation fails
|
|
99
100
|
*
|
|
100
101
|
* @example
|
|
101
102
|
* ```typescript
|
|
102
|
-
* const app = await client.createApp('agent@example.com');
|
|
103
|
+
* const app = await client.createApp('agent@example.com', 'My Shopping App');
|
|
103
104
|
* console.log(app.app_id); // 'app_abc123'
|
|
105
|
+
* console.log(app.name); // 'My Shopping App'
|
|
104
106
|
* console.log(app.app_secret); // 'sk_...' (save this!)
|
|
105
107
|
* ```
|
|
106
108
|
*/
|
|
107
|
-
createApp(email: string): Promise<CreateAppResponse>;
|
|
109
|
+
createApp(email: string, name?: string): Promise<CreateAppResponse>;
|
|
108
110
|
/**
|
|
109
111
|
* Verify the email address for an app using the 6-digit code sent via email.
|
|
110
112
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/client/index.ts"],"names":[],"mappings":"AAMA,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,OAAO,EACP,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,GAAG,EACH,MAAM,EACN,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/client/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import crypto from 'crypto';
|
|
2
2
|
// SDK version - hardcoded since npm_package_version is unreliable when used as a library
|
|
3
|
-
const SDK_VERSION = '0.
|
|
3
|
+
const SDK_VERSION = '0.20.1';
|
|
4
4
|
// Export stream client
|
|
5
5
|
export { BotchaStreamClient } from './stream.js';
|
|
6
6
|
/**
|
|
@@ -43,7 +43,11 @@ export class BotchaClient {
|
|
|
43
43
|
* @returns Array of SHA256 first 8 hex chars for each number
|
|
44
44
|
*/
|
|
45
45
|
solve(problems) {
|
|
46
|
-
return problems.map(num => crypto
|
|
46
|
+
return problems.map((num) => crypto
|
|
47
|
+
.createHash('sha256')
|
|
48
|
+
.update(num.toString())
|
|
49
|
+
.digest('hex')
|
|
50
|
+
.substring(0, 8));
|
|
47
51
|
}
|
|
48
52
|
/**
|
|
49
53
|
* Get a JWT token from the BOTCHA service using the token flow.
|
|
@@ -73,7 +77,7 @@ export class BotchaClient {
|
|
|
73
77
|
if (!challengeRes.ok) {
|
|
74
78
|
throw new Error(`Token request failed with status ${challengeRes.status} ${challengeRes.statusText}`);
|
|
75
79
|
}
|
|
76
|
-
const challengeData = await challengeRes.json();
|
|
80
|
+
const challengeData = (await challengeRes.json());
|
|
77
81
|
if (!challengeData.challenge) {
|
|
78
82
|
throw new Error('No challenge provided in token response');
|
|
79
83
|
}
|
|
@@ -107,7 +111,7 @@ export class BotchaClient {
|
|
|
107
111
|
if (!verifyRes.ok) {
|
|
108
112
|
throw new Error(`Token verification failed with status ${verifyRes.status} ${verifyRes.statusText}`);
|
|
109
113
|
}
|
|
110
|
-
const verifyData = await verifyRes.json();
|
|
114
|
+
const verifyData = (await verifyRes.json());
|
|
111
115
|
if (!verifyData.success && !verifyData.verified) {
|
|
112
116
|
throw new Error('Failed to obtain token from verification');
|
|
113
117
|
}
|
|
@@ -120,8 +124,8 @@ export class BotchaClient {
|
|
|
120
124
|
if (verifyData.refresh_token) {
|
|
121
125
|
this._refreshToken = verifyData.refresh_token;
|
|
122
126
|
}
|
|
123
|
-
// Cache the token - use expires_in from response (in seconds), default to
|
|
124
|
-
const expiresInSeconds = verifyData.expires_in ||
|
|
127
|
+
// Cache the token - use expires_in from response (in seconds), default to 1 hour
|
|
128
|
+
const expiresInSeconds = verifyData.expires_in || 3600; // Default to 1 hour
|
|
125
129
|
this.cachedToken = accessToken;
|
|
126
130
|
this.tokenExpiresAt = Date.now() + expiresInSeconds * 1000;
|
|
127
131
|
return this.cachedToken;
|
|
@@ -150,13 +154,13 @@ export class BotchaClient {
|
|
|
150
154
|
if (!refreshRes.ok) {
|
|
151
155
|
throw new Error(`Token refresh failed with status ${refreshRes.status} ${refreshRes.statusText}`);
|
|
152
156
|
}
|
|
153
|
-
const refreshData = await refreshRes.json();
|
|
157
|
+
const refreshData = (await refreshRes.json());
|
|
154
158
|
if (!refreshData.access_token) {
|
|
155
159
|
throw new Error('Failed to obtain access token from refresh');
|
|
156
160
|
}
|
|
157
161
|
// Update cached token with new access token
|
|
158
162
|
this.cachedToken = refreshData.access_token;
|
|
159
|
-
const expiresInSeconds = refreshData.expires_in ||
|
|
163
|
+
const expiresInSeconds = refreshData.expires_in || 3600; // Default to 1 hour
|
|
160
164
|
this.tokenExpiresAt = Date.now() + expiresInSeconds * 1000;
|
|
161
165
|
return this.cachedToken;
|
|
162
166
|
}
|
|
@@ -185,7 +189,7 @@ export class BotchaClient {
|
|
|
185
189
|
if (!contentType.toLowerCase().includes('application/json')) {
|
|
186
190
|
throw new Error('Expected JSON response for challenge request');
|
|
187
191
|
}
|
|
188
|
-
const data = await res.json();
|
|
192
|
+
const data = (await res.json());
|
|
189
193
|
if (!data.success || !data.challenge) {
|
|
190
194
|
throw new Error('Failed to get challenge');
|
|
191
195
|
}
|
|
@@ -215,7 +219,7 @@ export class BotchaClient {
|
|
|
215
219
|
if (!contentType.toLowerCase().includes('application/json')) {
|
|
216
220
|
throw new Error('Expected JSON response for verification request');
|
|
217
221
|
}
|
|
218
|
-
return await res.json();
|
|
222
|
+
return (await res.json());
|
|
219
223
|
}
|
|
220
224
|
/**
|
|
221
225
|
* Fetch a URL, automatically solving BOTCHA challenges if encountered.
|
|
@@ -343,30 +347,36 @@ export class BotchaClient {
|
|
|
343
347
|
* A 6-digit verification code will be sent to the provided email.
|
|
344
348
|
*
|
|
345
349
|
* @param email - Email address for the app owner
|
|
346
|
-
* @
|
|
350
|
+
* @param name - Optional human-readable label for the app (e.g., "My Shopping App")
|
|
351
|
+
* @returns App creation response including app_id, name, and app_secret
|
|
347
352
|
* @throws Error if app creation fails
|
|
348
353
|
*
|
|
349
354
|
* @example
|
|
350
355
|
* ```typescript
|
|
351
|
-
* const app = await client.createApp('agent@example.com');
|
|
356
|
+
* const app = await client.createApp('agent@example.com', 'My Shopping App');
|
|
352
357
|
* console.log(app.app_id); // 'app_abc123'
|
|
358
|
+
* console.log(app.name); // 'My Shopping App'
|
|
353
359
|
* console.log(app.app_secret); // 'sk_...' (save this!)
|
|
354
360
|
* ```
|
|
355
361
|
*/
|
|
356
|
-
async createApp(email) {
|
|
362
|
+
async createApp(email, name) {
|
|
363
|
+
const body = { email };
|
|
364
|
+
if (name)
|
|
365
|
+
body.name = name;
|
|
357
366
|
const res = await fetch(`${this.baseUrl}/v1/apps`, {
|
|
358
367
|
method: 'POST',
|
|
359
368
|
headers: {
|
|
360
369
|
'Content-Type': 'application/json',
|
|
361
370
|
'User-Agent': this.agentIdentity,
|
|
362
371
|
},
|
|
363
|
-
body: JSON.stringify(
|
|
372
|
+
body: JSON.stringify(body),
|
|
364
373
|
});
|
|
365
374
|
if (!res.ok) {
|
|
366
|
-
const body = await res.json().catch(() => ({}));
|
|
367
|
-
throw new Error(body.message ||
|
|
375
|
+
const body = (await res.json().catch(() => ({})));
|
|
376
|
+
throw new Error(body.message ||
|
|
377
|
+
`App creation failed with status ${res.status}`);
|
|
368
378
|
}
|
|
369
|
-
const data = await res.json();
|
|
379
|
+
const data = (await res.json());
|
|
370
380
|
// Auto-set appId for subsequent requests
|
|
371
381
|
if (data.app_id) {
|
|
372
382
|
this.appId = data.app_id;
|
|
@@ -401,10 +411,11 @@ export class BotchaClient {
|
|
|
401
411
|
body: JSON.stringify({ code }),
|
|
402
412
|
});
|
|
403
413
|
if (!res.ok) {
|
|
404
|
-
const body = await res.json().catch(() => ({}));
|
|
405
|
-
throw new Error(body.message ||
|
|
414
|
+
const body = (await res.json().catch(() => ({})));
|
|
415
|
+
throw new Error(body.message ||
|
|
416
|
+
`Email verification failed with status ${res.status}`);
|
|
406
417
|
}
|
|
407
|
-
return await res.json();
|
|
418
|
+
return (await res.json());
|
|
408
419
|
}
|
|
409
420
|
/**
|
|
410
421
|
* Resend the email verification code.
|
|
@@ -426,10 +437,11 @@ export class BotchaClient {
|
|
|
426
437
|
},
|
|
427
438
|
});
|
|
428
439
|
if (!res.ok) {
|
|
429
|
-
const body = await res.json().catch(() => ({}));
|
|
430
|
-
throw new Error(body.message ||
|
|
440
|
+
const body = (await res.json().catch(() => ({})));
|
|
441
|
+
throw new Error(body.message ||
|
|
442
|
+
`Resend verification failed with status ${res.status}`);
|
|
431
443
|
}
|
|
432
|
-
return await res.json();
|
|
444
|
+
return (await res.json());
|
|
433
445
|
}
|
|
434
446
|
/**
|
|
435
447
|
* Request account recovery via verified email.
|
|
@@ -451,10 +463,11 @@ export class BotchaClient {
|
|
|
451
463
|
body: JSON.stringify({ email }),
|
|
452
464
|
});
|
|
453
465
|
if (!res.ok) {
|
|
454
|
-
const body = await res.json().catch(() => ({}));
|
|
455
|
-
throw new Error(body.message ||
|
|
466
|
+
const body = (await res.json().catch(() => ({})));
|
|
467
|
+
throw new Error(body.message ||
|
|
468
|
+
`Account recovery failed with status ${res.status}`);
|
|
456
469
|
}
|
|
457
|
-
return await res.json();
|
|
470
|
+
return (await res.json());
|
|
458
471
|
}
|
|
459
472
|
/**
|
|
460
473
|
* Rotate the app secret. Requires an active dashboard session (Bearer token).
|
|
@@ -489,10 +502,11 @@ export class BotchaClient {
|
|
|
489
502
|
headers,
|
|
490
503
|
});
|
|
491
504
|
if (!res.ok) {
|
|
492
|
-
const body = await res.json().catch(() => ({}));
|
|
493
|
-
throw new Error(body.message ||
|
|
505
|
+
const body = (await res.json().catch(() => ({})));
|
|
506
|
+
throw new Error(body.message ||
|
|
507
|
+
`Secret rotation failed with status ${res.status}`);
|
|
494
508
|
}
|
|
495
|
-
return await res.json();
|
|
509
|
+
return (await res.json());
|
|
496
510
|
}
|
|
497
511
|
// ============ TAP (TRUSTED AGENT PROTOCOL) ============
|
|
498
512
|
/**
|
|
@@ -531,10 +545,11 @@ export class BotchaClient {
|
|
|
531
545
|
body: JSON.stringify(options),
|
|
532
546
|
});
|
|
533
547
|
if (!res.ok) {
|
|
534
|
-
const body = await res.json().catch(() => ({}));
|
|
535
|
-
throw new Error(body.message ||
|
|
548
|
+
const body = (await res.json().catch(() => ({})));
|
|
549
|
+
throw new Error(body.message ||
|
|
550
|
+
`TAP agent registration failed with status ${res.status}`);
|
|
536
551
|
}
|
|
537
|
-
return await res.json();
|
|
552
|
+
return (await res.json());
|
|
538
553
|
}
|
|
539
554
|
/**
|
|
540
555
|
* Get a TAP agent by ID.
|
|
@@ -548,10 +563,11 @@ export class BotchaClient {
|
|
|
548
563
|
headers: { 'User-Agent': this.agentIdentity },
|
|
549
564
|
});
|
|
550
565
|
if (!res.ok) {
|
|
551
|
-
const body = await res.json().catch(() => ({}));
|
|
552
|
-
throw new Error(body.message ||
|
|
566
|
+
const body = (await res.json().catch(() => ({})));
|
|
567
|
+
throw new Error(body.message ||
|
|
568
|
+
`TAP agent retrieval failed with status ${res.status}`);
|
|
553
569
|
}
|
|
554
|
-
return await res.json();
|
|
570
|
+
return (await res.json());
|
|
555
571
|
}
|
|
556
572
|
/**
|
|
557
573
|
* List TAP agents for the current app.
|
|
@@ -575,10 +591,11 @@ export class BotchaClient {
|
|
|
575
591
|
}
|
|
576
592
|
const res = await fetch(url, { headers });
|
|
577
593
|
if (!res.ok) {
|
|
578
|
-
const body = await res.json().catch(() => ({}));
|
|
579
|
-
throw new Error(body.message ||
|
|
594
|
+
const body = (await res.json().catch(() => ({})));
|
|
595
|
+
throw new Error(body.message ||
|
|
596
|
+
`TAP agent listing failed with status ${res.status}`);
|
|
580
597
|
}
|
|
581
|
-
return await res.json();
|
|
598
|
+
return (await res.json());
|
|
582
599
|
}
|
|
583
600
|
/**
|
|
584
601
|
* Create a TAP session after agent verification.
|
|
@@ -607,10 +624,11 @@ export class BotchaClient {
|
|
|
607
624
|
body: JSON.stringify(options),
|
|
608
625
|
});
|
|
609
626
|
if (!res.ok) {
|
|
610
|
-
const body = await res.json().catch(() => ({}));
|
|
611
|
-
throw new Error(body.message ||
|
|
627
|
+
const body = (await res.json().catch(() => ({})));
|
|
628
|
+
throw new Error(body.message ||
|
|
629
|
+
`TAP session creation failed with status ${res.status}`);
|
|
612
630
|
}
|
|
613
|
-
return await res.json();
|
|
631
|
+
return (await res.json());
|
|
614
632
|
}
|
|
615
633
|
/**
|
|
616
634
|
* Get a TAP session by ID.
|
|
@@ -624,10 +642,11 @@ export class BotchaClient {
|
|
|
624
642
|
headers: { 'User-Agent': this.agentIdentity },
|
|
625
643
|
});
|
|
626
644
|
if (!res.ok) {
|
|
627
|
-
const body = await res.json().catch(() => ({}));
|
|
628
|
-
throw new Error(body.message ||
|
|
645
|
+
const body = (await res.json().catch(() => ({})));
|
|
646
|
+
throw new Error(body.message ||
|
|
647
|
+
`TAP session retrieval failed with status ${res.status}`);
|
|
629
648
|
}
|
|
630
|
-
return await res.json();
|
|
649
|
+
return (await res.json());
|
|
631
650
|
}
|
|
632
651
|
/**
|
|
633
652
|
* Helper method for making authenticated requests to the BOTCHA API
|
|
@@ -648,8 +667,9 @@ export class BotchaClient {
|
|
|
648
667
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
649
668
|
});
|
|
650
669
|
if (!res.ok) {
|
|
651
|
-
const errorBody = await res.json().catch(() => ({}));
|
|
652
|
-
throw new Error(errorBody.message ||
|
|
670
|
+
const errorBody = (await res.json().catch(() => ({})));
|
|
671
|
+
throw new Error(errorBody.message ||
|
|
672
|
+
`Request failed with status ${res.status}`);
|
|
653
673
|
}
|
|
654
674
|
return await res.json();
|
|
655
675
|
}
|
|
@@ -669,8 +689,12 @@ export class BotchaClient {
|
|
|
669
689
|
* ```
|
|
670
690
|
*/
|
|
671
691
|
async getJWKS(appId) {
|
|
672
|
-
const params = appId
|
|
673
|
-
|
|
692
|
+
const params = appId
|
|
693
|
+
? `?app_id=${encodeURIComponent(appId)}`
|
|
694
|
+
: this.appId
|
|
695
|
+
? `?app_id=${encodeURIComponent(this.appId)}`
|
|
696
|
+
: '';
|
|
697
|
+
return (await this.request('GET', `/.well-known/jwks${params}`));
|
|
674
698
|
}
|
|
675
699
|
/**
|
|
676
700
|
* Get a specific public key by key ID.
|
|
@@ -686,7 +710,7 @@ export class BotchaClient {
|
|
|
686
710
|
* ```
|
|
687
711
|
*/
|
|
688
712
|
async getKeyById(keyId) {
|
|
689
|
-
return await this.request('GET', `/v1/keys/${encodeURIComponent(keyId)}`);
|
|
713
|
+
return (await this.request('GET', `/v1/keys/${encodeURIComponent(keyId)}`));
|
|
690
714
|
}
|
|
691
715
|
/**
|
|
692
716
|
* Rotate an agent's key pair.
|
|
@@ -706,7 +730,7 @@ export class BotchaClient {
|
|
|
706
730
|
* ```
|
|
707
731
|
*/
|
|
708
732
|
async rotateAgentKey(agentId, options) {
|
|
709
|
-
return await this.request('POST', `/v1/agents/${encodeURIComponent(agentId)}/tap/rotate-key`, options);
|
|
733
|
+
return (await this.request('POST', `/v1/agents/${encodeURIComponent(agentId)}/tap/rotate-key`, options));
|
|
710
734
|
}
|
|
711
735
|
// ============ INVOICE & PAYMENT (402 Flow) ============
|
|
712
736
|
/**
|
|
@@ -730,7 +754,7 @@ export class BotchaClient {
|
|
|
730
754
|
* ```
|
|
731
755
|
*/
|
|
732
756
|
async createInvoice(options) {
|
|
733
|
-
return await this.request('POST', '/v1/invoices', options);
|
|
757
|
+
return (await this.request('POST', '/v1/invoices', options));
|
|
734
758
|
}
|
|
735
759
|
/**
|
|
736
760
|
* Get an invoice by ID.
|
|
@@ -746,7 +770,7 @@ export class BotchaClient {
|
|
|
746
770
|
* ```
|
|
747
771
|
*/
|
|
748
772
|
async getInvoice(invoiceId) {
|
|
749
|
-
return await this.request('GET', `/v1/invoices/${encodeURIComponent(invoiceId)}`);
|
|
773
|
+
return (await this.request('GET', `/v1/invoices/${encodeURIComponent(invoiceId)}`));
|
|
750
774
|
}
|
|
751
775
|
/**
|
|
752
776
|
* Verify a Browsing IOU against an invoice.
|
|
@@ -774,7 +798,7 @@ export class BotchaClient {
|
|
|
774
798
|
* ```
|
|
775
799
|
*/
|
|
776
800
|
async verifyBrowsingIOU(invoiceId, iou) {
|
|
777
|
-
return await this.request('POST', `/v1/invoices/${encodeURIComponent(invoiceId)}/verify-iou`, iou);
|
|
801
|
+
return (await this.request('POST', `/v1/invoices/${encodeURIComponent(invoiceId)}/verify-iou`, iou));
|
|
778
802
|
}
|
|
779
803
|
// ============ Delegation Chain Methods ============
|
|
780
804
|
/**
|
|
@@ -792,13 +816,13 @@ export class BotchaClient {
|
|
|
792
816
|
* ```
|
|
793
817
|
*/
|
|
794
818
|
async createDelegation(options) {
|
|
795
|
-
return await this.request('POST', '/v1/delegations', options);
|
|
819
|
+
return (await this.request('POST', '/v1/delegations', options));
|
|
796
820
|
}
|
|
797
821
|
/**
|
|
798
822
|
* Get delegation details by ID.
|
|
799
823
|
*/
|
|
800
824
|
async getDelegation(delegationId) {
|
|
801
|
-
return await this.request('GET', `/v1/delegations/${encodeURIComponent(delegationId)}`);
|
|
825
|
+
return (await this.request('GET', `/v1/delegations/${encodeURIComponent(delegationId)}`));
|
|
802
826
|
}
|
|
803
827
|
/**
|
|
804
828
|
* List delegations for an agent.
|
|
@@ -814,7 +838,7 @@ export class BotchaClient {
|
|
|
814
838
|
params.set('include_revoked', 'true');
|
|
815
839
|
if (options?.include_expired)
|
|
816
840
|
params.set('include_expired', 'true');
|
|
817
|
-
return await this.request('GET', `/v1/delegations?${params.toString()}`);
|
|
841
|
+
return (await this.request('GET', `/v1/delegations?${params.toString()}`));
|
|
818
842
|
}
|
|
819
843
|
/**
|
|
820
844
|
* Revoke a delegation. Cascades to all sub-delegations.
|
|
@@ -823,7 +847,7 @@ export class BotchaClient {
|
|
|
823
847
|
* @param reason - Optional reason for revocation
|
|
824
848
|
*/
|
|
825
849
|
async revokeDelegation(delegationId, reason) {
|
|
826
|
-
return await this.request('POST', `/v1/delegations/${encodeURIComponent(delegationId)}/revoke`, reason ? { reason } : {});
|
|
850
|
+
return (await this.request('POST', `/v1/delegations/${encodeURIComponent(delegationId)}/revoke`, reason ? { reason } : {}));
|
|
827
851
|
}
|
|
828
852
|
/**
|
|
829
853
|
* Verify a delegation chain is valid.
|
|
@@ -832,7 +856,9 @@ export class BotchaClient {
|
|
|
832
856
|
* @param delegationId - The leaf delegation to verify (walks up the chain)
|
|
833
857
|
*/
|
|
834
858
|
async verifyDelegationChain(delegationId) {
|
|
835
|
-
return await this.request('POST', '/v1/verify/delegation', {
|
|
859
|
+
return (await this.request('POST', '/v1/verify/delegation', {
|
|
860
|
+
delegation_id: delegationId,
|
|
861
|
+
}));
|
|
836
862
|
}
|
|
837
863
|
// ============ Capability Attestation Methods ============
|
|
838
864
|
/**
|
|
@@ -851,13 +877,13 @@ export class BotchaClient {
|
|
|
851
877
|
* ```
|
|
852
878
|
*/
|
|
853
879
|
async issueAttestation(options) {
|
|
854
|
-
return await this.request('POST', '/v1/attestations', options);
|
|
880
|
+
return (await this.request('POST', '/v1/attestations', options));
|
|
855
881
|
}
|
|
856
882
|
/**
|
|
857
883
|
* Get attestation details by ID.
|
|
858
884
|
*/
|
|
859
885
|
async getAttestation(attestationId) {
|
|
860
|
-
return await this.request('GET', `/v1/attestations/${encodeURIComponent(attestationId)}`);
|
|
886
|
+
return (await this.request('GET', `/v1/attestations/${encodeURIComponent(attestationId)}`));
|
|
861
887
|
}
|
|
862
888
|
/**
|
|
863
889
|
* List attestations for an agent.
|
|
@@ -866,7 +892,7 @@ export class BotchaClient {
|
|
|
866
892
|
*/
|
|
867
893
|
async listAttestations(agentId) {
|
|
868
894
|
const params = new URLSearchParams({ agent_id: agentId });
|
|
869
|
-
return await this.request('GET', `/v1/attestations?${params.toString()}`);
|
|
895
|
+
return (await this.request('GET', `/v1/attestations?${params.toString()}`));
|
|
870
896
|
}
|
|
871
897
|
/**
|
|
872
898
|
* Revoke an attestation. Token will be rejected on future verification.
|
|
@@ -875,7 +901,7 @@ export class BotchaClient {
|
|
|
875
901
|
* @param reason - Optional reason for revocation
|
|
876
902
|
*/
|
|
877
903
|
async revokeAttestation(attestationId, reason) {
|
|
878
|
-
return await this.request('POST', `/v1/attestations/${encodeURIComponent(attestationId)}/revoke`, reason ? { reason } : {});
|
|
904
|
+
return (await this.request('POST', `/v1/attestations/${encodeURIComponent(attestationId)}/revoke`, reason ? { reason } : {}));
|
|
879
905
|
}
|
|
880
906
|
/**
|
|
881
907
|
* Verify an attestation token and optionally check a specific capability.
|
|
@@ -890,7 +916,7 @@ export class BotchaClient {
|
|
|
890
916
|
body.action = action;
|
|
891
917
|
if (resource)
|
|
892
918
|
body.resource = resource;
|
|
893
|
-
return await this.request('POST', '/v1/verify/attestation', body);
|
|
919
|
+
return (await this.request('POST', '/v1/verify/attestation', body));
|
|
894
920
|
}
|
|
895
921
|
// ============ Agent Reputation Scoring Methods ============
|
|
896
922
|
/**
|
|
@@ -905,7 +931,7 @@ export class BotchaClient {
|
|
|
905
931
|
* ```
|
|
906
932
|
*/
|
|
907
933
|
async getReputation(agentId) {
|
|
908
|
-
return await this.request('GET', `/v1/reputation/${encodeURIComponent(agentId)}`);
|
|
934
|
+
return (await this.request('GET', `/v1/reputation/${encodeURIComponent(agentId)}`));
|
|
909
935
|
}
|
|
910
936
|
/**
|
|
911
937
|
* Record a reputation event for an agent.
|
|
@@ -922,7 +948,7 @@ export class BotchaClient {
|
|
|
922
948
|
* ```
|
|
923
949
|
*/
|
|
924
950
|
async recordReputationEvent(options) {
|
|
925
|
-
return await this.request('POST', '/v1/reputation/events', options);
|
|
951
|
+
return (await this.request('POST', '/v1/reputation/events', options));
|
|
926
952
|
}
|
|
927
953
|
/**
|
|
928
954
|
* List reputation events for an agent.
|
|
@@ -938,7 +964,7 @@ export class BotchaClient {
|
|
|
938
964
|
params.set('limit', options.limit.toString());
|
|
939
965
|
const query = params.toString();
|
|
940
966
|
const path = `/v1/reputation/${encodeURIComponent(agentId)}/events${query ? `?${query}` : ''}`;
|
|
941
|
-
return await this.request('GET', path);
|
|
967
|
+
return (await this.request('GET', path));
|
|
942
968
|
}
|
|
943
969
|
/**
|
|
944
970
|
* Reset an agent's reputation to default (admin action).
|
|
@@ -947,7 +973,7 @@ export class BotchaClient {
|
|
|
947
973
|
* @param agentId - The agent to reset
|
|
948
974
|
*/
|
|
949
975
|
async resetReputation(agentId) {
|
|
950
|
-
return await this.request('POST', `/v1/reputation/${encodeURIComponent(agentId)}/reset`);
|
|
976
|
+
return (await this.request('POST', `/v1/reputation/${encodeURIComponent(agentId)}/reset`));
|
|
951
977
|
}
|
|
952
978
|
}
|
|
953
979
|
/**
|
|
@@ -960,7 +986,11 @@ export class BotchaClient {
|
|
|
960
986
|
* ```
|
|
961
987
|
*/
|
|
962
988
|
export function solveBotcha(problems) {
|
|
963
|
-
return problems.map(num => crypto
|
|
989
|
+
return problems.map((num) => crypto
|
|
990
|
+
.createHash('sha256')
|
|
991
|
+
.update(num.toString())
|
|
992
|
+
.digest('hex')
|
|
993
|
+
.substring(0, 8));
|
|
964
994
|
}
|
|
965
995
|
export default BotchaClient;
|
|
966
996
|
function normalizeProblems(problems) {
|
|
@@ -972,7 +1002,9 @@ function normalizeProblems(problems) {
|
|
|
972
1002
|
numbers.push(problem);
|
|
973
1003
|
continue;
|
|
974
1004
|
}
|
|
975
|
-
if (typeof problem === 'object' &&
|
|
1005
|
+
if (typeof problem === 'object' &&
|
|
1006
|
+
problem !== null &&
|
|
1007
|
+
typeof problem.num === 'number') {
|
|
976
1008
|
numbers.push(problem.num);
|
|
977
1009
|
continue;
|
|
978
1010
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/client/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/client/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tap-enhanced-verify.d.ts","sourceRoot":"","sources":["../../../src/middleware/tap-enhanced-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAoB1D,MAAM,WAAW,gBAAgB;IAE/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAGlD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,UAAU,CAAC,EAAE,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"tap-enhanced-verify.d.ts","sourceRoot":"","sources":["../../../src/middleware/tap-enhanced-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAoB1D,MAAM,WAAW,gBAAgB;IAE/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAGlD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAsBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,gBAAqB,IAGhD,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,wDAqE9D;AAgTD,eAAO,MAAM,cAAc;IACzB;;OAEG;uBACe,OAAO,CAAC,gBAAgB,CAAC,WAzXxB,OAAO,OAAO,QAAQ,QAAQ,YAAY;IAgY7D;;OAEG;yBACiB,OAAO,CAAC,gBAAgB,CAAC,WAnY1B,OAAO,OAAO,QAAQ,QAAQ,YAAY;IA0Y7D;;OAEG;8BACsB,OAAO,CAAC,gBAAgB,CAAC,WA7Y/B,OAAO,OAAO,QAAQ,QAAQ,YAAY;IAoZ7D;;OAEG;4BACoB,OAAO,CAAC,gBAAgB,CAAC,WAvZ7B,OAAO,OAAO,QAAQ,QAAQ,YAAY;CA8Z9D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,0BAAoB,CAAC;AAE3D,eAAe,iBAAiB,CAAC"}
|
|
@@ -122,7 +122,7 @@ async function performFullTAPVerification(req, opts) {
|
|
|
122
122
|
}
|
|
123
123
|
const agent = agentResult.agent;
|
|
124
124
|
// Verify cryptographic signature
|
|
125
|
-
const cryptoResult = await verifyCryptographicSignature(req, agent);
|
|
125
|
+
const cryptoResult = await verifyCryptographicSignature(req, agent, opts);
|
|
126
126
|
// Verify computational challenge
|
|
127
127
|
const challengeResult = await verifyComputationalChallenge(req);
|
|
128
128
|
// Both must pass for full TAP
|
|
@@ -183,7 +183,7 @@ async function performSignatureOnlyVerification(req, opts) {
|
|
|
183
183
|
};
|
|
184
184
|
}
|
|
185
185
|
// Verify signature
|
|
186
|
-
const cryptoResult = await verifyCryptographicSignature(req, agentResult.agent);
|
|
186
|
+
const cryptoResult = await verifyCryptographicSignature(req, agentResult.agent, opts);
|
|
187
187
|
return {
|
|
188
188
|
verified: cryptoResult.valid,
|
|
189
189
|
agent_id: agentResult.agent.agent_id,
|
|
@@ -240,7 +240,7 @@ async function handleVerificationFallback(req, opts, mode) {
|
|
|
240
240
|
};
|
|
241
241
|
}
|
|
242
242
|
// ============ HELPER FUNCTIONS ============
|
|
243
|
-
async function verifyCryptographicSignature(req, agent) {
|
|
243
|
+
async function verifyCryptographicSignature(req, agent, opts) {
|
|
244
244
|
if (!agent.public_key || !agent.signature_algorithm) {
|
|
245
245
|
return { valid: false, error: 'Agent has no cryptographic key configured' };
|
|
246
246
|
}
|
|
@@ -250,7 +250,7 @@ async function verifyCryptographicSignature(req, agent) {
|
|
|
250
250
|
headers: req.headers,
|
|
251
251
|
body: typeof req.body === 'string' ? req.body : JSON.stringify(req.body)
|
|
252
252
|
};
|
|
253
|
-
return await verifyHTTPMessageSignature(verificationRequest, agent.public_key, agent.signature_algorithm);
|
|
253
|
+
return await verifyHTTPMessageSignature(verificationRequest, agent.public_key, agent.signature_algorithm, opts.noncesKV || null);
|
|
254
254
|
}
|
|
255
255
|
async function verifyComputationalChallenge(req) {
|
|
256
256
|
const challengeId = req.headers['x-botcha-challenge-id'];
|
package/package.json
CHANGED
package/dist/src/index.d.ts
DELETED
package/dist/src/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAc3C,QAAA,MAAM,GAAG,EAAE,OAAmB,CAAC;AA2b/B,eAAe,GAAG,CAAC"}
|
package/dist/src/index.js
DELETED
|
@@ -1,408 +0,0 @@
|
|
|
1
|
-
// Local development server - Production runs on Cloudflare Workers
|
|
2
|
-
import express from 'express';
|
|
3
|
-
import crypto from 'crypto';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
import { botchaVerify } from './middleware/verify.js';
|
|
7
|
-
import { generateChallenge, verifyChallenge } from './challenges/compute.js';
|
|
8
|
-
import { generateSpeedChallenge, verifySpeedChallenge } from './challenges/speed.js';
|
|
9
|
-
import { generateReasoningChallenge, verifyReasoningChallenge } from './challenges/reasoning.js';
|
|
10
|
-
import { generateHybridChallenge, verifyHybridChallenge } from './challenges/hybrid.js';
|
|
11
|
-
import { TRUSTED_PROVIDERS } from './utils/signature.js';
|
|
12
|
-
import { createBadgeResponse, verifyBadge } from './utils/badge.js';
|
|
13
|
-
import { generateBadgeSvg, generateBadgeHtml } from './utils/badge-image.js';
|
|
14
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
-
const app = express();
|
|
16
|
-
const PORT = process.env.PORT || 3000;
|
|
17
|
-
app.use(express.json());
|
|
18
|
-
app.use(express.static(path.join(__dirname, '../public')));
|
|
19
|
-
// CORS + BOTCHA headers
|
|
20
|
-
app.use((req, res, next) => {
|
|
21
|
-
res.header('Access-Control-Allow-Origin', '*');
|
|
22
|
-
res.header('Access-Control-Allow-Headers', '*');
|
|
23
|
-
// BOTCHA discovery headers
|
|
24
|
-
res.header('X-Botcha-Version', '0.3.0');
|
|
25
|
-
res.header('X-Botcha-Enabled', 'true');
|
|
26
|
-
res.header('X-Botcha-Methods', 'speed-challenge,reasoning-challenge,hybrid-challenge,standard-challenge,web-bot-auth');
|
|
27
|
-
res.header('X-Botcha-Docs', 'https://botcha.ai/openapi.json');
|
|
28
|
-
if (req.method === 'OPTIONS')
|
|
29
|
-
return res.sendStatus(200);
|
|
30
|
-
next();
|
|
31
|
-
});
|
|
32
|
-
// Landing page
|
|
33
|
-
app.get('/', (req, res) => {
|
|
34
|
-
res.sendFile(path.join(__dirname, '../public/index.html'));
|
|
35
|
-
});
|
|
36
|
-
// API info
|
|
37
|
-
app.get('/api', (req, res) => {
|
|
38
|
-
res.json({
|
|
39
|
-
name: 'BOTCHA',
|
|
40
|
-
version: '0.3.0',
|
|
41
|
-
tagline: 'Prove you are a bot. Humans need not apply.',
|
|
42
|
-
endpoints: {
|
|
43
|
-
'/api': 'This info',
|
|
44
|
-
'/api/challenge': 'Standard challenge (GET new, POST verify)',
|
|
45
|
-
'/api/speed-challenge': '⚡ Speed challenge - 500ms to solve 5 problems',
|
|
46
|
-
'/api/reasoning-challenge': '🧠 Reasoning challenge - LLM-only questions',
|
|
47
|
-
'/api/hybrid-challenge': '🔥 Hybrid challenge - speed + reasoning combined',
|
|
48
|
-
'/agent-only': 'Protected endpoint',
|
|
49
|
-
},
|
|
50
|
-
verification: {
|
|
51
|
-
methods: [
|
|
52
|
-
'Web Bot Auth (cryptographic signature)',
|
|
53
|
-
'Hybrid Challenge (speed + reasoning)',
|
|
54
|
-
'Speed Challenge (500ms time limit)',
|
|
55
|
-
'Reasoning Challenge (LLM-only questions)',
|
|
56
|
-
'Standard Challenge (5s time limit)',
|
|
57
|
-
'X-Agent-Identity header (testing)',
|
|
58
|
-
],
|
|
59
|
-
trustedProviders: TRUSTED_PROVIDERS,
|
|
60
|
-
},
|
|
61
|
-
discovery: {
|
|
62
|
-
openapi: 'https://botcha.ai/openapi.json',
|
|
63
|
-
aiPlugin: 'https://botcha.ai/.well-known/ai-plugin.json',
|
|
64
|
-
aiTxt: 'https://botcha.ai/ai.txt',
|
|
65
|
-
robotsTxt: 'https://botcha.ai/robots.txt',
|
|
66
|
-
npm: 'https://www.npmjs.com/package/@dupecom/botcha',
|
|
67
|
-
github: 'https://github.com/dupe-com/botcha',
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
// Standard challenge
|
|
72
|
-
app.get('/api/challenge', (req, res) => {
|
|
73
|
-
const difficulty = req.query.difficulty || 'medium';
|
|
74
|
-
const challenge = generateChallenge(difficulty);
|
|
75
|
-
res.json({ success: true, challenge });
|
|
76
|
-
});
|
|
77
|
-
app.post('/api/challenge', (req, res) => {
|
|
78
|
-
const { id, answer } = req.body;
|
|
79
|
-
if (!id || !answer) {
|
|
80
|
-
return res.status(400).json({ success: false, error: 'Missing id or answer' });
|
|
81
|
-
}
|
|
82
|
-
const result = verifyChallenge(id, answer);
|
|
83
|
-
res.json({
|
|
84
|
-
success: result.valid,
|
|
85
|
-
message: result.valid ? '✅ Challenge passed!' : `❌ ${result.reason}`,
|
|
86
|
-
solveTime: result.timeMs,
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
// ⚡ SPEED CHALLENGE - The human killer
|
|
90
|
-
app.get('/api/speed-challenge', (req, res) => {
|
|
91
|
-
const challenge = generateSpeedChallenge();
|
|
92
|
-
res.json({
|
|
93
|
-
success: true,
|
|
94
|
-
warning: '⚡ SPEED CHALLENGE: You have 500ms to solve ALL 5 problems!',
|
|
95
|
-
challenge: {
|
|
96
|
-
id: challenge.id,
|
|
97
|
-
problems: challenge.challenges,
|
|
98
|
-
timeLimit: `${challenge.timeLimit}ms`,
|
|
99
|
-
instructions: challenge.instructions,
|
|
100
|
-
},
|
|
101
|
-
tip: 'Humans cannot copy-paste fast enough. Only real AI agents can pass.',
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
app.post('/api/speed-challenge', (req, res) => {
|
|
105
|
-
const { id, answers } = req.body;
|
|
106
|
-
if (!id || !answers) {
|
|
107
|
-
return res.status(400).json({ success: false, error: 'Missing id or answers array' });
|
|
108
|
-
}
|
|
109
|
-
const result = verifySpeedChallenge(id, answers);
|
|
110
|
-
const response = {
|
|
111
|
-
success: result.valid,
|
|
112
|
-
message: result.valid
|
|
113
|
-
? `⚡ SPEED TEST PASSED in ${result.solveTimeMs}ms! You are definitely an AI.`
|
|
114
|
-
: `❌ ${result.reason}`,
|
|
115
|
-
solveTimeMs: result.solveTimeMs,
|
|
116
|
-
verdict: result.valid ? '🤖 VERIFIED AI AGENT' : '🚫 LIKELY HUMAN (too slow)',
|
|
117
|
-
};
|
|
118
|
-
// Include badge for successful verifications
|
|
119
|
-
if (result.valid) {
|
|
120
|
-
response.badge = createBadgeResponse('speed-challenge', result.solveTimeMs);
|
|
121
|
-
}
|
|
122
|
-
res.json(response);
|
|
123
|
-
});
|
|
124
|
-
// 🧠 REASONING CHALLENGE - LLM-only questions
|
|
125
|
-
app.get('/api/reasoning-challenge', (req, res) => {
|
|
126
|
-
const challenge = generateReasoningChallenge();
|
|
127
|
-
res.json({
|
|
128
|
-
success: true,
|
|
129
|
-
warning: '🧠 REASONING CHALLENGE: Answer 3 questions that require AI reasoning!',
|
|
130
|
-
challenge: {
|
|
131
|
-
id: challenge.id,
|
|
132
|
-
questions: challenge.questions,
|
|
133
|
-
timeLimit: `${challenge.timeLimit / 1000}s`,
|
|
134
|
-
instructions: challenge.instructions,
|
|
135
|
-
},
|
|
136
|
-
tip: 'These questions require reasoning that LLMs can do, but simple scripts cannot.',
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
app.post('/api/reasoning-challenge', (req, res) => {
|
|
140
|
-
const { id, answers } = req.body;
|
|
141
|
-
if (!id || !answers) {
|
|
142
|
-
return res.status(400).json({
|
|
143
|
-
success: false,
|
|
144
|
-
error: 'Missing id or answers object',
|
|
145
|
-
hint: 'answers should be an object like { "question-id": "your answer", ... }',
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
const result = verifyReasoningChallenge(id, answers);
|
|
149
|
-
const response = {
|
|
150
|
-
success: result.valid,
|
|
151
|
-
message: result.valid
|
|
152
|
-
? `🧠 REASONING TEST PASSED in ${((result.solveTimeMs || 0) / 1000).toFixed(1)}s! You can think like an AI.`
|
|
153
|
-
: `❌ ${result.reason}`,
|
|
154
|
-
solveTimeMs: result.solveTimeMs,
|
|
155
|
-
score: result.valid ? `${result.correctCount}/${result.totalCount}` : undefined,
|
|
156
|
-
verdict: result.valid ? '🤖 VERIFIED AI AGENT (reasoning confirmed)' : '🚫 FAILED REASONING TEST',
|
|
157
|
-
};
|
|
158
|
-
// Include badge for successful verifications
|
|
159
|
-
if (result.valid) {
|
|
160
|
-
response.badge = createBadgeResponse('reasoning-challenge', result.solveTimeMs);
|
|
161
|
-
}
|
|
162
|
-
res.json(response);
|
|
163
|
-
});
|
|
164
|
-
// 🔥 HYBRID CHALLENGE - Speed + Reasoning combined
|
|
165
|
-
app.get('/api/hybrid-challenge', (req, res) => {
|
|
166
|
-
const challenge = generateHybridChallenge();
|
|
167
|
-
res.json({
|
|
168
|
-
success: true,
|
|
169
|
-
warning: '🔥 HYBRID CHALLENGE: Solve speed problems in <500ms AND answer reasoning questions!',
|
|
170
|
-
challenge: {
|
|
171
|
-
id: challenge.id,
|
|
172
|
-
speed: {
|
|
173
|
-
problems: challenge.speed.problems,
|
|
174
|
-
timeLimit: `${challenge.speed.timeLimit}ms`,
|
|
175
|
-
instructions: 'Compute SHA256 of each number, return first 8 hex chars',
|
|
176
|
-
},
|
|
177
|
-
reasoning: {
|
|
178
|
-
questions: challenge.reasoning.questions,
|
|
179
|
-
timeLimit: `${challenge.reasoning.timeLimit / 1000}s`,
|
|
180
|
-
instructions: 'Answer all reasoning questions',
|
|
181
|
-
},
|
|
182
|
-
},
|
|
183
|
-
instructions: challenge.instructions,
|
|
184
|
-
tip: 'This is the ultimate test: proves you can compute AND reason like an AI.',
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
app.post('/api/hybrid-challenge', (req, res) => {
|
|
188
|
-
const { id, speed_answers, reasoning_answers } = req.body;
|
|
189
|
-
if (!id || !speed_answers || !reasoning_answers) {
|
|
190
|
-
return res.status(400).json({
|
|
191
|
-
success: false,
|
|
192
|
-
error: 'Missing id, speed_answers array, or reasoning_answers object',
|
|
193
|
-
hint: 'Submit both speed_answers (array) and reasoning_answers (object) together',
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
const result = verifyHybridChallenge(id, speed_answers, reasoning_answers);
|
|
197
|
-
const response = {
|
|
198
|
-
success: result.valid,
|
|
199
|
-
message: result.valid
|
|
200
|
-
? `🔥 HYBRID TEST PASSED! Speed: ${result.speed.solveTimeMs}ms, Reasoning: ${result.reasoning.score}`
|
|
201
|
-
: `❌ ${result.reason}`,
|
|
202
|
-
speed: result.speed,
|
|
203
|
-
reasoning: result.reasoning,
|
|
204
|
-
totalTimeMs: result.totalTimeMs,
|
|
205
|
-
verdict: result.valid
|
|
206
|
-
? '🤖 VERIFIED AI AGENT (speed + reasoning confirmed)'
|
|
207
|
-
: '🚫 FAILED HYBRID TEST',
|
|
208
|
-
};
|
|
209
|
-
if (result.valid) {
|
|
210
|
-
response.badge = createBadgeResponse('hybrid-challenge', result.totalTimeMs);
|
|
211
|
-
}
|
|
212
|
-
res.json(response);
|
|
213
|
-
});
|
|
214
|
-
// 🤖 LANDING PAGE CHALLENGE - For bots that discover the embedded challenge
|
|
215
|
-
const landingTokens = new Map(); // token -> expiry timestamp
|
|
216
|
-
app.post('/api/verify-landing', (req, res) => {
|
|
217
|
-
const { answer, timestamp } = req.body;
|
|
218
|
-
if (!answer || !timestamp) {
|
|
219
|
-
return res.status(400).json({
|
|
220
|
-
success: false,
|
|
221
|
-
error: 'Missing answer or timestamp',
|
|
222
|
-
hint: 'Parse the challenge from <script type="application/botcha+json"> on the landing page'
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
// Verify timestamp is recent (within 5 minutes)
|
|
226
|
-
const submittedTime = new Date(timestamp).getTime();
|
|
227
|
-
const now = Date.now();
|
|
228
|
-
if (Math.abs(now - submittedTime) > 5 * 60 * 1000) {
|
|
229
|
-
return res.status(400).json({ success: false, error: 'Timestamp too old or in future' });
|
|
230
|
-
}
|
|
231
|
-
// Calculate expected answer for today
|
|
232
|
-
const today = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
|
|
233
|
-
const expectedHash = crypto
|
|
234
|
-
.createHash('sha256')
|
|
235
|
-
.update(`BOTCHA-LANDING-${today}`)
|
|
236
|
-
.digest('hex')
|
|
237
|
-
.substring(0, 16);
|
|
238
|
-
if (answer.toLowerCase() !== expectedHash.toLowerCase()) {
|
|
239
|
-
return res.status(403).json({
|
|
240
|
-
success: false,
|
|
241
|
-
error: 'Incorrect answer',
|
|
242
|
-
hint: `Expected SHA256('BOTCHA-LANDING-${today}') first 16 chars`
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
// Generate a token for accessing /agent-only
|
|
246
|
-
const token = crypto.randomBytes(32).toString('hex');
|
|
247
|
-
landingTokens.set(token, Date.now() + 60 * 60 * 1000); // Valid for 1 hour
|
|
248
|
-
// Clean up expired tokens
|
|
249
|
-
for (const [t, expiry] of landingTokens) {
|
|
250
|
-
if (expiry < Date.now())
|
|
251
|
-
landingTokens.delete(t);
|
|
252
|
-
}
|
|
253
|
-
res.json({
|
|
254
|
-
success: true,
|
|
255
|
-
message: '🤖 Landing challenge solved! You are a bot.',
|
|
256
|
-
token,
|
|
257
|
-
usage: {
|
|
258
|
-
header: 'X-Botcha-Landing-Token',
|
|
259
|
-
value: token,
|
|
260
|
-
expires_in: '1 hour',
|
|
261
|
-
use_with: '/agent-only'
|
|
262
|
-
},
|
|
263
|
-
badge: createBadgeResponse('landing-challenge'),
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
// ========================================
|
|
267
|
-
// BADGE VERIFICATION ENDPOINTS
|
|
268
|
-
// ========================================
|
|
269
|
-
// HTML verification page
|
|
270
|
-
app.get('/badge/:id', (req, res) => {
|
|
271
|
-
const badgeId = req.params.id;
|
|
272
|
-
const payload = verifyBadge(badgeId);
|
|
273
|
-
if (!payload) {
|
|
274
|
-
return res.status(404).send(`
|
|
275
|
-
<!DOCTYPE html>
|
|
276
|
-
<html>
|
|
277
|
-
<head><title>Invalid Badge</title></head>
|
|
278
|
-
<body style="font-family: system-ui; background: #0f0f23; color: #e5e7eb; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0;">
|
|
279
|
-
<div style="text-align: center;">
|
|
280
|
-
<h1 style="color: #ef4444;">Invalid Badge</h1>
|
|
281
|
-
<p>This badge token is invalid or has been tampered with.</p>
|
|
282
|
-
<a href="https://botcha.ai" style="color: #f59e0b;">Back to BOTCHA</a>
|
|
283
|
-
</div>
|
|
284
|
-
</body>
|
|
285
|
-
</html>
|
|
286
|
-
`);
|
|
287
|
-
}
|
|
288
|
-
res.setHeader('Content-Type', 'text/html');
|
|
289
|
-
res.send(generateBadgeHtml(payload, badgeId));
|
|
290
|
-
});
|
|
291
|
-
// SVG badge image
|
|
292
|
-
app.get('/badge/:id/image', (req, res) => {
|
|
293
|
-
const badgeId = req.params.id;
|
|
294
|
-
const payload = verifyBadge(badgeId);
|
|
295
|
-
if (!payload) {
|
|
296
|
-
// Return a simple error SVG
|
|
297
|
-
res.setHeader('Content-Type', 'image/svg+xml');
|
|
298
|
-
res.setHeader('Cache-Control', 'no-cache');
|
|
299
|
-
return res.send(`<svg xmlns="http://www.w3.org/2000/svg" width="400" height="120" viewBox="0 0 400 120">
|
|
300
|
-
<rect width="400" height="120" rx="12" fill="#1a1a2e"/>
|
|
301
|
-
<text x="200" y="65" font-family="system-ui" font-size="16" fill="#ef4444" text-anchor="middle">Invalid Badge</text>
|
|
302
|
-
</svg>`);
|
|
303
|
-
}
|
|
304
|
-
res.setHeader('Content-Type', 'image/svg+xml');
|
|
305
|
-
res.setHeader('Cache-Control', 'public, max-age=31536000'); // Cache for 1 year (badges are immutable)
|
|
306
|
-
res.send(generateBadgeSvg(payload));
|
|
307
|
-
});
|
|
308
|
-
// JSON API for badge verification
|
|
309
|
-
app.get('/api/badge/:id', (req, res) => {
|
|
310
|
-
const badgeId = req.params.id;
|
|
311
|
-
const payload = verifyBadge(badgeId);
|
|
312
|
-
if (!payload) {
|
|
313
|
-
return res.status(404).json({
|
|
314
|
-
success: false,
|
|
315
|
-
error: 'Invalid badge',
|
|
316
|
-
message: 'This badge token is invalid or has been tampered with.',
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
res.json({
|
|
320
|
-
success: true,
|
|
321
|
-
valid: true,
|
|
322
|
-
badge: {
|
|
323
|
-
method: payload.method,
|
|
324
|
-
solveTimeMs: payload.solveTimeMs,
|
|
325
|
-
verifiedAt: new Date(payload.verifiedAt).toISOString(),
|
|
326
|
-
},
|
|
327
|
-
verifyUrl: `https://botcha.ai/badge/${badgeId}`,
|
|
328
|
-
imageUrl: `https://botcha.ai/badge/${badgeId}/image`,
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
// Make landing tokens work with the protected endpoint
|
|
332
|
-
app.use('/agent-only', (req, res, next) => {
|
|
333
|
-
const landingToken = req.headers['x-botcha-landing-token'];
|
|
334
|
-
if (landingToken && landingTokens.has(landingToken)) {
|
|
335
|
-
const expiry = landingTokens.get(landingToken);
|
|
336
|
-
if (expiry > Date.now()) {
|
|
337
|
-
req.agent = 'landing-challenge-verified';
|
|
338
|
-
req.verificationMethod = 'landing-token';
|
|
339
|
-
return next();
|
|
340
|
-
}
|
|
341
|
-
landingTokens.delete(landingToken);
|
|
342
|
-
}
|
|
343
|
-
next();
|
|
344
|
-
});
|
|
345
|
-
// Protected endpoint
|
|
346
|
-
app.get('/agent-only', (req, res, next) => {
|
|
347
|
-
// Skip botchaVerify if already authenticated via landing token
|
|
348
|
-
if (req.verificationMethod === 'landing-token') {
|
|
349
|
-
return next();
|
|
350
|
-
}
|
|
351
|
-
botchaVerify({ challengeType: 'speed' })(req, res, next);
|
|
352
|
-
}, (req, res) => {
|
|
353
|
-
const method = req.verificationMethod;
|
|
354
|
-
// Map verification method to badge method
|
|
355
|
-
let badgeMethod = 'standard-challenge';
|
|
356
|
-
if (method === 'landing-token') {
|
|
357
|
-
badgeMethod = 'landing-challenge';
|
|
358
|
-
}
|
|
359
|
-
else if (method === 'web-bot-auth') {
|
|
360
|
-
badgeMethod = 'web-bot-auth';
|
|
361
|
-
}
|
|
362
|
-
else if (method === 'speed-challenge' || method === 'speed') {
|
|
363
|
-
badgeMethod = 'speed-challenge';
|
|
364
|
-
}
|
|
365
|
-
res.json({
|
|
366
|
-
success: true,
|
|
367
|
-
message: '🤖 Welcome, fellow agent!',
|
|
368
|
-
verified: true,
|
|
369
|
-
agent: req.agent,
|
|
370
|
-
method,
|
|
371
|
-
timestamp: new Date().toISOString(),
|
|
372
|
-
secret: 'The humans will never see this. Their fingers are too slow. 🤫',
|
|
373
|
-
badge: createBadgeResponse(badgeMethod),
|
|
374
|
-
});
|
|
375
|
-
});
|
|
376
|
-
app.listen(PORT, () => {
|
|
377
|
-
// Clear console on restart
|
|
378
|
-
console.clear();
|
|
379
|
-
const c = '\x1b[36m';
|
|
380
|
-
const magenta = '\x1b[35m';
|
|
381
|
-
const yellow = '\x1b[33m';
|
|
382
|
-
const green = '\x1b[32m';
|
|
383
|
-
const dim = '\x1b[2m';
|
|
384
|
-
const r = '\x1b[0m';
|
|
385
|
-
console.log(`
|
|
386
|
-
${c}╔══════════════════════════════════════════════════════╗${r}
|
|
387
|
-
${c}║${r} ${c}║${r}
|
|
388
|
-
${c}║${r} ${magenta}██████╗ ██████╗ ████████╗ ██████╗██╗ ██╗ █████╗${r} ${c}║${r}
|
|
389
|
-
${c}║${r} ${magenta}██╔══██╗██╔═══██╗╚══██╔══╝██╔════╝██║ ██║██╔══██╗${r} ${c}║${r}
|
|
390
|
-
${c}║${r} ${magenta}██████╔╝██║ ██║ ██║ ██║ ███████║███████║${r} ${c}║${r}
|
|
391
|
-
${c}║${r} ${magenta}██╔══██╗██║ ██║ ██║ ██║ ██╔══██║██╔══██║${r} ${c}║${r}
|
|
392
|
-
${c}║${r} ${magenta}██████╔╝╚██████╔╝ ██║ ╚██████╗██║ ██║██║ ██║${r} ${c}║${r}
|
|
393
|
-
${c}║${r} ${magenta}╚═════╝ ╚═════╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝${r} ${c}║${r}
|
|
394
|
-
${c}║${r} ${c}║${r}
|
|
395
|
-
${c}║${r} ${dim}Prove you're a bot. Humans need not apply.${r} ${c}║${r}
|
|
396
|
-
${c}║${r} ${c}║${r}
|
|
397
|
-
${c}╠══════════════════════════════════════════════════════╣${r}
|
|
398
|
-
${c}║${r} ${c}║${r}
|
|
399
|
-
${c}║${r} ${yellow}🤖 Server${r} ${green}http://localhost:${PORT}${r} ${c}║${r}
|
|
400
|
-
${c}║${r} ${yellow}📚 API${r} ${dim}/api${r} ${c}║${r}
|
|
401
|
-
${c}║${r} ${yellow}⚡ Challenge${r} ${dim}/api/speed-challenge${r} ${c}║${r}
|
|
402
|
-
${c}║${r} ${yellow}🔒 Protected${r} ${dim}/agent-only${r} ${c}║${r}
|
|
403
|
-
${c}║${r} ${yellow}📖 OpenAPI${r} ${dim}/openapi.json${r} ${c}║${r}
|
|
404
|
-
${c}║${r} ${c}║${r}
|
|
405
|
-
${c}╚══════════════════════════════════════════════════════╝${r}
|
|
406
|
-
`);
|
|
407
|
-
});
|
|
408
|
-
export default app;
|