@nordsym/apiclaw 1.5.6 → 1.5.8
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/convex/_generated/api.d.ts +2 -0
- package/convex/adminActivate.d.ts +3 -0
- package/convex/adminActivate.d.ts.map +1 -0
- package/convex/adminActivate.js +47 -0
- package/convex/adminActivate.js.map +1 -0
- package/convex/adminStats.d.ts +3 -0
- package/convex/adminStats.d.ts.map +1 -0
- package/convex/adminStats.js +42 -0
- package/convex/adminStats.js.map +1 -0
- package/convex/adminStats.ts +44 -0
- package/convex/agents.d.ts +54 -0
- package/convex/agents.d.ts.map +1 -0
- package/convex/agents.js +499 -0
- package/convex/agents.js.map +1 -0
- package/convex/analytics.d.ts +5 -0
- package/convex/analytics.d.ts.map +1 -0
- package/convex/analytics.js +166 -0
- package/convex/analytics.js.map +1 -0
- package/convex/billing.d.ts +88 -0
- package/convex/billing.d.ts.map +1 -0
- package/convex/billing.js +655 -0
- package/convex/billing.js.map +1 -0
- package/convex/capabilities.d.ts +9 -0
- package/convex/capabilities.d.ts.map +1 -0
- package/convex/capabilities.js +145 -0
- package/convex/capabilities.js.map +1 -0
- package/convex/chains.d.ts +67 -0
- package/convex/chains.d.ts.map +1 -0
- package/convex/chains.js +1042 -0
- package/convex/chains.js.map +1 -0
- package/convex/credits.d.ts +25 -0
- package/convex/credits.d.ts.map +1 -0
- package/convex/credits.js +186 -0
- package/convex/credits.js.map +1 -0
- package/convex/crons.d.ts +3 -0
- package/convex/crons.d.ts.map +1 -0
- package/convex/crons.js +17 -0
- package/convex/crons.js.map +1 -0
- package/convex/directCall.d.ts +72 -0
- package/convex/directCall.d.ts.map +1 -0
- package/convex/directCall.js +627 -0
- package/convex/directCall.js.map +1 -0
- package/convex/earnProgress.d.ts +58 -0
- package/convex/earnProgress.d.ts.map +1 -0
- package/convex/earnProgress.js +649 -0
- package/convex/earnProgress.js.map +1 -0
- package/convex/email.d.ts +14 -0
- package/convex/email.d.ts.map +1 -0
- package/convex/email.js +300 -0
- package/convex/email.js.map +1 -0
- package/convex/feedback.d.ts +7 -0
- package/convex/feedback.d.ts.map +1 -0
- package/convex/feedback.js +227 -0
- package/convex/feedback.js.map +1 -0
- package/convex/http.d.ts +3 -0
- package/convex/http.d.ts.map +1 -0
- package/convex/http.js +902 -0
- package/convex/http.js.map +1 -0
- package/convex/logs.d.ts +38 -0
- package/convex/logs.d.ts.map +1 -0
- package/convex/logs.js +487 -0
- package/convex/logs.js.map +1 -0
- package/convex/logs.ts +6 -1
- package/convex/mou.d.ts +6 -0
- package/convex/mou.d.ts.map +1 -0
- package/convex/mou.js +82 -0
- package/convex/mou.js.map +1 -0
- package/convex/providerKeys.d.ts +31 -0
- package/convex/providerKeys.d.ts.map +1 -0
- package/convex/providerKeys.js +257 -0
- package/convex/providerKeys.js.map +1 -0
- package/convex/providers.d.ts +29 -0
- package/convex/providers.d.ts.map +1 -0
- package/convex/providers.js +756 -0
- package/convex/providers.js.map +1 -0
- package/convex/purchases.d.ts +7 -0
- package/convex/purchases.d.ts.map +1 -0
- package/convex/purchases.js +157 -0
- package/convex/purchases.js.map +1 -0
- package/convex/ratelimit.d.ts +4 -0
- package/convex/ratelimit.d.ts.map +1 -0
- package/convex/ratelimit.js +91 -0
- package/convex/ratelimit.js.map +1 -0
- package/convex/schema.ts +2 -0
- package/convex/searchLogs.d.ts +4 -0
- package/convex/searchLogs.d.ts.map +1 -0
- package/convex/searchLogs.js +129 -0
- package/convex/searchLogs.js.map +1 -0
- package/convex/spendAlerts.d.ts +36 -0
- package/convex/spendAlerts.d.ts.map +1 -0
- package/convex/spendAlerts.js +380 -0
- package/convex/spendAlerts.js.map +1 -0
- package/convex/stripeActions.d.ts +19 -0
- package/convex/stripeActions.d.ts.map +1 -0
- package/convex/stripeActions.js +411 -0
- package/convex/stripeActions.js.map +1 -0
- package/convex/teams.d.ts +21 -0
- package/convex/teams.d.ts.map +1 -0
- package/convex/teams.js +215 -0
- package/convex/teams.js.map +1 -0
- package/convex/telemetry.d.ts +4 -0
- package/convex/telemetry.d.ts.map +1 -0
- package/convex/telemetry.js +74 -0
- package/convex/telemetry.js.map +1 -0
- package/convex/usage.d.ts +27 -0
- package/convex/usage.d.ts.map +1 -0
- package/convex/usage.js +229 -0
- package/convex/usage.js.map +1 -0
- package/convex/waitlist.d.ts +4 -0
- package/convex/waitlist.d.ts.map +1 -0
- package/convex/waitlist.js +49 -0
- package/convex/waitlist.js.map +1 -0
- package/convex/webhooks.d.ts +12 -0
- package/convex/webhooks.d.ts.map +1 -0
- package/convex/webhooks.js +410 -0
- package/convex/webhooks.js.map +1 -0
- package/convex/workspaces.d.ts +29 -0
- package/convex/workspaces.d.ts.map +1 -0
- package/convex/workspaces.js +880 -0
- package/convex/workspaces.js.map +1 -0
- package/dist/analytics.d.ts +1 -1
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +51 -2
- package/dist/analytics.js.map +1 -1
- package/dist/index.js +27 -2
- package/dist/index.js.map +1 -1
- package/landing/scripts/generate-stats.js +9 -5
- package/landing/src/app/api/og/route.tsx +0 -2
- package/landing/src/app/page.tsx +3 -3
- package/landing/src/app/workspace/page.tsx +26 -1
- package/landing/src/lib/stats.json +2 -2
- package/package.json +1 -1
- package/src/analytics.ts +53 -2
- package/src/index.ts +28 -2
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"apiCount": 22392,
|
|
3
3
|
"openApiCount": 1636,
|
|
4
4
|
"directCallCount": 18,
|
|
5
|
+
"npmDownloads": 4232,
|
|
5
6
|
"categoryCount": 13,
|
|
6
|
-
"
|
|
7
|
-
"generatedAt": "2026-03-18T11:19:31.518Z",
|
|
7
|
+
"generatedAt": "2026-03-18T12:30:05.958Z",
|
|
8
8
|
"categoryBreakdown": {
|
|
9
9
|
"Finance": 1179,
|
|
10
10
|
"Auth & Security": 491,
|
package/package.json
CHANGED
package/src/analytics.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { appendFileSync, existsSync, mkdirSync } from 'fs';
|
|
7
7
|
import { homedir } from 'os';
|
|
8
8
|
import { join } from 'path';
|
|
9
|
+
import { ConvexHttpClient } from 'convex/browser';
|
|
10
|
+
import { api } from '../convex/_generated/api.js';
|
|
9
11
|
|
|
10
12
|
export interface APICallLog {
|
|
11
13
|
timestamp: string;
|
|
@@ -22,6 +24,24 @@ export interface APICallLog {
|
|
|
22
24
|
const LOG_DIR = join(homedir(), '.apiclaw', 'logs');
|
|
23
25
|
const LOG_FILE = join(LOG_DIR, 'api-calls.jsonl');
|
|
24
26
|
|
|
27
|
+
// Convex client (lazy init)
|
|
28
|
+
let convexClient: ConvexHttpClient | null = null;
|
|
29
|
+
|
|
30
|
+
function getConvexClient(): ConvexHttpClient | null {
|
|
31
|
+
if (convexClient) return convexClient;
|
|
32
|
+
|
|
33
|
+
const convexUrl = process.env.APICLAW_CONVEX_URL || process.env.NEXT_PUBLIC_CONVEX_URL;
|
|
34
|
+
if (!convexUrl) return null;
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
convexClient = new ConvexHttpClient(convexUrl);
|
|
38
|
+
return convexClient;
|
|
39
|
+
} catch (e) {
|
|
40
|
+
console.error('[APIClaw Analytics] Failed to init Convex client:', e);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
25
45
|
// Ensure log directory exists
|
|
26
46
|
function ensureLogDir(): void {
|
|
27
47
|
if (!existsSync(LOG_DIR)) {
|
|
@@ -30,16 +50,47 @@ function ensureLogDir(): void {
|
|
|
30
50
|
}
|
|
31
51
|
|
|
32
52
|
/**
|
|
33
|
-
* Log an API call
|
|
53
|
+
* Log an API call to local file AND Convex
|
|
34
54
|
*/
|
|
35
55
|
export function logAPICall(log: APICallLog): void {
|
|
56
|
+
// 1. Local file (existing behavior)
|
|
36
57
|
try {
|
|
37
58
|
ensureLogDir();
|
|
38
59
|
const line = JSON.stringify(log) + '\n';
|
|
39
60
|
appendFileSync(LOG_FILE, line);
|
|
61
|
+
} catch (e) {
|
|
62
|
+
console.error('[APIClaw Analytics] Failed to log to file:', e);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 2. Send to Convex (new - includes anonymous usage)
|
|
66
|
+
sendToConvex(log).catch(() => {}); // Fire and forget
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Send analytics event to Convex
|
|
71
|
+
* Works for both authenticated and anonymous users
|
|
72
|
+
*/
|
|
73
|
+
async function sendToConvex(log: APICallLog): Promise<void> {
|
|
74
|
+
const client = getConvexClient();
|
|
75
|
+
if (!client) return;
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
await client.mutation(api.analytics.log, {
|
|
79
|
+
event: 'api_call',
|
|
80
|
+
provider: log.provider,
|
|
81
|
+
query: log.action, // Store action as query field
|
|
82
|
+
identifier: log.userId || 'anonymous',
|
|
83
|
+
metadata: {
|
|
84
|
+
type: log.type,
|
|
85
|
+
success: log.success,
|
|
86
|
+
latencyMs: log.latencyMs,
|
|
87
|
+
error: log.error,
|
|
88
|
+
timestamp: log.timestamp,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
40
91
|
} catch (e) {
|
|
41
92
|
// Silent fail - don't break API calls for logging errors
|
|
42
|
-
console.error('[APIClaw Analytics] Failed to
|
|
93
|
+
console.error('[APIClaw Analytics] Failed to send to Convex:', e);
|
|
43
94
|
}
|
|
44
95
|
}
|
|
45
96
|
|
package/src/index.ts
CHANGED
|
@@ -865,7 +865,33 @@ Docs: https://apiclaw.nordsym.com
|
|
|
865
865
|
const responseTimeMs = Date.now() - startTime;
|
|
866
866
|
trackSearch(query, results.length, responseTimeMs);
|
|
867
867
|
|
|
868
|
-
// Log search to Convex
|
|
868
|
+
// Log search to Convex analytics (authenticated + anonymous)
|
|
869
|
+
const analyticsUserId = workspaceContext?.workspaceId || `anon:${getMachineFingerprint()}`;
|
|
870
|
+
const convexUrl = process.env.APICLAW_CONVEX_URL || process.env.NEXT_PUBLIC_CONVEX_URL;
|
|
871
|
+
if (convexUrl) {
|
|
872
|
+
fetch(`${convexUrl}/api/mutation`, {
|
|
873
|
+
method: 'POST',
|
|
874
|
+
headers: { 'Content-Type': 'application/json' },
|
|
875
|
+
body: JSON.stringify({
|
|
876
|
+
path: 'analytics:log',
|
|
877
|
+
args: {
|
|
878
|
+
event: 'search_query',
|
|
879
|
+
provider: undefined,
|
|
880
|
+
query,
|
|
881
|
+
identifier: analyticsUserId,
|
|
882
|
+
metadata: {
|
|
883
|
+
resultCount: results.length,
|
|
884
|
+
matchedProviders: results.slice(0, 10).map(r => r.provider.id),
|
|
885
|
+
responseTimeMs,
|
|
886
|
+
category,
|
|
887
|
+
authenticated: !!workspaceContext,
|
|
888
|
+
},
|
|
889
|
+
},
|
|
890
|
+
}),
|
|
891
|
+
}).catch(() => {}); // Fire and forget
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
// Log search to searchLogs table (authenticated only - requires workspace)
|
|
869
895
|
if (workspaceContext?.sessionToken) {
|
|
870
896
|
const searchLogPayload = {
|
|
871
897
|
path: 'searchLogs:log',
|
|
@@ -879,7 +905,7 @@ Docs: https://apiclaw.nordsym.com
|
|
|
879
905
|
},
|
|
880
906
|
};
|
|
881
907
|
|
|
882
|
-
fetch(
|
|
908
|
+
fetch(`${convexUrl}/api/mutation`, {
|
|
883
909
|
method: 'POST',
|
|
884
910
|
headers: { 'Content-Type': 'application/json' },
|
|
885
911
|
body: JSON.stringify(searchLogPayload),
|