hedgequantx 1.8.19 → 1.8.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hedgequantx",
3
- "version": "1.8.19",
3
+ "version": "1.8.21",
4
4
  "description": "Prop Futures Algo Trading CLI - Connect to Topstep, Alpha Futures, and other prop firms",
5
5
  "main": "src/app.js",
6
6
  "bin": {
@@ -216,16 +216,18 @@ class AlgoUI {
216
216
  const r1c2 = buildCell('Follower', followerName, chalk.magenta, colR);
217
217
  row(r1c1.padded, r1c2.padded);
218
218
 
219
- this._line(chalk.cyan(GM));
219
+ // Full width separator
220
+ const GF = BOX.ML + BOX.H.repeat(W) + BOX.MR;
220
221
 
221
- // Row 2: Lead Symbol | Follower Symbol
222
- const leadSymbol = (stats.leadSymbol || stats.symbol || 'N/A').substring(0, 35);
223
- const followerSymbol = (stats.followerSymbol || stats.symbol || 'N/A').substring(0, 35);
224
- const r2c1 = buildCell('Symbol', leadSymbol, chalk.yellow, colL);
225
- const r2c2 = buildCell('Symbol', followerSymbol, chalk.yellow, colR);
226
- row(r2c1.padded, r2c2.padded);
222
+ this._line(chalk.cyan(GF));
227
223
 
228
- this._line(chalk.cyan(GM));
224
+ // Row 2: Symbol (centered, single row)
225
+ const symbol = (stats.symbol || stats.leadSymbol || 'N/A').substring(0, 60);
226
+ const symbolText = `Symbol: ${symbol}`;
227
+ const symbolPadded = center(symbolText, W);
228
+ this._line(chalk.cyan(BOX.V) + chalk.yellow(symbolPadded) + chalk.cyan(BOX.V));
229
+
230
+ this._line(chalk.cyan(GT));
229
231
 
230
232
  // Row 3: Lead Qty | Follower Qty
231
233
  const r3c1 = buildCell('Qty', (stats.leadQty || '1').toString(), chalk.cyan, colL);
@@ -68,6 +68,7 @@ const textInput = async (message, defaultVal = '') => {
68
68
  * Password input
69
69
  */
70
70
  const passwordInput = async (message) => {
71
+ if (rl && !rl.closed) { rl.close(); rl = null; }
71
72
  prepareStdin();
72
73
  const { value } = await inquirer.prompt([{
73
74
  type: 'password',
@@ -83,6 +84,7 @@ const passwordInput = async (message) => {
83
84
  * Confirm - arrow keys selection
84
85
  */
85
86
  const confirmPrompt = async (message, defaultVal = true) => {
87
+ if (rl && !rl.closed) { rl.close(); rl = null; }
86
88
  prepareStdin();
87
89
  const choices = defaultVal
88
90
  ? [{ name: 'Yes', value: true }, { name: 'No', value: false }]
@@ -103,6 +105,7 @@ const confirmPrompt = async (message, defaultVal = true) => {
103
105
  * Number input
104
106
  */
105
107
  const numberInput = async (message, defaultVal = 1, min = 1, max = 1000) => {
108
+ if (rl && !rl.closed) { rl.close(); rl = null; }
106
109
  prepareStdin();
107
110
  const { value } = await inquirer.prompt([{
108
111
  type: 'input',
@@ -125,6 +128,11 @@ const numberInput = async (message, defaultVal = 1, min = 1, max = 1000) => {
125
128
  * Select - arrow keys navigation
126
129
  */
127
130
  const selectOption = async (message, options) => {
131
+ // Close shared readline before inquirer to avoid conflicts
132
+ if (rl && !rl.closed) {
133
+ rl.close();
134
+ rl = null;
135
+ }
128
136
  prepareStdin();
129
137
 
130
138
  const choices = options.map(opt => ({