@nordsym/apiclaw 1.0.0

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 (79) hide show
  1. package/.github/ISSUE_TEMPLATE/add-api.yml +123 -0
  2. package/BRIEFING.md +30 -0
  3. package/CONCEPT.md +494 -0
  4. package/README.md +272 -0
  5. package/backend/convex/README.md +90 -0
  6. package/backend/convex/_generated/api.d.ts +55 -0
  7. package/backend/convex/_generated/api.js +23 -0
  8. package/backend/convex/_generated/dataModel.d.ts +60 -0
  9. package/backend/convex/_generated/server.d.ts +143 -0
  10. package/backend/convex/_generated/server.js +93 -0
  11. package/backend/convex/apiKeys.ts +75 -0
  12. package/backend/convex/purchases.ts +74 -0
  13. package/backend/convex/schema.ts +45 -0
  14. package/backend/convex/transactions.ts +57 -0
  15. package/backend/convex/tsconfig.json +25 -0
  16. package/backend/convex/users.ts +94 -0
  17. package/backend/package-lock.json +521 -0
  18. package/backend/package.json +15 -0
  19. package/dist/credits.d.ts +54 -0
  20. package/dist/credits.d.ts.map +1 -0
  21. package/dist/credits.js +209 -0
  22. package/dist/credits.js.map +1 -0
  23. package/dist/discovery.d.ts +37 -0
  24. package/dist/discovery.d.ts.map +1 -0
  25. package/dist/discovery.js +109 -0
  26. package/dist/discovery.js.map +1 -0
  27. package/dist/index.d.ts +13 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +355 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/registry/apis.json +20894 -0
  32. package/dist/registry/parse_apis.py +146 -0
  33. package/dist/revenuecat.d.ts +61 -0
  34. package/dist/revenuecat.d.ts.map +1 -0
  35. package/dist/revenuecat.js +166 -0
  36. package/dist/revenuecat.js.map +1 -0
  37. package/dist/test.d.ts +6 -0
  38. package/dist/test.d.ts.map +1 -0
  39. package/dist/test.js +81 -0
  40. package/dist/test.js.map +1 -0
  41. package/dist/types.d.ts +96 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +3 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/webhooks/revenuecat.d.ts +48 -0
  46. package/dist/webhooks/revenuecat.d.ts.map +1 -0
  47. package/dist/webhooks/revenuecat.js +119 -0
  48. package/dist/webhooks/revenuecat.js.map +1 -0
  49. package/docs/revenuecat-setup.md +89 -0
  50. package/landing/next-env.d.ts +5 -0
  51. package/landing/next.config.mjs +6 -0
  52. package/landing/package-lock.json +1666 -0
  53. package/landing/package.json +27 -0
  54. package/landing/postcss.config.js +6 -0
  55. package/landing/src/app/api/keys/route.ts +71 -0
  56. package/landing/src/app/api/log/route.ts +37 -0
  57. package/landing/src/app/api/stats/route.ts +37 -0
  58. package/landing/src/app/globals.css +261 -0
  59. package/landing/src/app/layout.tsx +37 -0
  60. package/landing/src/app/page.tsx +753 -0
  61. package/landing/src/app/page.tsx.bak +567 -0
  62. package/landing/src/components/AddKeyModal.tsx +159 -0
  63. package/landing/tailwind.config.ts +34 -0
  64. package/landing/tsconfig.json +20 -0
  65. package/newsletter-template.html +71 -0
  66. package/outreach/OUTREACH-SYSTEM.md +211 -0
  67. package/outreach/email-template.html +179 -0
  68. package/outreach/targets.md +133 -0
  69. package/package.json +39 -0
  70. package/src/credits.ts +261 -0
  71. package/src/discovery.ts +147 -0
  72. package/src/index.ts +396 -0
  73. package/src/registry/apis.json +20894 -0
  74. package/src/registry/parse_apis.py +146 -0
  75. package/src/revenuecat.ts +239 -0
  76. package/src/test.ts +97 -0
  77. package/src/types.ts +110 -0
  78. package/src/webhooks/revenuecat.ts +187 -0
  79. package/tsconfig.json +20 -0
