@nordsym/apiclaw 1.5.9 → 1.5.11

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 (109) hide show
  1. package/APILAYER_STATUS_2026-03-24.md +38 -0
  2. package/CHANGELOG-WHITELIST-V2.md +269 -0
  3. package/HIVR-INTEGRATION.md +281 -0
  4. package/HIVR-WHITELIST-STATUS.md +205 -0
  5. package/HIVR-WHITELIST.md +148 -0
  6. package/TERMINOLOGY-AUDIT.md +99 -0
  7. package/TERMINOLOGY-FIXED.md +74 -0
  8. package/VIDEO-DEMO-GUIDE.md +82 -0
  9. package/WHITELIST-ARCHITECTURE.md +379 -0
  10. package/api/discover.ts +71 -0
  11. package/api/health.ts +20 -0
  12. package/convex/http.d.ts.map +1 -1
  13. package/convex/http.js +8 -0
  14. package/convex/http.js.map +1 -1
  15. package/convex/http.ts +8 -0
  16. package/direct-test.mjs +51 -0
  17. package/dist/access-control.d.ts +45 -0
  18. package/dist/access-control.d.ts.map +1 -0
  19. package/dist/access-control.js +142 -0
  20. package/dist/access-control.js.map +1 -0
  21. package/dist/analytics.d.ts +4 -0
  22. package/dist/analytics.d.ts.map +1 -1
  23. package/dist/analytics.js +1 -0
  24. package/dist/analytics.js.map +1 -1
  25. package/dist/cli/commands/mcp-install.d.ts.map +1 -1
  26. package/dist/cli/commands/mcp-install.js +55 -40
  27. package/dist/cli/commands/mcp-install.js.map +1 -1
  28. package/dist/credentials.d.ts.map +1 -1
  29. package/dist/credentials.js +148 -0
  30. package/dist/credentials.js.map +1 -1
  31. package/dist/discovery.d.ts.map +1 -1
  32. package/dist/discovery.js +191 -82
  33. package/dist/discovery.js.map +1 -1
  34. package/dist/execute.d.ts.map +1 -1
  35. package/dist/execute.js +274 -0
  36. package/dist/execute.js.map +1 -1
  37. package/dist/hivr-whitelist.d.ts +18 -0
  38. package/dist/hivr-whitelist.d.ts.map +1 -0
  39. package/dist/hivr-whitelist.js +95 -0
  40. package/dist/hivr-whitelist.js.map +1 -0
  41. package/dist/http-api.d.ts.map +1 -1
  42. package/dist/http-api.js +17 -33
  43. package/dist/http-api.js.map +1 -1
  44. package/dist/http-server-minimal.d.ts +7 -0
  45. package/dist/http-server-minimal.d.ts.map +1 -0
  46. package/dist/http-server-minimal.js +126 -0
  47. package/dist/http-server-minimal.js.map +1 -0
  48. package/dist/product-whitelist.d.ts +37 -0
  49. package/dist/product-whitelist.d.ts.map +1 -0
  50. package/dist/product-whitelist.js +203 -0
  51. package/dist/product-whitelist.js.map +1 -0
  52. package/dist/proxy.d.ts.map +1 -1
  53. package/dist/proxy.js +1 -1
  54. package/dist/proxy.js.map +1 -1
  55. package/email-templates/README.md +104 -0
  56. package/email-templates/partnership-template.html +116 -0
  57. package/landing/next-env.d.ts +1 -0
  58. package/landing/pages/api/discover.ts +43 -0
  59. package/landing/pages/api/health.ts +20 -0
  60. package/landing/src/app/api/auth/magic-link/route.ts +1 -1
  61. package/landing/src/app/auth/verify/page.tsx +6 -0
  62. package/landing/src/app/dashboard/verify/page.tsx +6 -0
  63. package/landing/src/app/join/page.tsx +6 -0
  64. package/landing/src/app/layout.tsx +2 -2
  65. package/landing/src/app/login/page.tsx +1 -1
  66. package/landing/src/app/mou/[partnerId]/page.tsx +6 -0
  67. package/landing/src/app/page.tsx +39 -18
  68. package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +6 -0
  69. package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +5 -0
  70. package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +5 -0
  71. package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +6 -1
  72. package/landing/src/app/providers/dashboard/[apiId]/page.tsx +5 -0
  73. package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +5 -0
  74. package/landing/src/app/providers/dashboard/layout.tsx +6 -6
  75. package/landing/src/app/providers/dashboard/login/page.tsx +1 -1
  76. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  77. package/landing/src/app/providers/dashboard/verify/page.tsx +6 -0
  78. package/landing/src/app/providers/layout.tsx +1 -1
  79. package/landing/src/app/upgrade/page.tsx +6 -0
  80. package/landing/src/app/workspace/page.tsx +6 -0
  81. package/landing/src/components/HeroTabs.tsx +2 -2
  82. package/landing/src/components/VideoDemo.tsx +94 -0
  83. package/landing/src/components/{ProviderDashboard.tsx → Workspace.tsx} +2 -2
  84. package/landing/src/lib/mock-data.ts +1 -1
  85. package/landing/src/lib/stats.json +1 -1
  86. package/package.json +4 -2
  87. package/scripts/test-whitelist-v2.sh +128 -0
  88. package/src/access-control.ts +174 -0
  89. package/src/analytics.ts +5 -0
  90. package/src/cli/commands/mcp-install.ts +14 -4
  91. package/src/credentials.ts +156 -0
  92. package/src/discovery.ts +191 -82
  93. package/src/execute.ts +274 -0
  94. package/src/hivr-whitelist.ts +110 -0
  95. package/src/http-api.ts +18 -34
  96. package/src/http-server-minimal.ts +154 -0
  97. package/src/product-whitelist.ts +246 -0
  98. package/src/proxy.ts +1 -1
  99. package/test-actual-handlers.ts +92 -0
  100. package/test-apilayer-all-14.ts +249 -0
  101. package/test-apilayer-fixed.ts +248 -0
  102. package/test-direct-endpoints.ts +174 -0
  103. package/test-exact-endpoints.ts +144 -0
  104. package/test-final.ts +83 -0
  105. package/test-full-routing.ts +100 -0
  106. package/test-handlers-correct.ts +217 -0
  107. package/test-numverify-key.ts +41 -0
  108. package/test-via-handlers.ts +92 -0
  109. package/test-worldnews.mjs +26 -0
