@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.
- package/README.md +8 -0
- package/dist/api-client.d.ts +35 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +165 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/audit.d.ts +18 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +73 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/behavioral.d.ts +73 -0
- package/dist/commands/behavioral.d.ts.map +1 -0
- package/dist/commands/behavioral.js +349 -0
- package/dist/commands/behavioral.js.map +1 -0
- package/dist/commands/benchmark-cmd.d.ts +3 -0
- package/dist/commands/benchmark-cmd.d.ts.map +1 -0
- package/dist/commands/benchmark-cmd.js +196 -0
- package/dist/commands/benchmark-cmd.js.map +1 -0
- package/dist/commands/billing.d.ts +12 -0
- package/dist/commands/billing.d.ts.map +1 -0
- package/dist/commands/billing.js +117 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/catalysts.d.ts +17 -0
- package/dist/commands/catalysts.d.ts.map +1 -0
- package/dist/commands/catalysts.js +151 -0
- package/dist/commands/catalysts.js.map +1 -0
- package/dist/commands/coaching-cmd.d.ts +16 -0
- package/dist/commands/coaching-cmd.d.ts.map +1 -0
- package/dist/commands/coaching-cmd.js +231 -0
- package/dist/commands/coaching-cmd.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +30 -0
- package/dist/commands/config-cmd.d.ts.map +1 -0
- package/dist/commands/config-cmd.js +378 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/context.d.ts +41 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +391 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/decisions.d.ts +57 -0
- package/dist/commands/decisions.d.ts.map +1 -0
- package/dist/commands/decisions.js +352 -0
- package/dist/commands/decisions.js.map +1 -0
- package/dist/commands/edge-cmd.d.ts +78 -0
- package/dist/commands/edge-cmd.d.ts.map +1 -0
- package/dist/commands/edge-cmd.js +185 -0
- package/dist/commands/edge-cmd.js.map +1 -0
- package/dist/commands/edge-guard-cmd.d.ts +36 -0
- package/dist/commands/edge-guard-cmd.d.ts.map +1 -0
- package/dist/commands/edge-guard-cmd.js +174 -0
- package/dist/commands/edge-guard-cmd.js.map +1 -0
- package/dist/commands/events.d.ts +3 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +117 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/infra.d.ts +20 -0
- package/dist/commands/infra.d.ts.map +1 -0
- package/dist/commands/infra.js +130 -0
- package/dist/commands/infra.js.map +1 -0
- package/dist/commands/journal.d.ts +3 -0
- package/dist/commands/journal.d.ts.map +1 -0
- package/dist/commands/journal.js +281 -0
- package/dist/commands/journal.js.map +1 -0
- package/dist/commands/login.d.ts +18 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +121 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +39 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/narratives.d.ts +3 -0
- package/dist/commands/narratives.d.ts.map +1 -0
- package/dist/commands/narratives.js +259 -0
- package/dist/commands/narratives.js.map +1 -0
- package/dist/commands/onboarding.d.ts +7 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +126 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/query.d.ts +32 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +132 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/replay-cmd.d.ts +43 -0
- package/dist/commands/replay-cmd.d.ts.map +1 -0
- package/dist/commands/replay-cmd.js +215 -0
- package/dist/commands/replay-cmd.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +443 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/risk.d.ts +47 -0
- package/dist/commands/risk.d.ts.map +1 -0
- package/dist/commands/risk.js +156 -0
- package/dist/commands/risk.js.map +1 -0
- package/dist/commands/social.d.ts +43 -0
- package/dist/commands/social.d.ts.map +1 -0
- package/dist/commands/social.js +318 -0
- package/dist/commands/social.js.map +1 -0
- package/dist/commands/strategy-cmd.d.ts +44 -0
- package/dist/commands/strategy-cmd.d.ts.map +1 -0
- package/dist/commands/strategy-cmd.js +367 -0
- package/dist/commands/strategy-cmd.js.map +1 -0
- package/dist/commands/subscribe.d.ts +72 -0
- package/dist/commands/subscribe.d.ts.map +1 -0
- package/dist/commands/subscribe.js +480 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/suggestions-cmd.d.ts +24 -0
- package/dist/commands/suggestions-cmd.d.ts.map +1 -0
- package/dist/commands/suggestions-cmd.js +142 -0
- package/dist/commands/suggestions-cmd.js.map +1 -0
- package/dist/commands/thesis-cmd.d.ts +3 -0
- package/dist/commands/thesis-cmd.d.ts.map +1 -0
- package/dist/commands/thesis-cmd.js +132 -0
- package/dist/commands/thesis-cmd.js.map +1 -0
- package/dist/commands/trader.d.ts +29 -0
- package/dist/commands/trader.d.ts.map +1 -0
- package/dist/commands/trader.js +292 -0
- package/dist/commands/trader.js.map +1 -0
- package/dist/commands/watch.d.ts +16 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +88 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/whoami.d.ts +14 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +89 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/credentials.d.ts +18 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +168 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +51 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +118 -0
- package/dist/utils.js.map +1 -0
- 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"}
|