@tiens.nguyen/gu-cli 1.0.828 → 1.0.829
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/gu-repl.mjs +13 -7
- package/package.json +1 -1
package/gu-repl.mjs
CHANGED
|
@@ -369,7 +369,12 @@ const vwidth = (s) => String(s).replace(/\x1b\[[0-9;]*m/g, "").length;
|
|
|
369
369
|
// any theme without a font that has to be installed. Rows are plain text; padded + coloured at
|
|
370
370
|
// render time. LOGO_W = the visible column the status text starts after, and it MUST match the
|
|
371
371
|
// widest row or the status facts sit ragged beside it.
|
|
372
|
-
|
|
372
|
+
//
|
|
373
|
+
// LOWERCASE, THREE ROWS (#361). The capitals "G U" took four rows and the U, drawn as a closed
|
|
374
|
+
// square, read as a box; with an all-caps "GU AGENT" beside it the banner shouted its name twice.
|
|
375
|
+
// The product is written "gu", so the mark is too: a g with a real descender and a u — a wordmark,
|
|
376
|
+
// one row shorter, and the only coloured thing on the banner.
|
|
377
|
+
const LOGO = ["█▀▀█ █ █", "█▄▄█ █▄▄█", "▄▄▄█"];
|
|
373
378
|
const LOGO_W = 9;
|
|
374
379
|
// Lay the LOGO and the status rows SIDE BY SIDE (logo left, facts right), or STACK them (logo
|
|
375
380
|
// then facts) when the terminal is too narrow to fit both without wrapping — so the banner is
|
|
@@ -13326,7 +13331,7 @@ async function main() {
|
|
|
13326
13331
|
// right (label dim, value bright) — one fact per short line instead of the old wrapped
|
|
13327
13332
|
// "· … · …" wall. renderBanner lays them side by side, or stacks on a narrow terminal.
|
|
13328
13333
|
{
|
|
13329
|
-
const lbl = (s) => dim(s.padEnd(
|
|
13334
|
+
const lbl = (s) => dim(s.padEnd(9)); // aligned dim labels, values start at col 9 (#361: every row has one)
|
|
13330
13335
|
const ws = folderLabel(); // ONE definition, shared with the bottom bar's folder segment
|
|
13331
13336
|
// Task #170: `p.agentModelId` is "default_model" whenever a direct agent URL is set with
|
|
13332
13337
|
// no agentModelName beside it — mlx_lm's "whatever I loaded" sentinel, which Host mode
|
|
@@ -13358,7 +13363,8 @@ async function main() {
|
|
|
13358
13363
|
} catch { /* absent beats guessed — no suffix */ }
|
|
13359
13364
|
}
|
|
13360
13365
|
const statusRows = [
|
|
13361
|
-
|
|
13366
|
+
// #361: the name in the default colour — the mark beside it is the one accent.
|
|
13367
|
+
bold("gu") + dim(` agent · v${REPL_VERSION}${apiVersionSuffix(apiBannerVersion)}`),
|
|
13362
13368
|
// Task #134: a client machine OVERRIDES the account's agent model locally (the
|
|
13363
13369
|
// account value points at the model host's own server). Show what will actually be
|
|
13364
13370
|
// used, not a value this machine can't reach.
|
|
@@ -13403,7 +13409,7 @@ async function main() {
|
|
|
13403
13409
|
const name = m.label === "client expert" ? accent(m.label + " ") : m.label + " ";
|
|
13404
13410
|
return [lbl("mode") + name + dim(m.detail)];
|
|
13405
13411
|
})(),
|
|
13406
|
-
sessionTestAuto ? accent("auto
|
|
13412
|
+
lbl("test") + (sessionTestAuto ? accent("auto") : dim("off")),
|
|
13407
13413
|
// Same reason as workspaceSyncLabel: on Client Expert there is no cloud to sync TO, so
|
|
13408
13414
|
// the banner must not advertise one.
|
|
13409
13415
|
lbl("folder") +
|
|
@@ -13420,7 +13426,7 @@ async function main() {
|
|
|
13420
13426
|
// model that appears offline, and nobody thinks to check a setting they cannot see. Only
|
|
13421
13427
|
// shown when it is actually routing, and never the credentials — host and user only.
|
|
13422
13428
|
if (bannerProxy) statusRows.push(lbl("proxy") + bannerProxy);
|
|
13423
|
-
statusRows.push(
|
|
13429
|
+
statusRows.push(lbl("key") + dim(`${workerKey.slice(0, 8)}…`));
|
|
13424
13430
|
// Under the key: the account this machine signs in as, and its PLAN (#267) — so a machine
|
|
13425
13431
|
// paired to the wrong account, or a lapsed Pro, is obvious at a glance. Both from the VERIFIED
|
|
13426
13432
|
// gu token (no network call), which is the only source in private mode; client mode falls back
|
|
@@ -13429,7 +13435,7 @@ async function main() {
|
|
|
13429
13435
|
const acct = await bannerAccount(accountEmail);
|
|
13430
13436
|
if (acct.email || acct.plan) {
|
|
13431
13437
|
const plan = acct.plan ? (acct.pro ? accent(acct.plan) : dim(acct.plan)) : "";
|
|
13432
|
-
statusRows.push(acct.email ?
|
|
13438
|
+
statusRows.push(acct.email ? lbl("account") + dim(acct.email) + (plan ? dim(" · ") + plan : "") : lbl("plan") + plan);
|
|
13433
13439
|
}
|
|
13434
13440
|
// Skills and MCP servers (task #269) — one row, only when there are any.
|
|
13435
13441
|
try {
|
|
@@ -13439,7 +13445,7 @@ async function main() {
|
|
|
13439
13445
|
// #325: say whose they are when this folder uses Claude Code's — even when there are none.
|
|
13440
13446
|
const claudes = readSkillSource(process.cwd()) === "claude";
|
|
13441
13447
|
if (bits.length || claudes) {
|
|
13442
|
-
statusRows.push(dim((claudes ? "Claude's: " : "") + (bits.join(" · ") || "no skills or MCP servers") + (claudes ? " (/switch-skill · /mcp)" : " (/help · /mcp)")));
|
|
13448
|
+
statusRows.push(lbl("skills") + dim((claudes ? "Claude's: " : "") + (bits.join(" · ") || "no skills or MCP servers") + (claudes ? " (/switch-skill · /mcp)" : " (/help · /mcp)")));
|
|
13443
13449
|
}
|
|
13444
13450
|
} catch {
|
|
13445
13451
|
/* a broken file is reported below; the banner is not the place to fail */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiens.nguyen/gu-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.829",
|
|
4
4
|
"description": "Gu CLI — the gu terminal plus the local worker that runs agent / OCR / PDF / embedding jobs on your Mac (Ollama / MLX / OpenAI-compatible).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|