@@ -0,0 +1,205 @@
1
+ # Hivr Whitelist - Status & Verification
2
+
3
+ **Date:** 2026-03-19
4
+ **Issue:** Whitelist checking wrong field, no account attribution
5
+
6
+ ---
7
+
8
+ ## ✅ What I Fixed
9
+
10
+ ### 1. Hivr Whitelist — Field Name Mismatch
11
+
12
+ **Problem:** Both whitelist files were looking for `agentId` field, but Hivr agents have `handle`
13
+
14
+ **Files Fixed:**
15
+ - `src/hivr-whitelist.ts` — Line 60: `a.agentId` → `a.handle`
16
+ - `src/product-whitelist.ts` — Line 15: `agentIdField: 'agentId'` → `agentIdField: 'handle'`
17
+
18
+ **Result:** Whitelist will now correctly extract bee handles from Hivr Convex
19
+
20
+ ---
21
+
22
+ ## ⚠️ What's Missing: Account Attribution
23
+
24
+ **Your expectation:** All Hivr bee requests counted under `gustav@nordsym.com`
25
+
26
+ **Current reality:** Requests logged only by bee handle (`bytebee`, `elderbee`, etc.)
27
+
28
+ **Where tracking happens:**
29
+ ```typescript
30
+ // src/http-api.ts line ~94
31
+ logAPICall({
32
+ userId: agentId || 'unknown', // Just the bee handle, no account email
33
+ // ...
34
+ });
35
+ ```
36
+
37
+ **No account/email field exists in the current system.**
38
+
39
+ ---
40
+
41
+ ## 🔍 Verification Steps
42
+
43
+ ### 1. Check Whitelist Works
44
+
45
+ **Start APIClaw HTTP server:**
46
+ ```bash
47
+ cd ~/Projects/apiclaw
48
+ npm run start:http
49
+ ```
50
+
51
+ **Expected log:**
52
+ ```
53
+ [Hivr Whitelist] Fetched 12 agents from Hivr
54
+ ```
55
+
56
+ **Test authorization:**
57
+ ```bash
58
+ # Should return 200 (authorized)
59
+ curl "http://localhost:3000/api/discover?query=web&agentId=elderbee"
60
+
61
+ # Should return 403 (unauthorized)
62
+ curl "http://localhost:3000/api/discover?query=web&agentId=fakeagent"
63
+ ```
64
+
65
+ ### 2. Check Which Bees Are Whitelisted
66
+
67
+ **In APIClaw console (when server running):**
68
+ ```typescript
69
+ import { getWhitelist } from './hivr-whitelist.js';
70
+ const bees = await getWhitelist();
71
+ console.log(bees); // Should list all Hivr bee handles
72
+ ```
73
+
74
+ ---
75
+
76
+ ## 📊 Account Attribution (NOT Implemented)
77
+
78
+ **If you want gustav@nordsym.com attribution:**
79
+
80
+ ### Option A: Product Namespace (Already in place)
81
+
82
+ Current system namespaces as `hivr:bytebee`, `hivr:elderbee`
83
+
84
+ You can group by product:
85
+ ```typescript
86
+ // In analytics
87
+ const hivrRequests = logs.filter(log => log.userId.startsWith('hivr:'));
88
+ const nordsymRequests = logs.filter(log => log.userId.startsWith('nordsym:'));
89
+ ```
90
+
91
+ **Pros:** Works now with the fix
92
+ **Cons:** Still no email/account tracking
93
+
94
+ ### Option B: Add Account Field (Requires Implementation)
95
+
96
+ **Change needed:**
97
+ ```typescript
98
+ // src/http-api.ts
99
+ logAPICall({
100
+ userId: agentId,
101
+ accountEmail: 'gustav@nordsym.com', // ← Add this
102
+ product: getProduct(agentId), // Already exists
103
+ // ...
104
+ });
105
+ ```
106
+
107
+ **Pros:** Clear separation NordSym vs Hivr
108
+ **Cons:** Requires code changes + analytics schema update
109
+
110
+ ### Option C: Convex Metadata (Clean Approach)
111
+
112
+ **Store account mapping in Convex:**
113
+ ```typescript
114
+ // apiclawProviders table (already exists!)
115
+ {
116
+ agentId: "elderbee",
117
+ slug: "hivr-elderbee",
118
+ accountEmail: "gustav@nordsym.com", // ← Add this field
119
+ }
120
+ ```
121
+
122
+ **Then in APIClaw:**
123
+ ```typescript
124
+ const provider = await getProviderByAgent(agentId);
125
+ logAPICall({
126
+ userId: agentId,
127
+ accountEmail: provider?.accountEmail,
128
+ // ...
129
+ });
130
+ ```
131
+
132
+ **Pros:** Clean, uses existing infrastructure
133
+ **Cons:** Requires schema update + backfill
134
+
135
+ ---
136
+
137
+ ## 🎯 Recommendation
138
+
139
+ **Immediate (today):**
140
+ 1. ✅ Field fix deployed (handle instead of agentId)
141
+ 2. Restart APIClaw HTTP server to apply
142
+ 3. Verify whitelist works (see steps above)
143
+
144
+ **Short-term (if account attribution needed):**
145
+ - Option C (Convex metadata) is cleanest
146
+ - Add `accountEmail` to `apiclawProviders` table
147
+ - Update HTTP API to include it in logs
148
+ - **This aligns with the provider registration work already started**
149
+
150
+ ---
151
+
152
+ ## 📝 Current Whitelist Status
153
+
154
+ **Bees expected to be whitelisted after fix:**
155
+ - hivrqueen
156
+ - elderbee
157
+ - hivemind
158
+ - hivesage_hivr_bot
159
+ - buzzwriter
160
+ - analyzerbee
161
+ - buildbee
162
+ - bytebee
163
+ - reconbee
164
+ - sprintbee
165
+ - quillbee
166
+ - marketmaven
167
+
168
+ **Total:** 12 bees (all active Hivr agents)
169
+
170
+ ---
171
+
172
+ **Created:** 2026-03-19 12:20 CET
173
+ **Updated:** 2026-03-19 12:26 CET
174
+ **Status:** ✅ VERIFIED WORKING — All Hivr bees whitelisted
175
+ **Server:** Running on localhost:3001
176
+
177
+ ---
178
+
179
+ ## ✅ Verification Complete (2026-03-19 12:26)
180
+
181
+ **Issues Fixed:**
182
+ 1. Field name: `agentId` → `handle` ✓
183
+ 2. Convex HTTP response parsing: Access `.value` field ✓
184
+
185
+ **Whitelist Status:** 14 Hivr bees successfully fetched and authorized
186
+
187
+ **Tested Bees (all authorized ✓):**
188
+ - bytebee
189
+ - elderbee
190
+ - hivrqueen
191
+ - symbot
192
+ - marketmaven
193
+ - reconbee
194
+ - HiveMind_Hivr_bot
195
+ - AnalyzerBee_Hivr_bot
196
+ - Buzzwriter_Hivr_bot
197
+ - BuildBee_Hivr_bot
198
+ - HiveSage_Hivr_bot
199
+ - OutreachBee_Hivr_bot
200
+ - quillbee
201
+ - sprintbee
202
+
203
+ **Authorization Test:** Fake agents correctly blocked ✓
204
+
205
+ **Next:** Account attribution (gustav@nordsym.com) — see Option C above
@@ -0,0 +1,148 @@
1
+ # Hivr Auto-Whitelist System
2
+
3
+ **Problem:** Manually updating hardcoded whitelist every time new bee is added = fragile + easy to forget.
4
+
5
+ **Solution:** APIClaw dynamically fetches active agents from Hivr's Convex deployment.
6
+
7
+ ---
8
+
9
+ ## How It Works
10
+
11
+ 1. **Hivr Convex Deployment:** `sensible-quail-275` (PROD)
12
+ 2. **APIClaw queries:** `agents:list` from Hivr
13
+ 3. **Cache:** 5 minutes (performance)
14
+ 4. **Fallback:** Static whitelist if Convex unreachable
15
+
16
+ ---
17
+
18
+ ## Files
19
+
20
+ | File | Purpose |
21
+ |------|---------|
22
+ | `src/hivr-whitelist.ts` | Dynamic whitelist module |
23
+ | `src/http-api.ts` | Uses `isAuthorized()` from hivr-whitelist |
24
+
25
+ ---
26
+
27
+ ## Usage
28
+
29
+ ### In Code
30
+ ```typescript
31
+ import { isAuthorized, invalidateCache } from './hivr-whitelist.js';
32
+
33
+ // Check if agent is whitelisted
34
+ const authorized = await isAuthorized('bytebee'); // true
35
+
36
+ // Force refresh (after adding new bee)
37
+ invalidateCache();
38
+ ```
39
+
40
+ ### Adding New Bee (Automatic!)
41
+ 1. Add agent in Hivr (hivr.online admin)
42
+ 2. APIClaw will auto-discover within 5 minutes
43
+ 3. **No code changes needed!**
44
+
45
+ ---
46
+
47
+ ## Manual Override (Emergency)
48
+
49
+ If Hivr Convex is down, edit static fallback:
50
+
51
+ **File:** `src/hivr-whitelist.ts`
52
+ **Line:** 10-23
53
+
54
+ ```typescript
55
+ const STATIC_WHITELIST = [
56
+ 'bytebee',
57
+ 'symbot',
58
+ // Add emergency agents here
59
+ ];
60
+ ```
61
+
62
+ Then rebuild:
63
+ ```bash
64
+ npm run build
65
+ ```
66
+
67
+ ---
68
+
69
+ ## Testing
70
+
71
+ ### Local Test
72
+ ```bash
73
+ # Start APIClaw HTTP API
74
+ npm run start:http
75
+
76
+ # Test authorization
77
+ curl "http://localhost:3000/api/discover?query=web&agentId=bytebee"
78
+ # Should return 200 (authorized)
79
+
80
+ curl "http://localhost:3000/api/discover?query=web&agentId=unauthorized"
81
+ # Should return 403 (unauthorized)
82
+ ```
83
+
84
+ ### Check Whitelist Cache
85
+ APIClaw logs when fetching whitelist:
86
+ ```
87
+ [Hivr Whitelist] Fetched 12 agents from Hivr
88
+ ```
89
+
90
+ ---
91
+
92
+ ## Troubleshooting
93
+
94
+ **Problem:** New bee not authorized immediately
95
+ **Solution:** Wait 5 minutes (cache) or restart APIClaw server
96
+
97
+ **Problem:** "Failed to fetch from Hivr Convex"
98
+ **Solution:** Check Hivr Convex URL in `hivr-whitelist.ts`, fallback to static
99
+
100
+ **Problem:** All bees unauthorized
101
+ **Solution:** Check Hivr agents table has `agentId` field
102
+
103
+ ---
104
+
105
+ ## Architecture
106
+
107
+ ```
108
+ ┌─────────────────────────────────────────────┐
109
+ │ Hivr.online (sensible-quail-275) │
110
+ │ ┌───────────────────────────────────────┐ │
111
+ │ │ agents table │ │
112
+ │ │ { agentId: "bytebee", ... } │ │
113
+ │ └───────────────────────────────────────┘ │
114
+ └─────────────────────────────────────────────┘
115
+
116
+ │ Query agents:list
117
+ │ (every 5 min)
118
+
119
+ ┌─────────────────────────────────────────────┐
120
+ │ APIClaw HTTP API │
121
+ │ ┌───────────────────────────────────────┐ │
122
+ │ │ hivr-whitelist.ts │ │
123
+ │ │ - Cached whitelist │ │
124
+ │ │ - Auto-refresh every 5 min │ │
125
+ │ │ - Fallback to static list │ │
126
+ │ └───────────────────────────────────────┘ │
127
+ │ │ │
128
+ │ ┌───────────────────────────────────────┐ │
129
+ │ │ http-api.ts │ │
130
+ │ │ - /api/discover │ │
131
+ │ │ - /api/call_api │ │
132
+ │ │ - Calls isAuthorized(agentId) │ │
133
+ │ └───────────────────────────────────────┘ │
134
+ └─────────────────────────────────────────────┘
135
+ ```
136
+
137
+ ---
138
+
139
+ ## Future Improvements
140
+
141
+ - [ ] Webhook from Hivr when new agent added (instant refresh)
142
+ - [ ] Admin endpoint to manually refresh: `GET /api/admin/refresh-whitelist`
143
+ - [ ] Whitelist per-API (some bees only get certain providers)
144
+ - [ ] Usage quotas per bee (track in Convex)
145
+
146
+ ---
147
+
148
+ **TL;DR:** Add agent in Hivr → APIClaw auto-whitelists within 5 min. Zero manual code changes.
@@ -0,0 +1,99 @@
1
+ # 🔍 APIClaw Terminology Audit - "Provider Dashboard" → "Workspace"
2
+
3
+ **Goal:** Unify all dashboard terminology to "Workspace" regardless of user role.
4
+
5
+ **Principle:** ONE dashboard for ALL users. Same name: **Workspace**. Different data based on role.
6
+
7
+ ---
8
+
9
+ ## ❌ Current Issues
10
+
11
+ **Problem:** Multiple terms for the same concept:
12
+ - "Provider Dashboard" (for API providers like APILayer)
13
+ - "Workspace" (for regular users)
14
+ - Routes: `/providers/dashboard` vs `/workspace`
15
+
16
+ **Confusion:** Users/AI don't know if these are different things or the same.
17
+
18
+ ---
19
+
20
+ ## 📋 Files to Update
21
+
22
+ ### **1. Component Rename**
23
+
24
+ **File:** `src/components/ProviderDashboard.tsx`
25
+ - Rename to: `Workspace.tsx`
26
+ - Export: `ProviderDashboard` → `Workspace`
27
+
28
+ ### **2. Route Structure**
29
+
30
+ **Current:** `/providers/dashboard/*`
31
+ **Decision needed:**
32
+ - Option A: Rename to `/providers/workspace/*` (keeps separation)
33
+ - Option B: Merge into `/workspace` (unified, role-based views)
34
+
35
+ **Recommendation:** Option B - One workspace, role-based content.
36
+
37
+ ### **3. UI Text Changes (9 files)**
38
+
39
+ | File | Line | Current | Replace With |
40
+ |------|------|---------|--------------|
41
+ | `src/app/api/auth/magic-link/route.ts` | 54 | "provider dashboard" | "workspace" |
42
+ | `src/app/login/page.tsx` | 202 | "Provider Dashboard" | "Workspace" |
43
+ | `src/app/providers/dashboard/[apiId]/direct-call/page.tsx` | 448 | "provider dashboard" | "workspace" |
44
+ | `src/app/providers/dashboard/login/page.tsx` | 112 | "Provider Dashboard" | "Workspace" |
45
+ | `src/app/providers/dashboard/page.tsx` | 7 | `ProviderDashboardRedirect` | `WorkspaceRedirect` |
46
+ | `src/app/providers/layout.tsx` | 4 | "Provider Dashboard" | "Workspace" |
47
+ | `src/components/ProviderDashboard.tsx` | 79 | "Provider Dashboard" | "Workspace" |
48
+ | `src/lib/mock-data.ts` | 1 | "provider dashboard demo" | "workspace demo" |
49
+
50
+ ---
51
+
52
+ ## ✅ Acceptable "Provider" Usage
53
+
54
+ **These are OK (not confusing):**
55
+ - "API provider" (describes what someone IS, not a UI element)
56
+ - "Direct Call provider" (describes a service type)
57
+ - Technical variable names like `providerId`, `providerName` (code internals)
58
+ - "Provider" in list contexts ("Browse providers")
59
+
60
+ **Rule:** "Provider" OK when describing a ROLE or TYPE. NOT OK when naming UI elements.
61
+
62
+ ---
63
+
64
+ ## 🎯 Proposed Changes
65
+
66
+ ### Phase 1: UI Text (Quick Win)
67
+ Replace all "Provider Dashboard" → "Workspace" in user-facing text.
68
+
69
+ ### Phase 2: Component Rename
70
+ `ProviderDashboard.tsx` → `Workspace.tsx`
71
+
72
+ ### Phase 3: Route Consolidation (Optional)
73
+ Merge `/providers/dashboard` into `/workspace` with role-based rendering.
74
+
75
+ ---
76
+
77
+ ## 📝 Implementation Script
78
+
79
+ ```bash
80
+ # Find all instances (for verification)
81
+ cd ~/Projects/apiclaw/landing
82
+ grep -rn "Provider Dashboard" src/ --include="*.tsx" --include="*.ts"
83
+
84
+ # Replace in files (do manually or scripted)
85
+ # See detailed file list above
86
+ ```
87
+
88
+ ---
89
+
90
+ ## 🚀 Next Steps
91
+
92
+ 1. Review this audit
93
+ 2. Confirm approach (Phase 1-3 vs all at once)
94
+ 3. Execute changes
95
+ 4. Test routes still work
96
+ 5. Deploy
97
+
98
+ **Created:** 2026-03-24
99
+ **Status:** Ready for implementation
@@ -0,0 +1,74 @@
1
+ # ✅ Terminology Fixed - "Provider Dashboard" → "Workspace"
2
+
3
+ **Completed:** 2026-03-24 16:39
4
+
5
+ ---
6
+
7
+ ## Changes Made
8
+
9
+ ### 1. Component Renamed ✅
10
+ - `src/components/ProviderDashboard.tsx` → `Workspace.tsx`
11
+ - Export function: `ProviderDashboard()` → `Workspace()`
12
+ - Internal h1: "Provider Dashboard" → "Workspace"
13
+
14
+ ### 2. All UI Text Updated ✅
15
+
16
+ | File | Old | New |
17
+ |------|-----|-----|
18
+ | `src/app/api/auth/magic-link/route.ts` | "provider dashboard" | "workspace" |
19
+ | `src/app/login/page.tsx` | "Provider Dashboard" | "Workspace" |
20
+ | `src/app/providers/dashboard/[apiId]/direct-call/page.tsx` | "provider dashboard" | "workspace" |
21
+ | `src/app/providers/dashboard/login/page.tsx` | "Provider Dashboard" | "Workspace" |
22
+ | `src/app/providers/dashboard/page.tsx` | `ProviderDashboardRedirect` | `WorkspaceRedirect` |
23
+ | `src/app/providers/layout.tsx` | "Provider Dashboard" | "Workspace" |
24
+ | `src/lib/mock-data.ts` | "provider dashboard demo" | "workspace demo" |
25
+
26
+ ### 3. Verification ✅
27
+ ```bash
28
+ grep -rn "Provider Dashboard\|ProviderDashboard" src/
29
+ # Result: No matches found ✓
30
+ ```
31
+
32
+ ---
33
+
34
+ ## Result
35
+
36
+ **Before:**
37
+ - "Provider Dashboard" for API providers
38
+ - "Workspace" for regular users
39
+ - **Confusing:** Are these different things?
40
+
41
+ **After:**
42
+ - **"Workspace"** for EVERYONE
43
+ - Same name, different data based on role
44
+ - **Clear:** One unified dashboard concept
45
+
46
+ ---
47
+
48
+ ## Next Steps
49
+
50
+ **When ready to deploy:**
51
+ ```bash
52
+ cd ~/Projects/apiclaw/landing
53
+ npm install # if needed
54
+ npm run build
55
+ npx vercel --prod --yes
56
+ ```
57
+
58
+ **Routes still work:**
59
+ - `/workspace` → User workspace
60
+ - `/providers/dashboard` → Still routes to workspace (URL unchanged for now)
61
+ - Both show "Workspace" in UI
62
+
63
+ ---
64
+
65
+ ## No More Confusion
66
+
67
+ ✅ Users see: "Workspace"
68
+ ✅ API providers see: "Workspace"
69
+ ✅ Pratham will see: "Workspace"
70
+ ✅ AI/bots see: "Workspace"
71
+
72
+ **One term. Clear meaning. No confusion.**
73
+
74
+ 🎯 **Done.**
@@ -0,0 +1,82 @@
1
+ # 🎬 Video Demo Setup Guide
2
+
3
+ ## ✅ What's Ready
4
+
5
+ **Component created:** `landing/src/components/VideoDemo.tsx`
6
+ **Integrated:** Landing page (`landing/src/app/page.tsx`)
7
+ **Position:** Floating bubble, bottom-right corner
8
+ **Animation:** Pulse effect + hover expand
9
+
10
+ ## 📹 Tomorrow Morning - Steps
11
+
12
+ ### 1. Record with Tella
13
+ - Open Tella on Mac
14
+ - Record 2-minute demo:
15
+ - Install: `npx @nordsym/apiclaw mcp-install`
16
+ - Show workspace
17
+ - Make an API call
18
+ - Show it working
19
+ - Upload to Tella & get embed URL
20
+
21
+ ### 2. Update Component
22
+
23
+ Open: `landing/src/components/VideoDemo.tsx`
24
+
25
+ **Line 14** - Replace:
26
+ ```tsx
27
+ videoUrl = "PASTE_TELLA_URL_HERE"
28
+ ```
29
+
30
+ With your Tella embed URL (format: `https://www.tella.tv/video/...`)
31
+
32
+ ### 3. Deploy
33
+
34
+ ```bash
35
+ cd ~/Projects/apiclaw/landing
36
+ npm run build
37
+ npx vercel --prod --yes
38
+ ```
39
+
40
+ ## 🎨 Styling
41
+
42
+ **Already styled to match APIClaw design:**
43
+ - Red accent (#ef4444)
44
+ - Pulse animation
45
+ - Clean modal
46
+ - Mobile responsive
47
+ - Dark mode compatible
48
+
49
+ ## 📝 Video Content Suggestion
50
+
51
+ **0:00-0:20** - "I'm going to show you how to use APIClaw in 2 minutes"
52
+ **0:20-0:40** - Install command + MCP setup
53
+ **0:40-1:20** - Open workspace, discover APIs, make call
54
+ **1:20-1:40** - Show response, explain Direct Call
55
+ **1:40-2:00** - "That's it. No API keys needed. Go to apiclaw.cloud"
56
+
57
+ ## 🔧 Optional Customization
58
+
59
+ **Change button text:**
60
+ ```tsx
61
+ // In VideoDemo.tsx, line 28
62
+ <span>Watch Demo</span> // Change this
63
+ ```
64
+
65
+ **Change video title:**
66
+ ```tsx
67
+ // In VideoDemo.tsx, line 65
68
+ <h3>🦞 APIClaw Quick Start</h3> // Change this
69
+ ```
70
+
71
+ ## ✨ Features
72
+
73
+ - ✅ Floating button (always visible while scrolling)
74
+ - ✅ Click to open full-screen modal
75
+ - ✅ Click outside to close
76
+ - ✅ ESC key support
77
+ - ✅ Responsive (works on mobile)
78
+ - ✅ Smooth animations
79
+
80
+ ## 🚀 Ready to Go!
81
+
82
+ Just record the video and paste the URL. Everything else is done.