@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.
- package/APILAYER_STATUS_2026-03-24.md +38 -0
- package/CHANGELOG-WHITELIST-V2.md +269 -0
- package/HIVR-INTEGRATION.md +281 -0
- package/HIVR-WHITELIST-STATUS.md +205 -0
- package/HIVR-WHITELIST.md +148 -0
- package/TERMINOLOGY-AUDIT.md +99 -0
- package/TERMINOLOGY-FIXED.md +74 -0
- package/VIDEO-DEMO-GUIDE.md +82 -0
- package/WHITELIST-ARCHITECTURE.md +379 -0
- package/api/discover.ts +71 -0
- package/api/health.ts +20 -0
- package/convex/http.d.ts.map +1 -1
- package/convex/http.js +8 -0
- package/convex/http.js.map +1 -1
- package/convex/http.ts +8 -0
- package/direct-test.mjs +51 -0
- package/dist/access-control.d.ts +45 -0
- package/dist/access-control.d.ts.map +1 -0
- package/dist/access-control.js +142 -0
- package/dist/access-control.js.map +1 -0
- package/dist/analytics.d.ts +4 -0
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +1 -0
- package/dist/analytics.js.map +1 -1
- 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 +148 -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 +274 -0
- package/dist/execute.js.map +1 -1
- package/dist/hivr-whitelist.d.ts +18 -0
- package/dist/hivr-whitelist.d.ts.map +1 -0
- package/dist/hivr-whitelist.js +95 -0
- package/dist/hivr-whitelist.js.map +1 -0
- package/dist/http-api.d.ts.map +1 -1
- package/dist/http-api.js +17 -33
- package/dist/http-api.js.map +1 -1
- package/dist/http-server-minimal.d.ts +7 -0
- package/dist/http-server-minimal.d.ts.map +1 -0
- package/dist/http-server-minimal.js +126 -0
- package/dist/http-server-minimal.js.map +1 -0
- package/dist/product-whitelist.d.ts +37 -0
- package/dist/product-whitelist.d.ts.map +1 -0
- package/dist/product-whitelist.js +203 -0
- package/dist/product-whitelist.js.map +1 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +1 -1
- package/dist/proxy.js.map +1 -1
- package/email-templates/README.md +104 -0
- package/email-templates/partnership-template.html +116 -0
- package/landing/next-env.d.ts +1 -0
- package/landing/pages/api/discover.ts +43 -0
- package/landing/pages/api/health.ts +20 -0
- package/landing/src/app/api/auth/magic-link/route.ts +1 -1
- package/landing/src/app/auth/verify/page.tsx +6 -0
- package/landing/src/app/dashboard/verify/page.tsx +6 -0
- package/landing/src/app/join/page.tsx +6 -0
- 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 +6 -0
- package/landing/src/app/page.tsx +39 -18
- package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +6 -0
- package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +5 -0
- package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +5 -0
- package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +6 -1
- package/landing/src/app/providers/dashboard/[apiId]/page.tsx +5 -0
- package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +5 -0
- 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 +6 -0
- package/landing/src/app/providers/layout.tsx +1 -1
- package/landing/src/app/upgrade/page.tsx +6 -0
- package/landing/src/app/workspace/page.tsx +6 -0
- 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 +4 -2
- package/scripts/test-whitelist-v2.sh +128 -0
- package/src/access-control.ts +174 -0
- package/src/analytics.ts +5 -0
- package/src/cli/commands/mcp-install.ts +14 -4
- package/src/credentials.ts +156 -0
- package/src/discovery.ts +191 -82
- package/src/execute.ts +274 -0
- package/src/hivr-whitelist.ts +110 -0
- package/src/http-api.ts +18 -34
- package/src/http-server-minimal.ts +154 -0
- package/src/product-whitelist.ts +246 -0
- package/src/proxy.ts +1 -1
- 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,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.
|