@tradingboy/cli 0.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 (142) hide show
  1. package/README.md +8 -0
  2. package/dist/api-client.d.ts +35 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +165 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/cli.d.ts +5 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +143 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/audit.d.ts +18 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +73 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/behavioral.d.ts +73 -0
  15. package/dist/commands/behavioral.d.ts.map +1 -0
  16. package/dist/commands/behavioral.js +349 -0
  17. package/dist/commands/behavioral.js.map +1 -0
  18. package/dist/commands/benchmark-cmd.d.ts +3 -0
  19. package/dist/commands/benchmark-cmd.d.ts.map +1 -0
  20. package/dist/commands/benchmark-cmd.js +196 -0
  21. package/dist/commands/benchmark-cmd.js.map +1 -0
  22. package/dist/commands/billing.d.ts +12 -0
  23. package/dist/commands/billing.d.ts.map +1 -0
  24. package/dist/commands/billing.js +117 -0
  25. package/dist/commands/billing.js.map +1 -0
  26. package/dist/commands/catalysts.d.ts +17 -0
  27. package/dist/commands/catalysts.d.ts.map +1 -0
  28. package/dist/commands/catalysts.js +151 -0
  29. package/dist/commands/catalysts.js.map +1 -0
  30. package/dist/commands/coaching-cmd.d.ts +16 -0
  31. package/dist/commands/coaching-cmd.d.ts.map +1 -0
  32. package/dist/commands/coaching-cmd.js +231 -0
  33. package/dist/commands/coaching-cmd.js.map +1 -0
  34. package/dist/commands/config-cmd.d.ts +30 -0
  35. package/dist/commands/config-cmd.d.ts.map +1 -0
  36. package/dist/commands/config-cmd.js +378 -0
  37. package/dist/commands/config-cmd.js.map +1 -0
  38. package/dist/commands/context.d.ts +41 -0
  39. package/dist/commands/context.d.ts.map +1 -0
  40. package/dist/commands/context.js +391 -0
  41. package/dist/commands/context.js.map +1 -0
  42. package/dist/commands/decisions.d.ts +57 -0
  43. package/dist/commands/decisions.d.ts.map +1 -0
  44. package/dist/commands/decisions.js +352 -0
  45. package/dist/commands/decisions.js.map +1 -0
  46. package/dist/commands/edge-cmd.d.ts +78 -0
  47. package/dist/commands/edge-cmd.d.ts.map +1 -0
  48. package/dist/commands/edge-cmd.js +185 -0
  49. package/dist/commands/edge-cmd.js.map +1 -0
  50. package/dist/commands/edge-guard-cmd.d.ts +36 -0
  51. package/dist/commands/edge-guard-cmd.d.ts.map +1 -0
  52. package/dist/commands/edge-guard-cmd.js +174 -0
  53. package/dist/commands/edge-guard-cmd.js.map +1 -0
  54. package/dist/commands/events.d.ts +3 -0
  55. package/dist/commands/events.d.ts.map +1 -0
  56. package/dist/commands/events.js +117 -0
  57. package/dist/commands/events.js.map +1 -0
  58. package/dist/commands/infra.d.ts +20 -0
  59. package/dist/commands/infra.d.ts.map +1 -0
  60. package/dist/commands/infra.js +130 -0
  61. package/dist/commands/infra.js.map +1 -0
  62. package/dist/commands/journal.d.ts +3 -0
  63. package/dist/commands/journal.d.ts.map +1 -0
  64. package/dist/commands/journal.js +281 -0
  65. package/dist/commands/journal.js.map +1 -0
  66. package/dist/commands/login.d.ts +18 -0
  67. package/dist/commands/login.d.ts.map +1 -0
  68. package/dist/commands/login.js +121 -0
  69. package/dist/commands/login.js.map +1 -0
  70. package/dist/commands/logout.d.ts +7 -0
  71. package/dist/commands/logout.d.ts.map +1 -0
  72. package/dist/commands/logout.js +39 -0
  73. package/dist/commands/logout.js.map +1 -0
  74. package/dist/commands/narratives.d.ts +3 -0
  75. package/dist/commands/narratives.d.ts.map +1 -0
  76. package/dist/commands/narratives.js +259 -0
  77. package/dist/commands/narratives.js.map +1 -0
  78. package/dist/commands/onboarding.d.ts +7 -0
  79. package/dist/commands/onboarding.d.ts.map +1 -0
  80. package/dist/commands/onboarding.js +126 -0
  81. package/dist/commands/onboarding.js.map +1 -0
  82. package/dist/commands/query.d.ts +32 -0
  83. package/dist/commands/query.d.ts.map +1 -0
  84. package/dist/commands/query.js +132 -0
  85. package/dist/commands/query.js.map +1 -0
  86. package/dist/commands/replay-cmd.d.ts +43 -0
  87. package/dist/commands/replay-cmd.d.ts.map +1 -0
  88. package/dist/commands/replay-cmd.js +215 -0
  89. package/dist/commands/replay-cmd.js.map +1 -0
  90. package/dist/commands/review.d.ts +3 -0
  91. package/dist/commands/review.d.ts.map +1 -0
  92. package/dist/commands/review.js +443 -0
  93. package/dist/commands/review.js.map +1 -0
  94. package/dist/commands/risk.d.ts +47 -0
  95. package/dist/commands/risk.d.ts.map +1 -0
  96. package/dist/commands/risk.js +156 -0
  97. package/dist/commands/risk.js.map +1 -0
  98. package/dist/commands/social.d.ts +43 -0
  99. package/dist/commands/social.d.ts.map +1 -0
  100. package/dist/commands/social.js +318 -0
  101. package/dist/commands/social.js.map +1 -0
  102. package/dist/commands/strategy-cmd.d.ts +44 -0
  103. package/dist/commands/strategy-cmd.d.ts.map +1 -0
  104. package/dist/commands/strategy-cmd.js +367 -0
  105. package/dist/commands/strategy-cmd.js.map +1 -0
  106. package/dist/commands/subscribe.d.ts +72 -0
  107. package/dist/commands/subscribe.d.ts.map +1 -0
  108. package/dist/commands/subscribe.js +480 -0
  109. package/dist/commands/subscribe.js.map +1 -0
  110. package/dist/commands/suggestions-cmd.d.ts +24 -0
  111. package/dist/commands/suggestions-cmd.d.ts.map +1 -0
  112. package/dist/commands/suggestions-cmd.js +142 -0
  113. package/dist/commands/suggestions-cmd.js.map +1 -0
  114. package/dist/commands/thesis-cmd.d.ts +3 -0
  115. package/dist/commands/thesis-cmd.d.ts.map +1 -0
  116. package/dist/commands/thesis-cmd.js +132 -0
  117. package/dist/commands/thesis-cmd.js.map +1 -0
  118. package/dist/commands/trader.d.ts +29 -0
  119. package/dist/commands/trader.d.ts.map +1 -0
  120. package/dist/commands/trader.js +292 -0
  121. package/dist/commands/trader.js.map +1 -0
  122. package/dist/commands/watch.d.ts +16 -0
  123. package/dist/commands/watch.d.ts.map +1 -0
  124. package/dist/commands/watch.js +88 -0
  125. package/dist/commands/watch.js.map +1 -0
  126. package/dist/commands/whoami.d.ts +14 -0
  127. package/dist/commands/whoami.d.ts.map +1 -0
  128. package/dist/commands/whoami.js +89 -0
  129. package/dist/commands/whoami.js.map +1 -0
  130. package/dist/credentials.d.ts +18 -0
  131. package/dist/credentials.d.ts.map +1 -0
  132. package/dist/credentials.js +168 -0
  133. package/dist/credentials.js.map +1 -0
  134. package/dist/index.d.ts +33 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +28 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/utils.d.ts +51 -0
  139. package/dist/utils.d.ts.map +1 -0
  140. package/dist/utils.js +118 -0
  141. package/dist/utils.js.map +1 -0
  142. package/package.json +38 -0
