@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.
- package/.github/ISSUE_TEMPLATE/add-api.yml +123 -0
- package/BRIEFING.md +30 -0
- package/CONCEPT.md +494 -0
- package/README.md +272 -0
- package/backend/convex/README.md +90 -0
- package/backend/convex/_generated/api.d.ts +55 -0
- package/backend/convex/_generated/api.js +23 -0
- package/backend/convex/_generated/dataModel.d.ts +60 -0
- package/backend/convex/_generated/server.d.ts +143 -0
- package/backend/convex/_generated/server.js +93 -0
- package/backend/convex/apiKeys.ts +75 -0
- package/backend/convex/purchases.ts +74 -0
- package/backend/convex/schema.ts +45 -0
- package/backend/convex/transactions.ts +57 -0
- package/backend/convex/tsconfig.json +25 -0
- package/backend/convex/users.ts +94 -0
- package/backend/package-lock.json +521 -0
- package/backend/package.json +15 -0
- package/dist/credits.d.ts +54 -0
- package/dist/credits.d.ts.map +1 -0
- package/dist/credits.js +209 -0
- package/dist/credits.js.map +1 -0
- package/dist/discovery.d.ts +37 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +109 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +355 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/apis.json +20894 -0
- package/dist/registry/parse_apis.py +146 -0
- package/dist/revenuecat.d.ts +61 -0
- package/dist/revenuecat.d.ts.map +1 -0
- package/dist/revenuecat.js +166 -0
- package/dist/revenuecat.js.map +1 -0
- package/dist/test.d.ts +6 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +81 -0
- package/dist/test.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/webhooks/revenuecat.d.ts +48 -0
- package/dist/webhooks/revenuecat.d.ts.map +1 -0
- package/dist/webhooks/revenuecat.js +119 -0
- package/dist/webhooks/revenuecat.js.map +1 -0
- package/docs/revenuecat-setup.md +89 -0
- package/landing/next-env.d.ts +5 -0
- package/landing/next.config.mjs +6 -0
- package/landing/package-lock.json +1666 -0
- package/landing/package.json +27 -0
- package/landing/postcss.config.js +6 -0
- package/landing/src/app/api/keys/route.ts +71 -0
- package/landing/src/app/api/log/route.ts +37 -0
- package/landing/src/app/api/stats/route.ts +37 -0
- package/landing/src/app/globals.css +261 -0
- package/landing/src/app/layout.tsx +37 -0
- package/landing/src/app/page.tsx +753 -0
- package/landing/src/app/page.tsx.bak +567 -0
- package/landing/src/components/AddKeyModal.tsx +159 -0
- package/landing/tailwind.config.ts +34 -0
- package/landing/tsconfig.json +20 -0
- package/newsletter-template.html +71 -0
- package/outreach/OUTREACH-SYSTEM.md +211 -0
- package/outreach/email-template.html +179 -0
- package/outreach/targets.md +133 -0
- package/package.json +39 -0
- package/src/credits.ts +261 -0
- package/src/discovery.ts +147 -0
- package/src/index.ts +396 -0
- package/src/registry/apis.json +20894 -0
- package/src/registry/parse_apis.py +146 -0
- package/src/revenuecat.ts +239 -0
- package/src/test.ts +97 -0
- package/src/types.ts +110 -0
- package/src/webhooks/revenuecat.ts +187 -0
- package/tsconfig.json +20 -0
package/dist/credits.js
ADDED
|
@@ -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":"AAAA,gCAAgC;AAChC,8DAA8D;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,0BAA0B;AAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAChE,CAAC;AACF,MAAM,IAAI,GAAgB,QAAQ,CAAC,IAAI,CAAC;AAExC,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,qBAAqB,CAAC,CAAC;AAQrE;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,UAKI,EAAE;IAEN,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErE,MAAM,OAAO,GAAyB,EAAE,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,qCAAqC;QACrC,IAAI,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE;YAAE,SAAS;QAEhF,cAAc;QACd,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE;YAAE,SAAS;QAEpE,eAAe;QACf,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,SAAS;QAEtC,4BAA4B;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,8BAA8B;YAC9B,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,KAAK,IAAI,EAAE,CAAC;gBACZ,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;YAED,gBAAgB;YAChB,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC3E,KAAK,IAAI,EAAE,CAAC;gBACZ,YAAY,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,oBAAoB;YACpB,IAAI,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,KAAK,IAAI,EAAE,CAAC;gBACZ,YAAY,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;YAED,iBAAiB;YACjB,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,KAAK,IAAI,CAAC,CAAC;gBACX,YAAY,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,kBAAkB;YAClB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YAED,+BAA+B;YAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACvB,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG;gBACH,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;gBAC9C,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IAE9D,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|