@nordsym/apiclaw 1.3.6 → 1.3.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.
Files changed (214) hide show
  1. package/README.md +422 -169
  2. package/convex/_generated/api.d.ts +16 -0
  3. package/convex/agents.ts +403 -0
  4. package/convex/billing.ts +651 -216
  5. package/convex/crons.ts +17 -0
  6. package/convex/directCall.ts +80 -0
  7. package/convex/earnProgress.ts +753 -0
  8. package/convex/email.ts +135 -82
  9. package/convex/feedback.ts +265 -0
  10. package/convex/http.ts +80 -4
  11. package/convex/logs.ts +304 -0
  12. package/convex/providerKeys.ts +289 -0
  13. package/convex/providers.ts +18 -0
  14. package/convex/schema.ts +185 -1
  15. package/convex/stripeActions.ts +512 -0
  16. package/convex/webhooks.ts +494 -0
  17. package/convex/workspaces.ts +158 -3
  18. package/dist/adapters/base.d.ts +112 -0
  19. package/dist/adapters/base.d.ts.map +1 -0
  20. package/dist/adapters/base.js +247 -0
  21. package/dist/adapters/base.js.map +1 -0
  22. package/dist/adapters/claude-desktop.d.ts +12 -0
  23. package/dist/adapters/claude-desktop.d.ts.map +1 -0
  24. package/dist/adapters/claude-desktop.js +36 -0
  25. package/dist/adapters/claude-desktop.js.map +1 -0
  26. package/dist/adapters/cline.d.ts +20 -0
  27. package/dist/adapters/cline.d.ts.map +1 -0
  28. package/dist/adapters/cline.js +77 -0
  29. package/dist/adapters/cline.js.map +1 -0
  30. package/dist/adapters/continue.d.ts +26 -0
  31. package/dist/adapters/continue.d.ts.map +1 -0
  32. package/dist/adapters/continue.js +68 -0
  33. package/dist/adapters/continue.js.map +1 -0
  34. package/dist/adapters/cursor.d.ts +12 -0
  35. package/dist/adapters/cursor.d.ts.map +1 -0
  36. package/dist/adapters/cursor.js +38 -0
  37. package/dist/adapters/cursor.js.map +1 -0
  38. package/dist/adapters/custom.d.ts +47 -0
  39. package/dist/adapters/custom.d.ts.map +1 -0
  40. package/dist/adapters/custom.js +146 -0
  41. package/dist/adapters/custom.js.map +1 -0
  42. package/dist/adapters/detect.d.ts +69 -0
  43. package/dist/adapters/detect.d.ts.map +1 -0
  44. package/dist/adapters/detect.js +158 -0
  45. package/dist/adapters/detect.js.map +1 -0
  46. package/dist/adapters/index.d.ts +21 -0
  47. package/dist/adapters/index.d.ts.map +1 -0
  48. package/dist/adapters/index.js +23 -0
  49. package/dist/adapters/index.js.map +1 -0
  50. package/dist/adapters/windsurf.d.ts +12 -0
  51. package/dist/adapters/windsurf.d.ts.map +1 -0
  52. package/dist/adapters/windsurf.js +39 -0
  53. package/dist/adapters/windsurf.js.map +1 -0
  54. package/dist/bin.d.ts +9 -0
  55. package/dist/bin.d.ts.map +1 -0
  56. package/dist/bin.js +19 -0
  57. package/dist/bin.js.map +1 -0
  58. package/dist/cli/commands/doctor.d.ts +34 -0
  59. package/dist/cli/commands/doctor.d.ts.map +1 -0
  60. package/dist/cli/commands/doctor.js +312 -0
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/index.d.ts +9 -0
  63. package/dist/cli/commands/index.d.ts.map +1 -0
  64. package/dist/cli/commands/index.js +9 -0
  65. package/dist/cli/commands/index.js.map +1 -0
  66. package/dist/cli/commands/restore.d.ts +50 -0
  67. package/dist/cli/commands/restore.d.ts.map +1 -0
  68. package/dist/cli/commands/restore.js +260 -0
  69. package/dist/cli/commands/restore.js.map +1 -0
  70. package/dist/cli/commands/setup.d.ts +19 -0
  71. package/dist/cli/commands/setup.d.ts.map +1 -0
  72. package/dist/cli/commands/setup.js +206 -0
  73. package/dist/cli/commands/setup.js.map +1 -0
  74. package/dist/cli/commands/uninstall.d.ts +37 -0
  75. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  76. package/dist/cli/commands/uninstall.js +189 -0
  77. package/dist/cli/commands/uninstall.js.map +1 -0
  78. package/dist/cli/index.d.ts +7 -0
  79. package/dist/cli/index.d.ts.map +1 -0
  80. package/dist/cli/index.js +97 -0
  81. package/dist/cli/index.js.map +1 -0
  82. package/dist/discovery.d.ts +6 -2
  83. package/dist/discovery.d.ts.map +1 -1
  84. package/dist/discovery.js +296 -2
  85. package/dist/discovery.js.map +1 -1
  86. package/dist/enterprise/env.d.ts +56 -0
  87. package/dist/enterprise/env.d.ts.map +1 -0
  88. package/dist/enterprise/env.js +124 -0
  89. package/dist/enterprise/env.js.map +1 -0
  90. package/dist/enterprise/index.d.ts +7 -0
  91. package/dist/enterprise/index.d.ts.map +1 -0
  92. package/dist/enterprise/index.js +7 -0
  93. package/dist/enterprise/index.js.map +1 -0
  94. package/dist/enterprise/script-generator.d.ts +32 -0
  95. package/dist/enterprise/script-generator.d.ts.map +1 -0
  96. package/dist/enterprise/script-generator.js +461 -0
  97. package/dist/enterprise/script-generator.js.map +1 -0
  98. package/dist/execute.d.ts +21 -0
  99. package/dist/execute.d.ts.map +1 -1
  100. package/dist/execute.js +231 -0
  101. package/dist/execute.js.map +1 -1
  102. package/dist/index.js +257 -7
  103. package/dist/index.js.map +1 -1
  104. package/dist/metered.d.ts +62 -0
  105. package/dist/metered.d.ts.map +1 -0
  106. package/dist/metered.js +81 -0
  107. package/dist/metered.js.map +1 -0
  108. package/dist/stripe.d.ts +62 -0
  109. package/dist/stripe.d.ts.map +1 -1
  110. package/dist/stripe.js +212 -0
  111. package/dist/stripe.js.map +1 -1
  112. package/dist/types.d.ts +29 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/ui/colors.d.ts +111 -0
  115. package/dist/ui/colors.d.ts.map +1 -0
  116. package/dist/ui/colors.js +185 -0
  117. package/dist/ui/colors.js.map +1 -0
  118. package/dist/ui/errors.d.ts +69 -0
  119. package/dist/ui/errors.d.ts.map +1 -0
  120. package/dist/ui/errors.js +334 -0
  121. package/dist/ui/errors.js.map +1 -0
  122. package/dist/ui/index.d.ts +10 -0
  123. package/dist/ui/index.d.ts.map +1 -0
  124. package/dist/ui/index.js +14 -0
  125. package/dist/ui/index.js.map +1 -0
  126. package/dist/ui/prompts.d.ts +88 -0
  127. package/dist/ui/prompts.d.ts.map +1 -0
  128. package/dist/ui/prompts.js +295 -0
  129. package/dist/ui/prompts.js.map +1 -0
  130. package/dist/ui/spinner.d.ts +112 -0
  131. package/dist/ui/spinner.d.ts.map +1 -0
  132. package/dist/ui/spinner.js +229 -0
  133. package/dist/ui/spinner.js.map +1 -0
  134. package/dist/utils/backup.d.ts +48 -0
  135. package/dist/utils/backup.d.ts.map +1 -0
  136. package/dist/utils/backup.js +182 -0
  137. package/dist/utils/backup.js.map +1 -0
  138. package/dist/utils/config.d.ts +80 -0
  139. package/dist/utils/config.d.ts.map +1 -0
  140. package/dist/utils/config.js +221 -0
  141. package/dist/utils/config.js.map +1 -0
  142. package/dist/utils/os.d.ts +45 -0
  143. package/dist/utils/os.d.ts.map +1 -0
  144. package/dist/utils/os.js +106 -0
  145. package/dist/utils/os.js.map +1 -0
  146. package/dist/utils/paths.d.ts +38 -0
  147. package/dist/utils/paths.d.ts.map +1 -0
  148. package/dist/utils/paths.js +160 -0
  149. package/dist/utils/paths.js.map +1 -0
  150. package/docs/PRD-BILLING.md +226 -0
  151. package/docs/PRD-EARN-SYSTEM.md +261 -0
  152. package/docs/PRD-MCP-AUTO-SETUP.md +623 -0
  153. package/docs/PRD-final-polish.md +117 -0
  154. package/docs/PRD-mobile-responsive.md +56 -0
  155. package/docs/PRD-navigation-expansion.md +295 -0
  156. package/docs/PRD-stripe-billing.md +312 -0
  157. package/docs/PRD-workspace-cleanup.md +200 -0
  158. package/docs/enterprise-deployment.md +728 -0
  159. package/landing/next.config.mjs +14 -0
  160. package/landing/public/stats.json +4 -2
  161. package/landing/scripts/generate-stats.js +12 -0
  162. package/landing/src/app/api/billing/checkout/route.ts +109 -0
  163. package/landing/src/app/api/billing/payment-method/route.ts +118 -0
  164. package/landing/src/app/api/billing/portal/route.ts +64 -0
  165. package/landing/src/app/api/workspace-auth/magic-link/route.ts +6 -3
  166. package/landing/src/app/auth/verify/page.tsx +31 -9
  167. package/landing/src/app/docs/page.tsx +1 -1
  168. package/landing/src/app/earn/page.tsx +6 -6
  169. package/landing/src/app/join/page.tsx +49 -0
  170. package/landing/src/app/login/page.tsx +8 -2
  171. package/landing/src/app/page.tsx +81 -96
  172. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  173. package/landing/src/app/providers/register/page.tsx +1 -1
  174. package/landing/src/app/workspace/page.tsx +3269 -534
  175. package/landing/src/components/CheckoutButton.tsx +188 -0
  176. package/landing/src/components/EarnCreditsTab.tsx +842 -0
  177. package/landing/src/components/Toast.tsx +84 -0
  178. package/landing/src/lib/stats.json +3 -1
  179. package/package.json +9 -2
  180. package/src/adapters/base.ts +363 -0
  181. package/src/adapters/claude-desktop.ts +41 -0
  182. package/src/adapters/cline.ts +88 -0
  183. package/src/adapters/continue.ts +91 -0
  184. package/src/adapters/cursor.ts +43 -0
  185. package/src/adapters/custom.ts +188 -0
  186. package/src/adapters/detect.ts +202 -0
  187. package/src/adapters/index.ts +47 -0
  188. package/src/adapters/windsurf.ts +44 -0
  189. package/src/bin.ts +19 -0
  190. package/src/cli/commands/doctor.ts +367 -0
  191. package/src/cli/commands/index.ts +9 -0
  192. package/src/cli/commands/restore.ts +333 -0
  193. package/src/cli/commands/setup.ts +276 -0
  194. package/src/cli/commands/uninstall.ts +240 -0
  195. package/src/cli/index.ts +107 -0
  196. package/src/discovery.ts +328 -3
  197. package/src/enterprise/env.ts +156 -0
  198. package/src/enterprise/index.ts +7 -0
  199. package/src/enterprise/script-generator.ts +481 -0
  200. package/src/execute.ts +256 -0
  201. package/src/index.ts +290 -7
  202. package/src/metered.ts +149 -0
  203. package/src/stripe.ts +253 -0
  204. package/src/types.ts +32 -0
  205. package/src/ui/colors.ts +219 -0
  206. package/src/ui/errors.ts +394 -0
  207. package/src/ui/index.ts +17 -0
  208. package/src/ui/prompts.ts +390 -0
  209. package/src/ui/spinner.ts +325 -0
  210. package/src/utils/backup.ts +224 -0
  211. package/src/utils/config.ts +315 -0
  212. package/src/utils/os.ts +124 -0
  213. package/src/utils/paths.ts +203 -0
  214. package/landing/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,226 @@