@@ -0,0 +1,480 @@
1
+ // ─── Subscribe Command ───
2
+ //
3
+ // Handles the checkout flow for new subscribers:
4
+ //
5
+ // Stripe (default):
6
+ // 1. POST /api/v1/billing/checkout with user email
7
+ // 2. Open browser to Stripe Checkout
8
+ // 3. Poll GET /api/v1/billing/provision/:token every 3s until API key is returned
9
+ // 4. Store key locally via credential storage
10
+ //
11
+ // Crypto (--pay crypto):
12
+ // 1. POST /billing/crypto-checkout with user email
13
+ // 2. Display USDC payment instructions (wallet, amount, network)
14
+ // 3. Poll GET /billing/crypto-verify/:reference every 5s until confirmed
15
+ // 4. Poll GET /api/v1/billing/provision/:token for API key
16
+ // 5. Store key locally via credential storage
17
+ import chalk from 'chalk';
18
+ import { createLogger } from '@trading-boy/core';
19
+ import { storeCredentials } from '../credentials.js';
20
+ import { getApiBase } from '../api-client.js';
21
+ import { runOnboarding } from './onboarding.js';
22
+ // ─── Logger ───
23
+ const logger = createLogger('cli-subscribe');
24
+ // ─── Constants ───
25
+ const POLL_INTERVAL_MS = 3_000;
26
+ const POLL_TIMEOUT_MS = 5 * 60 * 1_000; // 5 minutes
27
+ // ─── API Helpers ───
28
+ /**
29
+ * Create a Stripe Checkout session via the API.
30
+ * This is a public endpoint — no auth needed.
31
+ */
32
+ export async function createCheckoutSession(email, plan = 'starter') {
33
+ const response = await fetch(`${getApiBase()}/api/v1/billing/checkout`, {
34
+ method: 'POST',
35
+ headers: { 'Content-Type': 'application/json' },
36
+ body: JSON.stringify({ email, plan }),
37
+ });
38
+ if (!response.ok) {
39
+ const body = await response.text();
40
+ throw new Error(`Checkout request failed (${response.status}): ${body}`);
41
+ }
42
+ return response.json();
43
+ }
44
+ /**
45
+ * Poll the provisioning endpoint for the API key.
46
+ * Returns normalized ProvisionResponse regardless of HTTP status.
47
+ */
48
+ export async function pollProvisioningToken(token) {
49
+ const response = await fetch(`${getApiBase()}/api/v1/billing/provision/${token}`);
50
+ if (response.status === 404) {
51
+ return { status: 'not_found' };
52
+ }
53
+ if (response.status === 410) {
54
+ const body = await response.json();
55
+ return { status: body.status === 'already_retrieved' ? 'already_retrieved' : 'expired' };
56
+ }
57
+ if (!response.ok) {
58
+ throw new Error(`Provision check failed (${response.status})`);
59
+ }
60
+ return response.json();
61
+ }
62
+ /**
63
+ * Create a crypto (USDC) checkout session via the API.
64
+ * Public endpoint — no auth needed.
65
+ */
66
+ export async function createCryptoCheckout(email, plan = 'starter') {
67
+ const response = await fetch(`${getApiBase()}/billing/crypto-checkout`, {
68
+ method: 'POST',
69
+ headers: { 'Content-Type': 'application/json' },
70
+ body: JSON.stringify({ email, plan }),
71
+ });
72
+ if (!response.ok) {
73
+ const body = await response.text();
74
+ throw new Error(`Crypto checkout failed (${response.status}): ${body}`);
75
+ }
76
+ return response.json();
77
+ }
78
+ /**
79
+ * Check if a USDC payment has been confirmed on Solana.
80
+ */
81
+ export async function checkCryptoPayment(reference) {
82
+ const response = await fetch(`${getApiBase()}/billing/crypto-verify/${reference}`);
83
+ if (response.status === 404)
84
+ return { status: 'not_found' };
85
+ if (response.status === 410)
86
+ return { status: 'expired' };
87
+ if (!response.ok)
88
+ throw new Error(`Crypto verify failed (${response.status})`);
89
+ return response.json();
90
+ }
91
+ /**
92
+ * Poll until USDC payment is confirmed on Solana, then poll for provisioned API key.
93
+ */
94
+ export async function pollCryptoPayment(reference, provisioningToken, onTick) {
95
+ const start = Date.now();
96
+ const CRYPTO_POLL_INTERVAL = 5_000; // 5s — Solana confirmation takes a few seconds
97
+ // Phase 1: Wait for Solana payment confirmation
98
+ while (Date.now() - start < POLL_TIMEOUT_MS) {
99
+ onTick?.(Date.now() - start, 'payment');
100
+ try {
101
+ const result = await checkCryptoPayment(reference);
102
+ if (result.status === 'confirmed')
103
+ break;
104
+ if (result.status === 'expired' || result.status === 'not_found') {
105
+ return { success: false, error: 'Payment expired or not found. Please try again.' };
106
+ }
107
+ }
108
+ catch (err) {
109
+ logger.debug({ error: err }, 'Crypto poll attempt failed, retrying');
110
+ }
111
+ await sleep(CRYPTO_POLL_INTERVAL);
112
+ }
113
+ if (Date.now() - start >= POLL_TIMEOUT_MS) {
114
+ return { success: false, error: 'Timed out waiting for USDC payment. If you sent the payment, contact support.' };
115
+ }
116
+ // Phase 2: Payment confirmed — poll for provisioned API key
117
+ while (Date.now() - start < POLL_TIMEOUT_MS) {
118
+ onTick?.(Date.now() - start, 'provisioning');
119
+ try {
120
+ const result = await pollProvisioningToken(provisioningToken);
121
+ if (result.status === 'ready' && result.apiKey) {
122
+ return { success: true, apiKey: result.apiKey, keyPrefix: result.keyPrefix, email: result.email, plan: result.plan };
123
+ }
124
+ if (result.status === 'expired' || result.status === 'not_found') {
125
+ return { success: false, error: 'Provisioning token expired after payment. Contact support.' };
126
+ }
127
+ }
128
+ catch (err) {
129
+ logger.debug({ error: err }, 'Provision poll attempt failed, retrying');
130
+ }
131
+ await sleep(POLL_INTERVAL_MS);
132
+ }
133
+ return { success: false, error: 'Timed out waiting for API key provisioning. Contact support.' };
134
+ }
135
+ // ─── Polling Logic ───
136
+ /**
137
+ * Poll the provisioning endpoint until a key is ready or timeout.
138
+ */
139
+ export async function pollForApiKey(token, onTick) {
140
+ const start = Date.now();
141
+ let elapsed = Date.now() - start;
142
+ while (elapsed < POLL_TIMEOUT_MS) {
143
+ onTick?.(elapsed);
144
+ try {
145
+ const result = await pollProvisioningToken(token);
146
+ if (result.status === 'ready' && result.apiKey) {
147
+ return {
148
+ success: true,
149
+ apiKey: result.apiKey,
150
+ keyPrefix: result.keyPrefix,
151
+ email: result.email,
152
+ plan: result.plan,
153
+ };
154
+ }
155
+ if (result.status === 'expired' || result.status === 'not_found') {
156
+ return {
157
+ success: false,
158
+ error: 'Provisioning token expired. If you completed payment, try `trading-boy login` with your API key from the confirmation email.',
159
+ };
160
+ }
161
+ if (result.status === 'already_retrieved') {
162
+ return {
163
+ success: false,
164
+ error: 'API key was already retrieved. Use `trading-boy login` if you need to re-enter your key.',
165
+ };
166
+ }
167
+ // status === 'pending' — keep polling
168
+ }
169
+ catch (err) {
170
+ logger.debug({ error: err }, 'Poll attempt failed, retrying');
171
+ }
172
+ await sleep(POLL_INTERVAL_MS);
173
+ elapsed = Date.now() - start;
174
+ }
175
+ return {
176
+ success: false,
177
+ error: 'Timed out waiting for payment confirmation. If you completed payment, try `trading-boy login` with your API key from the confirmation email.',
178
+ };
179
+ }
180
+ // ─── Credential Storage ───
181
+ /**
182
+ * Save API credentials using the credential storage module.
183
+ */
184
+ export async function saveApiKey(apiKey, metadata) {
185
+ await storeCredentials(apiKey, {
186
+ keyId: metadata.keyPrefix,
187
+ email: metadata.email,
188
+ plan: metadata.plan,
189
+ });
190
+ }
191
+ // ─── Formatters ───
192
+ function formatElapsed(ms) {
193
+ const seconds = Math.floor(ms / 1000);
194
+ const minutes = Math.floor(seconds / 60);
195
+ const remaining = seconds % 60;
196
+ if (minutes > 0)
197
+ return `${minutes}m ${remaining}s`;
198
+ return `${seconds}s`;
199
+ }
200
+ export function formatSubscribeSuccess(result) {
201
+ const lines = [];
202
+ lines.push('');
203
+ lines.push(chalk.green.bold(' Subscription activated!'));
204
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
205
+ lines.push('');
206
+ if (result.email) {
207
+ lines.push(` ${chalk.bold('Account:')} ${result.email}`);
208
+ }
209
+ if (result.plan) {
210
+ lines.push(` ${chalk.bold('Plan:')} ${result.plan}`);
211
+ }
212
+ if (result.keyPrefix) {
213
+ lines.push(` ${chalk.bold('Key ID:')} ${result.keyPrefix}`);
214
+ }
215
+ lines.push('');
216
+ lines.push(chalk.dim(' Your API key has been stored securely.'));
217
+ lines.push(chalk.dim(' You can now use all Trading Boy commands.'));
218
+ lines.push('');
219
+ lines.push(chalk.cyan(' Try it: trading-boy context SOL'));
220
+ lines.push('');
221
+ return lines.join('\n');
222
+ }
223
+ // ─── Command Registration ───
224
+ export function registerSubscribeCommand(program) {
225
+ program
226
+ .command('subscribe')
227
+ .description('Subscribe to Trading Boy and get your API key')
228
+ .requiredOption('-e, --email <email>', 'Your email address')
229
+ .option('--plan <plan>', 'Subscription plan: starter, pro, or edge')
230
+ .option('--pay <method>', 'Payment method: crypto (USDC on Solana) or stripe')
231
+ .action(async (options) => {
232
+ const { email } = options;
233
+ let { plan, pay } = options;
234
+ if (!isValidEmail(email)) {
235
+ console.error(chalk.red(' Invalid email address.'));
236
+ process.exitCode = 1;
237
+ return;
238
+ }
239
+ try {
240
+ const { select } = await import('@inquirer/prompts');
241
+ console.log('');
242
+ console.log(chalk.bold.cyan(' Trading Boy \u2014 Subscribe'));
243
+ console.log(chalk.gray(' ' + '\u2500'.repeat(50)));
244
+ console.log('');
245
+ // Interactive plan picker if not specified
246
+ if (!plan) {
247
+ plan = await select({
248
+ message: 'Choose your plan',
249
+ choices: [
250
+ { name: 'Starter — $20/mo (core context + journal)', value: 'starter' },
251
+ { name: 'Pro — $40/mo (+ coaching + thesis extraction)', value: 'pro' },
252
+ { name: 'Edge — $75/mo (+ edge analysis + full analytics)', value: 'edge' },
253
+ ],
254
+ });
255
+ }
256
+ const validPlans = ['starter', 'pro', 'edge'];
257
+ if (!validPlans.includes(plan)) {
258
+ console.error(chalk.red(` Invalid plan: ${plan}. Choose from: ${validPlans.join(', ')}`));
259
+ process.exitCode = 1;
260
+ return;
261
+ }
262
+ // Interactive payment method picker if not specified
263
+ if (!pay) {
264
+ pay = await select({
265
+ message: 'How would you like to pay?',
266
+ choices: [
267
+ { name: 'USDC on Solana (instant, no fees)', value: 'crypto' },
268
+ { name: 'Credit card via Stripe', value: 'stripe' },
269
+ ],
270
+ });
271
+ }
272
+ const validPayMethods = ['stripe', 'crypto'];
273
+ if (!validPayMethods.includes(pay)) {
274
+ console.error(chalk.red(` Invalid payment method: ${pay}. Choose: stripe, crypto`));
275
+ process.exitCode = 1;
276
+ return;
277
+ }
278
+ const planLabels = { starter: 'Starter ($20/mo)', pro: 'Pro ($40/mo)', edge: 'Edge ($75/mo)' };
279
+ console.log('');
280
+ console.log(` ${chalk.bold('Plan:')} ${planLabels[plan] ?? plan}`);
281
+ console.log(` ${chalk.bold('Pay:')} ${pay === 'crypto' ? 'USDC on Solana' : 'Stripe'}`);
282
+ console.log('');
283
+ if (pay === 'crypto') {
284
+ await handleCryptoCheckout(email, plan);
285
+ }
286
+ else {
287
+ await handleStripeCheckout(email, plan);
288
+ }
289
+ }
290
+ catch (error) {
291
+ // Handle Ctrl+C gracefully during prompts
292
+ if (error instanceof Error && error.message.includes('User force closed')) {
293
+ console.log('');
294
+ return;
295
+ }
296
+ const message = error instanceof Error ? error.message : String(error);
297
+ logger.error({ error: message }, 'Subscribe command failed');
298
+ console.error(chalk.red(` Error: ${message}`));
299
+ process.exitCode = 1;
300
+ }
301
+ });
302
+ }
303
+ // ─── Checkout Flows ───
304
+ async function handleStripeCheckout(email, plan) {
305
+ // Step 1: Create checkout session
306
+ let checkout;
307
+ try {
308
+ checkout = await createCheckoutSession(email, plan);
309
+ }
310
+ catch (err) {
311
+ const message = err instanceof Error ? err.message : String(err);
312
+ console.error(chalk.red(` Failed to create checkout session: ${message}`));
313
+ const hint = formatConnectionError(message);
314
+ if (hint)
315
+ console.error(hint);
316
+ process.exitCode = 1;
317
+ return;
318
+ }
319
+ // Step 2: Open browser
320
+ console.log(chalk.white(' Opening Stripe Checkout in your browser...'));
321
+ await openBrowser(checkout.checkoutUrl);
322
+ console.log(chalk.dim(' Complete payment in your browser to continue.'));
323
+ console.log('');
324
+ // Step 3: Poll for API key
325
+ let pollResult;
326
+ try {
327
+ const { createSpinner } = await import('../utils.js');
328
+ const spinner = (await createSpinner(' Waiting for payment confirmation...')).start();
329
+ pollResult = await pollForApiKey(checkout.provisioningToken, (elapsed) => {
330
+ spinner.text = ` Waiting for payment confirmation... (${formatElapsed(elapsed)})`;
331
+ });
332
+ if (pollResult.success) {
333
+ spinner.succeed(' Payment confirmed!');
334
+ }
335
+ else {
336
+ spinner.fail(' Payment not received');
337
+ }
338
+ }
339
+ catch {
340
+ // ora not available — simple polling
341
+ console.log(chalk.gray(' Waiting for payment confirmation...'));
342
+ pollResult = await pollForApiKey(checkout.provisioningToken);
343
+ }
344
+ if (!pollResult.success) {
345
+ console.error('');
346
+ console.error(chalk.red(` ${pollResult.error}`));
347
+ process.exitCode = 1;
348
+ return;
349
+ }
350
+ await storeAndDisplayKey(pollResult);
351
+ }
352
+ async function handleCryptoCheckout(email, plan) {
353
+ // Step 1: Create crypto checkout
354
+ let checkout;
355
+ try {
356
+ checkout = await createCryptoCheckout(email, plan);
357
+ }
358
+ catch (err) {
359
+ const message = err instanceof Error ? err.message : String(err);
360
+ console.error(chalk.red(` Failed to create crypto checkout: ${message}`));
361
+ const hint = formatConnectionError(message);
362
+ if (hint)
363
+ console.error(hint);
364
+ process.exitCode = 1;
365
+ return;
366
+ }
367
+ // Step 2: Display QR code + payment instructions
368
+ console.log(chalk.bold.white(' Scan with Phantom or any Solana wallet to pay:'));
369
+ console.log('');
370
+ try {
371
+ const { createRequire } = await import('node:module');
372
+ const require = createRequire(import.meta.url);
373
+ const qrcode = require('qrcode-terminal');
374
+ await new Promise((resolve) => {
375
+ qrcode.generate(checkout.solanaPayUrl, { small: true }, (code) => {
376
+ for (const line of code.split('\n')) {
377
+ console.log(` ${line}`);
378
+ }
379
+ resolve();
380
+ });
381
+ });
382
+ }
383
+ catch {
384
+ console.log(` ${chalk.cyan.underline(checkout.solanaPayUrl)}`);
385
+ }
386
+ console.log('');
387
+ console.log(` ${chalk.bold('To:')} ${chalk.green(checkout.merchantWallet)}`);
388
+ console.log(` ${chalk.bold('Amount:')} ${checkout.amountUsdc} USDC`);
389
+ console.log(` ${chalk.bold('Network:')} Solana (mainnet)`);
390
+ console.log(` ${chalk.bold('Token:')} USDC (SPL)`);
391
+ console.log('');
392
+ console.log(chalk.dim(' Payment expires in 30 minutes.'));
393
+ console.log('');
394
+ // Step 3: Poll for payment + provisioning
395
+ let pollResult;
396
+ try {
397
+ const { createSpinner } = await import('../utils.js');
398
+ const spinner = (await createSpinner(' Waiting for USDC payment on Solana...')).start();
399
+ pollResult = await pollCryptoPayment(checkout.reference, checkout.provisioningToken, (elapsed, phase) => {
400
+ if (phase === 'payment') {
401
+ spinner.text = ` Waiting for USDC payment on Solana... (${formatElapsed(elapsed)})`;
402
+ }
403
+ else {
404
+ spinner.text = ` Payment confirmed! Provisioning API key... (${formatElapsed(elapsed)})`;
405
+ }
406
+ });
407
+ if (pollResult.success) {
408
+ spinner.succeed(' Payment confirmed & API key provisioned!');
409
+ }
410
+ else {
411
+ spinner.fail(' Payment not received');
412
+ }
413
+ }
414
+ catch {
415
+ console.log(chalk.gray(' Waiting for USDC payment on Solana...'));
416
+ pollResult = await pollCryptoPayment(checkout.reference, checkout.provisioningToken);
417
+ }
418
+ if (!pollResult.success) {
419
+ console.error('');
420
+ console.error(chalk.red(` ${pollResult.error}`));
421
+ process.exitCode = 1;
422
+ return;
423
+ }
424
+ await storeAndDisplayKey(pollResult);
425
+ }
426
+ async function storeAndDisplayKey(pollResult) {
427
+ try {
428
+ await saveApiKey(pollResult.apiKey, {
429
+ keyPrefix: pollResult.keyPrefix,
430
+ email: pollResult.email,
431
+ plan: pollResult.plan,
432
+ });
433
+ }
434
+ catch (err) {
435
+ console.error('');
436
+ console.error(chalk.yellow(' Warning: Could not save API key automatically.'));
437
+ console.error(chalk.yellow(` Your API key: ${pollResult.apiKey}`));
438
+ console.error(chalk.yellow(' Save this key and run: trading-boy login --api-key <key>'));
439
+ logger.error({ error: err }, 'Failed to save credentials');
440
+ process.exitCode = 1;
441
+ return;
442
+ }
443
+ console.log(formatSubscribeSuccess(pollResult));
444
+ // Run onboarding wizard for new subscribers
445
+ try {
446
+ await runOnboarding();
447
+ }
448
+ catch {
449
+ // Onboarding is best-effort — don't fail the subscribe command
450
+ }
451
+ }
452
+ // ─── Helpers ───
453
+ function isValidEmail(email) {
454
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
455
+ }
456
+ function sleep(ms) {
457
+ return new Promise((resolve) => setTimeout(resolve, ms));
458
+ }
459
+ async function openBrowser(url) {
460
+ try {
461
+ const { default: open } = await import('open');
462
+ await open(url);
463
+ }
464
+ catch {
465
+ console.log(chalk.yellow(`\n Could not open browser automatically.`));
466
+ console.log(chalk.yellow(` Please open this URL manually:\n`));
467
+ console.log(` ${chalk.cyan.underline(url)}\n`);
468
+ }
469
+ }
470
+ function formatConnectionError(message) {
471
+ const lower = message.toLowerCase();
472
+ if (lower.includes('econnrefused') || lower.includes('fetch failed') || lower.includes('enotfound')) {
473
+ return [
474
+ chalk.dim(' \u2192 Is the API server running? Try: pnpm start:api'),
475
+ chalk.dim(' \u2192 Or set TRADING_BOY_API_URL to your API endpoint'),
476
+ ].join('\n');
477
+ }
478
+ return null;
479
+ }
480
+ //# sourceMappingURL=subscribe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/commands/subscribe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Command } from 'commander';
2
+ interface Suggestion {
3
+ id: string;
4
+ strategy_id: string;
5
+ parameter: string;
6
+ current_value: unknown;
7
+ suggested_value: unknown;
8
+ reason: string;
9
+ confidence: number;
10
+ status: string;
11
+ created_at: string;
12
+ resolved_at: string | null;
13
+ resolved_by: string | null;
14
+ }
15
+ interface ListResponse {
16
+ count: number;
17
+ limit: number;
18
+ offset: number;
19
+ suggestions: Suggestion[];
20
+ }
21
+ export declare function formatSuggestionsList(data: ListResponse): string;
22
+ export declare function registerSuggestionsCommand(program: Command): void;
23
+ export {};
24
+ //# sourceMappingURL=suggestions-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/suggestions-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAY5C,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAUD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAkDhE;AAaD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyFjE"}