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 +1 -1
- package/src/pages/algo/ui.js +10 -8
- package/src/utils/prompts.js +8 -0
package/package.json
CHANGED
package/src/pages/algo/ui.js
CHANGED
|
@@ -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
|
-
|
|
219
|
+
// Full width separator
|
|
220
|
+
const GF = BOX.ML + BOX.H.repeat(W) + BOX.MR;
|
|
220
221
|
|
|
221
|
-
|
|
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
|
-
|
|
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);
|
package/src/utils/prompts.js
CHANGED
|
@@ -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 => ({
|