@nordsym/apiclaw 1.5.9 → 1.5.10

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 (72) hide show
  1. package/CHANGELOG-WHITELIST-V2.md +269 -0
  2. package/HIVR-INTEGRATION.md +281 -0
  3. package/HIVR-WHITELIST-STATUS.md +205 -0
  4. package/HIVR-WHITELIST.md +148 -0
  5. package/WHITELIST-ARCHITECTURE.md +379 -0
  6. package/api/discover.ts +71 -0
  7. package/api/health.ts +20 -0
  8. package/convex/http.d.ts.map +1 -1
  9. package/convex/http.js +8 -0
  10. package/convex/http.js.map +1 -1
  11. package/convex/http.ts +8 -0
  12. package/dist/access-control.d.ts +45 -0
  13. package/dist/access-control.d.ts.map +1 -0
  14. package/dist/access-control.js +142 -0
  15. package/dist/access-control.js.map +1 -0
  16. package/dist/analytics.d.ts +4 -0
  17. package/dist/analytics.d.ts.map +1 -1
  18. package/dist/analytics.js +1 -0
  19. package/dist/analytics.js.map +1 -1
  20. package/dist/credentials.d.ts.map +1 -1
  21. package/dist/credentials.js +20 -0
  22. package/dist/credentials.js.map +1 -1
  23. package/dist/execute.d.ts.map +1 -1
  24. package/dist/execute.js +245 -0
  25. package/dist/execute.js.map +1 -1
  26. package/dist/hivr-whitelist.d.ts +18 -0
  27. package/dist/hivr-whitelist.d.ts.map +1 -0
  28. package/dist/hivr-whitelist.js +95 -0
  29. package/dist/hivr-whitelist.js.map +1 -0
  30. package/dist/http-api.d.ts.map +1 -1
  31. package/dist/http-api.js +17 -33
  32. package/dist/http-api.js.map +1 -1
  33. package/dist/http-server-minimal.d.ts +7 -0
  34. package/dist/http-server-minimal.d.ts.map +1 -0
  35. package/dist/http-server-minimal.js +126 -0
  36. package/dist/http-server-minimal.js.map +1 -0
  37. package/dist/product-whitelist.d.ts +37 -0
  38. package/dist/product-whitelist.d.ts.map +1 -0
  39. package/dist/product-whitelist.js +203 -0
  40. package/dist/product-whitelist.js.map +1 -0
  41. package/dist/proxy.d.ts.map +1 -1
  42. package/dist/proxy.js +1 -1
  43. package/dist/proxy.js.map +1 -1
  44. package/landing/next-env.d.ts +1 -0
  45. package/landing/pages/api/discover.ts +43 -0
  46. package/landing/pages/api/health.ts +20 -0
  47. package/landing/src/app/auth/verify/page.tsx +6 -0
  48. package/landing/src/app/dashboard/verify/page.tsx +6 -0
  49. package/landing/src/app/join/page.tsx +6 -0
  50. package/landing/src/app/mou/[partnerId]/page.tsx +6 -0
  51. package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +6 -0
  52. package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +5 -0
  53. package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +5 -0
  54. package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +5 -0
  55. package/landing/src/app/providers/dashboard/[apiId]/page.tsx +5 -0
  56. package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +5 -0
  57. package/landing/src/app/providers/dashboard/layout.tsx +6 -6
  58. package/landing/src/app/providers/dashboard/verify/page.tsx +6 -0
  59. package/landing/src/app/upgrade/page.tsx +6 -0
  60. package/landing/src/app/workspace/page.tsx +6 -0
  61. package/landing/src/lib/stats.json +1 -1
  62. package/package.json +4 -2
  63. package/scripts/test-whitelist-v2.sh +128 -0
  64. package/src/access-control.ts +174 -0
  65. package/src/analytics.ts +5 -0
  66. package/src/credentials.ts +20 -0
  67. package/src/execute.ts +247 -0
  68. package/src/hivr-whitelist.ts +110 -0
  69. package/src/http-api.ts +18 -34
  70. package/src/http-server-minimal.ts +154 -0
  71. package/src/product-whitelist.ts +246 -0
  72. package/src/proxy.ts +1 -1
@@ -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.