@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,378 @@
1
+ import { Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { getConfig, createLogger } from '@trading-boy/core';
4
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
5
+ import { resolve } from 'node:path';
6
+ import { apiRequest, ApiError } from '../api-client.js';
7
+ import { padRight } from '../utils.js';
8
+ // ─── Logger ───
9
+ const logger = createLogger('cli-config');
10
+ // ─── Sensitive Keys ───
11
+ /** Keys whose values should be redacted in `config show` output. */
12
+ const SENSITIVE_KEYS = new Set([
13
+ 'NEO4J_PASSWORD',
14
+ 'TIMESCALE_PASSWORD',
15
+ 'REDIS_PASSWORD',
16
+ 'HELIUS_API_KEY',
17
+ 'COINGECKO_API_KEY',
18
+ 'ALCHEMY_API_KEY',
19
+ 'GLASSNODE_API_KEY',
20
+ 'TWITTER_BEARER_TOKEN',
21
+ 'ANTHROPIC_API_KEY',
22
+ 'LLM_API_KEY',
23
+ 'LLM_FALLBACK_API_KEY',
24
+ 'BELIEF_HMAC_KEY',
25
+ 'STRIPE_SECRET_KEY',
26
+ 'STRIPE_WEBHOOK_SECRET',
27
+ 'TELEGRAM_BOT_TOKEN',
28
+ 'RESEND_API_KEY',
29
+ 'SMTP_PASS',
30
+ 'API_KEY_HASHES',
31
+ 'LLM_ENCRYPTION_KEY',
32
+ ]);
33
+ /** Valid config keys (from the Zod schema). */
34
+ const VALID_KEYS = [
35
+ 'NODE_ENV',
36
+ 'LOG_LEVEL',
37
+ 'NEO4J_URI',
38
+ 'NEO4J_USER',
39
+ 'NEO4J_PASSWORD',
40
+ 'TIMESCALE_HOST',
41
+ 'TIMESCALE_PORT',
42
+ 'TIMESCALE_USER',
43
+ 'TIMESCALE_PASSWORD',
44
+ 'TIMESCALE_DB',
45
+ 'REDIS_URL',
46
+ 'REDIS_PASSWORD',
47
+ 'HELIUS_API_KEY',
48
+ 'COINGECKO_API_KEY',
49
+ 'ALCHEMY_API_KEY',
50
+ 'GLASSNODE_API_KEY',
51
+ 'TWITTER_BEARER_TOKEN',
52
+ 'ANTHROPIC_API_KEY',
53
+ 'LLM_PROVIDER',
54
+ 'LLM_API_KEY',
55
+ 'LLM_BASE_URL',
56
+ 'LLM_MODEL',
57
+ 'LLM_FALLBACK_PROVIDER',
58
+ 'LLM_FALLBACK_MODEL',
59
+ 'LLM_FALLBACK_API_KEY',
60
+ 'LLM_MAX_RETRIES',
61
+ 'LLM_TIMEOUT_MS',
62
+ 'LLM_ENCRYPTION_KEY',
63
+ 'BELIEF_HMAC_KEY',
64
+ 'ENABLE_LLM',
65
+ 'ENABLE_LEARNING',
66
+ 'ENABLE_SOCIAL',
67
+ 'API_PORT',
68
+ 'TELEGRAM_BOT_TOKEN',
69
+ 'TELEGRAM_ALLOWED_CHAT_IDS',
70
+ 'RESEND_API_KEY',
71
+ 'EMAIL_FROM_ADDRESS',
72
+ 'EMAIL_FROM_NAME',
73
+ 'SMTP_HOST',
74
+ 'SMTP_PORT',
75
+ 'SMTP_USER',
76
+ 'SMTP_PASS',
77
+ 'NOTIFICATION_FROM_EMAIL',
78
+ 'STRIPE_SECRET_KEY',
79
+ 'STRIPE_WEBHOOK_SECRET',
80
+ 'STRIPE_PRICE_ID_STARTER',
81
+ 'STRIPE_PRICE_ID_PRO',
82
+ 'STRIPE_PRICE_ID_EDGE',
83
+ 'APP_URL',
84
+ 'API_KEY_HASHES',
85
+ 'API_KEY_AUTH_ENABLED',
86
+ ];
87
+ // ─── Formatters ───
88
+ /**
89
+ * Redact a config value if it's a sensitive key.
90
+ * Shows first 3 chars + '****' for non-empty sensitive values.
91
+ */
92
+ export function redactValue(key, value) {
93
+ const strValue = String(value);
94
+ if (!SENSITIVE_KEYS.has(key)) {
95
+ return strValue;
96
+ }
97
+ // Empty values shown as placeholder
98
+ if (strValue === '') {
99
+ return chalk.dim('(empty)');
100
+ }
101
+ // Redact: show first 3 chars + ****
102
+ if (strValue.length <= 3) {
103
+ return '****';
104
+ }
105
+ return strValue.slice(0, 3) + '****';
106
+ }
107
+ /**
108
+ * Format the full config for display.
109
+ */
110
+ export function formatConfigOutput(config) {
111
+ const lines = [];
112
+ lines.push('');
113
+ lines.push(chalk.bold.cyan(' Configuration'));
114
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(60)));
115
+ lines.push('');
116
+ // Group config keys by category
117
+ const groups = [
118
+ { name: 'Runtime', keys: ['NODE_ENV', 'LOG_LEVEL'] },
119
+ { name: 'Neo4j', keys: ['NEO4J_URI', 'NEO4J_USER', 'NEO4J_PASSWORD'] },
120
+ { name: 'TimescaleDB', keys: ['TIMESCALE_HOST', 'TIMESCALE_PORT', 'TIMESCALE_USER', 'TIMESCALE_PASSWORD', 'TIMESCALE_DB'] },
121
+ { name: 'Redis', keys: ['REDIS_URL', 'REDIS_PASSWORD'] },
122
+ { name: 'Data Sources', keys: ['HELIUS_API_KEY', 'COINGECKO_API_KEY', 'ALCHEMY_API_KEY', 'GLASSNODE_API_KEY', 'TWITTER_BEARER_TOKEN'] },
123
+ { name: 'AI / LLM', keys: ['ANTHROPIC_API_KEY', 'LLM_PROVIDER', 'LLM_API_KEY', 'LLM_BASE_URL', 'LLM_MODEL', 'LLM_FALLBACK_PROVIDER', 'LLM_FALLBACK_MODEL', 'LLM_FALLBACK_API_KEY', 'LLM_MAX_RETRIES', 'LLM_TIMEOUT_MS', 'LLM_ENCRYPTION_KEY', 'ENABLE_LLM'] },
124
+ { name: 'Learning', keys: ['BELIEF_HMAC_KEY', 'ENABLE_LEARNING', 'ENABLE_SOCIAL'] },
125
+ { name: 'API', keys: ['API_PORT', 'API_KEY_HASHES', 'API_KEY_AUTH_ENABLED'] },
126
+ { name: 'Billing', keys: ['STRIPE_SECRET_KEY', 'STRIPE_WEBHOOK_SECRET', 'STRIPE_PRICE_ID_STARTER', 'STRIPE_PRICE_ID_PRO', 'STRIPE_PRICE_ID_EDGE', 'APP_URL'] },
127
+ { name: 'Telegram', keys: ['TELEGRAM_BOT_TOKEN', 'TELEGRAM_ALLOWED_CHAT_IDS'] },
128
+ { name: 'Email', keys: ['RESEND_API_KEY', 'EMAIL_FROM_ADDRESS', 'EMAIL_FROM_NAME', 'SMTP_HOST', 'SMTP_PORT', 'SMTP_USER', 'SMTP_PASS', 'NOTIFICATION_FROM_EMAIL'] },
129
+ ];
130
+ const configRecord = config;
131
+ for (const group of groups) {
132
+ lines.push(chalk.bold(` ${group.name}`));
133
+ for (const key of group.keys) {
134
+ const value = configRecord[key];
135
+ const displayValue = value !== undefined ? redactValue(key, value) : chalk.dim('(not set)');
136
+ lines.push(` ${chalk.gray(padRight(key, 26))} ${displayValue}`);
137
+ }
138
+ lines.push('');
139
+ }
140
+ return lines.join('\n');
141
+ }
142
+ // ─── .env File Operations ───
143
+ /**
144
+ * Resolve the .env file path from the project root.
145
+ */
146
+ export function resolveEnvPath() {
147
+ return resolve(process.cwd(), '.env');
148
+ }
149
+ /**
150
+ * Parse a .env file into a Map of key-value pairs.
151
+ * Preserves comments and blank lines by returning the full lines array too.
152
+ */
153
+ export function parseEnvFile(filePath) {
154
+ const entries = new Map();
155
+ const lines = [];
156
+ if (!existsSync(filePath)) {
157
+ return { entries, lines };
158
+ }
159
+ const content = readFileSync(filePath, 'utf-8');
160
+ const rawLines = content.split('\n');
161
+ for (const line of rawLines) {
162
+ lines.push(line);
163
+ const trimmed = line.trim();
164
+ // Skip comments and empty lines
165
+ if (trimmed === '' || trimmed.startsWith('#')) {
166
+ continue;
167
+ }
168
+ const eqIndex = trimmed.indexOf('=');
169
+ if (eqIndex > 0) {
170
+ const key = trimmed.slice(0, eqIndex).trim();
171
+ let value = trimmed.slice(eqIndex + 1).trim();
172
+ // Remove surrounding quotes if present
173
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
174
+ value = value.slice(1, -1);
175
+ }
176
+ entries.set(key, value);
177
+ }
178
+ }
179
+ return { entries, lines };
180
+ }
181
+ /**
182
+ * Write a key-value pair to the .env file.
183
+ * If the key already exists, update the line; otherwise append.
184
+ */
185
+ export function writeEnvValue(filePath, key, value) {
186
+ const { entries, lines } = parseEnvFile(filePath);
187
+ if (entries.has(key)) {
188
+ // Update existing line
189
+ const updatedLines = lines.map((line) => {
190
+ const trimmed = line.trim();
191
+ if (trimmed.startsWith('#') || trimmed === '')
192
+ return line;
193
+ const eqIndex = trimmed.indexOf('=');
194
+ if (eqIndex > 0) {
195
+ const lineKey = trimmed.slice(0, eqIndex).trim();
196
+ if (lineKey === key) {
197
+ return `${key}=${value}`;
198
+ }
199
+ }
200
+ return line;
201
+ });
202
+ writeFileSync(filePath, updatedLines.join('\n'));
203
+ }
204
+ else {
205
+ // Append to end of file
206
+ const existing = existsSync(filePath) ? readFileSync(filePath, 'utf-8') : '';
207
+ const separator = existing.endsWith('\n') || existing === '' ? '' : '\n';
208
+ writeFileSync(filePath, existing + separator + `${key}=${value}\n`);
209
+ }
210
+ }
211
+ // ─── Command Registration ───
212
+ export function registerConfigCommand(program) {
213
+ const configCmd = program
214
+ .command('config')
215
+ .description('Configuration management commands');
216
+ // ─── config show ───
217
+ configCmd
218
+ .command('show')
219
+ .description('Display current configuration (sensitive values redacted)')
220
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
221
+ .action((options) => {
222
+ try {
223
+ const config = getConfig();
224
+ if (options.format === 'json') {
225
+ // Build a redacted config object for JSON output
226
+ const configRecord = config;
227
+ const redacted = {};
228
+ for (const key of VALID_KEYS) {
229
+ const value = configRecord[key];
230
+ redacted[key] = value !== undefined ? redactValue(key, value) : '';
231
+ }
232
+ console.log(JSON.stringify(redacted, null, 2));
233
+ }
234
+ else {
235
+ console.log(formatConfigOutput(config));
236
+ }
237
+ }
238
+ catch (error) {
239
+ const message = error instanceof Error ? error.message : String(error);
240
+ logger.error({ error: message }, 'Failed to load config');
241
+ console.error(chalk.red(`Error: ${message}`));
242
+ process.exitCode = 1;
243
+ }
244
+ });
245
+ // ─── config set ───
246
+ configCmd
247
+ .command('set <key> <value>')
248
+ .description('Set a config value in the .env file')
249
+ .action((key, value) => {
250
+ try {
251
+ // Validate key
252
+ if (!VALID_KEYS.includes(key)) {
253
+ console.error(chalk.red(`Error: Unknown config key "${key}".`));
254
+ console.error(chalk.dim(`Valid keys: ${VALID_KEYS.join(', ')}`));
255
+ process.exitCode = 1;
256
+ return;
257
+ }
258
+ const envPath = resolveEnvPath();
259
+ writeEnvValue(envPath, key, value);
260
+ console.log('');
261
+ console.log(chalk.green(` Config updated: ${key}`));
262
+ if (SENSITIVE_KEYS.has(key)) {
263
+ console.log(` ${chalk.gray('Value:')} ${redactValue(key, value)}`);
264
+ }
265
+ else {
266
+ console.log(` ${chalk.gray('Value:')} ${value}`);
267
+ }
268
+ console.log(` ${chalk.gray('File:')} ${envPath}`);
269
+ console.log('');
270
+ console.log(chalk.dim(' Note: Restart services for changes to take effect.'));
271
+ console.log('');
272
+ }
273
+ catch (error) {
274
+ const message = error instanceof Error ? error.message : String(error);
275
+ logger.error({ error: message }, 'Failed to set config');
276
+ console.error(chalk.red(`Error: ${message}`));
277
+ process.exitCode = 1;
278
+ }
279
+ });
280
+ // ─── config set-llm-key ───
281
+ configCmd
282
+ .command('set-llm-key <apiKey>')
283
+ .description('Store your LLM API key for thesis extraction + coaching (BYOK)')
284
+ .addOption(new Option('-p, --provider <provider>', 'LLM provider (auto-detected from key prefix if omitted)').choices(['anthropic', 'openai', 'openrouter', 'ollama', 'gemini', 'custom']))
285
+ .option('-m, --model <model>', 'Model name')
286
+ .option('--base-url <url>', 'Custom base URL (for openrouter/ollama/custom providers)')
287
+ .action(async (apiKey, opts) => {
288
+ try {
289
+ const result = await apiRequest('/api/v1/llm-config', {
290
+ method: 'PUT',
291
+ body: {
292
+ apiKey,
293
+ ...(opts.provider ? { provider: opts.provider } : {}),
294
+ ...(opts.model ? { model: opts.model } : {}),
295
+ ...(opts.baseUrl ? { baseUrl: opts.baseUrl } : {}),
296
+ },
297
+ });
298
+ console.log('');
299
+ console.log(chalk.green(' LLM API key saved successfully'));
300
+ console.log(` ${chalk.gray('Provider:')} ${result.provider}`);
301
+ console.log(` ${chalk.gray('Model:')} ${result.model}`);
302
+ console.log(` ${chalk.gray('Key:')} ${apiKey.slice(0, 8)}${'*'.repeat(Math.max(0, apiKey.length - 8))}`);
303
+ console.log('');
304
+ console.log(chalk.dim(' Your key is encrypted at rest. Thesis extraction and coaching are now enabled.'));
305
+ console.log('');
306
+ }
307
+ catch (error) {
308
+ const message = error instanceof Error ? error.message : String(error);
309
+ logger.error({ error: message }, 'Failed to set LLM key');
310
+ console.error(chalk.red(`Error: ${message}`));
311
+ process.exitCode = error instanceof ApiError ? 2 : 1;
312
+ }
313
+ });
314
+ // ─── config get-llm-key ───
315
+ configCmd
316
+ .command('get-llm-key')
317
+ .description('Show current LLM configuration (key redacted)')
318
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
319
+ .action(async (options) => {
320
+ try {
321
+ const result = await apiRequest('/api/v1/llm-config');
322
+ if (options.format === 'json') {
323
+ console.log(JSON.stringify(result, null, 2));
324
+ }
325
+ else {
326
+ console.log('');
327
+ console.log(chalk.bold.cyan(' LLM Configuration'));
328
+ console.log(chalk.gray(' ' + '\u2500'.repeat(40)));
329
+ console.log(` ${chalk.gray('Provider:')} ${result.provider}`);
330
+ console.log(` ${chalk.gray('Model:')} ${result.model}`);
331
+ if (result.baseUrl) {
332
+ console.log(` ${chalk.gray('Base URL:')} ${result.baseUrl}`);
333
+ }
334
+ console.log(` ${chalk.gray('Updated:')} ${new Date(result.updatedAt).toLocaleString()}`);
335
+ console.log('');
336
+ }
337
+ }
338
+ catch (error) {
339
+ if (error instanceof ApiError && error.status === 404) {
340
+ console.log('');
341
+ console.log(chalk.yellow(' No LLM key configured.'));
342
+ console.log(chalk.dim(' Run: trading-boy config set-llm-key <your-api-key>'));
343
+ console.log('');
344
+ }
345
+ else {
346
+ const message = error instanceof Error ? error.message : String(error);
347
+ logger.error({ error: message }, 'Failed to get LLM config');
348
+ console.error(chalk.red(`Error: ${message}`));
349
+ process.exitCode = error instanceof ApiError ? 2 : 1;
350
+ }
351
+ }
352
+ });
353
+ // ─── config remove-llm-key ───
354
+ configCmd
355
+ .command('remove-llm-key')
356
+ .description('Remove your stored LLM API key')
357
+ .action(async () => {
358
+ try {
359
+ await apiRequest('/api/v1/llm-config', { method: 'DELETE' });
360
+ console.log('');
361
+ console.log(chalk.green(' LLM API key removed.'));
362
+ console.log(chalk.dim(' Thesis extraction and coaching features are now disabled.'));
363
+ console.log('');
364
+ }
365
+ catch (error) {
366
+ if (error instanceof ApiError && error.status === 404) {
367
+ console.log(chalk.yellow(' No LLM key configured.'));
368
+ }
369
+ else {
370
+ const message = error instanceof Error ? error.message : String(error);
371
+ logger.error({ error: message }, 'Failed to remove LLM key');
372
+ console.error(chalk.red(`Error: ${message}`));
373
+ process.exitCode = error instanceof ApiError ? 2 : 1;
374
+ }
375
+ }
376
+ });
377
+ }
378
+ //# sourceMappingURL=config-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.js","sourceRoot":"","sources":["../../src/commands/config-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { Command } from 'commander';
2
+ import type { AssembledContextPackage, MarketData, OnchainData, DefiRiskProfile, Catalysts, SocialContext, Synthesis, ContextMeta } from '@trading-boy/core';
3
+ /**
4
+ * Format the market section of a ContextPackage.
5
+ */
6
+ export declare function formatMarketSection(market: MarketData | null): string;
7
+ /**
8
+ * Format the onchain section of a ContextPackage.
9
+ */
10
+ export declare function formatOnchainSection(onchain: OnchainData | null): string;
11
+ /**
12
+ * Format the DeFi risk section of a ContextPackage.
13
+ */
14
+ export declare function formatRiskSection(defiRisk: DefiRiskProfile | null): string;
15
+ /**
16
+ * Format the catalysts section of a ContextPackage.
17
+ */
18
+ export declare function formatCatalystsSection(catalysts: Catalysts | null): string;
19
+ /**
20
+ * Format the social section of a ContextPackage.
21
+ */
22
+ export declare function formatSocialSection(social: SocialContext | null): string;
23
+ /**
24
+ * Format the synthesis section of a ContextPackage.
25
+ */
26
+ export declare function formatSynthesisSection(synthesis: Synthesis | null): string;
27
+ /**
28
+ * Format the _meta section of a ContextPackage.
29
+ */
30
+ export declare function formatMetaSection(meta: ContextMeta): string;
31
+ /**
32
+ * Format a full AssembledContextPackage for colored terminal output.
33
+ */
34
+ export declare function formatContextOutput(pkg: AssembledContextPackage): string;
35
+ export declare function formatSnapshotRange(snapshots: Array<{
36
+ time: string;
37
+ regime: string | null;
38
+ context: AssembledContextPackage;
39
+ }>, symbol: string): string;
40
+ export declare function registerContextCommand(program: Command): void;
41
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAG5C,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAU7J;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAiCrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CA8BxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,CA6B1E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAuC1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAoCxE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAiD1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAwB3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CAiCxE;AASD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,uBAAuB,CAAA;CAAE,CAAC,EAC3F,MAAM,EAAE,MAAM,GACb,MAAM,CA+BR;AAaD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsF7D"}