@@ -0,0 +1,209 @@
1
+ // Credit system for APIvault
2
+ // MVP: In-memory store. Production: Supabase
3
+ import { randomUUID } from 'crypto';
4
+ import { hasProSubscription } from './revenuecat.js';
5
+ // In-memory stores (replace with Supabase in production)
6
+ const agentCredits = new Map();
7
+ const purchases = new Map();
8
+ const usage = new Map();
9
+ // Mock API keys for demo (in production, these would be provisioned from providers)
10
+ const mockCredentials = {
11
+ '46elks': () => ({
12
+ type: 'basic',
13
+ username: `u_${randomUUID().slice(0, 8)}`,
14
+ password: `p_${randomUUID().slice(0, 16)}`
15
+ }),
16
+ 'resend': () => ({
17
+ type: 'api_key',
18
+ api_key: `re_${randomUUID().replace(/-/g, '')}`
19
+ }),
20
+ 'brave_search': () => ({
21
+ type: 'api_key',
22
+ api_key: `BSA${randomUUID().replace(/-/g, '').toUpperCase().slice(0, 20)}`
23
+ }),
24
+ 'openrouter': () => ({
25
+ type: 'bearer',
26
+ api_key: `sk-or-v1-${randomUUID().replace(/-/g, '')}`
27
+ }),
28
+ 'elevenlabs': () => ({
29
+ type: 'api_key',
30
+ api_key: `${randomUUID().replace(/-/g, '')}`
31
+ })
32
+ };
33
+ /**
34
+ * Get or create agent credits account
35
+ */
36
+ export function getAgentCredits(agentId) {
37
+ if (!agentCredits.has(agentId)) {
38
+ agentCredits.set(agentId, {
39
+ agent_id: agentId,
40
+ balance_usd: 0,
41
+ currency: 'USD',
42
+ created_at: new Date().toISOString(),
43
+ updated_at: new Date().toISOString()
44
+ });
45
+ }
46
+ return agentCredits.get(agentId);
47
+ }
48
+ /**
49
+ * Add credits to an agent's account
50
+ */
51
+ export function addCredits(agentId, amountUsd) {
52
+ const credits = getAgentCredits(agentId);
53
+ credits.balance_usd += amountUsd;
54
+ credits.updated_at = new Date().toISOString();
55
+ return credits;
56
+ }
57
+ /**
58
+ * Purchase API access
59
+ * Returns credentials if successful
60
+ */
61
+ export function purchaseAPIAccess(agentId, providerId, amountUsd) {
62
+ const credits = getAgentCredits(agentId);
63
+ // Check balance
64
+ if (credits.balance_usd < amountUsd) {
65
+ return {
66
+ success: false,
67
+ error: `Insufficient balance. Have $${credits.balance_usd.toFixed(2)}, need $${amountUsd.toFixed(2)}`
68
+ };
69
+ }
70
+ // Check if provider exists
71
+ if (!mockCredentials[providerId]) {
72
+ return {
73
+ success: false,
74
+ error: `Unknown provider: ${providerId}`
75
+ };
76
+ }
77
+ // Deduct credits
78
+ credits.balance_usd -= amountUsd;
79
+ credits.updated_at = new Date().toISOString();
80
+ // Create purchase record
81
+ const purchaseId = `pur_${randomUUID().slice(0, 12)}`;
82
+ const purchase = {
83
+ id: purchaseId,
84
+ agent_id: agentId,
85
+ provider_id: providerId,
86
+ amount_usd: amountUsd,
87
+ credits_purchased: calculateCredits(providerId, amountUsd),
88
+ status: 'active',
89
+ credentials: mockCredentials[providerId](),
90
+ created_at: new Date().toISOString()
91
+ };
92
+ purchases.set(purchaseId, purchase);
93
+ // Initialize usage tracking
94
+ usage.set(purchaseId, {
95
+ purchase_id: purchaseId,
96
+ provider_id: providerId,
97
+ units_used: 0,
98
+ units_remaining: purchase.credits_purchased,
99
+ cost_incurred_usd: 0,
100
+ last_used_at: new Date().toISOString()
101
+ });
102
+ return { success: true, purchase };
103
+ }
104
+ /**
105
+ * Calculate credits based on provider pricing
106
+ */
107
+ function calculateCredits(providerId, amountUsd) {
108
+ // Simplified credit calculation per provider
109
+ const creditsPerDollar = {
110
+ '46elks': 30, // ~30 SMS per dollar
111
+ 'resend': 1000, // ~1000 emails per dollar
112
+ 'brave_search': 200, // ~200 searches per dollar
113
+ 'openrouter': 100, // ~100k tokens per dollar (varies by model)
114
+ 'elevenlabs': 3333 // ~3333 characters per dollar
115
+ };
116
+ return Math.floor(amountUsd * (creditsPerDollar[providerId] || 100));
117
+ }
118
+ /**
119
+ * Get all purchases for an agent
120
+ */
121
+ export function getAgentPurchases(agentId) {
122
+ return Array.from(purchases.values()).filter(p => p.agent_id === agentId);
123
+ }
124
+ /**
125
+ * Get usage for a purchase
126
+ */
127
+ export function getUsage(purchaseId) {
128
+ return usage.get(purchaseId) || null;
129
+ }
130
+ /**
131
+ * Record usage (call this when API is used)
132
+ */
133
+ export function recordUsage(purchaseId, unitsUsed, costUsd) {
134
+ const record = usage.get(purchaseId);
135
+ if (!record)
136
+ return null;
137
+ record.units_used += unitsUsed;
138
+ record.units_remaining = Math.max(0, record.units_remaining - unitsUsed);
139
+ record.cost_incurred_usd += costUsd;
140
+ record.last_used_at = new Date().toISOString();
141
+ // Update purchase status if depleted
142
+ if (record.units_remaining === 0) {
143
+ const purchase = purchases.get(purchaseId);
144
+ if (purchase)
145
+ purchase.status = 'exhausted';
146
+ }
147
+ return record;
148
+ }
149
+ /**
150
+ * Get full balance summary for an agent
151
+ */
152
+ export function getBalanceSummary(agentId) {
153
+ const credits = getAgentCredits(agentId);
154
+ const agentPurchases = getAgentPurchases(agentId);
155
+ const activePurchases = agentPurchases.filter(p => p.status === 'active');
156
+ const totalSpent = agentPurchases.reduce((sum, p) => sum + p.amount_usd, 0);
157
+ return {
158
+ credits,
159
+ active_purchases: activePurchases,
160
+ total_spent_usd: totalSpent
161
+ };
162
+ }
163
+ /**
164
+ * Calculate transaction fee based on user's subscription
165
+ * Pro users: 2% fee
166
+ * Free users: 5% fee
167
+ */
168
+ export async function calculateTransactionFee(userId, amountUsd) {
169
+ const isPro = await hasProSubscription(userId);
170
+ const feePercentage = isPro ? 0.02 : 0.05;
171
+ const feeAmount = Math.round(amountUsd * feePercentage * 100) / 100;
172
+ return {
173
+ amount_usd: amountUsd,
174
+ fee_percentage: feePercentage,
175
+ fee_amount_usd: feeAmount,
176
+ net_amount_usd: Math.round((amountUsd - feeAmount) * 100) / 100,
177
+ tier: isPro ? 'pro' : 'free',
178
+ };
179
+ }
180
+ /**
181
+ * Purchase API access with subscription-aware fees
182
+ */
183
+ export async function purchaseAPIAccessWithFees(agentId, userId, providerId, amountUsd) {
184
+ // Calculate fees first
185
+ const fee = await calculateTransactionFee(userId, amountUsd);
186
+ // Total amount user pays = API cost + platform fee
187
+ const totalCost = amountUsd + fee.fee_amount_usd;
188
+ const credits = getAgentCredits(agentId);
189
+ if (credits.balance_usd < totalCost) {
190
+ return {
191
+ success: false,
192
+ error: `Insufficient balance. Have $${credits.balance_usd.toFixed(2)}, need $${totalCost.toFixed(2)} (includes ${fee.tier === 'pro' ? '2%' : '5%'} platform fee)`
193
+ };
194
+ }
195
+ // Make the purchase (deducts API cost)
196
+ const result = purchaseAPIAccess(agentId, providerId, amountUsd);
197
+ if (result.success && result.purchase) {
198
+ // Deduct platform fee separately
199
+ credits.balance_usd -= fee.fee_amount_usd;
200
+ credits.updated_at = new Date().toISOString();
201
+ return {
202
+ success: true,
203
+ purchase: result.purchase,
204
+ fee,
205
+ };
206
+ }
207
+ return result;
208
+ }
209
+ //# sourceMappingURL=credits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credits.js","sourceRoot":"","sources":["../src/credits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { SimpleAPI } from './types.js';
2
+ export interface SimpleSearchResult {
3
+ api: SimpleAPI;
4
+ relevance_score: number;
5
+ match_reasons: string[];
6
+ }
7
+ /**
8
+ * Discover APIs based on a natural language query
9
+ * MVP uses keyword matching; production would use embeddings
10
+ */
11
+ export declare function discoverAPIs(query: string, options?: {
12
+ category?: string;
13
+ maxResults?: number;
14
+ auth?: string;
15
+ httpsOnly?: boolean;
16
+ }): SimpleSearchResult[];
17
+ /**
18
+ * Get detailed information about a specific API
19
+ */
20
+ export declare function getAPIDetails(apiId: string): SimpleAPI | null;
21
+ /**
22
+ * List all APIs in a category
23
+ */
24
+ export declare function listByCategory(category: string): SimpleAPI[];
25
+ /**
26
+ * Get all available categories
27
+ */
28
+ export declare function getCategories(): string[];
29
+ /**
30
+ * Get all APIs
31
+ */
32
+ export declare function getAllAPIs(): SimpleAPI[];
33
+ /**
34
+ * Get API count
35
+ */
36
+ export declare function getAPICount(): number;
37
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgBvC,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,SAAS,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,kBAAkB,EAAE,CA0EtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAExC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
@@ -0,0 +1,109 @@
1
+ // Discovery engine for APIvault
2
+ // MVP: Keyword matching. Future: Embeddings + semantic search
3
+ import { readFileSync } from 'fs';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname, join } from 'path';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ // Load APIs from registry
9
+ const apisData = JSON.parse(readFileSync(join(__dirname, 'registry', 'apis.json'), 'utf-8'));
10
+ const apis = apisData.apis;
11
+ console.error(`[APIvault] Loaded ${apis.length} APIs from registry`);
12
+ /**
13
+ * Discover APIs based on a natural language query
14
+ * MVP uses keyword matching; production would use embeddings
15
+ */
16
+ export function discoverAPIs(query, options = {}) {
17
+ const { category, maxResults = 10, auth, httpsOnly } = options;
18
+ const queryLower = query.toLowerCase();
19
+ const queryWords = queryLower.split(/\s+/).filter(w => w.length > 2);
20
+ const results = [];
21
+ for (const api of apis) {
22
+ // Category filter (case-insensitive)
23
+ if (category && api.category.toLowerCase() !== category.toLowerCase())
24
+ continue;
25
+ // Auth filter
26
+ if (auth && api.auth.toLowerCase() !== auth.toLowerCase())
27
+ continue;
28
+ // HTTPS filter
29
+ if (httpsOnly && !api.https)
30
+ continue;
31
+ // Calculate relevance score
32
+ let score = 0;
33
+ const matchReasons = [];
34
+ for (const word of queryWords) {
35
+ // Name match (highest weight)
36
+ if (api.name.toLowerCase().includes(word)) {
37
+ score += 25;
38
+ matchReasons.push(`name: ${word}`);
39
+ }
40
+ // Keyword match
41
+ if (api.keywords && api.keywords.some(k => k.toLowerCase().includes(word))) {
42
+ score += 15;
43
+ matchReasons.push(`keyword: ${word}`);
44
+ }
45
+ // Description match
46
+ if (api.description.toLowerCase().includes(word)) {
47
+ score += 10;
48
+ matchReasons.push(`description: ${word}`);
49
+ }
50
+ // Category match
51
+ if (api.category.toLowerCase().includes(word)) {
52
+ score += 8;
53
+ matchReasons.push(`category: ${word}`);
54
+ }
55
+ }
56
+ // Only add secondary boosts if there's a primary match
57
+ if (score > 0) {
58
+ // Boost for HTTPS
59
+ if (api.https) {
60
+ score += 2;
61
+ }
62
+ // Boost for known CORS support
63
+ if (api.cors === 'yes') {
64
+ score += 1;
65
+ }
66
+ }
67
+ if (score > 0) {
68
+ results.push({
69
+ api,
70
+ relevance_score: Math.round(score * 100) / 100,
71
+ match_reasons: [...new Set(matchReasons)]
72
+ });
73
+ }
74
+ }
75
+ // Sort by relevance
76
+ results.sort((a, b) => b.relevance_score - a.relevance_score);
77
+ return results.slice(0, maxResults);
78
+ }
79
+ /**
80
+ * Get detailed information about a specific API
81
+ */
82
+ export function getAPIDetails(apiId) {
83
+ return apis.find(api => api.id === apiId) || null;
84
+ }
85
+ /**
86
+ * List all APIs in a category
87
+ */
88
+ export function listByCategory(category) {
89
+ return apis.filter(api => api.category.toLowerCase() === category.toLowerCase());
90
+ }
91
+ /**
92
+ * Get all available categories
93
+ */
94
+ export function getCategories() {
95
+ return [...new Set(apis.map(api => api.category))].sort();
96
+ }
97
+ /**
98
+ * Get all APIs
99
+ */
100
+ export function getAllAPIs() {
101
+ return apis;
102
+ }
103
+ /**
104
+ * Get API count
105
+ */
106
+ export function getAPICount() {
107
+ return apis.length;
108
+ }
109
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * APIvault - Agent-Native API Discovery MCP Server
4
+ *
5
+ * Tools:
6
+ * - discover_apis: Search for APIs by capability
7
+ * - get_api_details: Get full info about an API
8
+ * - purchase_access: Buy API access with credits
9
+ * - check_balance: Check credits and active purchases
10
+ * - add_credits: Add credits to account (for testing)
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}