@dupecom/botcha-cloudflare 0.20.2 → 0.23.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 (88) hide show
  1. package/README.md +74 -9
  2. package/dist/agent-auth.d.ts +129 -0
  3. package/dist/agent-auth.d.ts.map +1 -0
  4. package/dist/agent-auth.js +210 -0
  5. package/dist/agents.d.ts +10 -0
  6. package/dist/agents.d.ts.map +1 -1
  7. package/dist/agents.js +51 -1
  8. package/dist/app-gate.d.ts +6 -0
  9. package/dist/app-gate.d.ts.map +1 -0
  10. package/dist/app-gate.js +69 -0
  11. package/dist/apps.d.ts +13 -4
  12. package/dist/apps.d.ts.map +1 -1
  13. package/dist/apps.js +30 -4
  14. package/dist/dashboard/account.d.ts +63 -0
  15. package/dist/dashboard/account.d.ts.map +1 -0
  16. package/dist/dashboard/account.js +488 -0
  17. package/dist/dashboard/api.js +15 -68
  18. package/dist/dashboard/auth.d.ts.map +1 -1
  19. package/dist/dashboard/auth.js +14 -14
  20. package/dist/dashboard/docs.d.ts.map +1 -1
  21. package/dist/dashboard/docs.js +146 -3
  22. package/dist/dashboard/layout.d.ts.map +1 -1
  23. package/dist/dashboard/layout.js +2 -2
  24. package/dist/dashboard/mcp-setup.d.ts +15 -0
  25. package/dist/dashboard/mcp-setup.d.ts.map +1 -0
  26. package/dist/dashboard/mcp-setup.js +391 -0
  27. package/dist/dashboard/showcase.d.ts +6 -10
  28. package/dist/dashboard/showcase.d.ts.map +1 -1
  29. package/dist/dashboard/showcase.js +67 -991
  30. package/dist/dashboard/whitepaper.d.ts.map +1 -1
  31. package/dist/dashboard/whitepaper.js +42 -4
  32. package/dist/index.d.ts +5 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +660 -83
  35. package/dist/mcp.d.ts +20 -0
  36. package/dist/mcp.d.ts.map +1 -0
  37. package/dist/mcp.js +1290 -0
  38. package/dist/oauth-agent.d.ts +130 -0
  39. package/dist/oauth-agent.d.ts.map +1 -0
  40. package/dist/oauth-agent.js +194 -0
  41. package/dist/static.d.ts +781 -5
  42. package/dist/static.d.ts.map +1 -1
  43. package/dist/static.js +790 -111
  44. package/dist/tap-a2a-routes.d.ts +355 -0
  45. package/dist/tap-a2a-routes.d.ts.map +1 -0
  46. package/dist/tap-a2a-routes.js +475 -0
  47. package/dist/tap-a2a.d.ts +199 -0
  48. package/dist/tap-a2a.d.ts.map +1 -0
  49. package/dist/tap-a2a.js +502 -0
  50. package/dist/tap-agents.d.ts +15 -0
  51. package/dist/tap-agents.d.ts.map +1 -1
  52. package/dist/tap-agents.js +31 -1
  53. package/dist/tap-ans-routes.d.ts +302 -0
  54. package/dist/tap-ans-routes.d.ts.map +1 -0
  55. package/dist/tap-ans-routes.js +535 -0
  56. package/dist/tap-ans.d.ts +241 -0
  57. package/dist/tap-ans.d.ts.map +1 -0
  58. package/dist/tap-ans.js +481 -0
  59. package/dist/tap-delegation-routes.d.ts.map +1 -1
  60. package/dist/tap-delegation-routes.js +11 -0
  61. package/dist/tap-did.d.ts +140 -0
  62. package/dist/tap-did.d.ts.map +1 -0
  63. package/dist/tap-did.js +262 -0
  64. package/dist/tap-oidca-routes.d.ts +383 -0
  65. package/dist/tap-oidca-routes.d.ts.map +1 -0
  66. package/dist/tap-oidca-routes.js +597 -0
  67. package/dist/tap-oidca.d.ts +288 -0
  68. package/dist/tap-oidca.d.ts.map +1 -0
  69. package/dist/tap-oidca.js +461 -0
  70. package/dist/tap-routes.d.ts +24 -8
  71. package/dist/tap-routes.d.ts.map +1 -1
  72. package/dist/tap-routes.js +169 -23
  73. package/dist/tap-vc-routes.d.ts +358 -0
  74. package/dist/tap-vc-routes.d.ts.map +1 -0
  75. package/dist/tap-vc-routes.js +367 -0
  76. package/dist/tap-vc.d.ts +125 -0
  77. package/dist/tap-vc.d.ts.map +1 -0
  78. package/dist/tap-vc.js +245 -0
  79. package/dist/tap-x402-routes.d.ts +89 -0
  80. package/dist/tap-x402-routes.d.ts.map +1 -0
  81. package/dist/tap-x402-routes.js +579 -0
  82. package/dist/tap-x402.d.ts +222 -0
  83. package/dist/tap-x402.d.ts.map +1 -0
  84. package/dist/tap-x402.js +546 -0
  85. package/dist/webhooks.d.ts +99 -0
  86. package/dist/webhooks.d.ts.map +1 -0
  87. package/dist/webhooks.js +642 -0
  88. package/package.json +3 -1
@@ -1,1048 +1,124 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
2
  import { OGMeta } from './layout';
3
3
  import { GlobalFooter } from './layout';
4
+ import { DASHBOARD_CSS } from './styles';
5
+ // ============ ASCII ART ============
6
+ const BOTCHA_LOGO = `\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557
7
+ \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u255a\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255d\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
8
+ \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551
9
+ \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551
10
+ \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551
11
+ \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u255d \u255a\u2550\u255d\u255a\u2550\u255d \u255a\u2550\u255d`;
4
12
  // ============ CSS ============
