@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,146 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Parse public-apis README and convert to APIClaw registry format
4
+ """
5
+ import re
6
+ import json
7
+ import hashlib
8
+
9
+ # Read the README content
10
+ with open('/tmp/public-apis-readme.md', 'r') as f:
11
+ content = f.read()
12
+
13
+ apis = []
14
+ current_category = None
15
+
16
+ # Split by lines
17
+ lines = content.split('\n')
18
+
19
+ for i, line in enumerate(lines):
20
+ # Check for category headers (### Animals, ### Anime, etc.)
21
+ if line.startswith('### ') and not line.startswith('### API'):
22
+ current_category = line[4:].strip()
23
+ continue
24
+
25
+ # Skip non-table rows
26
+ if not line.startswith('|'):
27
+ continue
28
+
29
+ # Skip header rows and separator rows
30
+ if '---' in line or 'API | Description' in line or 'API|Description' in line:
31
+ continue
32
+
33
+ # Parse table row
34
+ # Format: | [Name](url) | Description | Auth | HTTPS | CORS |
35
+ parts = line.split('|')
36
+ if len(parts) < 5:
37
+ continue
38
+
39
+ # Extract API info
40
+ api_cell = parts[1].strip() if len(parts) > 1 else ''
41
+ desc_cell = parts[2].strip() if len(parts) > 2 else ''
42
+ auth_cell = parts[3].strip() if len(parts) > 3 else ''
43
+ https_cell = parts[4].strip() if len(parts) > 4 else ''
44
+ cors_cell = parts[5].strip() if len(parts) > 5 else ''
45
+
46
+ # Extract name and link from markdown link format [Name](url)
47
+ link_match = re.match(r'\[([^\]]+)\]\(([^)]+)\)', api_cell)
48
+ if not link_match:
49
+ continue
50
+
51
+ name = link_match.group(1)
52
+ link = link_match.group(2)
53
+
54
+ # Generate slug ID
55
+ slug = re.sub(r'[^a-z0-9]+', '-', name.lower()).strip('-')
56
+
57
+ # Parse auth type
58
+ auth = 'None'
59
+ if '`apiKey`' in auth_cell or 'apiKey' in auth_cell:
60
+ auth = 'apiKey'
61
+ elif '`OAuth`' in auth_cell or 'OAuth' in auth_cell:
62
+ auth = 'OAuth'
63
+ elif '`X-Mashape-Key`' in auth_cell:
64
+ auth = 'apiKey'
65
+ elif '`User-Agent`' in auth_cell:
66
+ auth = 'User-Agent'
67
+ elif 'No' in auth_cell:
68
+ auth = 'None'
69
+
70
+ # Parse HTTPS
71
+ https = 'Yes' in https_cell
72
+
73
+ # Parse CORS
74
+ cors = 'unknown'
75
+ if 'Yes' in cors_cell:
76
+ cors = 'yes'
77
+ elif 'No' in cors_cell:
78
+ cors = 'no'
79
+
80
+ # Generate keywords from category and description
81
+ keywords = []
82
+ if current_category:
83
+ keywords.append(current_category.lower().replace(' & ', '-').replace(' ', '-'))
84
+
85
+ # Add some common keywords from description
86
+ desc_lower = desc_cell.lower()
87
+ for keyword in ['data', 'api', 'free', 'real-time', 'json', 'rest', 'graphql']:
88
+ if keyword in desc_lower:
89
+ keywords.append(keyword)
90
+
91
+ api_entry = {
92
+ "id": slug,
93
+ "name": name,
94
+ "description": desc_cell,
95
+ "category": current_category or "Uncategorized",
96
+ "auth": auth,
97
+ "https": https,
98
+ "cors": cors,
99
+ "link": link,
100
+ "pricing": "unknown", # public-apis doesn't have pricing info
101
+ "keywords": list(set(keywords))
102
+ }
103
+
104
+ apis.append(api_entry)
105
+
106
+ # Remove duplicates by ID (keep first occurrence)
107
+ seen_ids = set()
108
+ unique_apis = []
109
+ for api in apis:
110
+ if api['id'] not in seen_ids:
111
+ seen_ids.add(api['id'])
112
+ unique_apis.append(api)
113
+ else:
114
+ # Make ID unique by appending category
115
+ cat_slug = re.sub(r'[^a-z0-9]+', '-', api['category'].lower()).strip('-')
116
+ new_id = f"{api['id']}-{cat_slug}"
117
+ if new_id not in seen_ids:
118
+ api['id'] = new_id
119
+ seen_ids.add(new_id)
120
+ unique_apis.append(api)
121
+
122
+ print(f"Parsed {len(unique_apis)} unique APIs")
123
+
124
+ # Write to JSON
125
+ output = {
126
+ "version": "1.0.0",
127
+ "source": "https://github.com/public-apis/public-apis",
128
+ "lastUpdated": "2026-02-16",
129
+ "count": len(unique_apis),
130
+ "apis": unique_apis
131
+ }
132
+
133
+ with open('/Users/gustavhemmingsson/clawd/products/api-discovery/src/registry/apis.json', 'w') as f:
134
+ json.dump(output, f, indent=2)
135
+
136
+ print(f"Wrote to apis.json")
137
+
138
+ # Print some stats
139
+ categories = {}
140
+ for api in unique_apis:
141
+ cat = api['category']
142
+ categories[cat] = categories.get(cat, 0) + 1
143
+
144
+ print("\nAPIs per category:")
145
+ for cat, count in sorted(categories.items(), key=lambda x: -x[1]):
146
+ print(f" {cat}: {count}")
@@ -0,0 +1,61 @@
1
+ export declare const ENTITLEMENTS: {
2
+ readonly PRO: "pro";
3
+ };
4
+ export declare const PRODUCTS: {
5
+ readonly PRO_MONTHLY: "apiclaw_pro_monthly";
6
+ };
7
+ interface RevenueCatSubscriber {
8
+ subscriber: {
9
+ entitlements: Record<string, {
10
+ product_identifier: string;
11
+ expires_date: string | null;
12
+ purchase_date: string;
13
+ }>;
14
+ subscriptions: Record<string, {
15
+ expires_date: string | null;
16
+ purchase_date: string;
17
+ product_plan_identifier?: string;
18
+ billing_issues_detected_at?: string | null;
19
+ unsubscribe_detected_at?: string | null;
20
+ }>;
21
+ non_subscriptions: Record<string, unknown>;
22
+ first_seen: string;
23
+ original_app_user_id: string;
24
+ };
25
+ }
26
+ /**
27
+ * Check if a user has Pro subscription
28
+ */
29
+ export declare function hasProSubscription(userId: string): Promise<boolean>;
30
+ /**
31
+ * Get all entitlements for a user
32
+ */
33
+ export declare function getEntitlements(userId: string): Promise<{
34
+ pro: boolean;
35
+ expiresAt: string | null;
36
+ purchaseDate: string | null;
37
+ }>;
38
+ /**
39
+ * Get fee percentage based on subscription status
40
+ * Pro = 2%, Free = 5%
41
+ */
42
+ export declare function getFeePercentage(userId: string): Promise<number>;
43
+ /**
44
+ * Calculate platform fee for a transaction
45
+ */
46
+ export declare function calculateFee(userId: string, amountUsd: number): Promise<{
47
+ feePercentage: number;
48
+ feeAmount: number;
49
+ netAmount: number;
50
+ isPro: boolean;
51
+ }>;
52
+ /**
53
+ * Create or update subscriber attributes
54
+ */
55
+ export declare function setSubscriberAttributes(userId: string, attributes: Record<string, string>): Promise<boolean>;
56
+ /**
57
+ * Grant promotional entitlement (for testing/promos)
58
+ */
59
+ export declare function grantPromoEntitlement(userId: string, durationDays?: number): Promise<boolean>;
60
+ export type { RevenueCatSubscriber };
61
+ //# sourceMappingURL=revenuecat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revenuecat.d.ts","sourceRoot":"","sources":["../src/revenuecat.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY;;CAEf,CAAC;AAGX,eAAO,MAAM,QAAQ;;CAEX,CAAC;AAQX,UAAU,oBAAoB;IAC5B,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;YAC3B,kBAAkB,EAAE,MAAM,CAAC;YAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC,CAAC;QACH,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;YAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,aAAa,EAAE,MAAM,CAAC;YACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;YACjC,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAC3C,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SACzC,CAAC,CAAC;QACH,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,UAAU,EAAE,MAAM,CAAC;QACnB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AA2CD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBzE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC,CA0BD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC,CAWD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,OAAO,CAAC,CAwBlB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,MAAW,GACxB,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAGD,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,166 @@
1
+ // RevenueCat integration for APIClaw
2
+ // Handles Pro subscription checking and fee calculation
3
+ const REVENUECAT_API_URL = 'https://api.revenuecat.com/v1';
4
+ const PROJECT_ID = '0d074df4';
5
+ // Entitlement identifiers
6
+ export const ENTITLEMENTS = {
7
+ PRO: 'pro',
8
+ };
9
+ // Product identifiers
10
+ export const PRODUCTS = {
11
+ PRO_MONTHLY: 'apiclaw_pro_monthly',
12
+ };
13
+ // Fee structure
14
+ const FEES = {
15
+ FREE: 0.05, // 5% transaction fee
16
+ PRO: 0.02, // 2% transaction fee
17
+ };
18
+ /**
19
+ * Get RevenueCat API key from environment
20
+ */
21
+ function getApiKey() {
22
+ const key = process.env.REVENUECAT_SECRET_KEY;
23
+ if (!key) {
24
+ throw new Error('REVENUECAT_SECRET_KEY not set');
25
+ }
26
+ return key;
27
+ }
28
+ /**
29
+ * Fetch subscriber info from RevenueCat
30
+ */
31
+ async function getSubscriber(userId) {
32
+ try {
33
+ const response = await fetch(`${REVENUECAT_API_URL}/subscribers/${encodeURIComponent(userId)}`, {
34
+ headers: {
35
+ 'Authorization': `Bearer ${getApiKey()}`,
36
+ 'Content-Type': 'application/json',
37
+ },
38
+ });
39
+ if (response.status === 404) {
40
+ return null; // User doesn't exist in RevenueCat
41
+ }
42
+ if (!response.ok) {
43
+ throw new Error(`RevenueCat API error: ${response.status}`);
44
+ }
45
+ return await response.json();
46
+ }
47
+ catch (error) {
48
+ console.error('Error fetching subscriber:', error);
49
+ return null;
50
+ }
51
+ }
52
+ /**
53
+ * Check if a user has Pro subscription
54
+ */
55
+ export async function hasProSubscription(userId) {
56
+ const subscriber = await getSubscriber(userId);
57
+ if (!subscriber) {
58
+ return false;
59
+ }
60
+ const proEntitlement = subscriber.subscriber.entitlements[ENTITLEMENTS.PRO];
61
+ if (!proEntitlement) {
62
+ return false;
63
+ }
64
+ // Check if entitlement is active (not expired)
65
+ if (proEntitlement.expires_date) {
66
+ const expiresAt = new Date(proEntitlement.expires_date);
67
+ if (expiresAt < new Date()) {
68
+ return false;
69
+ }
70
+ }
71
+ return true;
72
+ }
73
+ /**
74
+ * Get all entitlements for a user
75
+ */
76
+ export async function getEntitlements(userId) {
77
+ const subscriber = await getSubscriber(userId);
78
+ const result = {
79
+ pro: false,
80
+ expiresAt: null,
81
+ purchaseDate: null,
82
+ };
83
+ if (!subscriber) {
84
+ return result;
85
+ }
86
+ const proEntitlement = subscriber.subscriber.entitlements[ENTITLEMENTS.PRO];
87
+ if (proEntitlement) {
88
+ const expiresAt = proEntitlement.expires_date
89
+ ? new Date(proEntitlement.expires_date)
90
+ : null;
91
+ result.pro = !expiresAt || expiresAt > new Date();
92
+ result.expiresAt = proEntitlement.expires_date;
93
+ result.purchaseDate = proEntitlement.purchase_date;
94
+ }
95
+ return result;
96
+ }
97
+ /**
98
+ * Get fee percentage based on subscription status
99
+ * Pro = 2%, Free = 5%
100
+ */
101
+ export async function getFeePercentage(userId) {
102
+ const isPro = await hasProSubscription(userId);
103
+ return isPro ? FEES.PRO : FEES.FREE;
104
+ }
105
+ /**
106
+ * Calculate platform fee for a transaction
107
+ */
108
+ export async function calculateFee(userId, amountUsd) {
109
+ const isPro = await hasProSubscription(userId);
110
+ const feePercentage = isPro ? FEES.PRO : FEES.FREE;
111
+ const feeAmount = amountUsd * feePercentage;
112
+ return {
113
+ feePercentage,
114
+ feeAmount: Math.round(feeAmount * 100) / 100, // Round to 2 decimals
115
+ netAmount: Math.round((amountUsd - feeAmount) * 100) / 100,
116
+ isPro,
117
+ };
118
+ }
119
+ /**
120
+ * Create or update subscriber attributes
121
+ */
122
+ export async function setSubscriberAttributes(userId, attributes) {
123
+ try {
124
+ const formattedAttributes = {};
125
+ for (const [key, value] of Object.entries(attributes)) {
126
+ formattedAttributes[`$${key}`] = { value };
127
+ }
128
+ const response = await fetch(`${REVENUECAT_API_URL}/subscribers/${encodeURIComponent(userId)}/attributes`, {
129
+ method: 'POST',
130
+ headers: {
131
+ 'Authorization': `Bearer ${getApiKey()}`,
132
+ 'Content-Type': 'application/json',
133
+ },
134
+ body: JSON.stringify({ attributes: formattedAttributes }),
135
+ });
136
+ return response.ok;
137
+ }
138
+ catch (error) {
139
+ console.error('Error setting subscriber attributes:', error);
140
+ return false;
141
+ }
142
+ }
143
+ /**
144
+ * Grant promotional entitlement (for testing/promos)
145
+ */
146
+ export async function grantPromoEntitlement(userId, durationDays = 30) {
147
+ try {
148
+ const response = await fetch(`${REVENUECAT_API_URL}/subscribers/${encodeURIComponent(userId)}/entitlements/${ENTITLEMENTS.PRO}/promotional`, {
149
+ method: 'POST',
150
+ headers: {
151
+ 'Authorization': `Bearer ${getApiKey()}`,
152
+ 'Content-Type': 'application/json',
153
+ },
154
+ body: JSON.stringify({
155
+ duration: 'daily',
156
+ duration_count: durationDays,
157
+ }),
158
+ });
159
+ return response.ok;
160
+ }
161
+ catch (error) {
162
+ console.error('Error granting promo entitlement:', error);
163
+ return false;
164
+ }
165
+ }
166
+ //# sourceMappingURL=revenuecat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revenuecat.js","sourceRoot":"","sources":["../src/revenuecat.ts"],"names":[],"mappings":"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"}
package/dist/test.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Test script for APIvault
3
+ * Run: pnpm test
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/dist/test.js ADDED
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Test script for APIvault
3
+ * Run: pnpm test
4
+ */
5
+ import { discoverAPIs, getAPIDetails, getCategories, getAPICount } from './discovery.js';
6
+ import { addCredits, purchaseAPIAccess, getBalanceSummary } from './credits.js';
7
+ console.log('🔐 APIvault Test Suite\n');
8
+ console.log('='.repeat(50));
9
+ // Test 1: API Count
10
+ console.log('\n📊 Test 1: API Registry');
11
+ console.log('-'.repeat(40));
12
+ console.log(`Total APIs loaded: ${getAPICount()}`);
13
+ // Test 2: Discovery
14
+ console.log('\n📡 Test 2: API Discovery');
15
+ console.log('-'.repeat(40));
16
+ const smsResults = discoverAPIs('SMS');
17
+ console.log(`Query: "SMS"`);
18
+ console.log(`Results: ${smsResults.length}`);
19
+ smsResults.slice(0, 5).forEach(r => {
20
+ console.log(` - ${r.api.name} (score: ${r.relevance_score})`);
21
+ console.log(` ${r.api.description.slice(0, 60)}...`);
22
+ });
23
+ const weatherResults = discoverAPIs('weather');
24
+ console.log(`\nQuery: "weather"`);
25
+ console.log(`Results: ${weatherResults.length}`);
26
+ weatherResults.slice(0, 5).forEach(r => {
27
+ console.log(` - ${r.api.name} (score: ${r.relevance_score})`);
28
+ });
29
+ const paymentResults = discoverAPIs('payment');
30
+ console.log(`\nQuery: "payment"`);
31
+ console.log(`Results: ${paymentResults.length}`);
32
+ paymentResults.slice(0, 5).forEach(r => {
33
+ console.log(` - ${r.api.name} (score: ${r.relevance_score})`);
34
+ });
35
+ // Test 3: Get API Details
36
+ console.log('\n📋 Test 3: API Details');
37
+ console.log('-'.repeat(40));
38
+ const stripe = getAPIDetails('stripe');
39
+ if (stripe) {
40
+ console.log(`\n${stripe.name}:`);
41
+ console.log(` Category: ${stripe.category}`);
42
+ console.log(` Auth: ${stripe.auth}`);
43
+ console.log(` HTTPS: ${stripe.https}`);
44
+ console.log(` Link: ${stripe.link}`);
45
+ }
46
+ // Test 4: Categories
47
+ console.log('\n📂 Test 4: Categories');
48
+ console.log('-'.repeat(40));
49
+ const categories = getCategories();
50
+ console.log(`Total categories: ${categories.length}`);
51
+ console.log(`Sample: ${categories.slice(0, 10).join(', ')}...`);
52
+ // Test 5: Credits System
53
+ console.log('\n💰 Test 5: Credit System');
54
+ console.log('-'.repeat(40));
55
+ const testAgent = 'agent_test_123';
56
+ // Check initial balance
57
+ let balance = getBalanceSummary(testAgent);
58
+ console.log(`Initial balance: $${balance.credits.balance_usd}`);
59
+ // Add credits
60
+ addCredits(testAgent, 50);
61
+ balance = getBalanceSummary(testAgent);
62
+ console.log(`After adding $50: $${balance.credits.balance_usd}`);
63
+ // Purchase API access
64
+ console.log('\n🛒 Purchasing stripe access for $10...');
65
+ const purchase = purchaseAPIAccess(testAgent, 'stripe', 10);
66
+ if (purchase.success) {
67
+ console.log(` ✅ Purchase successful!`);
68
+ console.log(` Purchase ID: ${purchase.purchase.id}`);
69
+ console.log(` Credits received: ${purchase.purchase.credits_purchased}`);
70
+ }
71
+ else {
72
+ console.log(` ❌ Purchase failed: ${purchase.error}`);
73
+ }
74
+ // Check updated balance
75
+ balance = getBalanceSummary(testAgent);
76
+ console.log(`\nFinal balance: $${balance.credits.balance_usd}`);
77
+ console.log(`Total spent: $${balance.total_spent_usd}`);
78
+ console.log(`Active purchases: ${balance.active_purchases.length}`);
79
+ console.log('\n' + '='.repeat(50));
80
+ console.log('✅ All tests completed!\n');
81
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ export interface SimpleAPI {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ category: string;
6
+ auth: string;
7
+ https: boolean;
8
+ cors: string;
9
+ link: string;
10
+ pricing: string;
11
+ keywords: string[];
12
+ }
13
+ export interface APIProvider {
14
+ id: string;
15
+ name: string;
16
+ description: string;
17
+ category: string;
18
+ capabilities: string[];
19
+ keywords: string[];
20
+ pricing: APIPricing;
21
+ auth_type: string;
22
+ docs_url: string;
23
+ base_url: string;
24
+ endpoints: APIEndpoint[];
25
+ features: string[];
26
+ compliance: string[];
27
+ regions: string[];
28
+ agent_success_rate: number;
29
+ avg_latency_ms: number;
30
+ }
31
+ export interface APIPricing {
32
+ model: string;
33
+ free_tier: boolean;
34
+ minimum_purchase: number | null;
35
+ [key: string]: string | number | boolean | null | undefined;
36
+ }
37
+ export interface APIEndpoint {
38
+ name: string;
39
+ method: string;
40
+ path: string;
41
+ params: string[];
42
+ }
43
+ export interface SearchResult {
44
+ provider: APIProvider;
45
+ relevance_score: number;
46
+ match_reasons: string[];
47
+ }
48
+ export interface AgentCredits {
49
+ agent_id: string;
50
+ balance_usd: number;
51
+ currency: string;
52
+ created_at: string;
53
+ updated_at: string;
54
+ }
55
+ export interface Purchase {
56
+ id: string;
57
+ agent_id: string;
58
+ provider_id: string;
59
+ amount_usd: number;
60
+ credits_purchased: number;
61
+ status: 'pending' | 'active' | 'exhausted' | 'refunded';
62
+ credentials?: APICredentials;
63
+ created_at: string;
64
+ }
65
+ export interface APICredentials {
66
+ type: string;
67
+ api_key?: string;
68
+ username?: string;
69
+ password?: string;
70
+ expires_at?: string;
71
+ }
72
+ export interface UsageRecord {
73
+ purchase_id: string;
74
+ provider_id: string;
75
+ units_used: number;
76
+ units_remaining: number;
77
+ cost_incurred_usd: number;
78
+ last_used_at: string;
79
+ }
80
+ export interface UserSubscription {
81
+ user_id: string;
82
+ tier: 'free' | 'pro';
83
+ status: 'active' | 'cancelled' | 'expired' | 'paused' | 'billing_issue';
84
+ product_id: string | null;
85
+ expires_at: string | null;
86
+ fee_percentage: number;
87
+ updated_at: string;
88
+ }
89
+ export interface TransactionFee {
90
+ amount_usd: number;
91
+ fee_percentage: number;
92
+ fee_amount_usd: number;
93
+ net_amount_usd: number;
94
+ tier: 'free' | 'pro';
95
+ }
96
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // Core types for APIvault
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,0BAA0B"}
@@ -0,0 +1,48 @@
1
+ import { Hono } from 'hono';
2
+ type WebhookEventType = 'INITIAL_PURCHASE' | 'RENEWAL' | 'CANCELLATION' | 'UNCANCELLATION' | 'NON_RENEWING_PURCHASE' | 'SUBSCRIPTION_PAUSED' | 'SUBSCRIPTION_EXTENDED' | 'EXPIRATION' | 'BILLING_ISSUE' | 'PRODUCT_CHANGE' | 'TRANSFER';
3
+ interface RevenueCatWebhookEvent {
4
+ api_version: string;
5
+ event: {
6
+ type: WebhookEventType;
7
+ id: string;
8
+ app_id: string;
9
+ app_user_id: string;
10
+ original_app_user_id: string;
11
+ aliases: string[];
12
+ product_id: string;
13
+ entitlement_ids: string[];
14
+ period_type: string;
15
+ purchased_at_ms: number;
16
+ expiration_at_ms: number | null;
17
+ environment: 'SANDBOX' | 'PRODUCTION';
18
+ store: string;
19
+ is_trial_conversion?: boolean;
20
+ cancel_reason?: string;
21
+ price_in_purchased_currency?: number;
22
+ currency?: string;
23
+ };
24
+ }
25
+ interface UserSubscriptionUpdate {
26
+ userId: string;
27
+ isPro: boolean;
28
+ subscriptionStatus: 'active' | 'cancelled' | 'expired' | 'paused' | 'billing_issue';
29
+ productId: string | null;
30
+ expiresAt: number | null;
31
+ updatedAt: number;
32
+ eventType: WebhookEventType;
33
+ }
34
+ /**
35
+ * Update user subscription status in Convex
36
+ */
37
+ declare function updateConvexUser(update: UserSubscriptionUpdate): Promise<boolean>;
38
+ /**
39
+ * Process webhook event and determine subscription state
40
+ */
41
+ declare function processEvent(event: RevenueCatWebhookEvent['event']): UserSubscriptionUpdate;
42
+ /**
43
+ * Create Hono router for webhook handling
44
+ */
45
+ export declare function createWebhookRouter(): Hono;
46
+ export { processEvent, updateConvexUser };
47
+ export type { RevenueCatWebhookEvent, UserSubscriptionUpdate };
48
+ //# sourceMappingURL=revenuecat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revenuecat.d.ts","sourceRoot":"","sources":["../../src/webhooks/revenuecat.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,KAAK,gBAAgB,GACjB,kBAAkB,GAClB,SAAS,GACT,cAAc,GACd,gBAAgB,GAChB,uBAAuB,GACvB,qBAAqB,GACrB,uBAAuB,GACvB,YAAY,GACZ,eAAe,GACf,gBAAgB,GAChB,UAAU,CAAC;AAEf,UAAU,sBAAsB;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,IAAI,EAAE,gBAAgB,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;QACtC,KAAK,EAAE,MAAM,CAAC;QACd,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,2BAA2B,CAAC,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,eAAe,CAAC;IACpF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED;;GAEG;AACH,iBAAe,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBhF;AAED;;GAEG;AACH,iBAAS,YAAY,CAAC,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,sBAAsB,CA0DpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAkC1C;AAGD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAC1C,YAAY,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,CAAC"}