@trading-boy/cli 0.1.0

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 (106) hide show
  1. package/README.md +8 -0
  2. package/dist/api-client.d.ts +20 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +81 -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 +71 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/audit.d.ts +33 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +135 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/behavioral.d.ts +40 -0
  15. package/dist/commands/behavioral.d.ts.map +1 -0
  16. package/dist/commands/behavioral.js +369 -0
  17. package/dist/commands/behavioral.js.map +1 -0
  18. package/dist/commands/billing.d.ts +12 -0
  19. package/dist/commands/billing.d.ts.map +1 -0
  20. package/dist/commands/billing.js +111 -0
  21. package/dist/commands/billing.js.map +1 -0
  22. package/dist/commands/catalysts.d.ts +8 -0
  23. package/dist/commands/catalysts.d.ts.map +1 -0
  24. package/dist/commands/catalysts.js +192 -0
  25. package/dist/commands/catalysts.js.map +1 -0
  26. package/dist/commands/config-cmd.d.ts +30 -0
  27. package/dist/commands/config-cmd.d.ts.map +1 -0
  28. package/dist/commands/config-cmd.js +265 -0
  29. package/dist/commands/config-cmd.js.map +1 -0
  30. package/dist/commands/context.d.ts +40 -0
  31. package/dist/commands/context.d.ts.map +1 -0
  32. package/dist/commands/context.js +385 -0
  33. package/dist/commands/context.js.map +1 -0
  34. package/dist/commands/decisions.d.ts +21 -0
  35. package/dist/commands/decisions.d.ts.map +1 -0
  36. package/dist/commands/decisions.js +327 -0
  37. package/dist/commands/decisions.js.map +1 -0
  38. package/dist/commands/events.d.ts +3 -0
  39. package/dist/commands/events.d.ts.map +1 -0
  40. package/dist/commands/events.js +201 -0
  41. package/dist/commands/events.js.map +1 -0
  42. package/dist/commands/infra.d.ts +22 -0
  43. package/dist/commands/infra.d.ts.map +1 -0
  44. package/dist/commands/infra.js +228 -0
  45. package/dist/commands/infra.js.map +1 -0
  46. package/dist/commands/journal.d.ts +3 -0
  47. package/dist/commands/journal.d.ts.map +1 -0
  48. package/dist/commands/journal.js +616 -0
  49. package/dist/commands/journal.js.map +1 -0
  50. package/dist/commands/login.d.ts +18 -0
  51. package/dist/commands/login.d.ts.map +1 -0
  52. package/dist/commands/login.js +121 -0
  53. package/dist/commands/login.js.map +1 -0
  54. package/dist/commands/logout.d.ts +7 -0
  55. package/dist/commands/logout.d.ts.map +1 -0
  56. package/dist/commands/logout.js +39 -0
  57. package/dist/commands/logout.js.map +1 -0
  58. package/dist/commands/narratives.d.ts +3 -0
  59. package/dist/commands/narratives.d.ts.map +1 -0
  60. package/dist/commands/narratives.js +336 -0
  61. package/dist/commands/narratives.js.map +1 -0
  62. package/dist/commands/query.d.ts +39 -0
  63. package/dist/commands/query.d.ts.map +1 -0
  64. package/dist/commands/query.js +212 -0
  65. package/dist/commands/query.js.map +1 -0
  66. package/dist/commands/review.d.ts +3 -0
  67. package/dist/commands/review.d.ts.map +1 -0
  68. package/dist/commands/review.js +481 -0
  69. package/dist/commands/review.js.map +1 -0
  70. package/dist/commands/risk.d.ts +19 -0
  71. package/dist/commands/risk.d.ts.map +1 -0
  72. package/dist/commands/risk.js +190 -0
  73. package/dist/commands/risk.js.map +1 -0
  74. package/dist/commands/social.d.ts +9 -0
  75. package/dist/commands/social.d.ts.map +1 -0
  76. package/dist/commands/social.js +386 -0
  77. package/dist/commands/social.js.map +1 -0
  78. package/dist/commands/subscribe.d.ts +45 -0
  79. package/dist/commands/subscribe.d.ts.map +1 -0
  80. package/dist/commands/subscribe.js +259 -0
  81. package/dist/commands/subscribe.js.map +1 -0
  82. package/dist/commands/trader.d.ts +12 -0
  83. package/dist/commands/trader.d.ts.map +1 -0
  84. package/dist/commands/trader.js +265 -0
  85. package/dist/commands/trader.js.map +1 -0
  86. package/dist/commands/watch.d.ts +26 -0
  87. package/dist/commands/watch.d.ts.map +1 -0
  88. package/dist/commands/watch.js +121 -0
  89. package/dist/commands/watch.js.map +1 -0
  90. package/dist/commands/whoami.d.ts +14 -0
  91. package/dist/commands/whoami.d.ts.map +1 -0
  92. package/dist/commands/whoami.js +73 -0
  93. package/dist/commands/whoami.js.map +1 -0
  94. package/dist/credentials.d.ts +18 -0
  95. package/dist/credentials.d.ts.map +1 -0
  96. package/dist/credentials.js +164 -0
  97. package/dist/credentials.js.map +1 -0
  98. package/dist/index.d.ts +33 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +28 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/utils.d.ts +6 -0
  103. package/dist/utils.d.ts.map +1 -0
  104. package/dist/utils.js +21 -0
  105. package/dist/utils.js.map +1 -0
  106. package/package.json +40 -0
