@nordsym/apiclaw 1.5.10 ā 1.5.12
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/APILAYER_STATUS_2026-03-24.md +38 -0
- package/TERMINOLOGY-AUDIT.md +99 -0
- package/TERMINOLOGY-FIXED.md +74 -0
- package/VIDEO-DEMO-GUIDE.md +82 -0
- package/direct-test.mjs +51 -0
- package/dist/cli/commands/mcp-install.d.ts.map +1 -1
- package/dist/cli/commands/mcp-install.js +55 -40
- package/dist/cli/commands/mcp-install.js.map +1 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +128 -0
- package/dist/credentials.js.map +1 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +191 -82
- package/dist/discovery.js.map +1 -1
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +53 -24
- package/dist/execute.js.map +1 -1
- package/email-templates/README.md +104 -0
- package/email-templates/partnership-template.html +116 -0
- package/landing/src/app/api/auth/magic-link/route.ts +1 -1
- package/landing/src/app/layout.tsx +2 -2
- package/landing/src/app/login/page.tsx +1 -1
- package/landing/src/app/page.tsx +39 -18
- package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +1 -1
- package/landing/src/app/providers/dashboard/login/page.tsx +1 -1
- package/landing/src/app/providers/dashboard/page.tsx +1 -1
- package/landing/src/app/providers/layout.tsx +1 -1
- package/landing/src/components/HeroTabs.tsx +2 -2
- package/landing/src/components/VideoDemo.tsx +94 -0
- package/landing/src/components/{ProviderDashboard.tsx ā Workspace.tsx} +2 -2
- package/landing/src/lib/mock-data.ts +1 -1
- package/landing/src/lib/stats.json +1 -1
- package/package.json +1 -1
- package/src/cli/commands/mcp-install.ts +14 -4
- package/src/credentials.ts +136 -0
- package/src/discovery.ts +191 -82
- package/src/execute.ts +49 -22
- package/test-actual-handlers.ts +92 -0
- package/test-apilayer-all-14.ts +249 -0
- package/test-apilayer-fixed.ts +248 -0
- package/test-direct-endpoints.ts +174 -0
- package/test-exact-endpoints.ts +144 -0
- package/test-final.ts +83 -0
- package/test-full-routing.ts +100 -0
- package/test-handlers-correct.ts +217 -0
- package/test-numverify-key.ts +41 -0
- package/test-via-handlers.ts +92 -0
- package/test-worldnews.mjs +26 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>APIClaw Email Template</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body style="margin: 0; padding: 0; background-color: #fafafa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;">
|
|
9
|
+
<table width="100%" cellpadding="0" cellspacing="0" style="background-color: #fafafa; padding: 40px 20px;">
|
|
10
|
+
<tr>
|
|
11
|
+
<td align="center">
|
|
12
|
+
<!-- Main container -->
|
|
13
|
+
<table width="600" cellpadding="0" cellspacing="0" style="background-color: #ffffff; border-radius: 16px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); overflow: hidden; border: 1px solid #e5e7eb;">
|
|
14
|
+
|
|
15
|
+
<!-- Header -->
|
|
16
|
+
<tr>
|
|
17
|
+
<td style="background-color: #ffffff; border-bottom: 1px solid #e5e7eb; padding: 32px; text-align: center;">
|
|
18
|
+
<div style="font-size: 28px; font-weight: bold; color: #ef4444; margin-bottom: 16px;">š¦ APIClaw</div>
|
|
19
|
+
<h1 style="margin: 0; font-size: 24px; font-weight: bold; color: #1a1a1a;">{{EMAIL_TITLE}}</h1>
|
|
20
|
+
<p style="margin: 4px 0 0 0; color: #6b7280; font-size: 14px;">{{EMAIL_SUBTITLE}}</p>
|
|
21
|
+
<div style="height: 4px; width: 80px; background-color: #ef4444; margin: 16px auto 0; border-radius: 2px;"></div>
|
|
22
|
+
</td>
|
|
23
|
+
</tr>
|
|
24
|
+
|
|
25
|
+
<!-- Content -->
|
|
26
|
+
<tr>
|
|
27
|
+
<td style="padding: 32px;">
|
|
28
|
+
<!-- Greeting -->
|
|
29
|
+
<p style="margin: 0 0 20px 0; color: #1a1a1a; font-size: 16px; line-height: 1.6;">
|
|
30
|
+
{{GREETING}}
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
<!-- Intro paragraph -->
|
|
34
|
+
<p style="margin: 0 0 20px 0; color: #4b5563; font-size: 16px; line-height: 1.6;">
|
|
35
|
+
{{INTRO_TEXT}}
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
<!-- Section 1 -->
|
|
39
|
+
<div style="margin: 24px 0;">
|
|
40
|
+
<h2 style="margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: #ef4444; border-bottom: 2px solid #f3f4f6; padding-bottom: 8px;">
|
|
41
|
+
{{SECTION_1_TITLE}}
|
|
42
|
+
</h2>
|
|
43
|
+
{{SECTION_1_CONTENT}}
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<!-- Highlight Box (optional) -->
|
|
47
|
+
<div style="margin: 24px 0; background-color: #fef2f2; border-left: 4px solid #ef4444; padding: 16px; border-radius: 8px;">
|
|
48
|
+
<h3 style="margin: 0 0 8px 0; font-size: 16px; font-weight: 600; color: #ef4444;">
|
|
49
|
+
{{HIGHLIGHT_TITLE}}
|
|
50
|
+
</h3>
|
|
51
|
+
<p style="margin: 0; color: #4b5563; font-size: 14px; line-height: 1.6;">
|
|
52
|
+
{{HIGHLIGHT_TEXT}}
|
|
53
|
+
</p>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<!-- Section 2 -->
|
|
57
|
+
<div style="margin: 24px 0;">
|
|
58
|
+
<h2 style="margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: #ef4444; border-bottom: 2px solid #f3f4f6; padding-bottom: 8px;">
|
|
59
|
+
{{SECTION_2_TITLE}}
|
|
60
|
+
</h2>
|
|
61
|
+
{{SECTION_2_CONTENT}}
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<!-- Code/Technical Block (optional) -->
|
|
65
|
+
<div style="background-color: #f9fafb; padding: 16px; border-radius: 8px; font-family: 'Courier New', monospace; font-size: 13px; color: #374151; line-height: 1.6;">
|
|
66
|
+
{{CODE_BLOCK}}
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<!-- CTA Button -->
|
|
70
|
+
<div style="text-align: center; margin: 32px 0;">
|
|
71
|
+
<a href="{{CTA_LINK}}" style="display: inline-block; background-color: #ef4444; color: #ffffff; text-decoration: none; padding: 14px 32px; border-radius: 8px; font-weight: 600; font-size: 16px; box-shadow: 0 2px 4px rgba(239, 68, 68, 0.2);">
|
|
72
|
+
{{CTA_TEXT}}
|
|
73
|
+
</a>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<!-- Closing -->
|
|
77
|
+
<p style="margin: 24px 0 0 0; color: #4b5563; font-size: 16px; line-height: 1.6;">
|
|
78
|
+
{{CLOSING_TEXT}}
|
|
79
|
+
</p>
|
|
80
|
+
|
|
81
|
+
<!-- Signature -->
|
|
82
|
+
<p style="margin: 20px 0 0 0; color: #4b5563; font-size: 16px; line-height: 1.6;">
|
|
83
|
+
Best,<br>
|
|
84
|
+
<strong style="color: #1a1a1a;">Gustav Hemmingsson</strong><br>
|
|
85
|
+
<span style="color: #6b7280; font-size: 14px;">CEO, NordSym AB</span>
|
|
86
|
+
</p>
|
|
87
|
+
</td>
|
|
88
|
+
</tr>
|
|
89
|
+
|
|
90
|
+
<!-- Footer -->
|
|
91
|
+
<tr>
|
|
92
|
+
<td style="background-color: #f9fafb; border-top: 1px solid #e5e7eb; padding: 24px; text-align: center;">
|
|
93
|
+
<p style="margin: 0 0 8px 0; color: #6b7280; font-size: 13px;">
|
|
94
|
+
{{FOOTER_TEXT}}
|
|
95
|
+
</p>
|
|
96
|
+
<p style="margin: 0; color: #9ca3af; font-size: 12px;">
|
|
97
|
+
Questions? Contact <a href="mailto:gustav@nordsym.com" style="color: #ef4444; text-decoration: none;">gustav@nordsym.com</a>
|
|
98
|
+
</p>
|
|
99
|
+
</td>
|
|
100
|
+
</tr>
|
|
101
|
+
|
|
102
|
+
</table>
|
|
103
|
+
|
|
104
|
+
<!-- Signature -->
|
|
105
|
+
<div style="margin-top: 32px; text-align: center; color: #9ca3af; font-size: 12px;">
|
|
106
|
+
<p style="margin: 0;">NordSym AB (559535-5768) ⢠Sweden</p>
|
|
107
|
+
<p style="margin: 4px 0 0 0;">
|
|
108
|
+
<a href="https://apiclaw.nordsym.com" style="color: #ef4444; text-decoration: none;">apiclaw.nordsym.com</a> ā¢
|
|
109
|
+
<a href="https://github.com/nordsym/apiclaw" style="color: #ef4444; text-decoration: none;">GitHub</a>
|
|
110
|
+
</p>
|
|
111
|
+
</div>
|
|
112
|
+
</td>
|
|
113
|
+
</tr>
|
|
114
|
+
</table>
|
|
115
|
+
</body>
|
|
116
|
+
</html>
|
|
@@ -51,7 +51,7 @@ export async function POST(req: NextRequest) {
|
|
|
51
51
|
</div>
|
|
52
52
|
|
|
53
53
|
<p style="color: #525252; font-size: 16px; line-height: 1.6; text-align: center;">
|
|
54
|
-
Click the button below to sign in to your
|
|
54
|
+
Click the button below to sign in to your workspace.
|
|
55
55
|
</p>
|
|
56
56
|
|
|
57
57
|
<div style="text-align: center; margin: 32px 0;">
|
|
@@ -51,7 +51,7 @@ const schemaOrg = {
|
|
|
51
51
|
"@type": "WebSite",
|
|
52
52
|
"name": "APIClaw",
|
|
53
53
|
"url": "https://apiclaw.nordsym.com",
|
|
54
|
-
"description": "Your agent's API encyclopedia. Search by capability, call instantly. 22,392 APIs indexed ⢠1,636 Open APIs ā¢
|
|
54
|
+
"description": "Your agent's API encyclopedia. Search by capability, call instantly. 22,392 APIs indexed ⢠1,636 Open APIs ⢠19 Direct Call ⢠MCP native"
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"@type": "Organization",
|
|
@@ -63,7 +63,7 @@ const schemaOrg = {
|
|
|
63
63
|
"name": "APIClaw",
|
|
64
64
|
"applicationCategory": "DeveloperApplication",
|
|
65
65
|
"operatingSystem": "Web",
|
|
66
|
-
"description": "The API layer for AI agents. 22,392 APIs indexed, 1,636 Open APIs,
|
|
66
|
+
"description": "The API layer for AI agents. 22,392 APIs indexed, 1,636 Open APIs, 19 Direct Call providers. MCP native.",
|
|
67
67
|
"offers": {
|
|
68
68
|
"@type": "Offer",
|
|
69
69
|
"price": "0",
|
|
@@ -199,7 +199,7 @@ export default function LoginPage() {
|
|
|
199
199
|
<p className="text-sm text-[var(--text-muted)]">
|
|
200
200
|
Are you an API provider?{" "}
|
|
201
201
|
<Link href="/providers/dashboard/login" className="text-accent hover:underline">
|
|
202
|
-
|
|
202
|
+
Workspace
|
|
203
203
|
</Link>
|
|
204
204
|
</p>
|
|
205
205
|
</div>
|
package/landing/src/app/page.tsx
CHANGED
|
@@ -12,11 +12,12 @@ import { useState, useEffect, useRef } from "react";
|
|
|
12
12
|
import { HeroTabs } from "@/components/HeroTabs";
|
|
13
13
|
import { PhoneDemo } from "@/components/demo";
|
|
14
14
|
import { AITestimonials } from "@/components/AITestimonials";
|
|
15
|
+
import { VideoDemo } from "@/components/VideoDemo";
|
|
15
16
|
|
|
16
17
|
const stats = [
|
|
17
18
|
{ number: statsData.apiCount.toLocaleString(), label: "APIs Indexed", live: true },
|
|
18
19
|
{ number: statsData.openApiCount.toLocaleString(), label: "Open APIs", live: true },
|
|
19
|
-
{ number:
|
|
20
|
+
{ number: "19", label: "Direct Call", live: false },
|
|
20
21
|
{ number: (statsData.npmDownloads || 4232).toLocaleString(), label: "Installs", live: false },
|
|
21
22
|
{ number: statsData.categoryCount.toString(), label: "Categories", live: false },
|
|
22
23
|
];
|
|
@@ -146,6 +147,7 @@ const terminalLines = [
|
|
|
146
147
|
const directCallProviders = [
|
|
147
148
|
{ name: "Replicate", desc: "1000+ ML models" },
|
|
148
149
|
{ name: "OpenRouter", desc: "100+ LLMs" },
|
|
150
|
+
{ name: "APILayer", desc: "14 APIs" },
|
|
149
151
|
{ name: "Firecrawl", desc: "Web scraping" },
|
|
150
152
|
{ name: "E2B", desc: "Code sandbox" },
|
|
151
153
|
{ name: "GitHub", desc: "Repos & Issues" },
|
|
@@ -170,22 +172,23 @@ export default function Home() {
|
|
|
170
172
|
const [waitlistEmail, setWaitlistEmail] = useState("");
|
|
171
173
|
const [waitlistStatus, setWaitlistStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
|
|
172
174
|
|
|
173
|
-
const directCallProviders = [
|
|
174
|
-
//
|
|
175
|
-
{ name: "
|
|
176
|
-
{ name: "
|
|
175
|
+
const directCallProviders: Array<{ name: string; desc: string; category: string; featured?: boolean; apis?: number }> = [
|
|
176
|
+
// Multi-API providers (top)
|
|
177
|
+
{ name: "APILayer", desc: "Exchange rates, stocks, aviation, PDF, screenshots, email/phone verification, VAT, news, scraping", category: "Multi-API", apis: 14 },
|
|
178
|
+
{ name: "Replicate", desc: "Whisper, Stable Diffusion, Flux, Luma, 1000+ ML models", category: "Multi-API", apis: 1000 },
|
|
179
|
+
{ name: "OpenRouter", desc: "GPT-4, Claude, Llama, Gemini, 100+ LLMs", category: "Multi-API", apis: 100 },
|
|
180
|
+
// Single-purpose
|
|
177
181
|
{ name: "ElevenLabs", desc: "Text-to-speech in 29 languages", category: "Voice & TTS" },
|
|
178
|
-
{ name: "46elks", desc: "SMS in Sweden and globally", category: "SMS & Messaging" },
|
|
179
|
-
{ name: "Twilio", desc: "Enterprise SMS and voice", category: "SMS & Messaging" },
|
|
180
|
-
{ name: "Resend", desc: "Modern email API for developers", category: "Email" },
|
|
181
|
-
{ name: "Brave Search", desc: "Privacy-focused web search", category: "Search" },
|
|
182
|
-
{ name: "Firecrawl", desc: "Web scraping to LLM-ready markdown", category: "Search" },
|
|
183
|
-
{ name: "E2B", desc: "Secure cloud sandboxes for code execution", category: "Code Execution" },
|
|
184
|
-
{ name: "GitHub", desc: "Repos, issues, PRs, and more", category: "Developer Tools" },
|
|
185
|
-
// New 8
|
|
186
182
|
{ name: "Groq", desc: "Ultra-fast LLM inference", category: "AI & LLM" },
|
|
187
183
|
{ name: "Deepgram", desc: "Speech-to-text transcription", category: "Voice & TTS" },
|
|
184
|
+
{ name: "Firecrawl", desc: "Web scraping to LLM-ready markdown", category: "Search" },
|
|
185
|
+
{ name: "Brave Search", desc: "Privacy-focused web search", category: "Search" },
|
|
188
186
|
{ name: "Serper", desc: "Google search API for AI", category: "Search" },
|
|
187
|
+
{ name: "E2B", desc: "Secure cloud sandboxes for code execution", category: "Code Execution" },
|
|
188
|
+
{ name: "GitHub", desc: "Repos, issues, PRs, and more", category: "Developer Tools" },
|
|
189
|
+
{ name: "Resend", desc: "Modern email API for developers", category: "Email" },
|
|
190
|
+
{ name: "46elks", desc: "SMS in Sweden and globally", category: "SMS & Messaging" },
|
|
191
|
+
{ name: "Twilio", desc: "Enterprise SMS and voice", category: "SMS & Messaging" },
|
|
189
192
|
{ name: "Mistral", desc: "Open-weight LLMs from Mistral AI", category: "AI & LLM" },
|
|
190
193
|
{ name: "Cohere", desc: "Enterprise NLP and embeddings", category: "AI & LLM" },
|
|
191
194
|
{ name: "Together AI", desc: "Open-source model inference", category: "AI & LLM" },
|
|
@@ -217,6 +220,7 @@ Voice: ElevenLabs, Deepgram, AssemblyAI
|
|
|
217
220
|
Search: Brave Search, Serper, Firecrawl
|
|
218
221
|
Code: E2B, GitHub
|
|
219
222
|
Utility: Resend (email), 46elks & Twilio (SMS)
|
|
223
|
+
Multi-API: APILayer (exchange rates, stocks, aviation, PDF, screenshots, verification, VAT, news, scraping ā 14 APIs)
|
|
220
224
|
|
|
221
225
|
Your Tools:
|
|
222
226
|
⢠call_api(provider, action, params) ā Execute immediately (leave auth fields empty ā APIClaw handles it)
|
|
@@ -587,12 +591,26 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
587
591
|
<p className="text-text-muted mb-4">These APIs work through APIClaw's proxy. Your agent calls them without needing API keys.</p>
|
|
588
592
|
<div className="space-y-3">
|
|
589
593
|
{directCallProviders.map((provider, i) => (
|
|
590
|
-
<div key={i} className=
|
|
594
|
+
<div key={i} className={`flex items-center justify-between p-3 rounded-xl border transition-all ${
|
|
595
|
+
provider.featured
|
|
596
|
+
? 'bg-gradient-to-r from-accent/5 to-purple-500/5 border-accent/30 hover:border-accent/50 hover:shadow-[0_0_20px_rgba(0,212,255,0.08)]'
|
|
597
|
+
: provider.apis
|
|
598
|
+
? 'bg-surface border-border/80'
|
|
599
|
+
: 'bg-surface border-border'
|
|
600
|
+
}`}>
|
|
591
601
|
<div>
|
|
592
|
-
<div className="
|
|
602
|
+
<div className="flex items-center gap-2">
|
|
603
|
+
<span className="font-medium">{provider.name}</span>
|
|
604
|
+
{provider.featured && (
|
|
605
|
+
<span className="text-[10px] font-bold uppercase tracking-wider px-1.5 py-0.5 rounded bg-accent/20 text-accent">Partner</span>
|
|
606
|
+
)}
|
|
607
|
+
{provider.apis && (
|
|
608
|
+
<span className="text-[10px] font-medium px-1.5 py-0.5 rounded bg-purple-500/20 text-purple-400">{provider.apis >= 1000 ? `${Math.floor(provider.apis/1000)}k+` : `${provider.apis}`} APIs</span>
|
|
609
|
+
)}
|
|
610
|
+
</div>
|
|
593
611
|
<div className="text-sm text-text-muted">{provider.desc}</div>
|
|
594
612
|
</div>
|
|
595
|
-
<span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent">{provider.category}</span>
|
|
613
|
+
<span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent flex-shrink-0 ml-3">{provider.category}</span>
|
|
596
614
|
</div>
|
|
597
615
|
))}
|
|
598
616
|
</div>
|
|
@@ -1029,7 +1047,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
1029
1047
|
</li>
|
|
1030
1048
|
<li className="flex items-start gap-3 text-text-secondary text-sm">
|
|
1031
1049
|
<Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
|
|
1032
|
-
|
|
1050
|
+
19 Direct Call providers
|
|
1033
1051
|
</li>
|
|
1034
1052
|
<li className="flex items-start gap-3 text-text-secondary text-sm">
|
|
1035
1053
|
<Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
|
|
@@ -1144,7 +1162,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
1144
1162
|
},
|
|
1145
1163
|
{
|
|
1146
1164
|
q: "How do I add my API?",
|
|
1147
|
-
a: "Go to
|
|
1165
|
+
a: "Go to your Workspace, sign up with your email, and follow the self-service onboarding. Your API will be discoverable by AI agents immediately. Want to become a Direct Call partner? Set that up in your Workspace too."
|
|
1148
1166
|
},
|
|
1149
1167
|
{
|
|
1150
1168
|
q: "What's MCP?",
|
|
@@ -1327,6 +1345,9 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
1327
1345
|
</div>
|
|
1328
1346
|
</div>
|
|
1329
1347
|
)}
|
|
1348
|
+
|
|
1349
|
+
{/* Video Demo Bubble - Always visible */}
|
|
1350
|
+
<VideoDemo />
|
|
1330
1351
|
</main>
|
|
1331
1352
|
);
|
|
1332
1353
|
}
|
|
@@ -445,7 +445,7 @@ export default function DirectCallSetupPage() {
|
|
|
445
445
|
<label className="block text-sm font-medium mb-2">Service Account Key</label>
|
|
446
446
|
<p className="text-xs text-text-muted mb-3">
|
|
447
447
|
The API key APIClaw uses to make requests on behalf of your users.
|
|
448
|
-
This is typically a privileged key from your
|
|
448
|
+
This is typically a privileged key from your workspace.
|
|
449
449
|
</p>
|
|
450
450
|
<div className="relative">
|
|
451
451
|
<Key className="absolute left-4 top-1/2 -translate-y-1/2 w-5 h-5 text-text-muted" />
|
|
@@ -109,7 +109,7 @@ export default function LoginPage() {
|
|
|
109
109
|
<div className="pt-32 pb-24 px-6">
|
|
110
110
|
<div className="max-w-md mx-auto">
|
|
111
111
|
<div className="text-center mb-8">
|
|
112
|
-
<h1 className="text-3xl font-bold mb-2">
|
|
112
|
+
<h1 className="text-3xl font-bold mb-2">Workspace</h1>
|
|
113
113
|
<p className="text-text-secondary">
|
|
114
114
|
Sign in to manage your APIs and view analytics
|
|
115
115
|
</p>
|
|
@@ -4,7 +4,7 @@ import { useEffect } from "react";
|
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
5
|
import { Loader2 } from "lucide-react";
|
|
6
6
|
|
|
7
|
-
export default function
|
|
7
|
+
export default function WorkspaceRedirect() {
|
|
8
8
|
const router = useRouter();
|
|
9
9
|
|
|
10
10
|
useEffect(() => {
|
|
@@ -179,10 +179,10 @@ export function HeroTabs() {
|
|
|
179
179
|
</ul>
|
|
180
180
|
|
|
181
181
|
<a
|
|
182
|
-
href="/
|
|
182
|
+
href="/workspace"
|
|
183
183
|
className="btn-primary w-full justify-center"
|
|
184
184
|
>
|
|
185
|
-
Open
|
|
185
|
+
Open Workspace
|
|
186
186
|
<ArrowRight className="w-4 h-4" />
|
|
187
187
|
</a>
|
|
188
188
|
</div>
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Play, X } from "lucide-react";
|
|
5
|
+
|
|
6
|
+
interface VideoDemoProps {
|
|
7
|
+
videoUrl?: string; // Tella embed URL
|
|
8
|
+
thumbnailUrl?: string; // Optional custom thumbnail
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function VideoDemo({
|
|
12
|
+
videoUrl = "PASTE_TELLA_URL_HERE",
|
|
13
|
+
thumbnailUrl
|
|
14
|
+
}: VideoDemoProps) {
|
|
15
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
16
|
+
const isVideoReady = videoUrl !== "PASTE_TELLA_URL_HERE" && videoUrl.startsWith("http");
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
{/* Floating Video Button - Bottom Right */}
|
|
21
|
+
<button
|
|
22
|
+
onClick={() => setIsOpen(true)}
|
|
23
|
+
className="fixed bottom-8 right-8 z-40 group"
|
|
24
|
+
aria-label="Watch demo video"
|
|
25
|
+
>
|
|
26
|
+
<div className="relative">
|
|
27
|
+
{/* Pulse animation */}
|
|
28
|
+
<div className="absolute inset-0 bg-[#ef4444] rounded-full opacity-75 animate-ping" />
|
|
29
|
+
|
|
30
|
+
{/* Main button */}
|
|
31
|
+
<div className="relative bg-[#ef4444] hover:bg-[#dc2626] text-white rounded-full p-4 shadow-lg transition-all duration-200 flex items-center gap-3 pr-6">
|
|
32
|
+
<Play className="w-6 h-6 fill-white" />
|
|
33
|
+
<span className="font-medium text-sm whitespace-nowrap">
|
|
34
|
+
Watch Demo
|
|
35
|
+
</span>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</button>
|
|
39
|
+
|
|
40
|
+
{/* Video Modal */}
|
|
41
|
+
{isOpen && (
|
|
42
|
+
<div
|
|
43
|
+
className="fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm p-4"
|
|
44
|
+
onClick={() => setIsOpen(false)}
|
|
45
|
+
>
|
|
46
|
+
<div
|
|
47
|
+
className="relative w-full max-w-4xl bg-[var(--background)] rounded-2xl shadow-2xl overflow-hidden"
|
|
48
|
+
onClick={(e) => e.stopPropagation()}
|
|
49
|
+
>
|
|
50
|
+
{/* Close button */}
|
|
51
|
+
<button
|
|
52
|
+
onClick={() => setIsOpen(false)}
|
|
53
|
+
className="absolute top-4 right-4 z-10 bg-black/50 hover:bg-black/70 text-white rounded-full p-2 transition-colors"
|
|
54
|
+
aria-label="Close video"
|
|
55
|
+
>
|
|
56
|
+
<X className="w-5 h-5" />
|
|
57
|
+
</button>
|
|
58
|
+
|
|
59
|
+
{/* Video container - 16:9 aspect ratio */}
|
|
60
|
+
<div className="relative w-full" style={{ paddingBottom: '56.25%' }}>
|
|
61
|
+
{isVideoReady ? (
|
|
62
|
+
<iframe
|
|
63
|
+
src={videoUrl}
|
|
64
|
+
className="absolute inset-0 w-full h-full"
|
|
65
|
+
frameBorder="0"
|
|
66
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
67
|
+
allowFullScreen
|
|
68
|
+
/>
|
|
69
|
+
) : (
|
|
70
|
+
<div className="absolute inset-0 flex items-center justify-center bg-gradient-to-br from-[#0f172a] to-[#1e293b]">
|
|
71
|
+
<div className="text-center">
|
|
72
|
+
<Play className="w-16 h-16 mx-auto mb-4 text-[#ef4444]" />
|
|
73
|
+
<h3 className="text-2xl font-bold text-white mb-2">Coming Soon</h3>
|
|
74
|
+
<p className="text-[#94a3b8]">Demo video will be available shortly</p>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
)}
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
{/* Video info */}
|
|
81
|
+
<div className="p-6 border-t border-[var(--border)]">
|
|
82
|
+
<h3 className="text-lg font-semibold text-[var(--text)] mb-2">
|
|
83
|
+
š¦ APIClaw Quick Start
|
|
84
|
+
</h3>
|
|
85
|
+
<p className="text-sm text-[var(--text-muted)]">
|
|
86
|
+
Install and use APIClaw in under 2 minutes
|
|
87
|
+
</p>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
)}
|
|
92
|
+
</>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
@@ -50,7 +50,7 @@ type TabType = "overview" | "apis" | "earnings";
|
|
|
50
50
|
|
|
51
51
|
const COLORS = ["#ef4444", "#f97316", "#eab308", "#22c55e", "#3b82f6"];
|
|
52
52
|
|
|
53
|
-
export function
|
|
53
|
+
export function Workspace() {
|
|
54
54
|
const [activeTab, setActiveTab] = useState<TabType>("overview");
|
|
55
55
|
const [period, setPeriod] = useState<"week" | "month" | "all">("month");
|
|
56
56
|
const [selectedApi, setSelectedApi] = useState<string | null>(null);
|
|
@@ -76,7 +76,7 @@ export function ProviderDashboard() {
|
|
|
76
76
|
š¦
|
|
77
77
|
</div>
|
|
78
78
|
<div>
|
|
79
|
-
<h1 className="font-bold text-lg">
|
|
79
|
+
<h1 className="font-bold text-lg">Workspace</h1>
|
|
80
80
|
<p className="text-sm text-text-muted">{provider.company || provider.email}</p>
|
|
81
81
|
</div>
|
|
82
82
|
</div>
|
package/package.json
CHANGED
|
@@ -275,13 +275,23 @@ export async function mcpInstallCommand(options: MCPInstallOptions): Promise<voi
|
|
|
275
275
|
console.log(chalk.cyan('\nā
Dry run complete! Run without --dry-run to apply changes.\n'));
|
|
276
276
|
} else if (successCount > 0) {
|
|
277
277
|
console.log(chalk.green('\nā
APIClaw installed successfully!\n'));
|
|
278
|
-
console.log('
|
|
279
|
-
console.log('
|
|
280
|
-
console.log('
|
|
278
|
+
console.log(chalk.bold('What you get:\n'));
|
|
279
|
+
console.log(chalk.cyan(' š Search') + ' 22,000+ APIs indexed');
|
|
280
|
+
console.log(chalk.cyan(' š Open APIs') + ' 1,600 APIs - no keys needed');
|
|
281
|
+
console.log(chalk.cyan(' š Direct Call') + ' 1,500+ endpoints - no keys needed');
|
|
281
282
|
console.log('');
|
|
282
|
-
console.log('
|
|
283
|
+
console.log('Next:');
|
|
284
|
+
console.log(' 1. Restart your MCP client');
|
|
285
|
+
console.log(' 2. Try: "Find weather APIs"');
|
|
286
|
+
console.log('');
|
|
287
|
+
console.log('Docs: https://apiclaw.com/docs\n');
|
|
283
288
|
} else {
|
|
284
289
|
console.log(chalk.yellow('\nā
APIClaw already installed in all clients.\n'));
|
|
290
|
+
console.log(chalk.bold('What you have:\n'));
|
|
291
|
+
console.log(chalk.cyan(' š Search') + ' 22,000+ APIs indexed');
|
|
292
|
+
console.log(chalk.cyan(' š Open APIs') + ' 1,600 APIs - no keys needed');
|
|
293
|
+
console.log(chalk.cyan(' š Direct Call') + ' 1,500+ endpoints - no keys needed');
|
|
294
|
+
console.log('');
|
|
285
295
|
console.log('Run with --force to reinstall (coming soon).\n');
|
|
286
296
|
}
|
|
287
297
|
} else {
|