@nordsym/apiclaw 1.3.6 → 1.3.7

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 (46) hide show
  1. package/README.md +33 -0
  2. package/convex/_generated/api.d.ts +12 -0
  3. package/convex/billing.ts +651 -216
  4. package/convex/crons.ts +17 -0
  5. package/convex/email.ts +135 -82
  6. package/convex/feedback.ts +265 -0
  7. package/convex/http.ts +80 -4
  8. package/convex/logs.ts +287 -0
  9. package/convex/providerKeys.ts +209 -0
  10. package/convex/providers.ts +18 -0
  11. package/convex/schema.ts +115 -0
  12. package/convex/stripeActions.ts +512 -0
  13. package/convex/webhooks.ts +494 -0
  14. package/convex/workspaces.ts +74 -1
  15. package/dist/index.js +178 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/metered.d.ts +62 -0
  18. package/dist/metered.d.ts.map +1 -0
  19. package/dist/metered.js +81 -0
  20. package/dist/metered.js.map +1 -0
  21. package/dist/stripe.d.ts +62 -0
  22. package/dist/stripe.d.ts.map +1 -1
  23. package/dist/stripe.js +212 -0
  24. package/dist/stripe.js.map +1 -1
  25. package/docs/PRD-final-polish.md +117 -0
  26. package/docs/PRD-mobile-responsive.md +56 -0
  27. package/docs/PRD-navigation-expansion.md +295 -0
  28. package/docs/PRD-stripe-billing.md +312 -0
  29. package/docs/PRD-workspace-cleanup.md +200 -0
  30. package/landing/src/app/api/billing/checkout/route.ts +109 -0
  31. package/landing/src/app/api/billing/payment-method/route.ts +118 -0
  32. package/landing/src/app/api/billing/portal/route.ts +64 -0
  33. package/landing/src/app/auth/verify/page.tsx +20 -5
  34. package/landing/src/app/earn/page.tsx +6 -6
  35. package/landing/src/app/login/page.tsx +1 -1
  36. package/landing/src/app/page.tsx +70 -70
  37. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  38. package/landing/src/app/workspace/page.tsx +3497 -535
  39. package/landing/src/components/CheckoutButton.tsx +188 -0
  40. package/landing/src/components/Toast.tsx +84 -0
  41. package/landing/src/lib/stats.json +1 -1
  42. package/landing/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +1 -1
  44. package/src/index.ts +205 -0
  45. package/src/metered.ts +149 -0
  46. package/src/stripe.ts +253 -0
