@ekkos/cli 1.2.13 → 1.2.14
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/dist/commands/dashboard.js +43 -65
- package/package.json +1 -1
|
@@ -1081,72 +1081,50 @@ async function launchDashboard(initialSessionName, jsonlPath, refreshMs) {
|
|
|
1081
1081
|
let header = '';
|
|
1082
1082
|
let separator = '';
|
|
1083
1083
|
let rows = [];
|
|
1084
|
-
//
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
else if (w >= 30) {
|
|
1114
|
-
// Compact mode: drop cache split columns to preserve readable headers.
|
|
1115
|
-
const colNum = 4;
|
|
1116
|
-
const colM = 6;
|
|
1117
|
-
const colCtx = 6;
|
|
1118
|
-
const colCost = 6;
|
|
1119
|
-
const nDividers = 4;
|
|
1120
|
-
const outW = Math.max(4, w - (colNum + colM + colCtx + colCost + nDividers));
|
|
1121
|
-
header = `${pad('Turn', colNum)}${div}${rpad('Model', colM)}${div}${rpad('Context', colCtx)}${div}${rpad('Output', outW)}${div}${rpad('Cost', colCost)}`;
|
|
1122
|
-
separator = `${'─'.repeat(colNum)}┼${'─'.repeat(colM)}┼${'─'.repeat(colCtx)}┼${'─'.repeat(outW)}┼${'─'.repeat(colCost)}`;
|
|
1123
|
-
rows = turns.map(t => {
|
|
1124
|
-
const mTag = modelTag(t.routedModel);
|
|
1125
|
-
const mColor = t.routedModel.includes('haiku') ? 'green' : t.routedModel.includes('sonnet') ? 'blue' : 'magenta';
|
|
1126
|
-
const costFlag = t.cost > 1.0 ? '{red-fg}' : t.cost > 0.5 ? '{yellow-fg}' : '{white-fg}';
|
|
1127
|
-
const costEnd = t.cost > 1.0 ? '{/red-fg}' : t.cost > 0.5 ? '{/yellow-fg}' : '{/white-fg}';
|
|
1128
|
-
return (pad(String(t.turn), colNum) + div +
|
|
1129
|
-
`{${mColor}-fg}${cpad(mTag, colM)}{/${mColor}-fg}` + div +
|
|
1130
|
-
rpad(`${t.contextPct.toFixed(0)}%`, colCtx) + div +
|
|
1131
|
-
`{cyan-fg}${rpad(fmtK(t.output), outW)}{/cyan-fg}` + div +
|
|
1132
|
-
costFlag + rpad(`$${t.cost.toFixed(2)}`, colCost) + costEnd);
|
|
1133
|
-
});
|
|
1134
|
-
}
|
|
1135
|
-
else {
|
|
1136
|
-
// Minimal mode: guaranteed no-wrap fallback.
|
|
1137
|
-
const colNum = 4;
|
|
1138
|
-
const colCtx = 6;
|
|
1139
|
-
const colCost = 6;
|
|
1140
|
-
header = `${pad('Turn', colNum)}${div}${rpad('Context', colCtx)}${div}${rpad('Cost', colCost)}`;
|
|
1141
|
-
separator = `${'─'.repeat(colNum)}┼${'─'.repeat(colCtx)}┼${'─'.repeat(colCost)}`;
|
|
1142
|
-
rows = turns.map(t => {
|
|
1143
|
-
const costFlag = t.cost > 1.0 ? '{red-fg}' : t.cost > 0.5 ? '{yellow-fg}' : '{white-fg}';
|
|
1144
|
-
const costEnd = t.cost > 1.0 ? '{/red-fg}' : t.cost > 0.5 ? '{/yellow-fg}' : '{/white-fg}';
|
|
1145
|
-
return (pad(String(t.turn), colNum) + div +
|
|
1146
|
-
rpad(`${t.contextPct.toFixed(0)}%`, colCtx) + div +
|
|
1147
|
-
costFlag + rpad(`$${t.cost.toFixed(2)}`, colCost) + costEnd);
|
|
1148
|
-
});
|
|
1084
|
+
// Always show all 7 columns: Turn, Model, Context, Cache Rd, Cache Wr, Output, Cost
|
|
1085
|
+
// Shrink flex columns to fit narrow panes instead of dropping them.
|
|
1086
|
+
const colNum = 4;
|
|
1087
|
+
const colM = 7;
|
|
1088
|
+
const colCtx = 7;
|
|
1089
|
+
const colCost = 8;
|
|
1090
|
+
const nDividers = 6;
|
|
1091
|
+
const fixedW = colNum + colM + colCtx + colCost;
|
|
1092
|
+
const flexTotal = Math.max(0, w - fixedW - nDividers);
|
|
1093
|
+
let rdW = Math.max(5, Math.floor(flexTotal * 0.35));
|
|
1094
|
+
let wrW = Math.max(5, Math.floor(flexTotal * 0.30));
|
|
1095
|
+
let outW = Math.max(6, flexTotal - rdW - wrW);
|
|
1096
|
+
// Trim flex columns if they overflow available width
|
|
1097
|
+
let totalW = fixedW + nDividers + rdW + wrW + outW;
|
|
1098
|
+
if (totalW > w) {
|
|
1099
|
+
let overflow = totalW - w;
|
|
1100
|
+
const trimOut = Math.min(overflow, Math.max(0, outW - 4));
|
|
1101
|
+
outW -= trimOut;
|
|
1102
|
+
overflow -= trimOut;
|
|
1103
|
+
if (overflow > 0) {
|
|
1104
|
+
const trimWr = Math.min(overflow, Math.max(0, wrW - 4));
|
|
1105
|
+
wrW -= trimWr;
|
|
1106
|
+
overflow -= trimWr;
|
|
1107
|
+
}
|
|
1108
|
+
if (overflow > 0) {
|
|
1109
|
+
const trimRd = Math.min(overflow, Math.max(0, rdW - 4));
|
|
1110
|
+
rdW -= trimRd;
|
|
1111
|
+
}
|
|
1149
1112
|
}
|
|
1113
|
+
header = `{bold}${pad('Turn', colNum)}${div}${pad('Model', colM)}${div}${pad('Context', colCtx)}${div}${rpad('Cache Rd', rdW)}${div}${rpad('Cache Wr', wrW)}${div}${rpad('Output', outW)}${div}${rpad('Cost', colCost)}{/bold}`;
|
|
1114
|
+
separator = `{gray-fg}${'─'.repeat(colNum)}┼${'─'.repeat(colM)}┼${'─'.repeat(colCtx)}┼${'─'.repeat(rdW)}┼${'─'.repeat(wrW)}┼${'─'.repeat(outW)}┼${'─'.repeat(colCost)}{/gray-fg}`;
|
|
1115
|
+
rows = turns.map(t => {
|
|
1116
|
+
const mTag = modelTag(t.routedModel);
|
|
1117
|
+
const mColor = t.routedModel.includes('haiku') ? 'green' : t.routedModel.includes('sonnet') ? 'blue' : 'magenta';
|
|
1118
|
+
const costFlag = t.cost > 1.0 ? '{red-fg}' : t.cost > 0.5 ? '{yellow-fg}' : '{white-fg}';
|
|
1119
|
+
const costEnd = t.cost > 1.0 ? '{/red-fg}' : t.cost > 0.5 ? '{/yellow-fg}' : '{/white-fg}';
|
|
1120
|
+
return (pad(String(t.turn), colNum) + div +
|
|
1121
|
+
`{${mColor}-fg}${pad(mTag, colM)}{/${mColor}-fg}` + div +
|
|
1122
|
+
pad(`${t.contextPct.toFixed(0)}%`, colCtx) + div +
|
|
1123
|
+
`{green-fg}${rpad(fmtK(t.cacheRead), rdW)}{/green-fg}` + div +
|
|
1124
|
+
`{yellow-fg}${rpad(fmtK(t.cacheCreate), wrW)}{/yellow-fg}` + div +
|
|
1125
|
+
`{cyan-fg}${rpad(fmtK(t.output), outW)}{/cyan-fg}` + div +
|
|
1126
|
+
costFlag + rpad(`$${t.cost.toFixed(2)}`, colCost) + costEnd);
|
|
1127
|
+
});
|
|
1150
1128
|
const lines = [header, separator, ...rows];
|
|
1151
1129
|
turnBox.setContent(lines.join('\n'));
|
|
1152
1130
|
// Restore scroll position AFTER content update
|