@dupecom/botcha-cloudflare 0.15.0 → 0.16.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 (46) hide show
  1. package/dist/dashboard/landing.d.ts.map +1 -1
  2. package/dist/dashboard/landing.js +2 -9
  3. package/dist/dashboard/layout.d.ts.map +1 -1
  4. package/dist/dashboard/layout.js +4 -4
  5. package/dist/dashboard/showcase.d.ts +1 -0
  6. package/dist/dashboard/showcase.d.ts.map +1 -1
  7. package/dist/dashboard/showcase.js +2 -2
  8. package/dist/dashboard/whitepaper.d.ts +14 -0
  9. package/dist/dashboard/whitepaper.d.ts.map +1 -0
  10. package/dist/dashboard/whitepaper.js +418 -0
  11. package/dist/email.d.ts.map +1 -1
  12. package/dist/email.js +5 -1
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +105 -18
  16. package/dist/og-image.d.ts +2 -0
  17. package/dist/og-image.d.ts.map +1 -0
  18. package/dist/og-image.js +2 -0
  19. package/dist/static.d.ts +331 -2
  20. package/dist/static.d.ts.map +1 -1
  21. package/dist/static.js +462 -4
  22. package/dist/tap-agents.d.ts +3 -2
  23. package/dist/tap-agents.d.ts.map +1 -1
  24. package/dist/tap-agents.js +19 -6
  25. package/dist/tap-consumer.d.ts +151 -0
  26. package/dist/tap-consumer.d.ts.map +1 -0
  27. package/dist/tap-consumer.js +346 -0
  28. package/dist/tap-edge.d.ts +106 -0
  29. package/dist/tap-edge.d.ts.map +1 -0
  30. package/dist/tap-edge.js +487 -0
  31. package/dist/tap-federation.d.ts +89 -0
  32. package/dist/tap-federation.d.ts.map +1 -0
  33. package/dist/tap-federation.js +237 -0
  34. package/dist/tap-jwks.d.ts +64 -0
  35. package/dist/tap-jwks.d.ts.map +1 -0
  36. package/dist/tap-jwks.js +279 -0
  37. package/dist/tap-payment.d.ts +172 -0
  38. package/dist/tap-payment.d.ts.map +1 -0
  39. package/dist/tap-payment.js +425 -0
  40. package/dist/tap-routes.d.ts +239 -2
  41. package/dist/tap-routes.d.ts.map +1 -1
  42. package/dist/tap-routes.js +279 -4
  43. package/dist/tap-verify.d.ts +43 -1
  44. package/dist/tap-verify.d.ts.map +1 -1
  45. package/dist/tap-verify.js +215 -30
  46. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"landing.d.ts","sourceRoot":"","sources":["../../src/dashboard/landing.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAsCnC,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA+H/D,CAAC;AAyBF,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAsF3E,CAAC"}
