refactor(commands): split CLI commands
This commit is contained in:
98
src/commands/models/list.table.ts
Normal file
98
src/commands/models/list.table.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import type { RuntimeEnv } from "../../runtime.js";
|
||||
import { colorize, theme } from "../../terminal/theme.js";
|
||||
import { formatTag, isRich, pad, truncate } from "./list.format.js";
|
||||
import type { ModelRow } from "./list.types.js";
|
||||
import { formatTokenK } from "./shared.js";
|
||||
|
||||
const MODEL_PAD = 42;
|
||||
const INPUT_PAD = 10;
|
||||
const CTX_PAD = 8;
|
||||
const LOCAL_PAD = 5;
|
||||
const AUTH_PAD = 5;
|
||||
|
||||
export function printModelTable(
|
||||
rows: ModelRow[],
|
||||
runtime: RuntimeEnv,
|
||||
opts: { json?: boolean; plain?: boolean } = {},
|
||||
) {
|
||||
if (opts.json) {
|
||||
runtime.log(
|
||||
JSON.stringify(
|
||||
{
|
||||
count: rows.length,
|
||||
models: rows,
|
||||
},
|
||||
null,
|
||||
2,
|
||||
),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (opts.plain) {
|
||||
for (const row of rows) runtime.log(row.key);
|
||||
return;
|
||||
}
|
||||
|
||||
const rich = isRich(opts);
|
||||
const header = [
|
||||
pad("Model", MODEL_PAD),
|
||||
pad("Input", INPUT_PAD),
|
||||
pad("Ctx", CTX_PAD),
|
||||
pad("Local", LOCAL_PAD),
|
||||
pad("Auth", AUTH_PAD),
|
||||
"Tags",
|
||||
].join(" ");
|
||||
runtime.log(rich ? theme.heading(header) : header);
|
||||
|
||||
for (const row of rows) {
|
||||
const keyLabel = pad(truncate(row.key, MODEL_PAD), MODEL_PAD);
|
||||
const inputLabel = pad(row.input || "-", INPUT_PAD);
|
||||
const ctxLabel = pad(formatTokenK(row.contextWindow), CTX_PAD);
|
||||
const localText = row.local === null ? "-" : row.local ? "yes" : "no";
|
||||
const localLabel = pad(localText, LOCAL_PAD);
|
||||
const authText =
|
||||
row.available === null ? "-" : row.available ? "yes" : "no";
|
||||
const authLabel = pad(authText, AUTH_PAD);
|
||||
const tagsLabel =
|
||||
row.tags.length > 0
|
||||
? rich
|
||||
? row.tags.map((tag) => formatTag(tag, rich)).join(",")
|
||||
: row.tags.join(",")
|
||||
: "";
|
||||
|
||||
const coloredInput = colorize(
|
||||
rich,
|
||||
row.input.includes("image") ? theme.accentBright : theme.info,
|
||||
inputLabel,
|
||||
);
|
||||
const coloredLocal = colorize(
|
||||
rich,
|
||||
row.local === null
|
||||
? theme.muted
|
||||
: row.local
|
||||
? theme.success
|
||||
: theme.muted,
|
||||
localLabel,
|
||||
);
|
||||
const coloredAuth = colorize(
|
||||
rich,
|
||||
row.available === null
|
||||
? theme.muted
|
||||
: row.available
|
||||
? theme.success
|
||||
: theme.error,
|
||||
authLabel,
|
||||
);
|
||||
|
||||
const line = [
|
||||
rich ? theme.accent(keyLabel) : keyLabel,
|
||||
coloredInput,
|
||||
ctxLabel,
|
||||
coloredLocal,
|
||||
coloredAuth,
|
||||
tagsLabel,
|
||||
].join(" ");
|
||||
runtime.log(line);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user