package/dist/stripe.js CHANGED
@@ -193,4 +193,216 @@ export function processWebhookEvent(event) {
193
193
  export function getStripe() {
194
194
  return stripe;
195
195
  }
196
+ // ============================================
197
+ // METERED BILLING (Pay-per-call)
198
+ // ============================================
199
+ // Stripe Meter configuration
200
+ export const METERED_BILLING = {
201
+ meterId: 'mtr_61UFEGojJ0b2awh1441RtJYK3aJTqS9g',
202
+ eventName: 'api_call',
203
+ priceId: 'price_1T5qMQRtJYK3aJTqun4YZLsE',
204
+ productId: 'prod_U3yHbnc4NcLofW',
205
+ pricePerCall: 0.002, // $0.002 per API call
206
+ };
207
+ /**
208
+ * Report API usage to Stripe Meter
209
+ * Call this after each successful API call
210
+ */
211
+ export async function reportUsage(customerId, calls = 1, idempotencyKey) {
212
+ if (!stripe) {
213
+ return { success: false, error: 'Stripe not configured' };
214
+ }
215
+ try {
216
+ // Use Stripe's meter event API
217
+ const event = await stripe.billing.meterEvents.create({
218
+ event_name: METERED_BILLING.eventName,
219
+ payload: {
220
+ stripe_customer_id: customerId,
221
+ value: calls.toString(),
222
+ },
223
+ timestamp: Math.floor(Date.now() / 1000),
224
+ }, {
225
+ idempotencyKey: idempotencyKey || `usage_${customerId}_${Date.now()}_${Math.random()}`,
226
+ });
227
+ return { success: true, eventId: event.identifier };
228
+ }
229
+ catch (error) {
230
+ console.error('Failed to report usage:', error);
231
+ return {
232
+ success: false,
233
+ error: error instanceof Error ? error.message : 'Usage reporting failed',
234
+ };
235
+ }
236
+ }
237
+ /**
238
+ * Create or get a customer in Stripe
239
+ */
240
+ export async function getOrCreateCustomer(agentId, email) {
241
+ if (!stripe) {
242
+ return { error: 'Stripe not configured' };
243
+ }
244
+ try {
245
+ // Search for existing customer by agentId
246
+ const existing = await stripe.customers.search({
247
+ query: `metadata['agentId']:'${agentId}'`,
248
+ });
249
+ if (existing.data.length > 0) {
250
+ return { customerId: existing.data[0].id };
251
+ }
252
+ // Create new customer
253
+ const customer = await stripe.customers.create({
254
+ email: email || `${agentId}@apiclaw.local`,
255
+ metadata: {
256
+ agentId,
257
+ source: 'apiclaw',
258
+ },
259
+ });
260
+ return { customerId: customer.id };
261
+ }
262
+ catch (error) {
263
+ console.error('Failed to get/create customer:', error);
264
+ return {
265
+ error: error instanceof Error ? error.message : 'Customer creation failed',
266
+ };
267
+ }
268
+ }
269
+ /**
270
+ * Create a metered subscription for pay-per-call billing
271
+ */
272
+ export async function createMeteredSubscription(customerId, paymentMethodId) {
273
+ if (!stripe) {
274
+ return { error: 'Stripe not configured' };
275
+ }
276
+ try {
277
+ // If payment method provided, attach it
278
+ if (paymentMethodId) {
279
+ await stripe.paymentMethods.attach(paymentMethodId, {
280
+ customer: customerId,
281
+ });
282
+ await stripe.customers.update(customerId, {
283
+ invoice_settings: {
284
+ default_payment_method: paymentMethodId,
285
+ },
286
+ });
287
+ }
288
+ // Create subscription with metered price
289
+ const subscription = await stripe.subscriptions.create({
290
+ customer: customerId,
291
+ items: [
292
+ {
293
+ price: METERED_BILLING.priceId,
294
+ },
295
+ ],
296
+ payment_behavior: 'default_incomplete',
297
+ payment_settings: {
298
+ save_default_payment_method: 'on_subscription',
299
+ },
300
+ expand: ['latest_invoice.payment_intent'],
301
+ });
302
+ return {
303
+ subscriptionId: subscription.id,
304
+ status: subscription.status,
305
+ };
306
+ }
307
+ catch (error) {
308
+ console.error('Failed to create metered subscription:', error);
309
+ return {
310
+ error: error instanceof Error ? error.message : 'Subscription creation failed',
311
+ };
312
+ }
313
+ }
314
+ /**
315
+ * Create a checkout session for metered billing subscription
316
+ */
317
+ export async function createMeteredCheckoutSession(agentId, successUrl, cancelUrl) {
318
+ if (!stripe) {
319
+ return { error: 'Stripe not configured' };
320
+ }
321
+ try {
322
+ const session = await stripe.checkout.sessions.create({
323
+ mode: 'subscription',
324
+ payment_method_types: ['card'],
325
+ line_items: [
326
+ {
327
+ price: METERED_BILLING.priceId,
328
+ },
329
+ ],
330
+ metadata: {
331
+ agentId,
332
+ billingType: 'metered',
333
+ },
334
+ subscription_data: {
335
+ metadata: {
336
+ agentId,
337
+ billingType: 'metered',
338
+ },
339
+ },
340
+ success_url: successUrl,
341
+ cancel_url: cancelUrl,
342
+ });
343
+ return {
344
+ sessionId: session.id,
345
+ url: session.url,
346
+ };
347
+ }
348
+ catch (error) {
349
+ console.error('Metered checkout error:', error);
350
+ return {
351
+ error: error instanceof Error ? error.message : 'Checkout failed',
352
+ };
353
+ }
354
+ }
355
+ /**
356
+ * Get usage summary for a subscription
357
+ */
358
+ export async function getUsageSummary(subscriptionId) {
359
+ if (!stripe) {
360
+ return { error: 'Stripe not configured' };
361
+ }
362
+ try {
363
+ // Get subscription details - use raw API response
364
+ const subscription = await stripe.subscriptions.retrieve(subscriptionId);
365
+ const subData = subscription;
366
+ // For metered billing with meters, usage is tracked via meter events
367
+ // The actual usage amount will show up on the invoice at period end
368
+ // For now, return period info and note that detailed usage is on the Stripe dashboard
369
+ return {
370
+ totalCalls: 0, // Usage tracked via meter events, visible in Stripe dashboard
371
+ totalCost: 0,
372
+ period: {
373
+ start: subData.current_period_start || Math.floor(Date.now() / 1000),
374
+ end: subData.current_period_end || Math.floor(Date.now() / 1000) + 30 * 24 * 3600,
375
+ },
376
+ };
377
+ }
378
+ catch (error) {
379
+ console.error('Failed to get usage summary:', error);
380
+ return {
381
+ error: error instanceof Error ? error.message : 'Usage summary failed',
382
+ };
383
+ }
384
+ }
385
+ /**
386
+ * Check if a customer has an active metered subscription
387
+ */
388
+ export async function hasActiveMeteredSubscription(customerId) {
389
+ if (!stripe) {
390
+ return { active: false };
391
+ }
392
+ try {
393
+ const subscriptions = await stripe.subscriptions.list({
394
+ customer: customerId,
395
+ status: 'active',
396
+ price: METERED_BILLING.priceId,
397
+ });
398
+ if (subscriptions.data.length > 0) {
399
+ return { active: true, subscriptionId: subscriptions.data[0].id };
400
+ }
401
+ return { active: false };
402
+ }
403
+ catch (error) {
404
+ console.error('Failed to check subscription:', error);
405
+ return { active: false };
406
+ }
407
+ }
196
408
  //# sourceMappingURL=stripe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../src/stripe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../src/stripe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ # PRD: APIClaw Final Polish
2
+
3
+ Samlar alla återstående issues för en sista polish-runda.
4
+
5
+ ---
6
+
7
+ ## Issues
8
+
9
+ ### 1. 🔴 "Available APIs: 10" Kort Förvirrar
10
+
11
+ **Problem:**
12
+ - Kortet visar "Available APIs: 10"
13
+ - User tror det är en personlig begränsning
14
+ - User tänker "kan jag köpa fler?"
15
+ - Verkligheten: 10 Direct Call + 22k+ via MCP
16
+
17
+ **Lösning:**
18
+ - Ta bort "Available APIs" kortet helt
19
+ - Behåll: API Calls, My Agents, My APIs
20
+ - Direct Call-sektionen visar redan de 10 APIs
21
+
22
+ **Scope:** Ändra OverviewTab, ta bort första stat-kortet
23
+
24
+ ---
25
+
26
+ ### 2. 🔴 Stripe Environment Variables
27
+
28
+ **Problem:**
29
+ - Stripe-koden finns men env vars saknas
30
+ - Betalning fungerar inte förrän keys är satta
31
+
32
+ **Variabler som behövs:**
33
+ ```
34
+ STRIPE_SECRET_KEY=sk_live_...
35
+ STRIPE_WEBHOOK_SECRET=whsec_...
36
+ STRIPE_PRICE_ID_USAGE=price_...
37
+ ```
38
+
39
+ **Lösning:**
40
+ - Gustav hämtar keys från Stripe dashboard
41
+ - Lägg in i Convex environment variables
42
+ - Testa checkout flow
43
+
44
+ **Scope:** Config only (ingen kod)
45
+
46
+ ---
47
+
48
+ ### 3. 🟡 Logging Hook → Execute.ts
49
+
50
+ **Problem:**
51
+ - Logs UI finns och visar data
52
+ - Men logs kopplas inte automatiskt till faktiska API-anrop
53
+ - `logs:createLog` mutation finns men anropas inte från execute
54
+
55
+ **Lösning:**
56
+ - Hitta execute-funktionen i MCP-servern
57
+ - Efter varje Direct Call, anropa createLog
58
+ - Logga: provider, action, status, latency, workspaceId
59
+
60
+ **Filer:**
61
+ - `src/execute.ts` (eller liknande i MCP-servern)
62
+ - Anropa Convex mutation efter varje call
63
+
64
+ **Scope:** 1 agent
65
+
66
+ ---
67
+
68
+ ### 4. 🟢 Auto-Configure Feature
69
+
70
+ **Problem:**
71
+ - Användare måste manuellt konfigurera MCP config
72
+ - Friktion i onboarding
73
+
74
+ **Vision:**
75
+ - Klicka "Auto-Configure" i workspace
76
+ - Permission dialog (File System Access API)
77
+ - AI lokaliserar och modifierar MCP config
78
+ - Visuell bekräftelse
79
+
80
+ **Tekniska alternativ:**
81
+ 1. File System Access API (Chrome/Edge)
82
+ 2. Browser extension
83
+ 3. Local daemon
84
+ 4. CLI command + copy-paste
85
+
86
+ **Scope:** Egen mini-PRD, 2-3 agenter
87
+
88
+ ---
89
+
90
+ ## Agenter
91
+
92
+ | # | Agent | Scope | Prio |
93
+ |---|-------|-------|------|
94
+ | 1 | `overview-cleanup` | Ta bort "Available APIs" kort | 🔴 |
95
+ | 2 | `stripe-config` | Dokumentera env var setup | 🔴 |
96
+ | 3 | `logging-hook` | Koppla execute → logs | 🟡 |
97
+ | 4 | `auto-configure-prd` | Skriv detaljerad PRD | 🟢 |
98
+
99
+ **Total: 4 agenter**
100
+
101
+ ---
102
+
103
+ ## Acceptanskriterier
104
+
105
+ - [ ] Overview visar 3 kort (inte 4)
106
+ - [ ] Stripe checkout fungerar live
107
+ - [ ] API-anrop loggas automatiskt
108
+ - [ ] Auto-Configure PRD dokumenterad
109
+
110
+ ---
111
+
112
+ ## Prioritetsordning
113
+
114
+ 1. **Overview cleanup** — Snabb fix, tar bort förvirring
115
+ 2. **Stripe config** — Gustav gör manuellt med guide
116
+ 3. **Logging hook** — Kräver research i MCP-servern
117
+ 4. **Auto-Configure** — Future feature, PRD först
@@ -0,0 +1,56 @@
1
+ # PRD: APIClaw Mobile Responsiveness
2
+
3
+ ## Scope
4
+ Göra workspace och landing page mobile-friendly.
5
+
6
+ ## Arbete (1 agent, ingen spawn)
7
+
8
+ Jag gör allt själv — inga subagenter. Estimat: ~20 min.
9
+
10
+ ---
11
+
12
+ ## Del 1: Workspace Mobile (workspace/page.tsx)
13
+
14
+ ### Ändringar:
15
+ 1. **Sidebar** → Dold på mobil, visa via hamburger-meny
16
+ 2. **Tabs** → Horisontell scroll eller dropdown på mobil
17
+ 3. **Cards/Tables** → Stack vertically på små skärmar
18
+ 4. **Agent-kort** → Responsiv layout, knappar under content
19
+ 5. **Input-fält** → Full width på mobil
20
+
21
+ ### Tekniskt:
22
+ - Tailwind breakpoints: `sm:`, `md:`, `lg:`
23
+ - Befintlig `Menu`/`X` icons redan importerade
24
+ - Mobil sidebar state: `sidebarOpen` finns redan
25
+
26
+ ---
27
+
28
+ ## Del 2: Landing Page Header (page.tsx)
29
+
30
+ ### Ändringar:
31
+ 1. **Desktop nav** → Dölj på mobil (`hidden lg:flex`)
32
+ 2. **Hamburger** → Visa på mobil (`lg:hidden`)
33
+ 3. **Mobile menu** → Slide-in eller dropdown
34
+ 4. **CTA-knappar** → Stack på mobil
35
+
36
+ ### Tekniskt:
37
+ - Lägg till mobile menu state
38
+ - Animera med Tailwind transitions
39
+
40
+ ---
41
+
42
+ ## Filer som ändras:
43
+ 1. `landing/src/app/workspace/page.tsx`
44
+ 2. `landing/src/app/page.tsx`
45
+
46
+ ## Inga nya dependencies
47
+
48
+ ## Teststrategi:
49
+ - Chrome DevTools mobile view
50
+ - Breakpoints: 375px (iPhone), 768px (tablet)
51
+
52
+ ---
53
+
54
+ ## Attestera?
55
+
56
+ Svara **"kör"** för att starta.