@@ -0,0 +1,45 @@
1
+ import { Command } from 'commander';
2
+ export interface CheckoutResponse {
3
+ checkoutUrl: string;
4
+ provisioningToken: string;
5
+ }
6
+ export interface ProvisionResponse {
7
+ status: 'pending' | 'ready' | 'expired' | 'already_retrieved' | 'not_found';
8
+ apiKey?: string;
9
+ keyPrefix?: string;
10
+ email?: string;
11
+ plan?: string;
12
+ }
13
+ export interface PollResult {
14
+ success: boolean;
15
+ apiKey?: string;
16
+ keyPrefix?: string;
17
+ email?: string;
18
+ plan?: string;
19
+ error?: string;
20
+ }
21
+ /**
22
+ * Create a Stripe Checkout session via the API.
23
+ * This is a public endpoint — no auth needed.
24
+ */
25
+ export declare function createCheckoutSession(email: string): Promise<CheckoutResponse>;
26
+ /**
27
+ * Poll the provisioning endpoint for the API key.
28
+ * Returns normalized ProvisionResponse regardless of HTTP status.
29
+ */
30
+ export declare function pollProvisioningToken(token: string): Promise<ProvisionResponse>;
31
+ /**
32
+ * Poll the provisioning endpoint until a key is ready or timeout.
33
+ */
34
+ export declare function pollForApiKey(token: string, onTick?: (elapsed: number) => void): Promise<PollResult>;
35
+ /**
36
+ * Save API credentials using the credential storage module.
37
+ */
38
+ export declare function saveApiKey(apiKey: string, metadata: {
39
+ keyPrefix?: string;
40
+ email?: string;
41
+ plan?: string;
42
+ }): Promise<void>;
43
+ export declare function formatSubscribeSuccess(result: PollResult): string;
44
+ export declare function registerSubscribeCommand(program: Command): void;
45
+ //# sourceMappingURL=subscribe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/commands/subscribe.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,mBAAmB,GAAG,WAAW,CAAC;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAapF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiBrF;AAID;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,UAAU,CAAC,CAgDrB;AAID;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhB;AAYD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA0BjE;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4F/D"}
@@ -0,0 +1,259 @@
1
+ // ─── Subscribe Command ───
2
+ //
3
+ // Handles the checkout flow for new subscribers:
4
+ // 1. POST /api/v1/billing/checkout with user email
5
+ // 2. Open browser to Stripe Checkout
6
+ // 3. Poll GET /api/v1/billing/provision/:token every 3s until API key is returned
7
+ // 4. Store key locally via credential storage
8
+ import chalk from 'chalk';
9
+ import { createLogger } from '@trading-boy/core';
10
+ import { storeCredentials } from '../credentials.js';
11
+ import { getApiBase } from '../api-client.js';
12
+ // ─── Logger ───
13
+ const logger = createLogger('cli-subscribe');
14
+ // ─── Constants ───
15
+ const POLL_INTERVAL_MS = 3_000;
16
+ const POLL_TIMEOUT_MS = 5 * 60 * 1_000; // 5 minutes
17
+ // ─── API Helpers ───
18
+ /**
19
+ * Create a Stripe Checkout session via the API.
20
+ * This is a public endpoint — no auth needed.
21
+ */
22
+ export async function createCheckoutSession(email) {
23
+ const response = await fetch(`${getApiBase()}/api/v1/billing/checkout`, {
24
+ method: 'POST',
25
+ headers: { 'Content-Type': 'application/json' },
26
+ body: JSON.stringify({ email }),
27
+ });
28
+ if (!response.ok) {
29
+ const body = await response.text();
30
+ throw new Error(`Checkout request failed (${response.status}): ${body}`);
31
+ }
32
+ return response.json();
33
+ }
34
+ /**
35
+ * Poll the provisioning endpoint for the API key.
36
+ * Returns normalized ProvisionResponse regardless of HTTP status.
37
+ */
38
+ export async function pollProvisioningToken(token) {
39
+ const response = await fetch(`${getApiBase()}/api/v1/billing/provision/${token}`);
40
+ if (response.status === 404) {
41
+ return { status: 'not_found' };
42
+ }
43
+ if (response.status === 410) {
44
+ const body = await response.json();
45
+ return { status: body.status === 'already_retrieved' ? 'already_retrieved' : 'expired' };
46
+ }
47
+ if (!response.ok) {
48
+ throw new Error(`Provision check failed (${response.status})`);
49
+ }
50
+ return response.json();
51
+ }
52
+ // ─── Polling Logic ───
53
+ /**
54
+ * Poll the provisioning endpoint until a key is ready or timeout.
55
+ */
56
+ export async function pollForApiKey(token, onTick) {
57
+ const start = Date.now();
58
+ let elapsed = Date.now() - start;
59
+ while (elapsed < POLL_TIMEOUT_MS) {
60
+ onTick?.(elapsed);
61
+ try {
62
+ const result = await pollProvisioningToken(token);
63
+ if (result.status === 'ready' && result.apiKey) {
64
+ return {
65
+ success: true,
66
+ apiKey: result.apiKey,
67
+ keyPrefix: result.keyPrefix,
68
+ email: result.email,
69
+ plan: result.plan,
70
+ };
71
+ }
72
+ if (result.status === 'expired' || result.status === 'not_found') {
73
+ return {
74
+ success: false,
75
+ error: 'Provisioning token expired. If you completed payment, try `trading-boy login` with your API key from the confirmation email.',
76
+ };
77
+ }
78
+ if (result.status === 'already_retrieved') {
79
+ return {
80
+ success: false,
81
+ error: 'API key was already retrieved. Use `trading-boy login` if you need to re-enter your key.',
82
+ };
83
+ }
84
+ // status === 'pending' — keep polling
85
+ }
86
+ catch (err) {
87
+ logger.debug({ error: err }, 'Poll attempt failed, retrying');
88
+ }
89
+ await sleep(POLL_INTERVAL_MS);
90
+ elapsed = Date.now() - start;
91
+ }
92
+ return {
93
+ success: false,
94
+ error: 'Timed out waiting for payment confirmation. If you completed payment, try `trading-boy login` with your API key from the confirmation email.',
95
+ };
96
+ }
97
+ // ─── Credential Storage ───
98
+ /**
99
+ * Save API credentials using the credential storage module.
100
+ */
101
+ export async function saveApiKey(apiKey, metadata) {
102
+ await storeCredentials(apiKey, {
103
+ keyId: metadata.keyPrefix,
104
+ email: metadata.email,
105
+ plan: metadata.plan,
106
+ });
107
+ }
108
+ // ─── Formatters ───
109
+ function formatElapsed(ms) {
110
+ const seconds = Math.floor(ms / 1000);
111
+ const minutes = Math.floor(seconds / 60);
112
+ const remaining = seconds % 60;
113
+ if (minutes > 0)
114
+ return `${minutes}m ${remaining}s`;
115
+ return `${seconds}s`;
116
+ }
117
+ export function formatSubscribeSuccess(result) {
118
+ const lines = [];
119
+ lines.push('');
120
+ lines.push(chalk.green.bold(' Subscription activated!'));
121
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
122
+ lines.push('');
123
+ if (result.email) {
124
+ lines.push(` ${chalk.bold('Account:')} ${result.email}`);
125
+ }
126
+ if (result.plan) {
127
+ lines.push(` ${chalk.bold('Plan:')} ${result.plan}`);
128
+ }
129
+ if (result.keyPrefix) {
130
+ lines.push(` ${chalk.bold('Key ID:')} ${result.keyPrefix}`);
131
+ }
132
+ lines.push('');
133
+ lines.push(chalk.dim(' Your API key has been stored securely.'));
134
+ lines.push(chalk.dim(' You can now use all Trading Boy commands.'));
135
+ lines.push('');
136
+ lines.push(chalk.cyan(' Try it: trading-boy context SOL'));
137
+ lines.push('');
138
+ return lines.join('\n');
139
+ }
140
+ // ─── Command Registration ───
141
+ export function registerSubscribeCommand(program) {
142
+ program
143
+ .command('subscribe')
144
+ .description('Subscribe to Trading Boy and get your API key')
145
+ .requiredOption('-e, --email <email>', 'Your email address')
146
+ .action(async (options) => {
147
+ const { email } = options;
148
+ if (!isValidEmail(email)) {
149
+ console.error(chalk.red(' Invalid email address.'));
150
+ process.exitCode = 1;
151
+ return;
152
+ }
153
+ try {
154
+ console.log('');
155
+ console.log(chalk.bold.cyan(' Trading Boy \u2014 Subscribe'));
156
+ console.log(chalk.gray(' ' + '\u2500'.repeat(50)));
157
+ console.log('');
158
+ // Step 1: Create checkout session
159
+ let checkout;
160
+ try {
161
+ checkout = await createCheckoutSession(email);
162
+ }
163
+ catch (err) {
164
+ const message = err instanceof Error ? err.message : String(err);
165
+ console.error(chalk.red(` Failed to create checkout session: ${message}`));
166
+ const hint = formatConnectionError(message);
167
+ if (hint)
168
+ console.error(hint);
169
+ process.exitCode = 1;
170
+ return;
171
+ }
172
+ // Step 2: Open browser
173
+ console.log(chalk.white(' Opening Stripe Checkout in your browser...'));
174
+ await openBrowser(checkout.checkoutUrl);
175
+ console.log(chalk.dim(' Complete payment in your browser to continue.'));
176
+ console.log('');
177
+ // Step 3: Poll for API key
178
+ let pollResult;
179
+ try {
180
+ const { default: ora } = await import('ora');
181
+ const spinner = ora(' Waiting for payment confirmation...').start();
182
+ pollResult = await pollForApiKey(checkout.provisioningToken, (elapsed) => {
183
+ spinner.text = ` Waiting for payment confirmation... (${formatElapsed(elapsed)})`;
184
+ });
185
+ if (pollResult.success) {
186
+ spinner.succeed(' Payment confirmed!');
187
+ }
188
+ else {
189
+ spinner.fail(' Payment not received');
190
+ }
191
+ }
192
+ catch {
193
+ // ora not available — simple polling
194
+ console.log(chalk.gray(' Waiting for payment confirmation...'));
195
+ pollResult = await pollForApiKey(checkout.provisioningToken);
196
+ }
197
+ if (!pollResult.success) {
198
+ console.error('');
199
+ console.error(chalk.red(` ${pollResult.error}`));
200
+ process.exitCode = 1;
201
+ return;
202
+ }
203
+ // Step 4: Store the API key
204
+ try {
205
+ await saveApiKey(pollResult.apiKey, {
206
+ keyPrefix: pollResult.keyPrefix,
207
+ email: pollResult.email,
208
+ plan: pollResult.plan,
209
+ });
210
+ }
211
+ catch (err) {
212
+ // Key provisioned but storage failed — show key so user doesn't lose it
213
+ console.error('');
214
+ console.error(chalk.yellow(' Warning: Could not save API key automatically.'));
215
+ console.error(chalk.yellow(` Your API key: ${pollResult.apiKey}`));
216
+ console.error(chalk.yellow(' Save this key and run: trading-boy login --api-key <key>'));
217
+ logger.error({ error: err }, 'Failed to save credentials');
218
+ process.exitCode = 1;
219
+ return;
220
+ }
221
+ console.log(formatSubscribeSuccess(pollResult));
222
+ }
223
+ catch (error) {
224
+ const message = error instanceof Error ? error.message : String(error);
225
+ logger.error({ error: message }, 'Subscribe command failed');
226
+ console.error(chalk.red(` Error: ${message}`));
227
+ process.exitCode = 1;
228
+ }
229
+ });
230
+ }
231
+ // ─── Helpers ───
232
+ function isValidEmail(email) {
233
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
234
+ }
235
+ function sleep(ms) {
236
+ return new Promise((resolve) => setTimeout(resolve, ms));
237
+ }
238
+ async function openBrowser(url) {
239
+ try {
240
+ const { default: open } = await import('open');
241
+ await open(url);
242
+ }
243
+ catch {
244
+ console.log(chalk.yellow(`\n Could not open browser automatically.`));
245
+ console.log(chalk.yellow(` Please open this URL manually:\n`));
246
+ console.log(` ${chalk.cyan.underline(url)}\n`);
247
+ }
248
+ }
249
+ function formatConnectionError(message) {
250
+ const lower = message.toLowerCase();
251
+ if (lower.includes('econnrefused') || lower.includes('fetch failed') || lower.includes('enotfound')) {
252
+ return [
253
+ chalk.dim(' \u2192 Is the API server running? Try: pnpm start:api'),
254
+ chalk.dim(' \u2192 Or set TRADING_BOY_API_URL to your API endpoint'),
255
+ ].join('\n');
256
+ }
257
+ return null;
258
+ }
259
+ //# 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,12 @@
1
+ import { Command } from 'commander';
2
+ import { type TraderRecord, type TraderWalletRecord } from '@trading-boy/graph-db';
3
+ /**
4
+ * Format a single trader record for display.
5
+ */
6
+ export declare function formatTraderOutput(trader: TraderRecord, wallets?: TraderWalletRecord[]): string;
7
+ /**
8
+ * Format a list of traders for display.
9
+ */
10
+ export declare function formatTraderListOutput(traders: TraderRecord[]): string;
11
+ export declare function registerTraderCommand(program: Command): void;
12
+ //# sourceMappingURL=trader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trader.d.ts","sourceRoot":"","sources":["../../src/commands/trader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EAOL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAmB/B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAiC/F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAyCtE;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoL5D"}
@@ -0,0 +1,265 @@
1
+ import chalk from 'chalk';
2
+ import { getConfig, createLogger } from '@trading-boy/core';
3
+ import { Neo4jClient } from '@trading-boy/graph-db';
4
+ import { formatConnectionError } from '../utils.js';
5
+ import { createTrader, listTraders, updateTrader, linkWallet, resolveTrader, getTraderWallets, } from '@trading-boy/graph-db';
6
+ // ─── Logger ───
7
+ const logger = createLogger('cli-trader');
8
+ // ─── Neo4j Client Factory ───
9
+ function createNeo4jClient() {
10
+ const config = getConfig();
11
+ return new Neo4jClient({
12
+ uri: config.NEO4J_URI,
13
+ username: config.NEO4J_USER,
14
+ password: config.NEO4J_PASSWORD,
15
+ });
16
+ }
17
+ // ─── Formatters ───
18
+ /**
19
+ * Format a single trader record for display.
20
+ */
21
+ export function formatTraderOutput(trader, wallets) {
22
+ const lines = [];
23
+ lines.push('');
24
+ lines.push(chalk.bold.cyan(' Trader Profile'));
25
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
26
+ lines.push('');
27
+ lines.push(` ${chalk.gray('Name:')} ${chalk.white(trader.name)}`);
28
+ lines.push(` ${chalk.gray('ID:')} ${chalk.dim(trader.id)}`);
29
+ lines.push(` ${chalk.gray('Max Drawdown:')} ${chalk.yellow(String(trader.riskToleranceMax) + '%')}`);
30
+ lines.push(` ${chalk.gray('Wallets:')} ${chalk.white(String(trader.walletAddresses.length))}`);
31
+ if (trader.walletAddresses.length > 0) {
32
+ for (const addr of trader.walletAddresses) {
33
+ lines.push(` ${chalk.dim('\u2022')} ${chalk.white(addr)}`);
34
+ }
35
+ }
36
+ if (wallets && wallets.length > 0) {
37
+ lines.push('');
38
+ lines.push(` ${chalk.gray('Wallet Details:')}`);
39
+ for (const w of wallets) {
40
+ lines.push(` ${chalk.dim('\u2022')} ${chalk.white(w.address)} ${chalk.dim(`(${w.chain})`)} ${chalk.dim(`since ${w.since}`)}`);
41
+ }
42
+ }
43
+ lines.push('');
44
+ lines.push(` ${chalk.gray('Created:')} ${chalk.dim(trader.createdAt)}`);
45
+ lines.push(` ${chalk.gray('Updated:')} ${chalk.dim(trader.updatedAt)}`);
46
+ lines.push('');
47
+ return lines.join('\n');
48
+ }
49
+ /**
50
+ * Format a list of traders for display.
51
+ */
52
+ export function formatTraderListOutput(traders) {
53
+ const lines = [];
54
+ lines.push('');
55
+ lines.push(chalk.bold.cyan(' Registered Traders'));
56
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(70)));
57
+ lines.push('');
58
+ if (traders.length === 0) {
59
+ lines.push(` ${chalk.dim('No traders registered.')}`);
60
+ lines.push('');
61
+ lines.push(` ${chalk.dim('Run')} ${chalk.white('trading-boy trader register --name "YourName"')} ${chalk.dim('to get started.')}`);
62
+ lines.push('');
63
+ return lines.join('\n');
64
+ }
65
+ // Header
66
+ lines.push(' ' +
67
+ padRight('Name', 20) +
68
+ padRight('Max DD', 10) +
69
+ padRight('Wallets', 10) +
70
+ 'ID');
71
+ lines.push(' ' + '\u2500'.repeat(70));
72
+ for (const t of traders) {
73
+ lines.push(' ' +
74
+ padRight(String(t.name ?? t.id ?? ''), 20) +
75
+ padRight(String(t.riskToleranceMax ?? 0) + '%', 10) +
76
+ padRight(String(t.walletAddresses?.length ?? 0), 10) +
77
+ chalk.dim(t.id));
78
+ }
79
+ lines.push('');
80
+ lines.push(` ${chalk.gray(`Total: ${traders.length} trader(s)`)}`);
81
+ lines.push('');
82
+ return lines.join('\n');
83
+ }
84
+ // ─── Command Registration ───
85
+ export function registerTraderCommand(program) {
86
+ const trader = program
87
+ .command('trader')
88
+ .description('Manage trader profiles');
89
+ // ─── register ───
90
+ trader
91
+ .command('register')
92
+ .description('Register a new trader profile')
93
+ .requiredOption('--name <name>', 'Trader display name')
94
+ .option('--wallet <address>', 'Initial Solana wallet address')
95
+ .option('--max-drawdown <pct>', 'Max acceptable drawdown percentage', parseFloatOption)
96
+ .action(async (options) => {
97
+ const client = createNeo4jClient();
98
+ try {
99
+ await client.connect();
100
+ const result = await createTrader(client, {
101
+ name: options.name,
102
+ walletAddress: options.wallet,
103
+ riskToleranceMax: options.maxDrawdown,
104
+ });
105
+ console.log(formatTraderOutput(result));
106
+ console.log(chalk.green(' Trader registered successfully.'));
107
+ console.log('');
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ logger.error({ error: message }, 'Failed to register trader');
112
+ console.error(chalk.red(`Error: ${message}`));
113
+ const guidance = formatConnectionError(message);
114
+ if (guidance)
115
+ console.error(guidance);
116
+ process.exitCode = 1;
117
+ }
118
+ finally {
119
+ await client.disconnect();
120
+ }
121
+ });
122
+ // ─── show ───
123
+ trader
124
+ .command('show')
125
+ .description('Show a trader profile by name or ID')
126
+ .argument('<name-or-id>', 'Trader name or ID')
127
+ .action(async (nameOrId) => {
128
+ const client = createNeo4jClient();
129
+ try {
130
+ await client.connect();
131
+ const result = await resolveTrader(client, nameOrId);
132
+ if (!result) {
133
+ console.error(chalk.yellow(`Trader not found: "${nameOrId}"`));
134
+ process.exitCode = 1;
135
+ return;
136
+ }
137
+ const wallets = await getTraderWallets(client, result.id);
138
+ console.log(formatTraderOutput(result, wallets));
139
+ }
140
+ catch (error) {
141
+ const message = error instanceof Error ? error.message : String(error);
142
+ logger.error({ error: message }, 'Failed to show trader');
143
+ console.error(chalk.red(`Error: ${message}`));
144
+ const guidance = formatConnectionError(message);
145
+ if (guidance)
146
+ console.error(guidance);
147
+ process.exitCode = 1;
148
+ }
149
+ finally {
150
+ await client.disconnect();
151
+ }
152
+ });
153
+ // ─── list ───
154
+ trader
155
+ .command('list')
156
+ .description('List all registered traders')
157
+ .action(async () => {
158
+ const client = createNeo4jClient();
159
+ try {
160
+ await client.connect();
161
+ const traders = await listTraders(client);
162
+ console.log(formatTraderListOutput(traders));
163
+ }
164
+ catch (error) {
165
+ const message = error instanceof Error ? error.message : String(error);
166
+ logger.error({ error: message }, 'Failed to list traders');
167
+ console.error(chalk.red(`Error: ${message}`));
168
+ const guidance = formatConnectionError(message);
169
+ if (guidance)
170
+ console.error(guidance);
171
+ process.exitCode = 1;
172
+ }
173
+ finally {
174
+ await client.disconnect();
175
+ }
176
+ });
177
+ // ─── update ───
178
+ trader
179
+ .command('update')
180
+ .description('Update a trader profile')
181
+ .argument('<name-or-id>', 'Trader name or ID')
182
+ .option('--name <new-name>', 'New display name')
183
+ .option('--max-drawdown <pct>', 'New max acceptable drawdown percentage', parseFloatOption)
184
+ .action(async (nameOrId, options) => {
185
+ const client = createNeo4jClient();
186
+ try {
187
+ await client.connect();
188
+ const existing = await resolveTrader(client, nameOrId);
189
+ if (!existing) {
190
+ console.error(chalk.yellow(`Trader not found: "${nameOrId}"`));
191
+ process.exitCode = 1;
192
+ return;
193
+ }
194
+ if (options.name === undefined && options.maxDrawdown === undefined) {
195
+ console.error(chalk.yellow('No updates provided. Use --name or --max-drawdown.'));
196
+ process.exitCode = 1;
197
+ return;
198
+ }
199
+ const result = await updateTrader(client, existing.id, {
200
+ name: options.name,
201
+ riskToleranceMax: options.maxDrawdown,
202
+ });
203
+ if (result) {
204
+ console.log(formatTraderOutput(result));
205
+ console.log(chalk.green(' Trader updated successfully.'));
206
+ console.log('');
207
+ }
208
+ }
209
+ catch (error) {
210
+ const message = error instanceof Error ? error.message : String(error);
211
+ logger.error({ error: message }, 'Failed to update trader');
212
+ console.error(chalk.red(`Error: ${message}`));
213
+ const guidance = formatConnectionError(message);
214
+ if (guidance)
215
+ console.error(guidance);
216
+ process.exitCode = 1;
217
+ }
218
+ finally {
219
+ await client.disconnect();
220
+ }
221
+ });
222
+ // ─── link-wallet ───
223
+ trader
224
+ .command('link-wallet')
225
+ .description('Link a wallet address to a trader')
226
+ .argument('<name-or-id>', 'Trader name or ID')
227
+ .argument('<wallet-address>', 'Solana wallet address')
228
+ .option('--chain <chain>', 'Blockchain name', 'solana')
229
+ .action(async (nameOrId, walletAddress, options) => {
230
+ const client = createNeo4jClient();
231
+ try {
232
+ await client.connect();
233
+ const existing = await resolveTrader(client, nameOrId);
234
+ if (!existing) {
235
+ console.error(chalk.yellow(`Trader not found: "${nameOrId}"`));
236
+ process.exitCode = 1;
237
+ return;
238
+ }
239
+ await linkWallet(client, existing.id, walletAddress, options.chain);
240
+ console.log('');
241
+ console.log(chalk.green(` Wallet linked to ${existing.name}: ${walletAddress}`));
242
+ console.log('');
243
+ }
244
+ catch (error) {
245
+ const message = error instanceof Error ? error.message : String(error);
246
+ logger.error({ error: message }, 'Failed to link wallet');
247
+ console.error(chalk.red(`Error: ${message}`));
248
+ const guidance = formatConnectionError(message);
249
+ if (guidance)
250
+ console.error(guidance);
251
+ process.exitCode = 1;
252
+ }
253
+ finally {
254
+ await client.disconnect();
255
+ }
256
+ });
257
+ }
258
+ // ─── Helpers ───
259
+ function padRight(str, len) {
260
+ return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
261
+ }
262
+ function parseFloatOption(value) {
263
+ return parseFloat(value);
264
+ }
265
+ //# sourceMappingURL=trader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trader.js","sourceRoot":"","sources":["../../src/commands/trader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAE/B,iBAAiB;AAEjB,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAE1C,+BAA+B;AAE/B,SAAS,iBAAiB;IACxB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,OAAO,IAAI,WAAW,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC,SAAS;QACrB,QAAQ,EAAE,MAAM,CAAC,UAAU;QAC3B,QAAQ,EAAE,MAAM,CAAC,cAAc;KAChC,CAAC,CAAC;AACL,CAAC;AAED,qBAAqB;AAErB;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,OAA8B;IACrF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3G,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAE1G,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnI,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAuB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACpI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS;IACT,KAAK,CAAC,IAAI,CACR,IAAI;QACJ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACpB,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;QACvB,IAAI,CACL,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,IAAI;YACJ,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YACnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACpD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+BAA+B;AAE/B,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAEzC,mBAAmB;IAEnB,MAAM;SACH,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,cAAc,CAAC,eAAe,EAAE,qBAAqB,CAAC;SACtD,MAAM,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;SAC7D,MAAM,CAAC,sBAAsB,EAAE,oCAAoC,EAAE,gBAAgB,CAAC;SACtF,MAAM,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE;gBACxC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,aAAa,EAAE,OAAO,CAAC,MAAM;gBAC7B,gBAAgB,EAAE,OAAO,CAAC,WAAW;aACtC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,2BAA2B,CAAC,CAAC;YAC9D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,eAAe;IAEf,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAErD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,eAAe;IAEf,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,iBAAiB;IAEjB,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yBAAyB,CAAC;SACtC,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;SAC7C,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;SAC/C,MAAM,CAAC,sBAAsB,EAAE,wCAAwC,EAAE,gBAAgB,CAAC;SAC1F,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAsB,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACpE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;gBAClF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACrD,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,gBAAgB,EAAE,OAAO,CAAC,WAAW;aACtC,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,yBAAyB,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,sBAAsB;IAEtB,MAAM;SACH,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,mCAAmC,CAAC;SAChD,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;SAC7C,QAAQ,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;SACrD,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,aAAqB,EAAE,OAA0B,EAAE,EAAE;QACpF,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAEpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAmBD,kBAAkB;AAElB,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Command } from 'commander';
2
+ import type { AssembledContextPackage } from '@trading-boy/core';
3
+ import { type QueryResult } from './query.js';
4
+ export interface WatchState {
5
+ timer: ReturnType<typeof setInterval> | null;
6
+ running: boolean;
7
+ }
8
+ /**
9
+ * Render a single query cycle — clears screen, runs query, prints output.
10
+ */
11
+ export declare function renderCycle(symbol: string): Promise<QueryResult | null>;
12
+ /**
13
+ * Render a single context cycle — clears screen, assembles full ContextPackage, prints output.
14
+ */
15
+ export declare function renderContextCycle(symbol: string, intervalSeconds?: number): Promise<AssembledContextPackage | null>;
16
+ /**
17
+ * Start a watch loop that polls and re-renders at the given interval.
18
+ * Returns a WatchState with a cleanup handle.
19
+ */
20
+ export declare function startWatchLoop(symbol: string, intervalSeconds: number, renderFn?: (symbol: string) => Promise<unknown>): WatchState;
21
+ /**
22
+ * Stop the watch loop and clean up resources.
23
+ */
24
+ export declare function stopWatchLoop(state: WatchState): void;
25
+ export declare function registerWatchCommand(program: Command): void;
26
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAmC,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAe/E,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC;IAC7C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkB7E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAmB1H;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC9C,UAAU,CAeZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAMrD;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C3D"}