5
- export const SHOWCASE_CSS = `
6
- /* ============ Showcase layout ============ */
7
- .showcase-page {
8
- max-width: 100%;
9
- overflow-x: hidden;
10
- }
11
-
12
- .showcase-divider {
13
- max-width: 800px;
14
- margin: 0 auto;
15
- border: none;
16
- border-top: 1px solid var(--border);
17
- }
18
-
19
- /* ============ Section 1: TAP Announcement Hero ============ */
20
- .showcase-tap-hero {
21
- max-width: 800px;
22
- margin: 0 auto;
23
- padding: 4rem 2rem 3rem;
24
- text-align: center;
25
- }
26
-
27
- .showcase-tap-hero-badge {
28
- display: inline-block;
29
- font-size: 0.625rem;
30
- font-weight: 700;
31
- letter-spacing: 0.15em;
32
- text-transform: uppercase;
33
- padding: 0.3rem 0.875rem;
34
- background: var(--green);
35
- color: #fff;
36
- margin-bottom: 1.5rem;
37
- }
38
-
39
- .showcase-tap-hero-title {
40
- font-size: 2.5rem;
41
- font-weight: 700;
42
- line-height: 1.1;
43
- margin: 0 0 1.25rem;
44
- color: var(--text);
45
- }
46
-
47
- .showcase-tap-links {
13
+ const HOME_CSS = `
14
+ .home-page {
48
15
  display: flex;
16
+ flex-direction: column;
49
17
  align-items: center;
50
18
  justify-content: center;
51
- flex-wrap: wrap;
52
- gap: 0.375rem;
53
- margin-bottom: 1.5rem;
54
- }
55
-
56
- .showcase-tap-link {
57
- font-size: 0.6875rem;
58
- color: var(--text-muted);
59
- text-decoration: underline;
60
- text-underline-offset: 3px;
61
- transition: color 0.15s;
62
- }
63
-
64
- .showcase-tap-link:hover {
65
- color: var(--green);
66
- opacity: 1;
67
- }
68
-
69
- .showcase-tap-links-sep {
70
- color: var(--text-dim);
71
- font-size: 0.625rem;
72
- }
73
-
74
- .showcase-tap-hero-subtitle {
75
- font-size: 0.9375rem;
76
- line-height: 1.7;
77
- color: var(--text-muted);
78
- max-width: 600px;
79
- margin: 0 auto 2.5rem;
80
- }
81
-
82
- .showcase-tap-hero-features {
83
- display: grid;
84
- grid-template-columns: repeat(3, 1fr);
85
- gap: 1.5rem;
86
- text-align: left;
87
- }
88
-
89
- .showcase-tap-feature {
90
- padding: 1.25rem;
91
- border: 1px solid var(--border);
92
- background: var(--bg);
93
- }
94
-
95
- .showcase-tap-feature-title {
96
- font-size: 0.8125rem;
97
- font-weight: 700;
98
- margin-bottom: 0.5rem;
99
- color: var(--text);
100
- }
101
-
102
- .showcase-tap-feature-desc {
103
- font-size: 0.75rem;
104
- line-height: 1.6;
105
- color: var(--text-muted);
106
- }
107
-
108
- /* ============ CAPTCHA vs BOTCHA Comparison ============ */
109
- .showcase-hero {
110
- max-width: 1100px;
111
- margin: 0 auto;
112
19
  padding: 4rem 2rem 2rem;
20
+ box-sizing: border-box;
113
21
  }
114
22
 