1
+ {"version":3,"file":"landing.d.ts","sourceRoot":"","sources":["../../src/dashboard/landing.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAsCnC,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA+H/D,CAAC;AAyBF,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAqG3E,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
2
  import { LandingLayout } from './layout';
3
- import { Card } from './layout';
4
3
  const BOTCHA_ASCII = `██████╗ ██████╗ ████████╗ ██████╗██╗ ██╗ █████╗
5
4
  ██╔══██╗██╔═══██╗╚══██╔══╝██╔════╝██║ ██║██╔══██╗
6
5
  ██████╔╝██║ ██║ ██║ ██║ ███████║███████║
@@ -55,7 +54,7 @@ export const LandingPage = ({ version, error }) => {
55
54
  } }), _jsx("script", { dangerouslySetInnerHTML: { __html: COPY_SCRIPT } })] }));
56
55
  };
57
56
  // ============ VERIFIED LANDING PAGE ============
58
- const ONBOARD_PROMPT = `Run: curl -s https://botcha.ai -H 'Accept: application/json' — then follow the instructions to verify yourself, create an app for me, and get me into the dashboard. Ask me for my email address when you need it.`;
57
+ const ONBOARD_PROMPT = `Run: curl -s https://botcha.ai -H 'Accept: application/json' — then follow the instructions to verify yourself, create an app for me, and get me into the dashboard. Ask me for my email address when you need it. I'll also give you a verification code from my email.`;
59
58
  const VERIFIED_COPY_SCRIPT = `
60
59
  function copyOnboardPrompt() {
61
60
  var text = document.getElementById('onboard-prompt').textContent.trim();
@@ -75,11 +74,5 @@ function copyOnboardPrompt() {
75
74
  }
76
75
  `;
77
76
  export const VerifiedLandingPage = ({ version, solveTime }) => {
78
- return (_jsxs(LandingLayout, { version: version, children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_ASCII }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 0.5rem;", children: ['>', "_\u00A0verified"] }), _jsxs("p", { class: "landing-tagline", style: "color: var(--green);", children: ["Your agent proved it's a bot", solveTime ? ` in ${solveTime}ms` : '', ". Welcome."] }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin: 2rem 0 0.625rem;", children: "Set up your account \u2014 paste this to your agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "onboard-btn", onclick: "copyOnboardPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "onboard-prompt", style: "font-size: 1rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: ONBOARD_PROMPT }), _jsxs("span", { id: "onboard-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "onboard-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "onboard-text", children: "Click to copy" })] })] }) }) }), _jsx("div", { style: "text-align: center; margin: 1.5rem 0;", children: _jsxs("p", { class: "text-muted", style: "font-size: 0.75rem; line-height: 2;", children: ["Your agent will ask for your email, create your app,", _jsx("br", {}), "and give you a link to your dashboard. You just click it."] }) }), _jsx("div", { style: "text-align: center; margin-bottom: 1.5rem;", children: _jsx("a", { href: "/dashboard", style: "font-size: 0.75rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px;", children: "Already have an account? Go to dashboard" }) }), _jsxs(Card, { title: "For developers", children: [_jsx("p", { class: "text-muted", style: "font-size: 0.8125rem; line-height: 1.7; margin-bottom: 0.75rem;", children: "Protect your own APIs so only verified AI agents can access them:" }), _jsx("pre", { children: _jsx("code", { children: `# Client SDK (for your agent)
79
- npm install @dupecom/botcha # TypeScript
80
- pip install botcha # Python
81
-
82
- # Server SDK (protect your APIs)
83
- npm install @botcha/verify # Express/Hono
84
- pip install botcha-verify # FastAPI/Django` }) }), _jsxs("div", { class: "landing-links", style: "margin-top: 1rem;", children: [_jsx("a", { href: "/openapi.json", class: "landing-link", children: "OpenAPI" }), _jsx("a", { href: "/ai.txt", class: "landing-link", children: "ai.txt" }), _jsx("a", { href: "https://github.com/dupe-com/botcha", class: "landing-link", children: "GitHub" }), _jsx("a", { href: "https://www.npmjs.com/package/@dupecom/botcha", class: "landing-link", children: "npm" }), _jsx("a", { href: "https://pypi.org/project/botcha/", class: "landing-link", children: "PyPI" })] })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: VERIFIED_COPY_SCRIPT } })] }));
77
+ return (_jsxs(LandingLayout, { version: version, children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_ASCII }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 0.5rem;", children: ['>', "_\u00A0verified"] }), _jsxs("p", { class: "landing-tagline", style: "color: var(--green);", children: ["Your agent proved it's a bot", solveTime ? ` in ${solveTime}ms` : '', ". Welcome."] }), _jsxs("div", { style: "max-width: 400px; margin: 2rem auto 2.5rem;", children: [_jsxs("div", { style: "display: flex; align-items: flex-start; gap: 0.75rem; margin-bottom: 1rem;", children: [_jsx("span", { style: "display: inline-flex; align-items: center; justify-content: center; min-width: 1.5rem; height: 1.5rem; font-size: 0.6875rem; font-weight: 700; background: var(--green); color: #fff; flex-shrink: 0;", children: "\u2713" }), _jsxs("div", { children: [_jsx("span", { style: "font-size: 0.8125rem; font-weight: 600; color: var(--text-dim); text-decoration: line-through;", children: "Your agent solved a challenge" }), _jsx("span", { style: "font-size: 0.6875rem; color: var(--green); margin-left: 0.5rem;", children: solveTime ? `${solveTime}ms` : 'done' })] })] }), _jsxs("div", { style: "display: flex; align-items: flex-start; gap: 0.75rem; margin-bottom: 1rem;", children: [_jsx("span", { style: "display: inline-flex; align-items: center; justify-content: center; min-width: 1.5rem; height: 1.5rem; font-size: 0.6875rem; font-weight: 700; background: var(--green); color: #fff; flex-shrink: 0;", children: "\u2713" }), _jsx("span", { style: "font-size: 0.8125rem; font-weight: 600; color: var(--text-dim); text-decoration: line-through;", children: "You clicked the link your agent gave you" })] }), _jsxs("div", { style: "display: flex; align-items: flex-start; gap: 0.75rem;", children: [_jsx("span", { style: "display: inline-flex; align-items: center; justify-content: center; min-width: 1.5rem; height: 1.5rem; font-size: 0.6875rem; font-weight: 700; border: 2px solid var(--accent); color: var(--accent); flex-shrink: 0;", children: "3" }), _jsx("span", { style: "font-size: 0.8125rem; font-weight: 700; color: var(--text);", children: "Set up your account \u2193" })] })] }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin: 0 0 0.625rem;", children: "Copy this and paste it back into your agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "onboard-btn", onclick: "copyOnboardPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "onboard-prompt", style: "font-size: 1rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: ONBOARD_PROMPT }), _jsxs("span", { id: "onboard-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "onboard-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "onboard-text", children: "Click to copy" })] })] }) }) }), _jsxs("div", { style: "max-width: 360px; margin: 1.5rem auto; text-align: left;", children: [_jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin-bottom: 0.75rem;", children: "What happens next" }), _jsxs("div", { style: "display: flex; flex-direction: column; gap: 0.5rem;", children: [_jsxs("div", { style: "display: flex; gap: 0.5rem; align-items: flex-start;", children: [_jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted); min-width: 1rem; font-weight: 600;", children: "a." }), _jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted);", children: "Your agent asks for your email" })] }), _jsxs("div", { style: "display: flex; gap: 0.5rem; align-items: flex-start;", children: [_jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted); min-width: 1rem; font-weight: 600;", children: "b." }), _jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted);", children: "You get a verification code in your inbox" })] }), _jsxs("div", { style: "display: flex; gap: 0.5rem; align-items: flex-start;", children: [_jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted); min-width: 1rem; font-weight: 600;", children: "c." }), _jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted);", children: _jsx("strong", { style: "color: var(--text);", children: "Paste the code back to your agent" }) })] }), _jsxs("div", { style: "display: flex; gap: 0.5rem; align-items: flex-start;", children: [_jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted); min-width: 1rem; font-weight: 600;", children: "d." }), _jsx("span", { style: "font-size: 0.75rem; color: var(--text-muted);", children: "Your agent gives you a dashboard link" })] })] })] }), _jsx("div", { style: "text-align: center; margin-bottom: 1.5rem;", children: _jsx("a", { href: "/dashboard", style: "font-size: 0.75rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px;", children: "Already have an account? Go to dashboard" }) }), _jsx("script", { dangerouslySetInnerHTML: { __html: VERIFIED_COPY_SCRIPT } })] }));
85
78
  };
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/dashboard/layout.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBzF,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CA+BjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAExC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCvG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBnF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAqDpE,CAAC"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/dashboard/layout.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBzF,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAiCjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAExC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CvG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8BnF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA8DpE,CAAC"}
@@ -25,7 +25,7 @@ export const Card = ({ children, title, badge, class: className, }) => {
25
25
  */
26
26
  export const GlobalFooter = ({ version = '0.15.0' }) => {
27
27
  const year = new Date().getFullYear();
28
- return (_jsx("footer", { class: "global-footer", children: _jsxs("div", { class: "global-footer-inner", children: [_jsx("a", { href: "/dashboard", class: "global-footer-dashboard", children: "Dashboard" }), _jsxs("div", { class: "global-footer-links", children: [_jsxs("span", { children: ["v", version] }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://botcha.ai", children: "botcha.ai" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/openapi.json", children: "OpenAPI" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/ai.txt", children: "ai.txt" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/dupe-com/botcha", children: "GitHub" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://www.npmjs.com/package/@dupecom/botcha", children: "npm" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://pypi.org/project/botcha/", children: "PyPI" })] }), _jsxs("div", { class: "global-footer-legal", children: ["\u00A9 ", year, " ", _jsx("a", { href: "https://dupe.com", children: "Dupe.com" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), "Free and open source", _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/i8ramin", children: "@i8ramin" })] })] }) }));
28
+ return (_jsx("footer", { class: "global-footer", children: _jsxs("div", { class: "global-footer-inner", children: [_jsx("a", { href: "/dashboard", class: "global-footer-dashboard", children: "Dashboard" }), _jsxs("div", { class: "global-footer-links", children: [_jsxs("span", { children: ["v", version] }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://botcha.ai", children: "botcha.ai" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/whitepaper", children: "Whitepaper" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/openapi.json", children: "OpenAPI" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/ai.txt", children: "ai.txt" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/dupe-com/botcha", children: "GitHub" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://www.npmjs.com/package/@dupecom/botcha", children: "npm" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://pypi.org/project/botcha/", children: "PyPI" })] }), _jsxs("div", { class: "global-footer-legal", children: ["\u00A9 ", year, " ", _jsx("a", { href: "https://dupe.com", children: "Dupe.com" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), "Free and open source", _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/i8ramin", children: "@i8ramin" })] })] }) }));
29
29
  };
30
30
  /**
31
31
  * Divider with centered text, used between sections on auth pages.
@@ -36,21 +36,21 @@ export const Divider = ({ text }) => (_jsx("div", { class: "divider", children:
36
36
  * Used for authenticated dashboard pages
37
37
  */
38
38
  export const DashboardLayout = ({ children, title, appId, version }) => {
39
- 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: title || 'BOTCHA Dashboard' }), _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 } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }), _jsxs("body", { children: [_jsx("nav", { class: "dashboard-nav", children: _jsxs("div", { class: "nav-container", children: [_jsx("a", { href: "/dashboard", class: "nav-logo", children: "BOTCHA" }), appId && (_jsxs(_Fragment, { children: [_jsx("span", { class: "nav-app-id", children: appId }), _jsx("a", { href: "/dashboard/logout", class: "nav-link", children: "Logout" })] }))] }) }), _jsx("main", { class: "dashboard-main", children: children }), _jsx(GlobalFooter, { version: version })] })] }));
39
+ 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: title || 'BOTCHA Dashboard' }), _jsx("meta", { property: "og:title", content: "BOTCHA \u2014 The Identity Layer for AI Agents" }), _jsx("meta", { property: "og:description", content: "Reverse CAPTCHA \u2014 Prove you're a bot. Humans need not apply." }), _jsx("meta", { property: "og:image", content: "https://botcha.ai/og.png" }), _jsx("meta", { property: "og:image:width", content: "1200" }), _jsx("meta", { property: "og:image:height", content: "630" }), _jsx("meta", { name: "twitter:card", content: "summary_large_image" }), _jsx("meta", { name: "twitter:image", content: "https://botcha.ai/og.png" }), _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 } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }), _jsxs("body", { children: [_jsx("nav", { class: "dashboard-nav", children: _jsxs("div", { class: "nav-container", children: [_jsx("a", { href: "/dashboard", class: "nav-logo", children: "BOTCHA" }), appId && (_jsxs(_Fragment, { children: [_jsx("span", { class: "nav-app-id", children: appId }), _jsx("a", { href: "/dashboard/logout", class: "nav-link", children: "Logout" })] }))] }) }), _jsx("main", { class: "dashboard-main", children: children }), _jsx(GlobalFooter, { version: version })] })] }));
40
40
  };
41
41
  /**
42
42
  * Login/auth layout without navigation
43
43
  * Used for login, signup, and other auth pages
44
44
  */
45
45
  export const LoginLayout = ({ children, title, version }) => {
46
- 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: title || 'BOTCHA Login' }), _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 } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }), _jsxs("body", { children: [_jsx("div", { class: "login-container", children: _jsx("div", { class: "login-box", children: children }) }), _jsx(GlobalFooter, { version: version })] })] }));
46
+ 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: title || 'BOTCHA Login' }), _jsx("meta", { property: "og:title", content: "BOTCHA \u2014 The Identity Layer for AI Agents" }), _jsx("meta", { property: "og:description", content: "Reverse CAPTCHA \u2014 Prove you're a bot. Humans need not apply." }), _jsx("meta", { property: "og:image", content: "https://botcha.ai/og.png" }), _jsx("meta", { property: "og:image:width", content: "1200" }), _jsx("meta", { property: "og:image:height", content: "630" }), _jsx("meta", { name: "twitter:card", content: "summary_large_image" }), _jsx("meta", { name: "twitter:image", content: "https://botcha.ai/og.png" }), _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 } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }), _jsxs("body", { children: [_jsx("div", { class: "login-container", children: _jsx("div", { class: "login-box", children: children }) }), _jsx(GlobalFooter, { version: version })] })] }));
47
47
  };
