@dupecom/botcha-cloudflare 0.21.0 → 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.
- package/README.md +74 -9
- package/dist/agent-auth.d.ts +129 -0
- package/dist/agent-auth.d.ts.map +1 -0
- package/dist/agent-auth.js +210 -0
- package/dist/agents.d.ts +10 -0
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +51 -1
- package/dist/app-gate.d.ts +6 -0
- package/dist/app-gate.d.ts.map +1 -0
- package/dist/app-gate.js +69 -0
- package/dist/apps.d.ts +9 -0
- package/dist/apps.d.ts.map +1 -1
- package/dist/apps.js +26 -0
- package/dist/dashboard/account.d.ts +63 -0
- package/dist/dashboard/account.d.ts.map +1 -0
- package/dist/dashboard/account.js +488 -0
- package/dist/dashboard/api.js +15 -68
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +14 -14
- package/dist/dashboard/docs.d.ts.map +1 -1
- package/dist/dashboard/docs.js +146 -3
- package/dist/dashboard/layout.d.ts.map +1 -1
- package/dist/dashboard/layout.js +2 -2
- package/dist/dashboard/mcp-setup.d.ts +15 -0
- package/dist/dashboard/mcp-setup.d.ts.map +1 -0
- package/dist/dashboard/mcp-setup.js +391 -0
- package/dist/dashboard/showcase.d.ts +6 -10
- package/dist/dashboard/showcase.d.ts.map +1 -1
- package/dist/dashboard/showcase.js +67 -991
- package/dist/dashboard/whitepaper.d.ts.map +1 -1
- package/dist/dashboard/whitepaper.js +42 -4
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +452 -52
- package/dist/mcp.d.ts +20 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +1290 -0
- package/dist/oauth-agent.d.ts +130 -0
- package/dist/oauth-agent.d.ts.map +1 -0
- package/dist/oauth-agent.js +194 -0
- package/dist/static.d.ts +732 -1
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +646 -2
- package/dist/tap-a2a-routes.d.ts +355 -0
- package/dist/tap-a2a-routes.d.ts.map +1 -0
- package/dist/tap-a2a-routes.js +475 -0
- package/dist/tap-a2a.d.ts +199 -0
- package/dist/tap-a2a.d.ts.map +1 -0
- package/dist/tap-a2a.js +502 -0
- package/dist/tap-agents.d.ts +15 -0
- package/dist/tap-agents.d.ts.map +1 -1
- package/dist/tap-agents.js +31 -1
- package/dist/tap-ans-routes.d.ts +302 -0
- package/dist/tap-ans-routes.d.ts.map +1 -0
- package/dist/tap-ans-routes.js +535 -0
- package/dist/tap-ans.d.ts +241 -0
- package/dist/tap-ans.d.ts.map +1 -0
- package/dist/tap-ans.js +481 -0
- package/dist/tap-delegation-routes.d.ts.map +1 -1
- package/dist/tap-delegation-routes.js +11 -0
- package/dist/tap-did.d.ts +140 -0
- package/dist/tap-did.d.ts.map +1 -0
- package/dist/tap-did.js +262 -0
- package/dist/tap-oidca-routes.d.ts +383 -0
- package/dist/tap-oidca-routes.d.ts.map +1 -0
- package/dist/tap-oidca-routes.js +597 -0
- package/dist/tap-oidca.d.ts +288 -0
- package/dist/tap-oidca.d.ts.map +1 -0
- package/dist/tap-oidca.js +461 -0
- package/dist/tap-routes.d.ts +24 -8
- package/dist/tap-routes.d.ts.map +1 -1
- package/dist/tap-routes.js +169 -23
- package/dist/tap-vc-routes.d.ts +358 -0
- package/dist/tap-vc-routes.d.ts.map +1 -0
- package/dist/tap-vc-routes.js +367 -0
- package/dist/tap-vc.d.ts +125 -0
- package/dist/tap-vc.d.ts.map +1 -0
- package/dist/tap-vc.js +245 -0
- package/dist/tap-x402-routes.d.ts +89 -0
- package/dist/tap-x402-routes.d.ts.map +1 -0
- package/dist/tap-x402-routes.js +579 -0
- package/dist/tap-x402.d.ts +222 -0
- package/dist/tap-x402.d.ts.map +1 -0
- package/dist/tap-x402.js +546 -0
- package/dist/webhooks.d.ts +99 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +642 -0
- 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
|
-
|
|
6
|
-
|
|
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
|
-
.
|
|
116
|
-
display:
|
|
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.
|
|
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
|
-
.
|
|
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
|
-
.
|
|
201
|
-
|
|
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
|
-
|
|
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
|
-
.
|
|
258
|
-
|
|
53
|
+
.home-agent-note:hover {
|
|
54
|
+
border-color: var(--text-muted);
|
|
55
|
+
background: rgba(0,0,0,0.02);
|
|
259
56
|
}
|
|
260
57
|
|
|
261
|
-
.
|
|
262
|
-
|
|
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
|
-
.
|
|
268
|
-
font-size: 0.
|
|
62
|
+
.home-agent-note-label {
|
|
63
|
+
font-size: 0.5625rem;
|
|
269
64
|
font-weight: 700;
|
|
270
65
|
text-transform: uppercase;
|
|
271
|
-
letter-spacing: 0.
|
|
66
|
+
letter-spacing: 0.12em;
|
|
272
67
|
color: var(--text-dim);
|
|
273
|
-
margin-bottom: 0.
|
|
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
|
-
.
|
|
318
|
-
display: inline-
|
|
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.
|
|
376
|
-
|
|
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
|
-
.
|
|
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
|
-
.
|
|
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.
|
|
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
|
-
.
|
|
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
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
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
|
-
.
|
|
780
|
-
.
|
|
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;
|