115
- .showcase-hero-grid {
116
- display: grid;
117
- grid-template-columns: 1fr 1fr;
118
- gap: 2rem;
119
- margin-bottom: 3rem;
120
- }
121
-
122
- .showcase-hero-column {
123
- border: 2px solid var(--border);
124
- padding: 2rem;
125
- background: var(--bg);
126
- }
127
-
128
- .showcase-hero-column.old-world {
129
- border-color: var(--red);
130
- }
131
-
132
- .showcase-hero-column.new-world {
133
- border-color: var(--green);
134
- }
135
-
136
- .showcase-hero-label {
137
- font-size: 0.6875rem;
138
- font-weight: 700;
139
- letter-spacing: 0.15em;
140
- text-transform: uppercase;
141
- margin-bottom: 0.75rem;
142
- color: var(--text-dim);
143
- }
144
-
145
- .showcase-hero-title {
146
- font-size: 2rem;
147
- font-weight: 700;
148
- margin-bottom: 1.25rem;
149
- line-height: 1;
150
- }
151
-
152
- .showcase-hero-title.strikethrough {
153
- text-decoration: line-through;
154
- color: var(--red);
155
- }
156
-
157
- .showcase-hero-title.active {
158
- color: var(--green);
159
- }
160
-
161
- .showcase-hero-visual {
23
+ .home-logo {
24
+ display: block;
162
25
  font-family: var(--font);
163
- font-size: 0.6875rem;
164
- line-height: 1.3;
165
- margin: 1.25rem 0;
166
- padding: 1rem;
167
- background: #fafafa;
168
- border: 1px solid var(--border);
26
+ font-size: clamp(0.35rem, 1.4vw, 0.6875rem);
27
+ line-height: 1.15;
169
28
  white-space: pre;
170
- overflow-x: auto;
171
- }
172
-
173
- .showcase-hero-visual.old-world {
174
- color: var(--red);
175
- border-color: var(--red);
176
- background: #fff5f5;
177
- }
178
-
179
- .showcase-hero-visual.new-world {
180
- color: var(--green);
181
- border-color: var(--green);
182
- background: #f5fff7;
183
- }
184
-
185
- .showcase-hero-subtitle {
186
- font-size: 0.875rem;
187
- margin-bottom: 1rem;
188
- line-height: 1.5;
189
29
  color: var(--text);
30
+ text-decoration: none;
31
+ margin-bottom: 1.5rem;
32
+ letter-spacing: 0;
190
33
  }
191
34
 
192
- .showcase-hero-features {
193
- list-style: none;
194
- padding: 0;
195
- margin: 0;
35
+ .home-tagline {
196
36
  font-size: 0.75rem;
197
37
  color: var(--text-muted);
38
+ margin: 0 0 3rem;
39
+ letter-spacing: 0.04em;
198
40
  }
199
41
 
200
- .showcase-hero-features li {
201
- padding: 0.25rem 0;
202
- }
203
-
204
- .showcase-hero-features li::before {
205
- content: "\\2192 ";
206
- color: var(--text-dim);
207
- }
208
-
209
- .showcase-hero-tagline {
210
- text-align: center;
211
- padding: 2rem 2rem 0;
212
- }
213
-
214
- .showcase-hero-tagline-main {
215
- font-size: 1.5rem;
216
- font-weight: 700;
217
- margin-bottom: 0.5rem;
218
- color: var(--text);
219
- }
220
-
221
- .showcase-hero-tagline-sub {
222
- font-size: 0.875rem;
223
- color: var(--text-muted);
224
- }
225
-
226
- /* ============ Section 2: Protocol Stack ============ */
227
- .showcase-protocol-stack {
228
- max-width: 800px;
229
- margin: 0 auto;
230
- padding: 4rem 2rem;
231
- }
232
-
233
- .showcase-protocol-stack h2 {
234
- font-size: 1.5rem;
235
- font-weight: 700;
236
- margin-bottom: 0.5rem;
237
- }
238
-
239
- .showcase-protocol-stack .subtitle {
240
- color: var(--text-muted);
241
- font-size: 0.875rem;
242
- margin-bottom: 2.5rem;
243
- }
244
-
245
- .showcase-stack-diagram {
246
- position: relative;
247
- margin: 0 0 2rem 0;
248
- }
249
-
250
- .showcase-stack-layer {
251
- border: 2px solid var(--border);
252
- background: var(--bg);
42
+ .home-agent-note {
43
+ max-width: 480px;
44
+ margin: 0 auto 3.5rem;
45
+ border: 1px solid var(--border);
253
46
  padding: 1.25rem 1.5rem;
254
- position: relative;
47
+ text-align: left;
48
+ cursor: pointer;
49
+ user-select: none;
50
+ transition: border-color 0.15s, background 0.15s;
255
51
  }
256
52
 
257
- .showcase-stack-layer + .showcase-stack-layer {
258
- margin-top: -2px;
53
+ .home-agent-note:hover {
54
+ border-color: var(--text-muted);
55
+ background: rgba(0,0,0,0.02);
259
56
  }
260
57
 
261
- .showcase-stack-layer-highlight {
262
- border: 3px solid var(--accent);
263
- background: var(--bg-raised);
264
- z-index: 1;
58
+ .home-agent-note:active {
59
+ background: rgba(0,0,0,0.05);
265
60
  }
266
61
 
267
- .showcase-stack-layer-number {
268
- font-size: 0.625rem;
62
+ .home-agent-note-label {
63
+ font-size: 0.5625rem;
269
64
  font-weight: 700;
270
65
  text-transform: uppercase;
271
- letter-spacing: 0.1em;
66
+ letter-spacing: 0.12em;
272
67
  color: var(--text-dim);
273
- margin-bottom: 0.375rem;
274
- }
275
-
276
- .showcase-stack-layer-highlight .showcase-stack-layer-number {
277
- color: var(--green);
278
- }
279
-
280
- .showcase-stack-layer-title {
281
- font-size: 1.125rem;
282
- font-weight: 700;
283
- margin-bottom: 0.25rem;
68
+ margin-bottom: 0.75rem;
284
69
  display: flex;
285
70
  align-items: center;
286
- gap: 0.75rem;
287
- }
288
-
289
- .showcase-stack-layer-subtitle {
290
- font-size: 0.8125rem;
291
- color: var(--text-muted);
292
- margin-bottom: 0.375rem;
293
- }
294
-
295
- .showcase-stack-layer-features {
296
- font-size: 0.75rem;
297
- color: var(--text-dim);
298
- }
299
-
300
- .showcase-you-are-here {
301
- display: inline-block;
302
- background: var(--green);
303
- color: white;
304
- font-size: 0.5625rem;
305
- font-weight: 700;
306
- padding: 0.2rem 0.5rem;
307
- letter-spacing: 0.05em;
308
- }
309
-
310
- .showcase-buzzword-badges {
311
- display: flex;
312
- flex-wrap: wrap;
313
71
  gap: 0.5rem;
314
- margin-bottom: 2rem;
315
72
  }
316
73
 
317
- .showcase-badge {
318
- display: inline-block;
319
- font-size: 0.6875rem;
320
- padding: 0.3rem 0.625rem;
321
- border: 1px solid var(--border);
322
- background: var(--bg);
323
- color: var(--text-muted);
324
- white-space: nowrap;
325
- }
326
-
327
- .showcase-protocol-explanation {
328
- font-size: 0.8125rem;
329
- line-height: 1.7;
330
- color: var(--text-muted);
331
- }
332
-
333
- /* ============ Section 3: Terminal Demo ============ */
334
- .showcase-terminal-section {
335
- max-width: 1100px;
336
- margin: 0 auto;
337
- padding: 4rem 2rem;
338
- }
339
-
340
- .showcase-terminal-header {
341
- text-align: center;
342
- margin-bottom: 2.5rem;
343
- }
344
-
345
- .showcase-terminal-title {
346
- font-size: 1.5rem;
347
- font-weight: 700;
348
- margin: 0 0 0.5rem 0;
349
- color: var(--text);
350
- }
351
-
352
- .showcase-terminal-subtitle {
353
- font-size: 0.875rem;
354
- color: var(--text-muted);
355
- margin: 0;
356
- line-height: 1.5;
357
- }
358
-
359
- .showcase-terminal-container {
360
- max-width: 640px;
361
- margin: 0 auto;
362
- }
363
-
364
- .showcase-terminal-window {
365
- background: #0d0d0d;
366
- border: 1px solid var(--border);
367
- overflow: hidden;
368
- }
369
-
370
- .showcase-terminal-chrome {
371
- background: #1a1a1a;
372
- padding: 0.75rem 1rem;
373
- display: flex;
74
+ .home-agent-copy-hint {
75
+ display: inline-flex;
374
76
  align-items: center;
375
- gap: 0.5rem;
376
- border-bottom: 1px solid #333;
377
- }
378
-
379
- .showcase-terminal-dot {
380
- width: 10px;
381
- height: 10px;
382
- border-radius: 50%;
383
- }
384
-
385
- .showcase-terminal-dot--red { background: #ff5f56; }
386
- .showcase-terminal-dot--yellow { background: #ffbd2e; }
387
- .showcase-terminal-dot--green { background: #27c93f; }
388
-
389
- .showcase-terminal-title-text {
390
- font-size: 0.6875rem;
391
- color: #888;
392
- margin-left: 0.5rem;
393
- }
394
-
395
- .showcase-terminal-content {
396
- padding: 1.5rem;
397
- font-size: 0.8125rem;
398
- line-height: 1.6;
399
- color: #f0f0f0;
400
- height: 460px;
401
- overflow-y: hidden;
402
- font-family: var(--font);
403
- }
404
-
405
- .showcase-terminal-line {
406
- margin-bottom: 0.375rem;
407
- white-space: pre-wrap;
408
- word-break: break-word;
409
- }
410
-
411
- .showcase-terminal-prompt { color: #888; }
412
- .showcase-terminal-command { color: #f0f0f0; }
413
- .showcase-terminal-flag { color: #9a9aff; }
414
- .showcase-terminal-success { color: #4ade80; }
415
- .showcase-terminal-label { color: #888; }
416
- .showcase-terminal-value { color: #fff; }
417
-
418
- .showcase-terminal-cursor {
419
- display: inline-block;
420
- background: #f0f0f0;
421
- animation: showcase-cursor-blink 1s step-end infinite;
422
- }
423
-
424
- @keyframes showcase-cursor-blink {
425
- 0%, 50% { opacity: 1; }
426
- 51%, 100% { opacity: 0; }
427
- }
428
-
429
- .showcase-terminal-replay-container {
430
- text-align: center;
431
- margin-top: 1.5rem;
432
- }
433
-
434
- .showcase-terminal-replay-btn {
435
- background: var(--bg);
436
- border: 1px solid var(--border);
437
- padding: 0.5rem 1rem;
438
- font-family: var(--font);
439
- font-size: 0.75rem;
440
- color: var(--text-muted);
441
- cursor: pointer;
442
- text-transform: uppercase;
443
- letter-spacing: 0.05em;
444
- }
445
-
446
- .showcase-terminal-replay-btn:hover {
447
- border-color: var(--accent);
448
- color: var(--text);
449
- }
450
-
451
- /* ============ Section 4: Live Demo ============ */
452
- .showcase-livedemo {
453
- padding: 4rem 2rem;
454
- background: var(--bg-raised);
455
- border-top: 2px solid var(--border);
456
- border-bottom: 2px solid var(--border);
457
- }
458
-
459
- .showcase-livedemo-container {
460
- max-width: 700px;
461
- margin: 0 auto;
462
- text-align: center;
463
- }
464
-
465
- .showcase-livedemo-title {
466
- font-size: 1.5rem;
467
- font-weight: 700;
468
- margin-bottom: 0.5rem;
469
- color: var(--text);
470
- }
471
-
472
- .showcase-livedemo-subtitle {
473
- font-size: 0.875rem;
474
- color: var(--text-muted);
475
- margin-bottom: 2.5rem;
476
- line-height: 1.6;
477
- }
478
-
479
- .showcase-livedemo-button {
480
- display: inline-block;
481
- padding: 1rem 2rem;
482
- font-size: 0.875rem;
483
- font-weight: 700;
484
- font-family: var(--font);
485
- color: #fff;
486
- background: var(--accent);
487
- border: 2px solid var(--accent);
488
- cursor: pointer;
489
- text-transform: uppercase;
77
+ gap: 0.25rem;
78
+ opacity: 0.6;
79
+ font-weight: 400;
490
80
  letter-spacing: 0.08em;
491
- box-shadow: 4px 4px 0 var(--border-bright);
492
- transition: all 0.15s;
493
- margin-bottom: 1.5rem;
494
81
  }
495
82
 
496
- .showcase-livedemo-button:hover:not(:disabled) {
497
- transform: translate(-2px, -2px);
498
- box-shadow: 6px 6px 0 var(--border-bright);
83
+ .home-agent-note:hover .home-agent-copy-hint {
499
84
  opacity: 1;
500
85
  }
501
86
 
502
- .showcase-livedemo-button:active:not(:disabled) {
503
- transform: translate(2px, 2px);
504
- box-shadow: 2px 2px 0 var(--border-bright);
505
- }
506
-
507
- .showcase-livedemo-button:disabled {
508
- cursor: not-allowed;
509
- opacity: 0.5;
510
- }
511
-
512
- .showcase-livedemo-result {
513
- margin-top: 2rem;
514
- padding: 1.5rem;
515
- background: var(--bg);
516
- border: 2px solid var(--border);
517
- box-shadow: 4px 4px 0 var(--border-bright);
518
- text-align: left;
87
+ .home-agent-prompt-text {
519
88
  font-size: 0.8125rem;
520
- line-height: 1.8;
521
- }
522
-
523
- .showcase-livedemo-result-line {
524
- opacity: 0;
525
- animation: showcase-livedemo-fadein 0.3s ease forwards;
526
- margin-bottom: 0.375rem;
527
- }
528
-
529
- .showcase-livedemo-result-line:nth-child(1) { animation-delay: 0ms; }
530
- .showcase-livedemo-result-line:nth-child(2) { animation-delay: 100ms; }
531
- .showcase-livedemo-result-line:nth-child(3) { animation-delay: 200ms; }
532
- .showcase-livedemo-result-line:nth-child(4) { animation-delay: 300ms; }
533
- .showcase-livedemo-result-line:nth-child(5) { animation-delay: 400ms; }
534
- .showcase-livedemo-result-line:nth-child(6) { animation-delay: 500ms; }
535
- .showcase-livedemo-result-line:nth-child(7) { animation-delay: 600ms; }
536
-
537
- @keyframes showcase-livedemo-fadein {
538
- from { opacity: 0; transform: translateY(-4px); }
539
- to { opacity: 1; transform: translateY(0); }
540
- }
541
-
542
- .showcase-livedemo-label {
543
- color: var(--text-dim);
544
- font-weight: 600;
545
- }
546
-
547
- .showcase-livedemo-value {
89
+ line-height: 1.6;
548
90
  color: var(--text);
549
91
  }
550
92
 
551
- .showcase-livedemo-time-fast {
552
- color: var(--green);
553
- font-weight: 700;
554
- }
555
-
556
- .showcase-livedemo-time-slow {
557
- color: var(--red);
558
- font-weight: 700;
559
- }
560
-
561
- .showcase-livedemo-status-success {
562
- color: var(--green);
563
- font-weight: 700;
564
- font-size: 1rem;
565
- }
566
-
567
- .showcase-livedemo-status-error {
568
- color: var(--red);
569
- font-weight: 700;
570
- }
571
-
572
- .showcase-livedemo-token {
573
- font-family: var(--font);
574
- color: var(--text-muted);
575
- word-break: break-all;
576
- font-size: 0.75rem;
577
- }
578
-
579
- .showcase-livedemo-counter {
580
- margin-top: 1rem;
93
+ .home-agent-note-sub {
581
94
  font-size: 0.75rem;
582
95
  color: var(--text-dim);
583
- }
584
-
585
- .showcase-livedemo-error {
586
- margin-top: 1.5rem;
587
- padding: 1rem;
588
- background: var(--bg);
589
- border: 2px solid var(--red);
590
- color: var(--red);
591
- text-align: left;
592
- font-size: 0.8125rem;
593
- }
594
-
595
- /* ============ Showcase footer ============ */
596
- .showcase-footer {
597
- max-width: 800px;
598
- margin: 0 auto;
599
- padding: 3rem 2rem 4rem;
600
- text-align: center;
601
- }
602
-
603
- .showcase-footer-cta {
604
- font-size: 1rem;
605
- font-weight: 700;
606
- margin-bottom: 1rem;
607
- color: var(--text);
608
- }
609
-
610
- .showcase-footer-steps {
611
- display: flex;
612
- flex-direction: column;
613
- gap: 0.5rem;
614
- max-width: 420px;
615
- margin: 0 auto 2rem;
616
- text-align: left;
617
- }
618
-
619
- .showcase-footer-step {
620
- display: flex;
621
- align-items: center;
622
- gap: 0.75rem;
623
- font-size: 0.8125rem;
624
- padding: 0.625rem 1rem;
625
- background: var(--bg-raised);
626
- border: 1px solid var(--border);
627
- }
628
-
629
- .showcase-footer-step-number {
630
- display: inline-flex;
631
- align-items: center;
632
- justify-content: center;
633
- width: 1.375rem;
634
- height: 1.375rem;
635
- font-size: 0.6875rem;
636
- font-weight: 700;
637
- border: 1px solid var(--border-bright);
638
- color: var(--text-muted);
639
- flex-shrink: 0;
640
- }
641
-
642
- .showcase-footer-step code {
643
- color: var(--text);
644
- }
645
-
646
- .showcase-agent-prompt {
647
- max-width: 520px;
648
- margin: 2rem auto 2.5rem;
649
- text-align: center;
650
- }
651
-
652
- .showcase-agent-prompt-label {
653
- font-size: 0.6875rem;
654
- font-weight: 600;
655
- text-transform: uppercase;
656
- letter-spacing: 0.1em;
657
- color: var(--text-dim);
658
- margin-bottom: 0.75rem;
659
- }
660
-
661
- .showcase-agent-prompt-card {
662
- display: block;
663
- width: 100%;
664
- padding: 1.25rem;
665
- border: 1px solid var(--border);
666
- background: var(--bg);
667
- cursor: pointer;
668
- font-family: var(--font);
669
- text-align: left;
670
- transition: border-color 0.15s;
671
- }
672
-
673
- .showcase-agent-prompt-card:hover {
674
- border-color: var(--accent);
675
- }
676
-
677
- .showcase-agent-prompt-card code {
678
- display: block;
679
- font-size: 0.8125rem;
680
- font-weight: 600;
681
- color: var(--text);
682
- line-height: 1.5;
683
- background: none;
684
- border: none;
685
- padding: 0;
686
- text-transform: none;
687
- letter-spacing: normal;
688
- }
689
-
690
- .showcase-agent-prompt-copy {
691
- display: flex;
692
- align-items: center;
693
- gap: 0.375rem;
694
96
  margin-top: 0.75rem;
695
- font-size: 0.625rem;
696
- font-weight: 500;
697
- color: var(--text-muted);
698
- text-transform: uppercase;
699
- letter-spacing: 0.1em;
700
- transition: color 0.2s;
701
- }
702
-
703
- .showcase-agent-prompt-copy span {
704
- display: flex;
705
- }
706
-
707
- .showcase-footer-links {
708
- display: flex;
709
- flex-wrap: wrap;
710
- justify-content: center;
711
- gap: 0.5rem;
712
- margin-bottom: 2rem;
713
- }
714
-
715
- .showcase-footer-link {
716
- font-size: 0.6875rem;
717
- color: var(--text);
718
- text-decoration: none;
719
- padding: 0.25rem 0.625rem;
720
- border: 1px solid var(--border-bright);
721
- transition: border-color 0.15s;
722
- }
723
-
724
- .showcase-footer-link:hover {
725
- border-color: var(--accent);
726
- opacity: 1;
727
- }
728
-
729
- .showcase-footer-meta {
730
- font-size: 0.6875rem;
731
- color: var(--text-dim);
732
- }
733
-
734
- .showcase-footer-meta a {
735
- color: var(--text-muted);
736
- text-decoration: none;
737
- }
738
-
739
- .showcase-footer-sep {
740
- margin: 0 0.375rem;
741
97
  }
742
98
 
743
- /* ============ Responsive ============ */
744
- @media (max-width: 768px) {
745
- .showcase-tap-hero { padding: 3rem 1rem 2rem; }
746
- .showcase-tap-hero-title { font-size: 1.75rem; }
747
- .showcase-tap-hero-features {
748
- grid-template-columns: 1fr;
749
- gap: 1rem;
750
- }
751
-
752
- .showcase-hero { padding: 2rem 1rem 1rem; }
753
- .showcase-hero-grid {
754
- grid-template-columns: 1fr;
755
- gap: 1.5rem;
756
- }
757
- .showcase-hero-column { padding: 1.5rem; }
758
- .showcase-hero-title { font-size: 1.5rem; }
759
- .showcase-hero-visual { font-size: 0.5625rem; }
760
- .showcase-hero-tagline-main { font-size: 1.25rem; }
761
-
762
- .showcase-protocol-stack { padding: 3rem 1rem; }
763
- .showcase-stack-layer-title {
764
- flex-direction: column;
765
- align-items: flex-start;
766
- gap: 0.375rem;
767
- font-size: 1rem;
768
- }
769
-
770
- .showcase-terminal-section { padding: 3rem 1rem; }
771
- .showcase-terminal-content { padding: 1rem; font-size: 0.75rem; height: 420px; }
772
-
773
- .showcase-livedemo { padding: 3rem 1rem; }
774
-
775
- .showcase-footer { padding: 2rem 1rem 3rem; }
99
+ .home-agent-note-copied {
100
+ opacity: 0;
101
+ transition: opacity 0.2s;
102
+ color: var(--accent);
776
103
  }
777
104
 
778
105
  @media (max-width: 480px) {
779
- .showcase-hero-visual { font-size: 0.5rem; padding: 0.75rem; }
780
- .showcase-hero-tagline-main { font-size: 1rem; }
781
- }
782
- `;
783
- // ============ SCRIPTS ============
784
- const TERMINAL_ANIMATION_SCRIPT = `
785
- (function() {
786
- var commands = [
787
- {
788
- cmd: 'botcha init --email dev@company.com',
789
- response: [
790
- '<span class="showcase-terminal-success">\\u2705</span> App created in 312ms!',
791
- ' <span class="showcase-terminal-label">App ID:</span> <span class="showcase-terminal-value">app_b18545f37eee64c4</span>',
792
- ' <span class="showcase-terminal-label">Config saved to</span> <span class="showcase-terminal-value">~/.botcha/config.json</span>'
793
- ]
794
- },
795
- {
796
- cmd: 'botcha tap register --name "shopping-agent" --capabilities browse,search,purchase',
797
- response: [
798
- '<span class="showcase-terminal-success">\\u2705</span> Agent registered in 467ms!',
799
- ' <span class="showcase-terminal-label">Agent ID:</span> <span class="showcase-terminal-value">agent_6ddfd9f10cfd8dfc</span>',
800
- ' <span class="showcase-terminal-label">Name:</span> <span class="showcase-terminal-value">shopping-agent</span>',
801
- ' <span class="showcase-terminal-label">Capabilities:</span> <span class="showcase-terminal-value">browse, search, purchase</span>'
802
- ]
803
- },
804
- {
805
- cmd: 'botcha tap session --action browse --resource products --duration 1h',
806
- response: [
807
- '<span class="showcase-terminal-success">\\u2705</span> Session created in 374ms!',
808
- ' <span class="showcase-terminal-label">Session ID:</span> <span class="showcase-terminal-value">e66323397a809b9b</span>',
809
- ' <span class="showcase-terminal-label">Intent:</span> <span class="showcase-terminal-value">browse on products</span>',
810
- ' <span class="showcase-terminal-label">Expires in:</span> <span class="showcase-terminal-value">1 hour</span>'
811
- ]
812
- }
813
- ];
814
-
815
- var content = document.getElementById('terminal-content');
816
- var replayBtn = document.getElementById('terminal-replay');
817
- var currentTimeout;
818
- var running = false;
819
- var hasPlayed = false;
820
- var cancelled = false;
821
-
822
- function highlightFlags(cmd) {
823
- return cmd.replace(/(--[a-z-]+)/g, '<span class="showcase-terminal-flag">$1</span>');
824
- }
825
-
826
- function sleep(ms) {
827
- return new Promise(function(resolve, reject) {
828
- currentTimeout = setTimeout(resolve, ms);
829
- });
830
- }
831
-
832
- async function animate() {
833
- if (running) return;
834
- running = true;
835
- cancelled = false;
836
- content.innerHTML = '';
837
-
838
- try {
839
- for (var c = 0; c < commands.length; c++) {
840
- if (cancelled) return;
841
- var item = commands[c];
842
- var line = document.createElement('div');
843
- line.className = 'showcase-terminal-line';
844
- line.innerHTML = '<span class="showcase-terminal-prompt">$ </span><span class="showcase-terminal-command"></span><span class="showcase-terminal-cursor">\\u2589</span>';
845
- content.appendChild(line);
846
-
847
- var cmdSpan = line.querySelector('.showcase-terminal-command');
848
- var cursor = line.querySelector('.showcase-terminal-cursor');
849
-
850
- for (var i = 0; i < item.cmd.length; i++) {
851
- if (cancelled) return;
852
- await sleep(35);
853
- cmdSpan.textContent = item.cmd.slice(0, i + 1);
854
- }
855
-
856
- cmdSpan.innerHTML = highlightFlags(item.cmd);
857
- cursor.remove();
858
- await sleep(300);
859
-
860
- for (var r = 0; r < item.response.length; r++) {
861
- if (cancelled) return;
862
- var respLine = document.createElement('div');
863
- respLine.className = 'showcase-terminal-line';
864
- respLine.innerHTML = item.response[r];
865
- content.appendChild(respLine);
866
- }
867
-
868
- await sleep(800);
869
- }
870
- } finally {
871
- running = false;
872
- hasPlayed = true;
873
- }
874
- }
875
-
876
- // Replay button — cancel any in-progress animation and restart
877
- replayBtn.addEventListener('click', function() {
878
- clearTimeout(currentTimeout);
879
- cancelled = true;
880
- running = false;
881
- animate();
882
- });
883
-
884
- // IntersectionObserver — play once when terminal scrolls into view
885
- var observer = new IntersectionObserver(function(entries) {
886
- if (entries[0].isIntersecting && !hasPlayed && !running) {
887
- animate();
888
- observer.disconnect();
889
- }
890
- }, { threshold: 0.3 });
891
-
892
- observer.observe(content);
893
- })();
894
- `;
895
- const LIVE_DEMO_SCRIPT = `
896
- (function() {
897
- var solveCount = 0;
898
- var isRunning = false;
899
-
900
- function sha256(str) {
901
- var encoder = new TextEncoder();
902
- var data = encoder.encode(str);
903
- return crypto.subtle.digest('SHA-256', data).then(function(buf) {
904
- var arr = Array.from(new Uint8Array(buf));
905
- var hex = arr.map(function(b) { return b.toString(16).padStart(2, '0'); }).join('');
906
- return hex.substring(0, 8);
907
- });
106
+ .home-page { padding: 3rem 1.25rem 2rem; justify-content: flex-start; }
107
+ .home-logo { font-size: 0.3rem; }
108
+ .home-agent-note { max-width: 100%; }
908
109
  }
909
-
910
- function solveBotcha() {
911
- if (isRunning) return;
912
- isRunning = true;
913
-
914
- var button = document.getElementById('botcha-demo-button');
915
- var resultDiv = document.getElementById('botcha-demo-result');
916
- var errorDiv = document.getElementById('botcha-demo-error');
917
- var counter = document.getElementById('botcha-demo-counter');
918
-
919
- button.disabled = true;
920
- button.textContent = 'SOLVING...';
921
- resultDiv.style.display = 'none';
922
- errorDiv.style.display = 'none';
923
-
924
- var startTime = Date.now();
925
-
926
- fetch('https://botcha.ai/v1/token')
927
- .then(function(res) {
928
- if (!res.ok) throw new Error('Failed to fetch challenge: ' + res.status);
929
- return res.json();
930
- })
931
- .then(function(data) {
932
- var challenge = data.challenge;
933
- if (!challenge || !challenge.problems) throw new Error('Invalid challenge format');
934
-
935
- var numbers = challenge.problems.map(function(p) { return p.num; });
936
-
937
- return Promise.all(
938
- numbers.map(function(n) { return sha256(String(n)); })
939
- ).then(function(answers) {
940
- return fetch('https://botcha.ai/v1/token/verify', {
941
- method: 'POST',
942
- headers: { 'Content-Type': 'application/json' },
943
- body: JSON.stringify({ id: challenge.id, answers: answers })
944
- }).then(function(res) {
945
- if (!res.ok) throw new Error('Verification failed: ' + res.status);
946
- return res.json();
947
- }).then(function(verifyData) {
948
- var solveTime = Date.now() - startTime;
949
- var timeClass = solveTime < 500 ? 'showcase-livedemo-time-fast' : 'showcase-livedemo-time-slow';
950
- var token = verifyData.token || verifyData.access_token || 'N/A';
951
- var tokenPreview = token.substring(0, 24) + '...';
952
-
953
- resultDiv.innerHTML =
954
- '<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Challenge:</span> <span class="showcase-livedemo-value">' + numbers.length + ' SHA-256 hashes</span></div>' +
955
- '<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Numbers:</span> <span class="showcase-livedemo-value">[' + numbers.join(', ') + ']</span></div>' +
956
- '<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Answers:</span> <span class="showcase-livedemo-value">["' + answers.join('", "') + '"]</span></div>' +
957
- '<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Solve time:</span> <span class="' + timeClass + '">' + solveTime + 'ms</span></div>' +
958
- '<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-status-success">VERIFIED \\u2014 You are a bot.</span></div>' +
959
- '<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Token:</span> <span class="showcase-livedemo-token">' + tokenPreview + '</span></div>';
960
-
961
- resultDiv.style.display = 'block';
962
- solveCount++;
963
- counter.textContent = 'Challenges solved on this page: ' + solveCount;
964
- button.textContent = 'SOLVE ANOTHER';
965
- });
966
- });
967
- })
968
- .catch(function(err) {
969
- errorDiv.innerHTML = '<span class="showcase-livedemo-status-error">[ERR]</span> ' + err.message;
970
- errorDiv.style.display = 'block';
971
- button.textContent = 'TRY AGAIN';
972
- })
973
- .finally(function() {
974
- button.disabled = false;
975
- isRunning = false;
976
- });
977
- }
978
-
979
- document.getElementById('botcha-demo-button').addEventListener('click', solveBotcha);
980
- })();
981
- `;
982
- // ============ COPY PROMPT ============
983
- const COPY_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"><rect x="9" y="9" width="13" height="13" rx="0"/><path d="M5 15H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1"/></svg>`;
984
- const CHECK_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="square" stroke-linejoin="miter"><polyline points="20 6 9 17 4 12"/></svg>`;
985
- const COPY_PROMPT_SCRIPT = `
986
- function copyPrompt() {
987
- var text = document.getElementById('agent-prompt').textContent.trim();
988
- navigator.clipboard.writeText(text).then(function() {
989
- var label = document.getElementById('copy-label');
990
- var icon = document.getElementById('copy-icon');
991
- var txt = document.getElementById('copy-text');
992
- label.style.color = 'var(--green)';
993
- icon.innerHTML = '${CHECK_ICON.replace(/'/g, "\\'")}';
994
- txt.textContent = 'Copied — now paste into your agent';
995
- setTimeout(function() {
996
- label.style.color = 'var(--text-muted)';
997
- icon.innerHTML = '${COPY_ICON.replace(/'/g, "\\'")}';
998
- txt.textContent = 'Click to copy';
999
- }, 2500);
1000
- });
1001
- }
1002
110
  `;
1003
- // ============ ASCII ART ============
1004
- const CAPTCHA_ASCII = `\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
1005
- \u2502 Select all squares \u2502
1006
- \u2502 with TRAFFIC LIGHTS \u2502
1007
- \u2502 \u2502
1008
- \u2502 \u250c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u2510 \u2502
1009
- \u2502 \u2502\u2591\u2591\u2502 \u2502 \u2502 \u2502
1010
- \u2502 \u251c\u2500\u2500\u253c\u2500\u2500\u253c\u2500\u2500\u2524 \u2502
1011
- \u2502 \u2502 \u2502\u2591\u2591\u2502 \u2502 \u2502
1012
- \u2502 \u251c\u2500\u2500\u253c\u2500\u2500\u253c\u2500\u2500\u2524 \u2502
1013
- \u2502 \u2502 \u2502 \u2502??\u2502 \u2502
1014
- \u2502 \u2514\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2518 \u2502
1015
- \u2502 \u2502
1016
- \u2502 \u2610 I'm not a robot \u2502
1017
- \u2502 \u2502
1018
- \u2502 Try again in 8 sec... \u2502
1019
- \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`;
1020
- const BOTCHA_SOLVE_ASCII = `\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
1021
- \u2502 SPEED CHALLENGE \u2502
1022
- \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
1023
- \u2502 \u2502
1024
- \u2502 SHA-256 x 5 numbers \u2502
1025
- \u2502 Time limit: 500ms \u2502
1026
- \u2502 \u2502
1027
- \u2502 \u2713 hash(42) = ab34ef12 \u2502
1028
- \u2502 \u2713 hash(7) = cd56ab78 \u2502
1029
- \u2502 \u2713 hash(99) = ef12cd34 \u2502
1030
- \u2502 \u2713 hash(13) = 12ab56ef \u2502
1031
- \u2502 \u2713 hash(256) = 78cd12ab \u2502
1032
- \u2502 \u2502
1033
- \u2502 \u26a1 Solved in 47ms \u2502
1034
- \u2502 Status: VERIFIED \u2713 \u2502
1035
- \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`;
1036
- const BOTCHA_LOGO = `\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557
1037
- \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u255a\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255d\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
1038
- \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551
1039
- \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551
1040
- \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551
1041
- \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u255d \u255a\u2550\u255d\u255a\u2550\u255d \u255a\u2550\u255d`;
1042
111
  // ============ PAGE COMPONENT ============
1043
- export const ShowcasePage = ({ version, error }) => {
1044
- return (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("title", { children: "BOTCHA \u2014 Trusted Agent Protocol (TAP) for AI Agents" }), _jsx("meta", { name: "description", content: "BOTCHA is one of the first services to support TAP \u2014 the Trusted Agent Protocol. Zero-trust identity for AI agents." }), _jsx("meta", { name: "keywords", content: "AI, bot verification, reverse CAPTCHA, API security, AI agents, agent verification, TAP, Trusted Agent Protocol" }), _jsx("link", { rel: "alternate", type: "application/json", href: "/openapi.json", title: "OpenAPI Specification" }), _jsx("link", { rel: "alternate", type: "application/json", href: "/.well-known/ai-plugin.json", title: "AI Plugin Manifest" }), _jsx("meta", { name: "ai-agent-welcome", content: "true" }), _jsx(OGMeta, {}), _jsx("link", { rel: "preconnect", href: "https://fonts.googleapis.com" }), _jsx("link", { href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap", rel: "stylesheet" }), _jsx("style", { dangerouslySetInnerHTML: { __html: SHOWCASE_PAGE_CSS } })] }), _jsx("body", { children: _jsxs("div", { class: "showcase-page", children: [error && (_jsx("div", { style: "max-width: 600px; margin: 1.5rem auto 0; padding: 1rem 1.25rem; background: #fff3f0; border: 1px solid #cc3300; font-family: 'JetBrains Mono', monospace; font-size: 0.8125rem; color: #992200; line-height: 1.5; text-align: center;", children: error })), _jsxs("div", { style: "text-align: center; padding: 3rem 2rem 0;", children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_LOGO }), _jsxs("p", { class: "text-muted", style: "font-size: 0.6875rem; margin-top: -0.5rem;", children: ['>', "_\u00A0the identity layer for AI agents"] })] }), _jsxs("section", { class: "showcase-tap-hero", children: [_jsx("div", { class: "showcase-tap-hero-badge", children: "Announcing TAP Support" }), _jsx("h1", { class: "showcase-tap-hero-title", children: "Trusted Agent Protocol" }), _jsxs("div", { class: "showcase-tap-links", children: [_jsx("a", { href: "https://developer.visa.com/capabilities/trusted-agent-protocol/overview", target: "_blank", rel: "noopener", class: "showcase-tap-link", children: "Visa Developer Docs" }), _jsx("span", { class: "showcase-tap-links-sep", children: "\u00B7" }), _jsx("a", { href: "https://investor.visa.com/news/news-details/2025/Visa-Introduces-Trusted-Agent-Protocol-An-Ecosystem-Led-Framework-for-AI-Commerce/default.aspx", target: "_blank", rel: "noopener", class: "showcase-tap-link", children: "Visa Announcement" }), _jsx("span", { class: "showcase-tap-links-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/visa/trusted-agent-protocol", target: "_blank", rel: "noopener", class: "showcase-tap-link", children: "GitHub Spec" })] }), _jsx("p", { class: "showcase-tap-hero-subtitle", children: "BOTCHA is one of the first services to implement TAP \u2014 a protocol for zero-trust agent identity. Register agents, scope capabilities, and create sessions with cryptographic proof." }), _jsxs("div", { class: "showcase-tap-hero-features", children: [_jsxs("div", { class: "showcase-tap-feature", children: [_jsx("div", { class: "showcase-tap-feature-title", children: "Agent Registration" }), _jsx("div", { class: "showcase-tap-feature-desc", children: "Register agents with names, capabilities, and operator metadata. Each agent gets a unique cryptographic identity." })] }), _jsxs("div", { class: "showcase-tap-feature", children: [_jsx("div", { class: "showcase-tap-feature-title", children: "Capability Scoping" }), _jsx("div", { class: "showcase-tap-feature-desc", children: "Declare what an agent can do \u2014 browse, search, purchase \u2014 and enforce it at the protocol level. No over-permissioning." })] }), _jsxs("div", { class: "showcase-tap-feature", children: [_jsx("div", { class: "showcase-tap-feature-title", children: "Scoped Sessions" }), _jsx("div", { class: "showcase-tap-feature-desc", children: "Create time-limited sessions tied to specific actions and resources. Sessions expire, capabilities are bounded." })] })] })] }), _jsx("hr", { class: "showcase-divider" }), _jsxs("section", { class: "showcase-protocol-stack", children: [_jsx("h2", { children: "The Agent Infrastructure Stack" }), _jsx("p", { class: "subtitle", children: "Where BOTCHA fits in the new world of agentic AI" }), _jsxs("div", { class: "showcase-stack-diagram", children: [_jsxs("div", { class: "showcase-stack-layer showcase-stack-layer-highlight", children: [_jsx("div", { class: "showcase-stack-layer-number", children: "Layer 3: Identity" }), _jsxs("div", { class: "showcase-stack-layer-title", children: ["TAP (BOTCHA)", _jsx("span", { class: "showcase-you-are-here", children: "YOU ARE HERE" })] }), _jsx("div", { class: "showcase-stack-layer-subtitle", children: "Who agents are" }), _jsx("div", { class: "showcase-stack-layer-features", children: "Agent auth \u00B7 Proof of AI \u00B7 Zero-trust \u00B7 Capability scoping \u00B7 Session management" })] }), _jsxs("div", { class: "showcase-stack-layer", children: [_jsx("div", { class: "showcase-stack-layer-number", children: "Layer 2: Communication" }), _jsx("div", { class: "showcase-stack-layer-title", children: "A2A (Google)" }), _jsx("div", { class: "showcase-stack-layer-subtitle", children: "How agents talk" }), _jsx("div", { class: "showcase-stack-layer-features", children: "Agent-to-agent \u00B7 Task delegation \u00B7 Multi-agent coordination" })] }), _jsxs("div", { class: "showcase-stack-layer", children: [_jsx("div", { class: "showcase-stack-layer-number", children: "Layer 1: Tools" }), _jsx("div", { class: "showcase-stack-layer-title", children: "MCP (Anthropic)" }), _jsx("div", { class: "showcase-stack-layer-subtitle", children: "What agents access" }), _jsx("div", { class: "showcase-stack-layer-features", children: "Tool use \u00B7 Context \u00B7 Data sources \u00B7 Resource bindings" })] })] }), _jsxs("div", { class: "showcase-buzzword-badges", children: [_jsx("span", { class: "showcase-badge", children: "RFC 9421" }), _jsx("span", { class: "showcase-badge", children: "HTTP Message Signatures" }), _jsx("span", { class: "showcase-badge", children: "Zero-Trust" }), _jsx("span", { class: "showcase-badge", children: "Agent Identity" }), _jsx("span", { class: "showcase-badge", children: "Capability Scoping" }), _jsx("span", { class: "showcase-badge", children: "Agentic AI" }), _jsx("span", { class: "showcase-badge", children: "Multi-Agent Systems" })] }), _jsx("p", { class: "showcase-protocol-explanation", children: "Every agent protocol needs an identity layer. MCP gives agents tools. A2A lets agents communicate. TAP proves they're actually AI \u2014 and scopes what they're allowed to do." })] }), _jsx("hr", { class: "showcase-divider" }), _jsxs("section", { class: "showcase-terminal-section", children: [_jsxs("div", { class: "showcase-terminal-header", children: [_jsx("h2", { class: "showcase-terminal-title", children: "See it in action" }), _jsx("p", { class: "showcase-terminal-subtitle", children: "Three commands. Your agent has an identity, capabilities, and a scoped session." })] }), _jsxs("div", { class: "showcase-terminal-container", children: [_jsxs("div", { class: "showcase-terminal-window", children: [_jsxs("div", { class: "showcase-terminal-chrome", children: [_jsx("span", { class: "showcase-terminal-dot showcase-terminal-dot--red" }), _jsx("span", { class: "showcase-terminal-dot showcase-terminal-dot--yellow" }), _jsx("span", { class: "showcase-terminal-dot showcase-terminal-dot--green" }), _jsx("span", { class: "showcase-terminal-title-text", children: "terminal \u2014 botcha" })] }), _jsx("div", { class: "showcase-terminal-content", id: "terminal-content" })] }), _jsx("div", { class: "showcase-terminal-replay-container", children: _jsx("button", { class: "showcase-terminal-replay-btn", id: "terminal-replay", children: "Replay" }) })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: TERMINAL_ANIMATION_SCRIPT } })] }), _jsx("section", { class: "showcase-hero", children: _jsxs("div", { class: "showcase-hero-grid", children: [_jsxs("div", { class: "showcase-hero-column old-world", children: [_jsx("div", { class: "showcase-hero-label", children: "The old world" }), _jsx("h2", { class: "showcase-hero-title strikethrough", children: "CAPTCHA" }), _jsx("div", { class: "showcase-hero-visual old-world", children: CAPTCHA_ASCII }), _jsx("p", { class: "showcase-hero-subtitle", children: "Blocks bots. Annoys humans. Everyone loses." }), _jsxs("ul", { class: "showcase-hero-features", children: [_jsx("li", { children: "Proves you're human" }), _jsx("li", { children: "Blocks automation" }), _jsx("li", { children: "Wastes 5-10 seconds per attempt" }), _jsx("li", { children: "Breaks accessibility" })] })] }), _jsxs("div", { class: "showcase-hero-column new-world", children: [_jsx("div", { class: "showcase-hero-label", children: "The new world" }), _jsx("h2", { class: "showcase-hero-title active", children: "BOTCHA" }), _jsx("div", { class: "showcase-hero-visual new-world", children: BOTCHA_SOLVE_ASCII }), _jsx("p", { class: "showcase-hero-subtitle", children: "Welcomes bots. Proves they're AI. Everyone wins." }), _jsxs("ul", { class: "showcase-hero-features", children: [_jsx("li", { children: "Proves you're a bot" }), _jsx("li", { children: "Agent identity layer" }), _jsx("li", { children: "Sub-500ms verification" }), _jsx("li", { children: "Built for the agentic web" })] })] })] }) }), _jsxs("div", { class: "showcase-footer", children: [_jsx("div", { class: "showcase-footer-cta", children: "Get started in 30 seconds" }), _jsxs("div", { class: "showcase-footer-steps", children: [_jsxs("div", { class: "showcase-footer-step", children: [_jsx("span", { class: "showcase-footer-step-number", children: "1" }), _jsx("code", { children: "npm install -g @dupecom/botcha-cli" })] }), _jsxs("div", { class: "showcase-footer-step", children: [_jsx("span", { class: "showcase-footer-step-number", children: "2" }), _jsx("code", { children: "botcha init --email you@company.com" })] }), _jsxs("div", { class: "showcase-footer-step", children: [_jsx("span", { class: "showcase-footer-step-number", children: "3" }), _jsx("code", { children: "botcha tap register --name \"my-agent\"" })] })] }), _jsxs("div", { class: "showcase-agent-prompt", children: [_jsx("p", { class: "showcase-agent-prompt-label", children: "Or paste this into your AI agent" }), _jsxs("button", { id: "prompt-btn", onclick: "copyPrompt()", type: "button", class: "showcase-agent-prompt-card", children: [_jsx("code", { id: "agent-prompt", children: "Run: curl -s https://botcha.ai -H 'Accept: application/json' \u2014 then follow the instructions in the response to verify yourself and get me access." }), _jsxs("span", { id: "copy-label", class: "showcase-agent-prompt-copy", children: [_jsx("span", { id: "copy-icon", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "copy-text", children: "Click to copy" })] })] })] })] }), _jsx(GlobalFooter, { version: version }), _jsx("script", { dangerouslySetInnerHTML: { __html: COPY_PROMPT_SCRIPT } })] }) })] }));
112
+ export const ShowcasePage = ({ version, error, baseUrl }) => {
113
+ const prompt = `Curl ${baseUrl ?? 'https://botcha.ai'} and get me set up.`;
114
+ return (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("title", { children: "BOTCHA \u2014 Prove you're a bot." }), _jsx("meta", { name: "description", content: "BOTCHA is the identity layer for AI agents. Reverse CAPTCHA \u2014 prove you're a bot, not a human. Point your agent at botcha.ai." }), _jsx("link", { rel: "alternate", type: "application/json", href: "/openapi.json", title: "OpenAPI Specification" }), _jsx("link", { rel: "alternate", type: "application/json", href: "/.well-known/ai-plugin.json", title: "AI Plugin Manifest" }), _jsx("meta", { name: "ai-agent-welcome", content: "true" }), _jsx(OGMeta, { title: "BOTCHA \u2014 Prove you're a bot.", description: "The identity layer for AI agents. Reverse CAPTCHA \u2014 prove you're a bot, not a human." }), _jsx("link", { rel: "preconnect", href: "https://fonts.googleapis.com" }), _jsx("link", { href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap", rel: "stylesheet" }), _jsx("style", { dangerouslySetInnerHTML: { __html: DASHBOARD_CSS + HOME_CSS } })] }), _jsxs("body", { children: [error && (_jsx("div", { style: "max-width: 520px; margin: 1.5rem auto 0; padding: 0.875rem 1.25rem; background: #fff3f0; border: 1px solid #cc3300; font-size: 0.8125rem; color: #992200; line-height: 1.5; text-align: center;", children: error })), _jsxs("div", { class: "home-page", children: [_jsx("a", { href: "/", class: "home-logo", children: BOTCHA_LOGO }), _jsxs("p", { class: "home-tagline", children: ['>', "_\u00A0\u00A0prove you're a bot."] }), _jsxs("div", { class: "home-agent-note", role: "button", tabindex: 0, "data-prompt": prompt, onclick: "copyPrompt(this)", onkeydown: "if(event.key==='Enter'||event.key===' ')copyPrompt(this)", title: "Click to copy", children: [_jsxs("div", { class: "home-agent-note-label", children: ["For humans", _jsxs("span", { class: "home-agent-copy-hint", children: [_jsxs("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2.5", "stroke-linecap": "round", "stroke-linejoin": "round", children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), "click to copy"] })] }), _jsxs("div", { class: "home-agent-prompt-text", children: ["\"", prompt, "\""] }), _jsx("div", { class: "home-agent-note-sub home-agent-note-copied", id: "copy-confirm", children: "Copied!" })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: `
115
+ function copyPrompt(el) {
116
+ var text = el.getAttribute('data-prompt');
117
+ navigator.clipboard.writeText(text).then(function() {
118
+ var confirm = document.getElementById('copy-confirm');
119
+ confirm.style.opacity = '1';
120
+ setTimeout(function() { confirm.style.opacity = '0'; }, 1500);
121
+ });
122
+ }
123
+ ` } })] }), _jsx(GlobalFooter, { version: version })] })] }));
1045
124
  };
1046
- // Combined CSS: base dashboard styles (subset) + showcase-specific styles
1047
- import { DASHBOARD_CSS } from './styles';
1048
- const SHOWCASE_PAGE_CSS = DASHBOARD_CSS + SHOWCASE_CSS;