1
+ # PRD: APIClaw Billing System
2
+
3
+ **Status:** Draft
4
+ **Datum:** 2026-02-28
5
+ **Författare:** Symbot + Gustav
6
+
7
+ ---
8
+
9
+ ## Sammanfattning
10
+
11
+ Två betalningsmodeller för APIClaw:
12
+ 1. **Pay-per-usage** — Lägg in kort, betala per API-anrop
13
+ 2. **Backer** — $99 one-time, free usage 2026, VIP-status
14
+
15
+ ---
16
+
17
+ ## Modell 1: Pay-per-usage
18
+
19
+ ### Användarflöde
20
+ 1. Användare skapar konto (magic link)
21
+ 2. Klickar "Add payment method" i dashboard
22
+ 3. Stripe Checkout → sparar kort
23
+ 4. Varje API-anrop drar: **provider-kostnad + 4% fee**
24
+ 5. Faktureras månadsvis (Stripe invoicing)
25
+
26
+ ### Teknisk implementation
27
+
28
+ **Stripe-komponenter:**
29
+ - Meter: `api_call` (redan skapad)
30
+ - Customer: skapas vid signup
31
+ - Subscription: skapas vid "add payment method" (usage-based)
32
+
33
+ **execute.ts integration:**
34
+ ```typescript
35
+ // Efter lyckat API-anrop
36
+ await stripe.billing.meterEvents.create({
37
+ event_name: 'api_call',
38
+ payload: {
39
+ stripe_customer_id: user.stripeCustomerId,
40
+ value: String(costInCents) // Provider cost + 4%
41
+ }
42
+ });
43
+ ```
44
+
45
+ **Prissättning per provider:**
46
+
47
+ | Provider | Ungefärlig kostnad | Med 4% fee |
48
+ |----------|-------------------|------------|
49
+ | Brave Search | $0.005/sökning | $0.0052 |
50
+ | OpenRouter | Varierar (token-based) | +4% |
51
+ | 46elks SMS | ~$0.035/SMS | $0.0364 |
52
+ | ElevenLabs | ~$0.001/tecken | +4% |
53
+ | Resend | $0.001/email | $0.00104 |
54
+
55
+ **Krav:**
56
+ - [ ] Stripe Customer skapas vid signup
57
+ - [ ] "Add payment method" knapp i dashboard
58
+ - [ ] Stripe Checkout Session för kort-setup
59
+ - [ ] Meter event logging i execute.ts
60
+ - [ ] Usage-dashboard (visa förbrukning)
61
+ - [ ] Provider-kostnad lookup per API
62
+
63
+ ---
64
+
65
+ ## Modell 2: Backer ($99)
66
+
67
+ ### Erbjudande
68
+ - **Pris:** $99 USD one-time
69
+ - **Inkluderar:** Free API usage t.o.m. 2026-12-31
70
+ - **VIP-perks:**
71
+ - Newsletter (insider updates)
72
+ - Direkt kontakt med founders
73
+ - Badge i systemet
74
+ - Prioriterad support
75
+ - **Efter 2026:** Övergår till pay-per-usage
76
+
77
+ ### Användarflöde
78
+ 1. Användare ser "Become a Backer" CTA
79
+ 2. Klickar → Stripe Checkout ($99 one-time)
80
+ 3. Betalning genomförd → `backer: true` + `backerUntil: 2026-12-31`
81
+ 4. Dashboard visar "Backer" badge
82
+ 5. Alla API-anrop = gratis (skippa metering)
83
+ 6. 2027-01-01: Automatiskt övergång till pay-per-usage
84
+
85
+ ### Teknisk implementation
86
+
87
+ **Stripe-komponenter:**
88
+ - Produkt: "APIClaw Backer" (skapa ny, arkivera Pro)
89
+ - Price: $99 one-time (inte recurring)
90
+ - Checkout Session: mode=payment
91
+
92
+ **Databas (Convex):**
93
+ ```typescript
94
+ // users table
95
+ {
96
+ email: string,
97
+ stripeCustomerId: string,
98
+ backer: boolean, // true om betalat
99
+ backerUntil: number, // timestamp 2026-12-31 23:59:59
100
+ // ...
101
+ }
102
+ ```
103
+
104
+ **execute.ts logic:**
105
+ ```typescript
106
+ // Innan metering
107
+ if (user.backer && Date.now() < user.backerUntil) {
108
+ // Skip metering, free call
109
+ return executeApiCall();
110
+ }
111
+ // Annars: logga till meter
112
+ ```
113
+
114
+ **Krav:**
115
+ - [ ] Stripe produkt "APIClaw Backer" ($99 one-time)
116
+ - [ ] "Become a Backer" CTA på landing + dashboard
117
+ - [ ] Checkout flow för one-time payment
118
+ - [ ] Webhook: `checkout.session.completed` → sätt backer=true
119
+ - [ ] Backer-badge i UI
120
+ - [ ] Conditional metering i execute.ts
121
+ - [ ] Övergångslogik 2027-01-01
122
+
123
+ ---
124
+
125
+ ## UI/UX
126
+
127
+ ### Landing Page
128
+ - Sektion: "Support APIClaw" eller "Become a Backer"
129
+ - Tydlig value prop: "$99 → Free API calls all of 2026"
130
+ - Lista VIP-perks
131
+
132
+ ### Dashboard (inloggad)
133
+ - **Backer:** Badge, "Free until Dec 31, 2026", usage stats (för kul)
134
+ - **Pay-per-usage:** "Add payment method", current balance, usage
135
+
136
+ ### Pricing Page (om separat)
137
+ ```
138
+ ┌─────────────────────┬─────────────────────┐
139
+ │ PAY AS YOU GO │ BACKER │
140
+ ├─────────────────────┼─────────────────────┤
141
+ │ Free to start │ $99 │
142
+ │ Pay per API call │ one-time │
143
+ │ (cost + 4%) │ │
144
+ │ │ ✓ Free calls 2026 │
145
+ │ │ ✓ VIP newsletter │
146
+ │ │ ✓ Founder access │
147
+ │ │ ✓ Priority support │
148
+ ├─────────────────────┼─────────────────────┤
149
+ │ [Add Card] │ [Become a Backer] │
150
+ └─────────────────────┴─────────────────────┘
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Webhook Events
156
+
157
+ | Event | Action |
158
+ |-------|--------|
159
+ | `checkout.session.completed` (backer) | Set user.backer=true, backerUntil |
160
+ | `checkout.session.completed` (card setup) | Create usage subscription |
161
+ | `invoice.payment_failed` | Notify user, pause access? |
162
+ | `customer.subscription.deleted` | Revoke access |
163
+
164
+ ---
165
+
166
+ ## Milstolpar
167
+
168
+ ### Fas 1: Backer (ship first)
169
+ - [ ] Stripe produkt + price
170
+ - [ ] Checkout flow
171
+ - [ ] Webhook handler
172
+ - [ ] Backer flag i DB
173
+ - [ ] Badge i UI
174
+ - [ ] Skip metering för backers
175
+
176
+ ### Fas 2: Pay-per-usage
177
+ - [ ] Fix meter price ($0.002 base eller dynamic)
178
+ - [ ] Metering i execute.ts
179
+ - [ ] "Add payment method" flow
180
+ - [ ] Usage dashboard
181
+ - [ ] Provider cost lookup
182
+
183
+ ### Fas 3: Polish
184
+ - [ ] Email kvitto (Backer welcome)
185
+ - [ ] Transition email (Dec 2026 → pay-per-usage)
186
+ - [ ] Referral? ("Get 1 month free")
187
+
188
+ ---
189
+
190
+ ## Free Tier
191
+
192
+ **Alla användare får:**
193
+ - 50 API calls/månad (baseline)
194
+ - +50 bonus calls (one-time) via "Earn"-tasks
195
+
196
+ **Earn-tasks (one-time bonus):**
197
+ | Task | Bonus |
198
+ |------|-------|
199
+ | Verifiera email | +10 |
200
+ | Koppla första API | +15 |
201
+ | Gör första anrop | +10 |
202
+ | Dela på X/LinkedIn | +15 |
203
+ | **Total** | **+50** |
204
+
205
+ **Struktur:**
206
+ ```
207
+ Free user startar: 50/månad
208
+ Gör alla earn-tasks: +50 bonus (total 100 första månaden)
209
+ Månad 2: 50/månad (bonus är one-time)
210
+ ```
211
+
212
+ ---
213
+
214
+ ## Öppna frågor
215
+
216
+ 1. **Provider cost tracking:** Hårdkoda per provider eller dynamiskt?
217
+ 2. **Minimum balance?** Kan man gå minus och faktureras efteråt?
218
+ 3. **Backer limit?** Max 100 backers? Eller obegränsat?
219
+
220
+ ---
221
+
222
+ ## Success Metrics
223
+
224
+ - **Backers:** 10 första månaden, 50 till EOY
225
+ - **Pay-per-usage conversion:** 20% av free users
226
+ - **Revenue target:** $5k MRR EOY 2026
@@ -0,0 +1,261 @@
1
+ # PRD: APIClaw Earn System
2
+
3
+ **Status:** Draft
4
+ **Datum:** 2026-02-28
5
+ **Författare:** Symbot + Gustav
6
+
7
+ ---
8
+
9
+ ## Sammanfattning
10
+
11
+ Gamifierat earn-system där användare tjänar API calls genom att slutföra tasks. Två kategorier: **Usage tasks** (driver aha-moment) och **Growth tasks** (driver tillväxt).
12
+
13
+ ---
14
+
15
+ ## Earn Tasks
16
+
17
+ ### Usage Tasks (driver aha-moment)
18
+
19
+ | Task | Calls | Trigger |
20
+ |------|-------|---------|
21
+ | Gör första Direct Call | +15 | API-anrop loggas i system |
22
+ | Testa 3 olika APIs | +10 | 3 unika API endpoints anropade |
23
+ | Lista din Agent | +10 | Agent publicerad i marketplace |
24
+ | Lista ditt API | +10 | API publicerad som provider |
25
+ | Sätt upp Direct Call (BYOK) | +5 | Minst 1 API key sparad |
26
+
27
+ ### Growth Tasks (driver tillväxt)
28
+
29
+ | Task | Calls | Trigger |
30
+ |------|-------|---------|
31
+ | Star on GitHub | +10 | OAuth-verifierad eller manuell claim |
32
+ | Follow @NordSym | +5 | OAuth-verifierad eller manuell claim |
33
+ | Invite Friends | +10/referral | Referral-kod använd vid signup |
34
+
35
+ ### Totalt
36
+
37
+ - **One-time max:** 65 calls (exkl. referrals)
38
+ - **Referrals:** Obegränsat (+10 per signup)
39
+
40
+ ---
41
+
42
+ ## UX Specification
43
+
44
+ ### Progress Section (top of Earn tab)
45
+
46
+ ```
47
+ ┌─────────────────────────────────────────────────────────────┐
48
+ │ │
49
+ │ [Target icon] Earn Progress │
50
+ │ │
51
+ │ [████████████░░░░░░░░░░░░] 35/65 calls earned │
52
+ │ │
53
+ │ USAGE │
54
+ │ ┌─────────────────────────────────────────────────────┐ │
55
+ │ │ [Check icon] First Direct Call +15 CLAIMED │ │
56
+ │ │ [Circle icon] Test 3 APIs +10 1/3 │ │
57
+ │ │ [Circle icon] List your Agent +10 [DO IT] │ │
58
+ │ │ [Circle icon] List your API +10 [DO IT] │ │
59
+ │ │ [Circle icon] Set up Direct Call +5 [DO IT] │ │
60
+ │ └─────────────────────────────────────────────────────┘ │
61
+ │ │
62
+ │ GROWTH │
63
+ │ ┌─────────────────────────────────────────────────────┐ │
64
+ │ │ [Check icon] Star on GitHub +10 CLAIMED │ │
65
+ │ │ [Circle icon] Follow @NordSym +5 [DO IT] │ │
66
+ │ │ [Users icon] Invite Friends +10 [COPY] │ │
67
+ │ │ 3 friends joined │ │
68
+ │ └─────────────────────────────────────────────────────┘ │
69
+ │ │
70
+ └─────────────────────────────────────────────────────────────┘
71
+ ```
72
+
73
+ ### Visual States
74
+
75
+ | State | Icon | Style |
76
+ |-------|------|-------|
77
+ | Not started | Circle (outline) | Gray text |
78
+ | In progress | Circle with partial fill | Blue text, "1/3" counter |
79
+ | Completed | CheckCircle (filled) | Green, "CLAIMED" badge |
80
+ | Action available | Button | Red accent, "[DO IT]" |
81
+
82
+ ### Icons (Lucide)
83
+
84
+ | Element | Icon |
85
+ |---------|------|
86
+ | Progress header | Target |
87
+ | Completed task | CheckCircle |
88
+ | Open task | Circle |
89
+ | Referral | Users |
90
+ | Direct Call | Zap |
91
+ | Agent | Bot |
92
+ | API | Code |
93
+ | GitHub | Github |
94
+ | Twitter/X | Twitter |
95
+
96
+ ### Animations
97
+
98
+ 1. **On claim:** Checkmark animation (scale in + color change)
99
+ 2. **Progress bar:** Smooth fill animation on update
100
+ 3. **Confetti:** Optional, on major milestone (50%, 100%)
101
+
102
+ ### Toast Notifications
103
+
104
+ | Event | Message |
105
+ |-------|---------|
106
+ | Task completed | "+15 calls earned! First Direct Call complete." |
107
+ | Milestone | "Halfway there! 32/65 calls earned." |
108
+ | Referral | "+10 calls! [Name] joined with your link." |
109
+
110
+ ---
111
+
112
+ ## Data Model
113
+
114
+ ### Convex Schema
115
+
116
+ ```typescript
117
+ // earnProgress table
118
+ {
119
+ userId: Id<"users">,
120
+
121
+ // Usage tasks
122
+ firstDirectCall: boolean,
123
+ firstDirectCallAt: number | null,
124
+
125
+ apisUsed: string[], // Track unique APIs
126
+ apisUsedComplete: boolean,
127
+
128
+ agentListed: boolean,
129
+ agentListedAt: number | null,
130
+
131
+ apiListed: boolean,
132
+ apiListedAt: number | null,
133
+
134
+ byokSetup: boolean,
135
+ byokSetupAt: number | null,
136
+
137
+ // Growth tasks
138
+ githubStarred: boolean,
139
+ githubStarredAt: number | null,
140
+
141
+ twitterFollowed: boolean,
142
+ twitterFollowedAt: number | null,
143
+
144
+ // Referrals (tracked separately)
145
+ referralCount: number,
146
+
147
+ // Calculated
148
+ totalEarned: number,
149
+ }
150
+ ```
151
+
152
+ ### API Endpoints
153
+
154
+ | Endpoint | Purpose |
155
+ |----------|---------|
156
+ | `earnProgress:get` | Get user's earn progress |
157
+ | `earnProgress:claimGithub` | Mark GitHub star as claimed |
158
+ | `earnProgress:claimTwitter` | Mark Twitter follow as claimed |
159
+ | `earnProgress:checkProgress` | Recalculate based on actual usage |
160
+
161
+ ### Automatic Triggers
162
+
163
+ | Action | Updates |
164
+ |--------|---------|
165
+ | API call logged | Check firstDirectCall, apisUsed |
166
+ | Agent published | Set agentListed |
167
+ | API published | Set apiListed |
168
+ | BYOK key saved | Set byokSetup |
169
+ | Referral signup | Increment referralCount |
170
+
171
+ ---
172
+
173
+ ## Integration Points
174
+
175
+ ### execute.ts
176
+
177
+ ```typescript
178
+ // After successful API call
179
+ if (!user.earnProgress.firstDirectCall) {
180
+ await ctx.runMutation(api.earnProgress.markFirstDirectCall, { userId });
181
+ }
182
+
183
+ // Track unique APIs
184
+ await ctx.runMutation(api.earnProgress.trackApiUsed, {
185
+ userId,
186
+ apiId: request.apiId
187
+ });
188
+ ```
189
+
190
+ ### Agent/API Publish Flow
191
+
192
+ ```typescript
193
+ // On agent publish
194
+ await ctx.runMutation(api.earnProgress.markAgentListed, { userId });
195
+
196
+ // On API publish
197
+ await ctx.runMutation(api.earnProgress.markApiListed, { userId });
198
+ ```
199
+
200
+ ### BYOK Settings
201
+
202
+ ```typescript
203
+ // On first API key saved
204
+ await ctx.runMutation(api.earnProgress.markByokSetup, { userId });
205
+ ```
206
+
207
+ ---
208
+
209
+ ## Free Tier Interaction
210
+
211
+ | Source | Calls |
212
+ |--------|-------|
213
+ | Monthly free | 50 |
214
+ | Earn bonus (max) | 65 |
215
+ | Referrals | Unlimited |
216
+ | **Total potential** | 115+ first month |
217
+
218
+ Earn bonus is **one-time**. Monthly free refreshes.
219
+
220
+ ---
221
+
222
+ ## Implementation Plan
223
+
224
+ ### Agents Required: 3
225
+
226
+ **Agent 1: Backend (Convex)**
227
+ - Create earnProgress table
228
+ - Mutations: markFirstDirectCall, trackApiUsed, markAgentListed, markApiListed, markByokSetup, claimGithub, claimTwitter
229
+ - Query: getEarnProgress
230
+ - Integration hooks in execute.ts, agent publish, API publish, BYOK save
231
+
232
+ **Agent 2: Frontend (Earn Tab)**
233
+ - Redesign Earn Credits tab with progress bar
234
+ - Task cards with states (open, in-progress, claimed)
235
+ - Toast notifications on completion
236
+ - Animations (checkmark, progress fill)
237
+ - Replace current earn/page.tsx content
238
+
239
+ **Agent 3: Referral System**
240
+ - Generate unique referral codes
241
+ - Track referral signups
242
+ - Credit referrer on successful signup
243
+ - Referral leaderboard (optional)
244
+
245
+ ---
246
+
247
+ ## Success Metrics
248
+
249
+ - Earn completion rate (% users completing all tasks)
250
+ - First Direct Call within 24h of signup
251
+ - Referral conversion rate
252
+ - Correlation: earn completion vs. paid conversion
253
+
254
+ ---
255
+
256
+ ## Open Questions
257
+
258
+ 1. **Manual claim vs. auto-detect:** GitHub/Twitter require OAuth or trust user?
259
+ 2. **Referral cap:** Unlimited or max 50 referrals?
260
+ 3. **Expiration:** Do earned calls expire or persist?
261
+ 4. **Existing users:** Retroactive credit for already-completed actions?