@modelstatus/cli 0.1.55 → 0.1.56
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/tui/app.js +8 -11
- package/src/tui/game/launch.js +6 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modelstatus/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.56",
|
|
4
4
|
"description": "Track which AI models you use, where, and never get surprised by a retirement. Free offline model-health for any repo (mm status), browser sign-in for cloud inventory + alerts.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"llm",
|
package/src/tui/app.js
CHANGED
|
@@ -88,22 +88,19 @@ function useTermDims() {
|
|
|
88
88
|
const [dims, setDims] = React.useState({ cols: (stdout && stdout.columns) || 80, rows: (stdout && stdout.rows) || 24 });
|
|
89
89
|
React.useEffect(() => {
|
|
90
90
|
if (!stdout) return undefined;
|
|
91
|
-
//
|
|
92
|
-
//
|
|
91
|
+
// Re-measure ONLY on a genuine resize event — NEVER poll with timers.
|
|
92
|
+
// ROOT CAUSE of the Warp clip: process.stdout.rows changes a beat AFTER the
|
|
93
|
+
// alt-screen transition settles, and a re-render with those changed dims
|
|
94
|
+
// SCROLLS the window's top (the header) off-screen in Warp. The dims read at
|
|
95
|
+
// mount render correctly; a "more accurate" later value is actually worse. So
|
|
96
|
+
// we keep the mount-time dims and only react to real resizes (functional
|
|
97
|
+
// update returns the SAME object when nothing changed → no needless render).
|
|
93
98
|
const on = () => setDims((prev) => {
|
|
94
99
|
const cols = stdout.columns || 80, rows = stdout.rows || 24;
|
|
95
100
|
return prev.cols === cols && prev.rows === rows ? prev : { cols, rows };
|
|
96
101
|
});
|
|
97
102
|
stdout.on("resize", on);
|
|
98
|
-
|
|
99
|
-
// game leaves the alternate screen, some terminals (notably Warp's block
|
|
100
|
-
// model) re-flow the viewport a moment LATER and report stdout.{columns,rows}
|
|
101
|
-
// stale at mount-time — so the first frame is too SHORT and Ink falls back to
|
|
102
|
-
// cursor-up diffing, which drifts/scrolls the window off the top (and Ctrl-L
|
|
103
|
-
// can't fix it because it redraws at the same wrong height). These one-shot
|
|
104
|
-
// re-reads pick up the settled size and snap the window back to full screen.
|
|
105
|
-
const timers = [60, 250, 600, 1200].map((ms) => setTimeout(on, ms));
|
|
106
|
-
return () => { stdout.off("resize", on); timers.forEach(clearTimeout); };
|
|
103
|
+
return () => { stdout.off("resize", on); };
|
|
107
104
|
}, [stdout]);
|
|
108
105
|
const fw = Number(process.env.MM_TUI_WIDTH);
|
|
109
106
|
const fh = Number(process.env.MM_TUI_HEIGHT);
|
package/src/tui/game/launch.js
CHANGED
|
@@ -83,13 +83,13 @@ export async function playGameInTui({ dir, width, height, initialView = "scan",
|
|
|
83
83
|
// remounted tree fills the whole terminal from the top (same as Ctrl-L).
|
|
84
84
|
// RECYCLE Warp's alt screen (leave + re-enter) to force it back into clean
|
|
85
85
|
// full-screen mode — Warp drops that presentation during the game round-trip
|
|
86
|
-
// and its block header otherwise bleeds over the top rows. Then
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
86
|
+
// and its block header otherwise bleeds over the top rows. Then remount RIGHT
|
|
87
|
+
// AWAY (just a tick to flush the write): this reads the dims at mount the same
|
|
88
|
+
// way a FRESH launch does — those render perfectly. Do NOT wait for Warp to
|
|
89
|
+
// "settle" its reported height; the settled value is the one that clips (see
|
|
90
|
+
// useTermDims — we no longer poll for it).
|
|
91
91
|
try { process.stdout.write("\x1b[?1049l\x1b[?1049h\x1b[2J\x1b[H"); } catch { /* ignore */ }
|
|
92
|
-
await new Promise((r) =>
|
|
92
|
+
await new Promise((r) => setImmediate(r));
|
|
93
93
|
appController.remount({ initialView, fresh: false });
|
|
94
94
|
} catch (e) {
|
|
95
95
|
if (onError) onError(e); else throw e;
|