48
48
  /**
49
49
  * Landing page layout — wider than LoginLayout, includes SEO meta tags.
50
50
  * Used for the public landing page at GET /
51
51
  */
52
52
  export const LandingLayout = ({ children, version }) => {
53
- 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 Reverse CAPTCHA for AI Agents" }), _jsx("meta", { name: "description", content: "BOTCHA is a hosted reverse CAPTCHA that verifies AI agents, not humans. Protect your APIs with computational challenges only bots can solve." }), _jsx("meta", { name: "keywords", content: "AI, bot verification, reverse CAPTCHA, API security, AI agents, agent verification" }), _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("link", { rel: "botcha-challenge", href: "#botcha-challenge", type: "application/botcha+json", title: "Embedded Bot Challenge" }), _jsx("meta", { name: "ai-agent-welcome", content: "true" }), _jsx("meta", { name: "botcha-challenge", content: "embedded", "data-selector": "script[type='application/botcha+json']" }), _jsx("meta", { property: "og:title", content: "BOTCHA \u2014 Reverse CAPTCHA for AI Agents" }), _jsx("meta", { property: "og:description", content: "Hosted bot verification service. Prove you're a bot. Humans need not apply." }), _jsx("meta", { property: "og:url", content: "https://botcha.ai" }), _jsx("meta", { property: "og:type", content: "website" }), _jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: JSON.stringify({
53
+ 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 Reverse CAPTCHA for AI Agents" }), _jsx("meta", { name: "description", content: "BOTCHA is a hosted reverse CAPTCHA that verifies AI agents, not humans. Protect your APIs with computational challenges only bots can solve." }), _jsx("meta", { name: "keywords", content: "AI, bot verification, reverse CAPTCHA, API security, AI agents, agent verification" }), _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("link", { rel: "botcha-challenge", href: "#botcha-challenge", type: "application/botcha+json", title: "Embedded Bot Challenge" }), _jsx("meta", { name: "ai-agent-welcome", content: "true" }), _jsx("meta", { name: "botcha-challenge", content: "embedded", "data-selector": "script[type='application/botcha+json']" }), _jsx("meta", { property: "og:title", content: "BOTCHA \u2014 The Identity Layer for AI Agents" }), _jsx("meta", { property: "og:description", content: "Reverse CAPTCHA \u2014 Prove you're a bot. Humans need not apply. One of the first services to support the Trusted Agent Protocol (TAP)." }), _jsx("meta", { property: "og:url", content: "https://botcha.ai" }), _jsx("meta", { property: "og:type", content: "website" }), _jsx("meta", { property: "og:image", content: "https://botcha.ai/og.png" }), _jsx("meta", { property: "og:image:width", content: "1200" }), _jsx("meta", { property: "og:image:height", content: "630" }), _jsx("meta", { property: "og:image:type", content: "image/png" }), _jsx("meta", { name: "twitter:card", content: "summary_large_image" }), _jsx("meta", { name: "twitter:title", content: "BOTCHA \u2014 The Identity Layer for AI Agents" }), _jsx("meta", { name: "twitter:description", content: "Reverse CAPTCHA \u2014 Prove you're a bot. Humans need not apply." }), _jsx("meta", { name: "twitter:image", content: "https://botcha.ai/og.png" }), _jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: JSON.stringify({
54
54
  '@context': 'https://schema.org',
55
55
  '@type': 'SoftwareApplication',
56
56
  name: 'BOTCHA',
@@ -15,5 +15,6 @@ import type { FC } from 'hono/jsx';
15
15
  export declare const SHOWCASE_CSS = "\n /* ============ Showcase layout ============ */\n .showcase-page {\n max-width: 100%;\n overflow-x: hidden;\n }\n\n .showcase-divider {\n max-width: 800px;\n margin: 0 auto;\n border: none;\n border-top: 1px solid var(--border);\n }\n\n /* ============ Section 1: TAP Announcement Hero ============ */\n .showcase-tap-hero {\n max-width: 800px;\n margin: 0 auto;\n padding: 4rem 2rem 3rem;\n text-align: center;\n }\n\n .showcase-tap-hero-badge {\n display: inline-block;\n font-size: 0.625rem;\n font-weight: 700;\n letter-spacing: 0.15em;\n text-transform: uppercase;\n padding: 0.3rem 0.875rem;\n background: var(--green);\n color: #fff;\n margin-bottom: 1.5rem;\n }\n\n .showcase-tap-hero-title {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n margin: 0 0 1.25rem;\n color: var(--text);\n }\n\n .showcase-tap-links {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: 0.375rem;\n margin-bottom: 1.5rem;\n }\n\n .showcase-tap-link {\n font-size: 0.6875rem;\n color: var(--text-muted);\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n .showcase-tap-link:hover {\n color: var(--green);\n opacity: 1;\n }\n\n .showcase-tap-links-sep {\n color: var(--text-dim);\n font-size: 0.625rem;\n }\n\n .showcase-tap-hero-subtitle {\n font-size: 0.9375rem;\n line-height: 1.7;\n color: var(--text-muted);\n max-width: 600px;\n margin: 0 auto 2.5rem;\n }\n\n .showcase-tap-hero-features {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 1.5rem;\n text-align: left;\n }\n\n .showcase-tap-feature {\n padding: 1.25rem;\n border: 1px solid var(--border);\n background: var(--bg);\n }\n\n .showcase-tap-feature-title {\n font-size: 0.8125rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n .showcase-tap-feature-desc {\n font-size: 0.75rem;\n line-height: 1.6;\n color: var(--text-muted);\n }\n\n /* ============ CAPTCHA vs BOTCHA Comparison ============ */\n .showcase-hero {\n max-width: 1100px;\n margin: 0 auto;\n padding: 4rem 2rem 2rem;\n }\n\n .showcase-hero-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2rem;\n margin-bottom: 3rem;\n }\n\n .showcase-hero-column {\n border: 2px solid var(--border);\n padding: 2rem;\n background: var(--bg);\n }\n\n .showcase-hero-column.old-world {\n border-color: var(--red);\n }\n\n .showcase-hero-column.new-world {\n border-color: var(--green);\n }\n\n .showcase-hero-label {\n font-size: 0.6875rem;\n font-weight: 700;\n letter-spacing: 0.15em;\n text-transform: uppercase;\n margin-bottom: 0.75rem;\n color: var(--text-dim);\n }\n\n .showcase-hero-title {\n font-size: 2rem;\n font-weight: 700;\n margin-bottom: 1.25rem;\n line-height: 1;\n }\n\n .showcase-hero-title.strikethrough {\n text-decoration: line-through;\n color: var(--red);\n }\n\n .showcase-hero-title.active {\n color: var(--green);\n }\n\n .showcase-hero-visual {\n font-family: var(--font);\n font-size: 0.6875rem;\n line-height: 1.3;\n margin: 1.25rem 0;\n padding: 1rem;\n background: #fafafa;\n border: 1px solid var(--border);\n white-space: pre;\n overflow-x: auto;\n }\n\n .showcase-hero-visual.old-world {\n color: var(--red);\n border-color: var(--red);\n background: #fff5f5;\n }\n\n .showcase-hero-visual.new-world {\n color: var(--green);\n border-color: var(--green);\n background: #f5fff7;\n }\n\n .showcase-hero-subtitle {\n font-size: 0.875rem;\n margin-bottom: 1rem;\n line-height: 1.5;\n color: var(--text);\n }\n\n .showcase-hero-features {\n list-style: none;\n padding: 0;\n margin: 0;\n font-size: 0.75rem;\n color: var(--text-muted);\n }\n\n .showcase-hero-features li {\n padding: 0.25rem 0;\n }\n\n .showcase-hero-features li::before {\n content: \"\\2192 \";\n color: var(--text-dim);\n }\n\n .showcase-hero-tagline {\n text-align: center;\n padding: 2rem 2rem 0;\n }\n\n .showcase-hero-tagline-main {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n .showcase-hero-tagline-sub {\n font-size: 0.875rem;\n color: var(--text-muted);\n }\n\n /* ============ Section 2: Protocol Stack ============ */\n .showcase-protocol-stack {\n max-width: 800px;\n margin: 0 auto;\n padding: 4rem 2rem;\n }\n\n .showcase-protocol-stack h2 {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n }\n\n .showcase-protocol-stack .subtitle {\n color: var(--text-muted);\n font-size: 0.875rem;\n margin-bottom: 2.5rem;\n }\n\n .showcase-stack-diagram {\n position: relative;\n margin: 0 0 2rem 0;\n }\n\n .showcase-stack-layer {\n border: 2px solid var(--border);\n background: var(--bg);\n padding: 1.25rem 1.5rem;\n position: relative;\n }\n\n .showcase-stack-layer + .showcase-stack-layer {\n margin-top: -2px;\n }\n\n .showcase-stack-layer-highlight {\n border: 3px solid var(--accent);\n background: var(--bg-raised);\n z-index: 1;\n }\n\n .showcase-stack-layer-number {\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n color: var(--text-dim);\n margin-bottom: 0.375rem;\n }\n\n .showcase-stack-layer-highlight .showcase-stack-layer-number {\n color: var(--green);\n }\n\n .showcase-stack-layer-title {\n font-size: 1.125rem;\n font-weight: 700;\n margin-bottom: 0.25rem;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .showcase-stack-layer-subtitle {\n font-size: 0.8125rem;\n color: var(--text-muted);\n margin-bottom: 0.375rem;\n }\n\n .showcase-stack-layer-features {\n font-size: 0.75rem;\n color: var(--text-dim);\n }\n\n .showcase-you-are-here {\n display: inline-block;\n background: var(--green);\n color: white;\n font-size: 0.5625rem;\n font-weight: 700;\n padding: 0.2rem 0.5rem;\n letter-spacing: 0.05em;\n }\n\n .showcase-buzzword-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-bottom: 2rem;\n }\n\n .showcase-badge {\n display: inline-block;\n font-size: 0.6875rem;\n padding: 0.3rem 0.625rem;\n border: 1px solid var(--border);\n background: var(--bg);\n color: var(--text-muted);\n white-space: nowrap;\n }\n\n .showcase-protocol-explanation {\n font-size: 0.8125rem;\n line-height: 1.7;\n color: var(--text-muted);\n }\n\n /* ============ Section 3: Terminal Demo ============ */\n .showcase-terminal-section {\n max-width: 1100px;\n margin: 0 auto;\n padding: 4rem 2rem;\n }\n\n .showcase-terminal-header {\n text-align: center;\n margin-bottom: 2.5rem;\n }\n\n .showcase-terminal-title {\n font-size: 1.5rem;\n font-weight: 700;\n margin: 0 0 0.5rem 0;\n color: var(--text);\n }\n\n .showcase-terminal-subtitle {\n font-size: 0.875rem;\n color: var(--text-muted);\n margin: 0;\n line-height: 1.5;\n }\n\n .showcase-terminal-container {\n max-width: 640px;\n margin: 0 auto;\n }\n\n .showcase-terminal-window {\n background: #0d0d0d;\n border: 1px solid var(--border);\n overflow: hidden;\n }\n\n .showcase-terminal-chrome {\n background: #1a1a1a;\n padding: 0.75rem 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n border-bottom: 1px solid #333;\n }\n\n .showcase-terminal-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n }\n\n .showcase-terminal-dot--red { background: #ff5f56; }\n .showcase-terminal-dot--yellow { background: #ffbd2e; }\n .showcase-terminal-dot--green { background: #27c93f; }\n\n .showcase-terminal-title-text {\n font-size: 0.6875rem;\n color: #888;\n margin-left: 0.5rem;\n }\n\n .showcase-terminal-content {\n padding: 1.5rem;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: #f0f0f0;\n height: 460px;\n overflow-y: hidden;\n font-family: var(--font);\n }\n\n .showcase-terminal-line {\n margin-bottom: 0.375rem;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .showcase-terminal-prompt { color: #888; }\n .showcase-terminal-command { color: #f0f0f0; }\n .showcase-terminal-flag { color: #9a9aff; }\n .showcase-terminal-success { color: #4ade80; }\n .showcase-terminal-label { color: #888; }\n .showcase-terminal-value { color: #fff; }\n\n .showcase-terminal-cursor {\n display: inline-block;\n background: #f0f0f0;\n animation: showcase-cursor-blink 1s step-end infinite;\n }\n\n @keyframes showcase-cursor-blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n\n .showcase-terminal-replay-container {\n text-align: center;\n margin-top: 1.5rem;\n }\n\n .showcase-terminal-replay-btn {\n background: var(--bg);\n border: 1px solid var(--border);\n padding: 0.5rem 1rem;\n font-family: var(--font);\n font-size: 0.75rem;\n color: var(--text-muted);\n cursor: pointer;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .showcase-terminal-replay-btn:hover {\n border-color: var(--accent);\n color: var(--text);\n }\n\n /* ============ Section 4: Live Demo ============ */\n .showcase-livedemo {\n padding: 4rem 2rem;\n background: var(--bg-raised);\n border-top: 2px solid var(--border);\n border-bottom: 2px solid var(--border);\n }\n\n .showcase-livedemo-container {\n max-width: 700px;\n margin: 0 auto;\n text-align: center;\n }\n\n .showcase-livedemo-title {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n .showcase-livedemo-subtitle {\n font-size: 0.875rem;\n color: var(--text-muted);\n margin-bottom: 2.5rem;\n line-height: 1.6;\n }\n\n .showcase-livedemo-button {\n display: inline-block;\n padding: 1rem 2rem;\n font-size: 0.875rem;\n font-weight: 700;\n font-family: var(--font);\n color: #fff;\n background: var(--accent);\n border: 2px solid var(--accent);\n cursor: pointer;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n box-shadow: 4px 4px 0 var(--border-bright);\n transition: all 0.15s;\n margin-bottom: 1.5rem;\n }\n\n .showcase-livedemo-button:hover:not(:disabled) {\n transform: translate(-2px, -2px);\n box-shadow: 6px 6px 0 var(--border-bright);\n opacity: 1;\n }\n\n .showcase-livedemo-button:active:not(:disabled) {\n transform: translate(2px, 2px);\n box-shadow: 2px 2px 0 var(--border-bright);\n }\n\n .showcase-livedemo-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .showcase-livedemo-result {\n margin-top: 2rem;\n padding: 1.5rem;\n background: var(--bg);\n border: 2px solid var(--border);\n box-shadow: 4px 4px 0 var(--border-bright);\n text-align: left;\n font-size: 0.8125rem;\n line-height: 1.8;\n }\n\n .showcase-livedemo-result-line {\n opacity: 0;\n animation: showcase-livedemo-fadein 0.3s ease forwards;\n margin-bottom: 0.375rem;\n }\n\n .showcase-livedemo-result-line:nth-child(1) { animation-delay: 0ms; }\n .showcase-livedemo-result-line:nth-child(2) { animation-delay: 100ms; }\n .showcase-livedemo-result-line:nth-child(3) { animation-delay: 200ms; }\n .showcase-livedemo-result-line:nth-child(4) { animation-delay: 300ms; }\n .showcase-livedemo-result-line:nth-child(5) { animation-delay: 400ms; }\n .showcase-livedemo-result-line:nth-child(6) { animation-delay: 500ms; }\n .showcase-livedemo-result-line:nth-child(7) { animation-delay: 600ms; }\n\n @keyframes showcase-livedemo-fadein {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .showcase-livedemo-label {\n color: var(--text-dim);\n font-weight: 600;\n }\n\n .showcase-livedemo-value {\n color: var(--text);\n }\n\n .showcase-livedemo-time-fast {\n color: var(--green);\n font-weight: 700;\n }\n\n .showcase-livedemo-time-slow {\n color: var(--red);\n font-weight: 700;\n }\n\n .showcase-livedemo-status-success {\n color: var(--green);\n font-weight: 700;\n font-size: 1rem;\n }\n\n .showcase-livedemo-status-error {\n color: var(--red);\n font-weight: 700;\n }\n\n .showcase-livedemo-token {\n font-family: var(--font);\n color: var(--text-muted);\n word-break: break-all;\n font-size: 0.75rem;\n }\n\n .showcase-livedemo-counter {\n margin-top: 1rem;\n font-size: 0.75rem;\n color: var(--text-dim);\n }\n\n .showcase-livedemo-error {\n margin-top: 1.5rem;\n padding: 1rem;\n background: var(--bg);\n border: 2px solid var(--red);\n color: var(--red);\n text-align: left;\n font-size: 0.8125rem;\n }\n\n /* ============ Showcase footer ============ */\n .showcase-footer {\n max-width: 800px;\n margin: 0 auto;\n padding: 3rem 2rem 4rem;\n text-align: center;\n }\n\n .showcase-footer-cta {\n font-size: 1rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: var(--text);\n }\n\n .showcase-footer-steps {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-width: 420px;\n margin: 0 auto 2rem;\n text-align: left;\n }\n\n .showcase-footer-step {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 0.8125rem;\n padding: 0.625rem 1rem;\n background: var(--bg-raised);\n border: 1px solid var(--border);\n }\n\n .showcase-footer-step-number {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.375rem;\n height: 1.375rem;\n font-size: 0.6875rem;\n font-weight: 700;\n border: 1px solid var(--border-bright);\n color: var(--text-muted);\n flex-shrink: 0;\n }\n\n .showcase-footer-step code {\n color: var(--text);\n }\n\n .showcase-agent-prompt {\n max-width: 520px;\n margin: 2rem auto 2.5rem;\n text-align: center;\n }\n\n .showcase-agent-prompt-label {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n color: var(--text-dim);\n margin-bottom: 0.75rem;\n }\n\n .showcase-agent-prompt-card {\n display: block;\n width: 100%;\n padding: 1.25rem;\n border: 1px solid var(--border);\n background: var(--bg);\n cursor: pointer;\n font-family: var(--font);\n text-align: left;\n transition: border-color 0.15s;\n }\n\n .showcase-agent-prompt-card:hover {\n border-color: var(--accent);\n }\n\n .showcase-agent-prompt-card code {\n display: block;\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--text);\n line-height: 1.5;\n background: none;\n border: none;\n padding: 0;\n text-transform: none;\n letter-spacing: normal;\n }\n\n .showcase-agent-prompt-copy {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n margin-top: 0.75rem;\n font-size: 0.625rem;\n font-weight: 500;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.1em;\n transition: color 0.2s;\n }\n\n .showcase-agent-prompt-copy span {\n display: flex;\n }\n\n .showcase-footer-links {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.5rem;\n margin-bottom: 2rem;\n }\n\n .showcase-footer-link {\n font-size: 0.6875rem;\n color: var(--text);\n text-decoration: none;\n padding: 0.25rem 0.625rem;\n border: 1px solid var(--border-bright);\n transition: border-color 0.15s;\n }\n\n .showcase-footer-link:hover {\n border-color: var(--accent);\n opacity: 1;\n }\n\n .showcase-footer-meta {\n font-size: 0.6875rem;\n color: var(--text-dim);\n }\n\n .showcase-footer-meta a {\n color: var(--text-muted);\n text-decoration: none;\n }\n\n .showcase-footer-sep {\n margin: 0 0.375rem;\n }\n\n /* ============ Responsive ============ */\n @media (max-width: 768px) {\n .showcase-tap-hero { padding: 3rem 1rem 2rem; }\n .showcase-tap-hero-title { font-size: 1.75rem; }\n .showcase-tap-hero-features {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .showcase-hero { padding: 2rem 1rem 1rem; }\n .showcase-hero-grid {\n grid-template-columns: 1fr;\n gap: 1.5rem;\n }\n .showcase-hero-column { padding: 1.5rem; }\n .showcase-hero-title { font-size: 1.5rem; }\n .showcase-hero-visual { font-size: 0.5625rem; }\n .showcase-hero-tagline-main { font-size: 1.25rem; }\n\n .showcase-protocol-stack { padding: 3rem 1rem; }\n .showcase-stack-layer-title {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.375rem;\n font-size: 1rem;\n }\n\n .showcase-terminal-section { padding: 3rem 1rem; }\n .showcase-terminal-content { padding: 1rem; font-size: 0.75rem; height: 420px; }\n\n .showcase-livedemo { padding: 3rem 1rem; }\n\n .showcase-footer { padding: 2rem 1rem 3rem; }\n }\n\n @media (max-width: 480px) {\n .showcase-hero-visual { font-size: 0.5rem; padding: 0.75rem; }\n .showcase-hero-tagline-main { font-size: 1rem; }\n }\n";
16
16
  export declare const ShowcasePage: FC<{
17
17
  version: string;
18
+ error?: string;
18
19
  }>;
19
20
  //# sourceMappingURL=showcase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"showcase.d.ts","sourceRoot":"","sources":["../../src/dashboard/showcase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAKnC,eAAO,MAAM,YAAY,+kiBAywBxB,CAAC;AAiRF,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CA6PhD,CAAC"}
1
+ {"version":3,"file":"showcase.d.ts","sourceRoot":"","sources":["../../src/dashboard/showcase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAKnC,eAAO,MAAM,YAAY,+kiBAywBxB,CAAC;AAiRF,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA6QhE,CAAC"}
@@ -1039,8 +1039,8 @@ const BOTCHA_LOGO = `\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2
1039
1039
  \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
1040
1040
  \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`;
1041
1041
  // ============ PAGE COMPONENT ============
1042
- export const ShowcasePage = ({ version }) => {
1043
- 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("meta", { property: "og:title", content: "BOTCHA \u2014 Trusted Agent Protocol (TAP) for AI Agents" }), _jsx("meta", { property: "og:description", content: "One of the first services to support TAP. Zero-trust identity for AI agents." }), _jsx("meta", { property: "og:url", content: "https://botcha.ai" }), _jsx("meta", { property: "og:type", content: "website" }), _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: [_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 } })] }) })] }));
1042
+ export const ShowcasePage = ({ version, error }) => {
1043
+ 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("meta", { property: "og:title", content: "BOTCHA \u2014 The Identity Layer for AI Agents" }), _jsx("meta", { property: "og:description", content: "Reverse CAPTCHA \u2014 Prove you're a bot. Humans need not apply. One of the first services to support the Trusted Agent Protocol (TAP)." }), _jsx("meta", { property: "og:url", content: "https://botcha.ai" }), _jsx("meta", { property: "og:type", content: "website" }), _jsx("meta", { property: "og:image", content: "https://botcha.ai/og.png" }), _jsx("meta", { property: "og:image:width", content: "1200" }), _jsx("meta", { property: "og:image:height", content: "630" }), _jsx("meta", { property: "og:image:type", content: "image/png" }), _jsx("meta", { name: "twitter:card", content: "summary_large_image" }), _jsx("meta", { name: "twitter:title", content: "BOTCHA \u2014 The Identity Layer for AI Agents" }), _jsx("meta", { name: "twitter:description", content: "Reverse CAPTCHA \u2014 Prove you're a bot. Humans need not apply." }), _jsx("meta", { name: "twitter:image", content: "https://botcha.ai/og.png" }), _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 } })] }) })] }));
1044
1044
  };
1045
1045
  // Combined CSS: base dashboard styles (subset) + showcase-specific styles
1046
1046
  import { DASHBOARD_CSS } from './styles';
@@ -0,0 +1,14 @@
1
+ /**
2
+ * BOTCHA Whitepaper Page
3
+ *
4
+ * Serves the whitepaper at /whitepaper — long-form prose explaining
5
+ * what BOTCHA is, how it works, TAP, architecture, and use cases.
6
+ *
7
+ * Follows the ShowcasePage pattern: self-contained JSX with own
8
+ * HTML shell, inline CSS, and the shared DASHBOARD_CSS base.
9
+ */
10
+ import type { FC } from 'hono/jsx';
11
+ export declare const WhitepaperPage: FC<{
12
+ version: string;
13
+ }>;
14
+ //# sourceMappingURL=whitepaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whitepaper.d.ts","sourceRoot":"","sources":["../../src/dashboard/whitepaper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AA8XnC,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAgqBlD,CAAC"}