@nordsym/apiclaw 1.5.16 → 1.5.18
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/convex/http.js +196 -0
- package/convex/http.js.map +1 -1
- package/convex/http.ts +201 -0
- package/convex/http.ts.bak +934 -0
- package/dist/analytics.d.ts +0 -4
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +0 -1
- package/dist/analytics.js.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/cli/commands/mcp-install.d.ts.map +1 -1
- package/dist/cli/commands/mcp-install.js +8 -87
- package/dist/cli/commands/mcp-install.js.map +1 -1
- package/dist/cli/index.js +0 -7
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +0 -128
- package/dist/credentials.js.map +1 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +82 -191
- package/dist/discovery.js.map +1 -1
- package/dist/http-api.d.ts.map +1 -1
- package/dist/http-api.js +33 -17
- package/dist/http-api.js.map +1 -1
- package/dist/proxy.js +1 -1
- package/dist/proxy.js.map +1 -1
- package/landing/next-env.d.ts +0 -1
- package/landing/src/app/api/auth/magic-link/route.ts +1 -1
- package/landing/src/app/auth/verify/page.tsx +0 -6
- package/landing/src/app/dashboard/verify/page.tsx +0 -6
- package/landing/src/app/join/page.tsx +0 -6
- package/landing/src/app/layout.tsx +2 -2
- package/landing/src/app/login/page.tsx +1 -1
- package/landing/src/app/mou/[partnerId]/page.tsx +0 -6
- package/landing/src/app/page.tsx +18 -39
- package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +0 -6
- package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +0 -5
- package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +0 -5
- package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +1 -6
- package/landing/src/app/providers/dashboard/[apiId]/page.tsx +0 -5
- package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +0 -5
- package/landing/src/app/providers/dashboard/layout.tsx +6 -6
- 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/dashboard/verify/page.tsx +0 -6
- package/landing/src/app/providers/layout.tsx +1 -1
- package/landing/src/app/upgrade/page.tsx +0 -6
- package/landing/src/app/workspace/page.tsx +0 -6
- package/landing/src/components/HeroTabs.tsx +2 -2
- package/landing/src/components/{Workspace.tsx → ProviderDashboard.tsx} +2 -2
- package/landing/src/components/VideoDemo.tsx +10 -21
- package/landing/src/lib/mock-data.ts +1 -1
- package/landing/src/lib/stats.json +1 -1
- package/package.json +4 -6
- package/src/analytics.ts +0 -5
- package/src/bin.ts +1 -1
- package/src/cli/commands/mcp-install.ts +8 -90
- package/src/cli/index.ts +0 -8
- package/src/credentials.ts +0 -136
- package/src/discovery.ts +82 -191
- package/src/http-api.ts +34 -18
- package/src/proxy.ts +1 -1
- package/APILAYER_STATUS_2026-03-24.md +0 -38
- package/CHANGELOG-WHITELIST-V2.md +0 -269
- package/HIVR-WHITELIST-STATUS.md +0 -205
- package/HIVR-WHITELIST.md +0 -148
- package/TERMINOLOGY-AUDIT.md +0 -99
- package/TERMINOLOGY-FIXED.md +0 -74
- package/VIDEO-DEMO-GUIDE.md +0 -82
- package/WHITELIST-ARCHITECTURE.md +0 -379
- package/api/discover.ts +0 -71
- package/api/health.ts +0 -20
- package/direct-test.mjs +0 -51
- package/dist/access-control.d.ts +0 -45
- package/dist/access-control.d.ts.map +0 -1
- package/dist/access-control.js +0 -142
- package/dist/access-control.js.map +0 -1
- package/dist/chain-types.d.ts +0 -187
- package/dist/chain-types.d.ts.map +0 -1
- package/dist/chain-types.js +0 -33
- package/dist/chain-types.js.map +0 -1
- package/dist/convex/adminActivate.js +0 -46
- package/dist/convex/adminStats.js +0 -41
- package/dist/convex/agents.js +0 -498
- package/dist/convex/analytics.js +0 -165
- package/dist/convex/billing.js +0 -654
- package/dist/convex/capabilities.js +0 -144
- package/dist/convex/chains.js +0 -1041
- package/dist/convex/credits.js +0 -185
- package/dist/convex/crons.js +0 -16
- package/dist/convex/directCall.js +0 -626
- package/dist/convex/earnProgress.js +0 -648
- package/dist/convex/email.js +0 -299
- package/dist/convex/feedback.js +0 -226
- package/dist/convex/http.js +0 -909
- package/dist/convex/logs.js +0 -486
- package/dist/convex/mou.js +0 -81
- package/dist/convex/providerKeys.js +0 -256
- package/dist/convex/providers.js +0 -755
- package/dist/convex/purchases.js +0 -156
- package/dist/convex/ratelimit.js +0 -90
- package/dist/convex/schema.js +0 -709
- package/dist/convex/searchLogs.js +0 -128
- package/dist/convex/spendAlerts.js +0 -379
- package/dist/convex/stripeActions.js +0 -410
- package/dist/convex/teams.js +0 -214
- package/dist/convex/telemetry.js +0 -73
- package/dist/convex/usage.js +0 -228
- package/dist/convex/waitlist.js +0 -48
- package/dist/convex/webhooks.js +0 -409
- package/dist/convex/workspaces.js +0 -879
- package/dist/hivr-whitelist.d.ts +0 -18
- package/dist/hivr-whitelist.d.ts.map +0 -1
- package/dist/hivr-whitelist.js +0 -95
- package/dist/hivr-whitelist.js.map +0 -1
- package/dist/http-server-minimal.d.ts +0 -7
- package/dist/http-server-minimal.d.ts.map +0 -1
- package/dist/http-server-minimal.js +0 -126
- package/dist/http-server-minimal.js.map +0 -1
- package/dist/product-whitelist.d.ts +0 -37
- package/dist/product-whitelist.d.ts.map +0 -1
- package/dist/product-whitelist.js +0 -203
- package/dist/product-whitelist.js.map +0 -1
- package/dist/src/analytics.js +0 -129
- package/dist/src/bin.js +0 -17
- package/dist/src/capability-router.js +0 -240
- package/dist/src/chainExecutor.js +0 -451
- package/dist/src/chainResolver.js +0 -518
- package/dist/src/cli/commands/doctor.js +0 -324
- package/dist/src/cli/commands/mcp-install.js +0 -255
- package/dist/src/cli/commands/restore.js +0 -259
- package/dist/src/cli/commands/setup.js +0 -205
- package/dist/src/cli/commands/uninstall.js +0 -188
- package/dist/src/cli/index.js +0 -111
- package/dist/src/cli.js +0 -302
- package/dist/src/confirmation.js +0 -240
- package/dist/src/credentials.js +0 -357
- package/dist/src/credits.js +0 -260
- package/dist/src/crypto.js +0 -66
- package/dist/src/discovery.js +0 -504
- package/dist/src/enterprise/env.js +0 -123
- package/dist/src/enterprise/script-generator.js +0 -460
- package/dist/src/execute-dynamic.js +0 -473
- package/dist/src/execute.js +0 -1727
- package/dist/src/index.js +0 -2062
- package/dist/src/metered.js +0 -80
- package/dist/src/open-apis.js +0 -276
- package/dist/src/proxy.js +0 -28
- package/dist/src/session.js +0 -86
- package/dist/src/stripe.js +0 -407
- package/dist/src/telemetry.js +0 -49
- package/dist/src/types.js +0 -2
- package/dist/src/utils/backup.js +0 -181
- package/dist/src/utils/config.js +0 -220
- package/dist/src/utils/os.js +0 -105
- package/dist/src/utils/paths.js +0 -159
- package/landing/pages/api/discover.ts +0 -43
- package/landing/pages/api/health.ts +0 -20
- package/scripts/test-whitelist-v2.sh +0 -128
- package/src/access-control.ts +0 -174
- package/src/hivr-whitelist.ts +0 -110
- package/src/http-server-minimal.ts +0 -154
- package/src/product-whitelist.ts +0 -246
- package/test-actual-handlers.ts +0 -92
- package/test-apilayer-all-14.ts +0 -249
- package/test-apilayer-fixed.ts +0 -248
- package/test-direct-endpoints.ts +0 -174
- package/test-exact-endpoints.ts +0 -144
- package/test-final.ts +0 -83
- package/test-full-routing.ts +0 -100
- package/test-handlers-correct.ts +0 -217
- package/test-numverify-key.ts +0 -41
- package/test-via-handlers.ts +0 -92
- package/test-worldnews.mjs +0 -26
package/landing/src/app/page.tsx
CHANGED
|
@@ -12,12 +12,11 @@ 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";
|
|
16
15
|
|
|
17
16
|
const stats = [
|
|
18
17
|
{ number: statsData.apiCount.toLocaleString(), label: "APIs Indexed", live: true },
|
|
19
18
|
{ number: statsData.openApiCount.toLocaleString(), label: "Open APIs", live: true },
|
|
20
|
-
{ number: "19", label: "Direct Call", live: false },
|
|
19
|
+
{ number: statsData.directCallCount?.toString() || "19", label: "Direct Call", live: false },
|
|
21
20
|
{ number: (statsData.npmDownloads || 4232).toLocaleString(), label: "Installs", live: false },
|
|
22
21
|
{ number: statsData.categoryCount.toString(), label: "Categories", live: false },
|
|
23
22
|
];
|
|
@@ -147,7 +146,6 @@ const terminalLines = [
|
|
|
147
146
|
const directCallProviders = [
|
|
148
147
|
{ name: "Replicate", desc: "1000+ ML models" },
|
|
149
148
|
{ name: "OpenRouter", desc: "100+ LLMs" },
|
|
150
|
-
{ name: "APILayer", desc: "14 APIs" },
|
|
151
149
|
{ name: "Firecrawl", desc: "Web scraping" },
|
|
152
150
|
{ name: "E2B", desc: "Code sandbox" },
|
|
153
151
|
{ name: "GitHub", desc: "Repos & Issues" },
|
|
@@ -172,23 +170,22 @@ export default function Home() {
|
|
|
172
170
|
const [waitlistEmail, setWaitlistEmail] = useState("");
|
|
173
171
|
const [waitlistStatus, setWaitlistStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
|
|
174
172
|
|
|
175
|
-
const directCallProviders
|
|
176
|
-
//
|
|
177
|
-
{ name: "
|
|
178
|
-
{ name: "
|
|
179
|
-
{ name: "OpenRouter", desc: "GPT-4, Claude, Llama, Gemini, 100+ LLMs", category: "Multi-API", apis: 100 },
|
|
180
|
-
// Single-purpose
|
|
173
|
+
const directCallProviders = [
|
|
174
|
+
// Original 10
|
|
175
|
+
{ name: "Replicate", desc: "Whisper, Stable Diffusion, 1000+ ML models", category: "AI & LLM" },
|
|
176
|
+
{ name: "OpenRouter", desc: "GPT-4, Claude, Llama, 100+ LLMs", category: "AI & LLM" },
|
|
181
177
|
{ name: "ElevenLabs", desc: "Text-to-speech in 29 languages", category: "Voice & TTS" },
|
|
182
|
-
{ name: "
|
|
183
|
-
{ name: "
|
|
184
|
-
{ name: "
|
|
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" },
|
|
185
181
|
{ name: "Brave Search", desc: "Privacy-focused web search", category: "Search" },
|
|
186
|
-
{ name: "
|
|
182
|
+
{ name: "Firecrawl", desc: "Web scraping to LLM-ready markdown", category: "Search" },
|
|
187
183
|
{ name: "E2B", desc: "Secure cloud sandboxes for code execution", category: "Code Execution" },
|
|
188
184
|
{ name: "GitHub", desc: "Repos, issues, PRs, and more", category: "Developer Tools" },
|
|
189
|
-
|
|
190
|
-
{ name: "
|
|
191
|
-
{ name: "
|
|
185
|
+
// New 8
|
|
186
|
+
{ name: "Groq", desc: "Ultra-fast LLM inference", category: "AI & LLM" },
|
|
187
|
+
{ name: "Deepgram", desc: "Speech-to-text transcription", category: "Voice & TTS" },
|
|
188
|
+
{ name: "Serper", desc: "Google search API for AI", category: "Search" },
|
|
192
189
|
{ name: "Mistral", desc: "Open-weight LLMs from Mistral AI", category: "AI & LLM" },
|
|
193
190
|
{ name: "Cohere", desc: "Enterprise NLP and embeddings", category: "AI & LLM" },
|
|
194
191
|
{ name: "Together AI", desc: "Open-source model inference", category: "AI & LLM" },
|
|
@@ -220,7 +217,6 @@ Voice: ElevenLabs, Deepgram, AssemblyAI
|
|
|
220
217
|
Search: Brave Search, Serper, Firecrawl
|
|
221
218
|
Code: E2B, GitHub
|
|
222
219
|
Utility: Resend (email), 46elks & Twilio (SMS)
|
|
223
|
-
Multi-API: APILayer (exchange rates, stocks, aviation, PDF, screenshots, verification, VAT, news, scraping — 14 APIs)
|
|
224
220
|
|
|
225
221
|
Your Tools:
|
|
226
222
|
• call_api(provider, action, params) – Execute immediately (leave auth fields empty – APIClaw handles it)
|
|
@@ -591,26 +587,12 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
591
587
|
<p className="text-text-muted mb-4">These APIs work through APIClaw's proxy. Your agent calls them without needing API keys.</p>
|
|
592
588
|
<div className="space-y-3">
|
|
593
589
|
{directCallProviders.map((provider, i) => (
|
|
594
|
-
<div key={i} className=
|
|
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
|
-
}`}>
|
|
590
|
+
<div key={i} className="flex items-center justify-between p-3 rounded-xl bg-surface border border-border">
|
|
601
591
|
<div>
|
|
602
|
-
<div className="
|
|
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>
|
|
592
|
+
<div className="font-medium">{provider.name}</div>
|
|
611
593
|
<div className="text-sm text-text-muted">{provider.desc}</div>
|
|
612
594
|
</div>
|
|
613
|
-
<span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent
|
|
595
|
+
<span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent">{provider.category}</span>
|
|
614
596
|
</div>
|
|
615
597
|
))}
|
|
616
598
|
</div>
|
|
@@ -1047,7 +1029,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
1047
1029
|
</li>
|
|
1048
1030
|
<li className="flex items-start gap-3 text-text-secondary text-sm">
|
|
1049
1031
|
<Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
|
|
1050
|
-
|
|
1032
|
+
18 Direct Call providers
|
|
1051
1033
|
</li>
|
|
1052
1034
|
<li className="flex items-start gap-3 text-text-secondary text-sm">
|
|
1053
1035
|
<Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
|
|
@@ -1162,7 +1144,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
1162
1144
|
},
|
|
1163
1145
|
{
|
|
1164
1146
|
q: "How do I add my API?",
|
|
1165
|
-
a: "Go to
|
|
1147
|
+
a: "Go to the Provider Dashboard, 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 the dashboard too."
|
|
1166
1148
|
},
|
|
1167
1149
|
{
|
|
1168
1150
|
q: "What's MCP?",
|
|
@@ -1345,9 +1327,6 @@ Docs: https://apiclaw.nordsym.com/docs`;
|
|
|
1345
1327
|
</div>
|
|
1346
1328
|
</div>
|
|
1347
1329
|
)}
|
|
1348
|
-
|
|
1349
|
-
{/* Video Demo Bubble - Always visible */}
|
|
1350
|
-
<VideoDemo />
|
|
1351
1330
|
</main>
|
|
1352
1331
|
);
|
|
1353
1332
|
}
|
|
@@ -47,12 +47,6 @@ const PARAM_LOCATIONS = ["body", "query", "path"] as const;
|
|
|
47
47
|
export default function EditActionPage() {
|
|
48
48
|
const params = useParams();
|
|
49
49
|
const router = useRouter();
|
|
50
|
-
|
|
51
|
-
// Handle null params
|
|
52
|
-
if (!params || !params.apiId || !params.actionId) {
|
|
53
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
50
|
const apiId = params.apiId as string;
|
|
57
51
|
const actionId = params.actionId as string;
|
|
58
52
|
|
|
@@ -45,11 +45,6 @@ const PARAM_LOCATIONS = ["body", "query", "path"] as const;
|
|
|
45
45
|
|
|
46
46
|
export default function NewActionPage() {
|
|
47
47
|
const params = useParams();
|
|
48
|
-
|
|
49
|
-
// Handle null params
|
|
50
|
-
if (!params || !params.apiId) {
|
|
51
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
52
|
-
}
|
|
53
48
|
const router = useRouter();
|
|
54
49
|
const apiId = params.apiId as string;
|
|
55
50
|
|
|
@@ -41,11 +41,6 @@ const CONVEX_URL = process.env.NEXT_PUBLIC_CONVEX_URL || 'https://brilliant-puff
|
|
|
41
41
|
|
|
42
42
|
export default function ActionsPage() {
|
|
43
43
|
const params = useParams();
|
|
44
|
-
|
|
45
|
-
// Handle null params
|
|
46
|
-
if (!params || !params.apiId) {
|
|
47
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
48
|
-
}
|
|
49
44
|
const router = useRouter();
|
|
50
45
|
const apiId = params.apiId as string;
|
|
51
46
|
|
|
@@ -50,11 +50,6 @@ const authTypes = [
|
|
|
50
50
|
|
|
51
51
|
export default function DirectCallSetupPage() {
|
|
52
52
|
const params = useParams();
|
|
53
|
-
|
|
54
|
-
// Handle null params
|
|
55
|
-
if (!params || !params.apiId) {
|
|
56
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
57
|
-
}
|
|
58
53
|
const router = useRouter();
|
|
59
54
|
const apiId = params.apiId as string;
|
|
60
55
|
|
|
@@ -445,7 +440,7 @@ export default function DirectCallSetupPage() {
|
|
|
445
440
|
<label className="block text-sm font-medium mb-2">Service Account Key</label>
|
|
446
441
|
<p className="text-xs text-text-muted mb-3">
|
|
447
442
|
The API key APIClaw uses to make requests on behalf of your users.
|
|
448
|
-
This is typically a privileged key from your
|
|
443
|
+
This is typically a privileged key from your provider dashboard.
|
|
449
444
|
</p>
|
|
450
445
|
<div className="relative">
|
|
451
446
|
<Key className="absolute left-4 top-1/2 -translate-y-1/2 w-5 h-5 text-text-muted" />
|
|
@@ -32,11 +32,6 @@ interface DirectCallConfig {
|
|
|
32
32
|
|
|
33
33
|
export default function ApiOverviewPage() {
|
|
34
34
|
const params = useParams();
|
|
35
|
-
|
|
36
|
-
// Handle null params
|
|
37
|
-
if (!params || !params.apiId) {
|
|
38
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
39
|
-
}
|
|
40
35
|
const router = useRouter();
|
|
41
36
|
const apiId = params.apiId as string;
|
|
42
37
|
|
|
@@ -61,11 +61,6 @@ const methodColors: Record<string, string> = {
|
|
|
61
61
|
|
|
62
62
|
export default function TestConsolePage() {
|
|
63
63
|
const params = useParams();
|
|
64
|
-
|
|
65
|
-
// Handle null params
|
|
66
|
-
if (!params || !params.apiId) {
|
|
67
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
68
|
-
}
|
|
69
64
|
const router = useRouter();
|
|
70
65
|
const apiId = params.apiId as string;
|
|
71
66
|
|
|
@@ -80,12 +80,12 @@ export default function DashboardLayout({
|
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
// Check if current route is API detail page
|
|
83
|
-
const apiIdMatch = pathname
|
|
83
|
+
const apiIdMatch = pathname.match(/\/providers\/dashboard\/([^/]+)/);
|
|
84
84
|
const currentApiId = apiIdMatch ? apiIdMatch[1] : null;
|
|
85
85
|
const isApiDetailPage = currentApiId && currentApiId !== "login" && currentApiId !== "verify";
|
|
86
86
|
|
|
87
87
|
// Don't show layout for login/verify pages
|
|
88
|
-
if (pathname
|
|
88
|
+
if (pathname.includes("/login") || pathname.includes("/verify")) {
|
|
89
89
|
return <>{children}</>;
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -167,7 +167,7 @@ export default function DashboardLayout({
|
|
|
167
167
|
key={item.label}
|
|
168
168
|
href={item.href}
|
|
169
169
|
className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
|
|
170
|
-
(item.exact ? pathname === item.href : pathname
|
|
170
|
+
(item.exact ? pathname === item.href : pathname.startsWith(item.href.split('?')[0])) && !isApiDetailPage
|
|
171
171
|
? "bg-accent text-white"
|
|
172
172
|
: "text-text-secondary hover:bg-surface hover:text-text-primary"
|
|
173
173
|
}`}
|
|
@@ -200,7 +200,7 @@ export default function DashboardLayout({
|
|
|
200
200
|
<Link
|
|
201
201
|
href={`/providers/dashboard/${currentApiId}/direct-call`}
|
|
202
202
|
className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
|
|
203
|
-
pathname
|
|
203
|
+
pathname.includes("/direct-call")
|
|
204
204
|
? "bg-accent text-white"
|
|
205
205
|
: "text-text-secondary hover:bg-surface hover:text-text-primary"
|
|
206
206
|
}`}
|
|
@@ -212,7 +212,7 @@ export default function DashboardLayout({
|
|
|
212
212
|
<Link
|
|
213
213
|
href={`/providers/dashboard/${currentApiId}/actions`}
|
|
214
214
|
className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
|
|
215
|
-
pathname
|
|
215
|
+
pathname.includes("/actions")
|
|
216
216
|
? "bg-accent text-white"
|
|
217
217
|
: "text-text-secondary hover:bg-surface hover:text-text-primary"
|
|
218
218
|
}`}
|
|
@@ -224,7 +224,7 @@ export default function DashboardLayout({
|
|
|
224
224
|
<Link
|
|
225
225
|
href={`/providers/dashboard/${currentApiId}/test`}
|
|
226
226
|
className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
|
|
227
|
-
pathname
|
|
227
|
+
pathname.includes("/test")
|
|
228
228
|
? "bg-accent text-white"
|
|
229
229
|
: "text-text-secondary hover:bg-surface hover:text-text-primary"
|
|
230
230
|
}`}
|
|
@@ -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">Provider Dashboard</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 ProviderDashboardRedirect() {
|
|
8
8
|
const router = useRouter();
|
|
9
9
|
|
|
10
10
|
useEffect(() => {
|
|
@@ -8,12 +8,6 @@ import Link from "next/link";
|
|
|
8
8
|
function VerifyContent() {
|
|
9
9
|
const router = useRouter();
|
|
10
10
|
const searchParams = useSearchParams();
|
|
11
|
-
|
|
12
|
-
// Handle null searchParams
|
|
13
|
-
if (!searchParams) {
|
|
14
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
11
|
const token = searchParams.get("token");
|
|
18
12
|
|
|
19
13
|
const [status, setStatus] = useState<"verifying" | "success" | "error">("verifying");
|
|
@@ -40,12 +40,6 @@ async function actionConvex<T>(path: string, args: Record<string, unknown>): Pro
|
|
|
40
40
|
function UpgradeContent() {
|
|
41
41
|
const searchParams = useSearchParams();
|
|
42
42
|
const router = useRouter();
|
|
43
|
-
|
|
44
|
-
// Handle null searchParams
|
|
45
|
-
if (!searchParams) {
|
|
46
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
43
|
const workspaceId = searchParams.get("ws");
|
|
50
44
|
const success = searchParams.get("success");
|
|
51
45
|
|
|
@@ -184,12 +184,6 @@ function generatePreviewAnalytics(): ProviderAnalytics {
|
|
|
184
184
|
export default function WorkspacePage() {
|
|
185
185
|
const router = useRouter();
|
|
186
186
|
const searchParams = useSearchParams();
|
|
187
|
-
|
|
188
|
-
// Handle null searchParams
|
|
189
|
-
if (!searchParams) {
|
|
190
|
-
return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
187
|
const tabFromUrl = searchParams.get("tab") as TabType | null;
|
|
194
188
|
const subFromUrl = searchParams.get("sub") as AnalyticsSubtab | null;
|
|
195
189
|
|
|
@@ -179,10 +179,10 @@ export function HeroTabs() {
|
|
|
179
179
|
</ul>
|
|
180
180
|
|
|
181
181
|
<a
|
|
182
|
-
href="/
|
|
182
|
+
href="/providers/dashboard"
|
|
183
183
|
className="btn-primary w-full justify-center"
|
|
184
184
|
>
|
|
185
|
-
Open
|
|
185
|
+
Open Provider Dashboard
|
|
186
186
|
<ArrowRight className="w-4 h-4" />
|
|
187
187
|
</a>
|
|
188
188
|
</div>
|
|
@@ -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 ProviderDashboard() {
|
|
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 Workspace() {
|
|
|
76
76
|
🦞
|
|
77
77
|
</div>
|
|
78
78
|
<div>
|
|
79
|
-
<h1 className="font-bold text-lg">
|
|
79
|
+
<h1 className="font-bold text-lg">Provider Dashboard</h1>
|
|
80
80
|
<p className="text-sm text-text-muted">{provider.company || provider.email}</p>
|
|
81
81
|
</div>
|
|
82
82
|
</div>
|
|
@@ -4,16 +4,15 @@ import { useState } from "react";
|
|
|
4
4
|
import { Play, X } from "lucide-react";
|
|
5
5
|
|
|
6
6
|
interface VideoDemoProps {
|
|
7
|
-
videoUrl?: string;
|
|
8
|
-
thumbnailUrl?: string;
|
|
7
|
+
videoUrl?: string;
|
|
8
|
+
thumbnailUrl?: string;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export function VideoDemo({
|
|
12
|
-
videoUrl = "
|
|
12
|
+
videoUrl = "https://firebasestorage.googleapis.com/v0/b/nordsym-funnel.firebasestorage.app/o/Getting%20Started%20with%20API%20Claw.mp4?alt=media&token=5982c20f-d97c-4b36-9ef1-4795f9347068",
|
|
13
13
|
thumbnailUrl
|
|
14
14
|
}: VideoDemoProps) {
|
|
15
15
|
const [isOpen, setIsOpen] = useState(false);
|
|
16
|
-
const isVideoReady = videoUrl !== "PASTE_TELLA_URL_HERE" && videoUrl.startsWith("http");
|
|
17
16
|
|
|
18
17
|
return (
|
|
19
18
|
<>
|
|
@@ -58,23 +57,13 @@ export function VideoDemo({
|
|
|
58
57
|
|
|
59
58
|
{/* Video container - 16:9 aspect ratio */}
|
|
60
59
|
<div className="relative w-full" style={{ paddingBottom: '56.25%' }}>
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
)}
|
|
60
|
+
<video
|
|
61
|
+
src={videoUrl}
|
|
62
|
+
className="absolute inset-0 w-full h-full"
|
|
63
|
+
controls
|
|
64
|
+
autoPlay
|
|
65
|
+
preload="auto"
|
|
66
|
+
/>
|
|
78
67
|
</div>
|
|
79
68
|
|
|
80
69
|
{/* Video info */}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nordsym/apiclaw",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.18",
|
|
4
4
|
"description": "The API layer for AI agents. Dashboard + 22K APIs + 18 Direct Call providers. MCP native.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
"build": "tsc && cp -r src/registry dist/",
|
|
17
17
|
"dev": "tsx watch src/index.ts",
|
|
18
18
|
"start": "node dist/index.js",
|
|
19
|
-
"start:http": "tsx src/http-server-minimal.ts",
|
|
20
19
|
"test": "tsx src/test.ts",
|
|
21
20
|
"test:e2e": "tsx src/test.ts",
|
|
22
21
|
"webhook": "tsx src/webhook.ts",
|
|
@@ -67,7 +66,7 @@
|
|
|
67
66
|
"@types/inquirer": "^9.0.9",
|
|
68
67
|
"chalk": "^5.6.2",
|
|
69
68
|
"commander": "^14.0.3",
|
|
70
|
-
"convex": "^1.
|
|
69
|
+
"convex": "^1.32.0",
|
|
71
70
|
"dotenv": "^17.3.1",
|
|
72
71
|
"fs-extra": "^11.3.3",
|
|
73
72
|
"hono": "^4.0.0",
|
|
@@ -78,12 +77,11 @@
|
|
|
78
77
|
"devDependencies": {
|
|
79
78
|
"@types/fs-extra": "^11.0.4",
|
|
80
79
|
"@types/node": "^20.10.0",
|
|
81
|
-
"@vercel/node": "^5.6.16",
|
|
82
80
|
"tsx": "^4.7.0",
|
|
83
|
-
"typescript": "^5.3
|
|
81
|
+
"typescript": "^5.9.3"
|
|
84
82
|
},
|
|
85
83
|
"bin": {
|
|
86
84
|
"apiclaw": "./dist/bin.js",
|
|
87
85
|
"apiclaw-http": "./dist/bin-http.js"
|
|
88
86
|
}
|
|
89
|
-
}
|
|
87
|
+
}
|
package/src/analytics.ts
CHANGED
|
@@ -18,10 +18,6 @@ export interface APICallLog {
|
|
|
18
18
|
success: boolean;
|
|
19
19
|
latencyMs?: number;
|
|
20
20
|
error?: string;
|
|
21
|
-
metadata?: {
|
|
22
|
-
product?: string;
|
|
23
|
-
[key: string]: any;
|
|
24
|
-
};
|
|
25
21
|
}
|
|
26
22
|
|
|
27
23
|
// Log directory
|
|
@@ -90,7 +86,6 @@ async function sendToConvex(log: APICallLog): Promise<void> {
|
|
|
90
86
|
latencyMs: log.latencyMs,
|
|
91
87
|
error: log.error,
|
|
92
88
|
timestamp: log.timestamp,
|
|
93
|
-
...log.metadata, // Include product and any other metadata
|
|
94
89
|
},
|
|
95
90
|
});
|
|
96
91
|
} catch (e) {
|
package/src/bin.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - setup/doctor/restore/uninstall → Run CLI
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
const cliCommands = ['setup', 'mcp-install', '
|
|
9
|
+
const cliCommands = ['setup', 'mcp-install', 'doctor', 'restore', 'uninstall', 'help', '--help', '-h', '--version', '-V'];
|
|
10
10
|
|
|
11
11
|
const firstArg = process.argv[2];
|
|
12
12
|
|