ai-speedometer 2.3.4 → 2.4.0

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.
@@ -178,7 +178,7 @@ __export(exports_models_dev, {
178
178
  });
179
179
  import fs from "fs";
180
180
  import path2 from "path";
181
- import { homedir as homedir2 } from "os";
181
+ import { homedir } from "os";
182
182
  function ensureCacheDir() {
183
183
  try {
184
184
  if (!fs.existsSync(CACHE_DIR)) {
@@ -370,7 +370,7 @@ var cacheBase, CACHE_DIR, CACHE_FILE, FALLBACK_PROVIDERS;
370
370
  var init_models_dev = __esm(() => {
371
371
  init_xdg_basedir();
372
372
  init_custom_verified_providers();
373
- cacheBase = process.env.XDG_CACHE_HOME || xdgCache || path2.join(homedir2(), ".cache");
373
+ cacheBase = process.env.XDG_CACHE_HOME || xdgCache || path2.join(homedir(), ".cache");
374
374
  CACHE_DIR = path2.join(cacheBase, "ai-speedometer");
375
375
  CACHE_FILE = path2.join(CACHE_DIR, "models.json");
376
376
  FALLBACK_PROVIDERS = [
@@ -433,9 +433,9 @@ __export(exports_ai_config, {
433
433
  });
434
434
  import fs2 from "fs";
435
435
  import path3 from "path";
436
- import { homedir as homedir3 } from "os";
436
+ import { homedir as homedir2 } from "os";
437
437
  var getAIConfigPaths = () => {
438
- const aiConfigDir = process.env.XDG_CONFIG_HOME || xdgConfig || path3.join(homedir3(), ".config");
438
+ const aiConfigDir = process.env.XDG_CONFIG_HOME || xdgConfig || path3.join(homedir2(), ".config");
439
439
  const aiSpeedometerConfigDir = path3.join(aiConfigDir, "ai-speedometer");
440
440
  return {
441
441
  configDir: aiSpeedometerConfigDir,
@@ -461,7 +461,7 @@ var getAIConfigPaths = () => {
461
461
  }
462
462
  }, readThemeFromConfig = async () => {
463
463
  const config = await readAIConfig();
464
- return config.theme ?? "tokyonight";
464
+ return config.theme ?? "minimal-b";
465
465
  }, writeThemeToConfig = async (theme) => {
466
466
  const config = await readAIConfig();
467
467
  await writeAIConfig({ ...config, theme });
@@ -1440,6 +1440,7 @@ __export(exports_opencode_integration, {
1440
1440
  });
1441
1441
  import fs3 from "fs";
1442
1442
  import path4 from "path";
1443
+ import { homedir as homedir3 } from "os";
1443
1444
  var getXDGPaths = () => ({
1444
1445
  data: path4.join(process.env.XDG_DATA_HOME || xdgData || path4.join(path4.join(process.env.HOME || process.env.USERPROFILE || "."), ".local", "share"), "opencode"),
1445
1446
  config: path4.join(process.env.XDG_CONFIG_HOME || xdgConfig || path4.join(path4.join(process.env.HOME || process.env.USERPROFILE || "."), ".config"), "opencode")
@@ -1492,7 +1493,7 @@ var getXDGPaths = () => ({
1492
1493
  console.warn("Warning: opencode.json is no longer used. Use ai-benchmark-config.json instead.");
1493
1494
  return { provider: {} };
1494
1495
  }, readOpencodeGlobalConfig = () => {
1495
- const configDir = path4.join(process.env.XDG_CONFIG_HOME || path4.join(homedir(), ".config"), "opencode");
1496
+ const configDir = path4.join(process.env.XDG_CONFIG_HOME || path4.join(homedir3(), ".config"), "opencode");
1496
1497
  const candidates = ["config.json", "opencode.json", "opencode.jsonc"];
1497
1498
  let merged = {};
1498
1499
  for (const filename of candidates) {
@@ -3456,7 +3457,7 @@ var init_AppContext = __esm(() => {
3456
3457
  function getTheme(name) {
3457
3458
  return THEMES[name] ?? THEMES[DEFAULT_THEME];
3458
3459
  }
3459
- var THEMES, DEFAULT_THEME = "tokyonight", THEME_NAMES;
3460
+ var THEMES, DEFAULT_THEME = "minimal-b", THEME_NAMES;
3460
3461
  var init_themes = __esm(() => {
3461
3462
  THEMES = {
3462
3463
  tokyonight: {
@@ -3887,6 +3888,32 @@ var init_themes = __esm(() => {
3887
3888
  success: "#388E3C",
3888
3889
  error: "#DC3545",
3889
3890
  warning: "#FF9500"
3891
+ },
3892
+ "minimal-b": {
3893
+ background: "#000000",
3894
+ surface: "#000000",
3895
+ border: "#333333",
3896
+ dim: "#888888",
3897
+ text: "#FFFFFF",
3898
+ primary: "#FFFFFF",
3899
+ accent: "#FFFFFF",
3900
+ secondary: "#FFFFFF",
3901
+ success: "#FFFFFF",
3902
+ error: "#FFFFFF",
3903
+ warning: "#FFFFFF"
3904
+ },
3905
+ "minimal-w": {
3906
+ background: "#FFFFFF",
3907
+ surface: "#FFFFFF",
3908
+ border: "#CCCCCC",
3909
+ dim: "#777777",
3910
+ text: "#000000",
3911
+ primary: "#000000",
3912
+ accent: "#000000",
3913
+ secondary: "#000000",
3914
+ success: "#000000",
3915
+ error: "#000000",
3916
+ warning: "#000000"
3890
3917
  }
3891
3918
  };
3892
3919
  THEME_NAMES = Object.keys(THEMES);
@@ -4015,7 +4042,7 @@ function ThemePicker({ onClose }) {
4015
4042
  width: W,
4016
4043
  flexDirection: "column",
4017
4044
  border: true,
4018
- borderStyle: "rounded",
4045
+ borderStyle: "single",
4019
4046
  borderColor: theme.primary,
4020
4047
  backgroundColor: theme.surface,
4021
4048
  zIndex: 100,
@@ -4046,7 +4073,10 @@ function ThemePicker({ onClose }) {
4046
4073
  }, undefined, true, undefined, this),
4047
4074
  /* @__PURE__ */ jsxDEV4("box", {
4048
4075
  height: 1,
4049
- backgroundColor: theme.border
4076
+ children: /* @__PURE__ */ jsxDEV4("text", {
4077
+ fg: theme.border,
4078
+ children: "\u2500".repeat(150)
4079
+ }, undefined, false, undefined, this)
4050
4080
  }, undefined, false, undefined, this),
4051
4081
  /* @__PURE__ */ jsxDEV4("box", {
4052
4082
  height: 1,
@@ -4072,7 +4102,10 @@ function ThemePicker({ onClose }) {
4072
4102
  }, undefined, true, undefined, this),
4073
4103
  /* @__PURE__ */ jsxDEV4("box", {
4074
4104
  height: 1,
4075
- backgroundColor: theme.border
4105
+ children: /* @__PURE__ */ jsxDEV4("text", {
4106
+ fg: theme.border,
4107
+ children: "\u2500".repeat(150)
4108
+ }, undefined, false, undefined, this)
4076
4109
  }, undefined, false, undefined, this),
4077
4110
  /* @__PURE__ */ jsxDEV4("scrollbox", {
4078
4111
  ref: scrollRef,
@@ -4125,7 +4158,10 @@ function ThemePicker({ onClose }) {
4125
4158
  }, undefined, false, undefined, this),
4126
4159
  /* @__PURE__ */ jsxDEV4("box", {
4127
4160
  height: 1,
4128
- backgroundColor: theme.border
4161
+ children: /* @__PURE__ */ jsxDEV4("text", {
4162
+ fg: theme.border,
4163
+ children: "\u2500".repeat(150)
4164
+ }, undefined, false, undefined, this)
4129
4165
  }, undefined, false, undefined, this),
4130
4166
  /* @__PURE__ */ jsxDEV4("box", {
4131
4167
  height: 1,
@@ -4172,7 +4208,7 @@ var package_default;
4172
4208
  var init_package = __esm(() => {
4173
4209
  package_default = {
4174
4210
  name: "ai-speedometer",
4175
- version: "2.3.4",
4211
+ version: "2.4.0",
4176
4212
  description: "A comprehensive CLI tool for benchmarking AI models across multiple providers with parallel execution and professional metrics",
4177
4213
  bin: {
4178
4214
  "ai-speedometer": "dist/ai-speedometer",
@@ -4274,7 +4310,6 @@ function Footer({ hints }) {
4274
4310
  const theme = useTheme();
4275
4311
  const joined = hints.join(" \xB7 ");
4276
4312
  return /* @__PURE__ */ jsxDEV6("box", {
4277
- height: 1,
4278
4313
  flexDirection: "row",
4279
4314
  alignItems: "center",
4280
4315
  paddingLeft: 1,
@@ -4319,20 +4354,23 @@ function MainMenuScreen() {
4319
4354
  { label: "? FAQ / Learn", desc: "how metrics work & resources", color: theme.primary },
4320
4355
  { label: "\u2715 Exit", desc: "quit the application", color: theme.error }
4321
4356
  ];
4357
+ function handleSelect(index) {
4358
+ if (index === 0)
4359
+ navigate("model-select");
4360
+ else if (index === 1)
4361
+ navigate("model-menu");
4362
+ else if (index === 2)
4363
+ navigate("faq");
4364
+ else if (index === 3)
4365
+ renderer.destroy();
4366
+ }
4322
4367
  useAppKeyboard((key) => {
4323
4368
  if (key.name === "up") {
4324
4369
  setCursor((i) => (i - 1 + ITEMS.length) % ITEMS.length);
4325
4370
  } else if (key.name === "down") {
4326
4371
  setCursor((i) => (i + 1) % ITEMS.length);
4327
4372
  } else if (key.name === "enter" || key.name === "return") {
4328
- if (cursor === 0)
4329
- navigate("model-select");
4330
- else if (cursor === 1)
4331
- navigate("model-menu");
4332
- else if (cursor === 2)
4333
- navigate("faq");
4334
- else if (cursor === 3)
4335
- renderer.destroy();
4373
+ handleSelect(cursor);
4336
4374
  }
4337
4375
  });
4338
4376
  return /* @__PURE__ */ jsxDEV7("box", {
@@ -4363,7 +4401,7 @@ function MainMenuScreen() {
4363
4401
  /* @__PURE__ */ jsxDEV7("box", {
4364
4402
  flexDirection: "column",
4365
4403
  border: true,
4366
- borderStyle: "rounded",
4404
+ borderStyle: "single",
4367
4405
  borderColor: theme.border,
4368
4406
  backgroundColor: theme.background,
4369
4407
  width: 48,
@@ -4377,6 +4415,8 @@ function MainMenuScreen() {
4377
4415
  paddingRight: 2,
4378
4416
  paddingTop: 1,
4379
4417
  paddingBottom: 1,
4418
+ onMouseOver: () => setCursor(i),
4419
+ onMouseDown: () => handleSelect(i),
4380
4420
  children: [
4381
4421
  /* @__PURE__ */ jsxDEV7("box", {
4382
4422
  flexDirection: "column",
@@ -4410,74 +4450,13 @@ var init_MainMenuScreen = __esm(() => {
4410
4450
  init_package();
4411
4451
  });
4412
4452
 
4413
- // src/tui/components/MenuList.tsx
4453
+ // src/tui/screens/ModelMenuScreen.tsx
4414
4454
  import { useState as useState5 } from "react";
4415
4455
  import { jsxDEV as jsxDEV8 } from "@opentui/react/jsx-dev-runtime";
4416
- function MenuList({ items, selectedIndex: initialIndex = 0, onSelect, onNavigate }) {
4417
- const theme = useTheme();
4418
- const [cursor, setCursor] = useState5(initialIndex);
4419
- useAppKeyboard((key) => {
4420
- if (key.name === "up") {
4421
- const next = (cursor - 1 + items.length) % items.length;
4422
- setCursor(next);
4423
- onNavigate?.(next);
4424
- } else if (key.name === "down") {
4425
- const next = (cursor + 1) % items.length;
4426
- setCursor(next);
4427
- onNavigate?.(next);
4428
- } else if (key.name === "enter" || key.name === "return") {
4429
- onSelect(cursor);
4430
- }
4431
- });
4432
- return /* @__PURE__ */ jsxDEV8("box", {
4433
- flexDirection: "column",
4434
- children: items.map((item, i) => {
4435
- const isSelected = i === cursor;
4436
- return /* @__PURE__ */ jsxDEV8("box", {
4437
- flexDirection: "row",
4438
- alignItems: "center",
4439
- backgroundColor: isSelected ? theme.border : "transparent",
4440
- paddingLeft: 1,
4441
- paddingRight: 1,
4442
- children: [
4443
- /* @__PURE__ */ jsxDEV8("box", {
4444
- flexDirection: "column",
4445
- flexGrow: 1,
4446
- children: [
4447
- /* @__PURE__ */ jsxDEV8("text", {
4448
- fg: isSelected ? theme.text : theme.dim,
4449
- children: item.label
4450
- }, undefined, false, undefined, this),
4451
- item.description ? /* @__PURE__ */ jsxDEV8("text", {
4452
- fg: isSelected ? theme.dim : theme.border,
4453
- children: item.description
4454
- }, undefined, false, undefined, this) : null
4455
- ]
4456
- }, undefined, true, undefined, this),
4457
- isSelected && /* @__PURE__ */ jsxDEV8("text", {
4458
- fg: theme.primary,
4459
- children: "\u203A"
4460
- }, undefined, false, undefined, this)
4461
- ]
4462
- }, i, true, undefined, this);
4463
- })
4464
- }, undefined, false, undefined, this);
4465
- }
4466
- var init_MenuList = __esm(() => {
4467
- init_useAppKeyboard();
4468
- init_ThemeContext();
4469
- });
4470
-
4471
- // src/tui/screens/ModelMenuScreen.tsx
4472
- import { jsxDEV as jsxDEV9 } from "@opentui/react/jsx-dev-runtime";
4473
4456
  function ModelMenuScreen() {
4474
4457
  const navigate = useNavigate();
4475
4458
  const theme = useTheme();
4476
- useAppKeyboard((key) => {
4477
- if (key.name === "escape" || key.name === "q") {
4478
- navigate("main-menu");
4479
- }
4480
- });
4459
+ const [cursor, setCursor] = useState5(0);
4481
4460
  function handleSelect(index) {
4482
4461
  if (index === 0)
4483
4462
  navigate("add-verified");
@@ -4490,21 +4469,81 @@ function ModelMenuScreen() {
4490
4469
  else if (index === 4)
4491
4470
  navigate("main-menu");
4492
4471
  }
4493
- return /* @__PURE__ */ jsxDEV9("box", {
4472
+ useAppKeyboard((key) => {
4473
+ if (key.name === "up") {
4474
+ setCursor((i) => (i - 1 + ITEMS.length) % ITEMS.length);
4475
+ } else if (key.name === "down") {
4476
+ setCursor((i) => (i + 1) % ITEMS.length);
4477
+ } else if (key.name === "enter" || key.name === "return") {
4478
+ handleSelect(cursor);
4479
+ } else if (key.name === "escape" || key.name === "q") {
4480
+ navigate("main-menu");
4481
+ }
4482
+ });
4483
+ return /* @__PURE__ */ jsxDEV8("box", {
4494
4484
  flexDirection: "column",
4495
4485
  flexGrow: 1,
4496
- padding: 1,
4486
+ alignItems: "center",
4487
+ justifyContent: "center",
4497
4488
  children: [
4498
- /* @__PURE__ */ jsxDEV9("text", {
4499
- fg: theme.primary,
4500
- children: "Model Management"
4501
- }, undefined, false, undefined, this),
4502
- /* @__PURE__ */ jsxDEV9("box", {
4503
- marginTop: 1,
4504
- children: /* @__PURE__ */ jsxDEV9(MenuList, {
4505
- items: ITEMS,
4506
- onSelect: handleSelect
4507
- }, undefined, false, undefined, this)
4489
+ /* @__PURE__ */ jsxDEV8("box", {
4490
+ flexDirection: "column",
4491
+ alignItems: "center",
4492
+ marginBottom: 2,
4493
+ children: [
4494
+ /* @__PURE__ */ jsxDEV8("text", {
4495
+ fg: theme.primary,
4496
+ bold: true,
4497
+ children: "MODEL MANAGEMENT"
4498
+ }, undefined, false, undefined, this),
4499
+ /* @__PURE__ */ jsxDEV8("text", {
4500
+ fg: theme.dim,
4501
+ children: "configure providers & models"
4502
+ }, undefined, false, undefined, this)
4503
+ ]
4504
+ }, undefined, true, undefined, this),
4505
+ /* @__PURE__ */ jsxDEV8("box", {
4506
+ flexDirection: "column",
4507
+ border: true,
4508
+ borderStyle: "single",
4509
+ borderColor: theme.border,
4510
+ backgroundColor: theme.background,
4511
+ width: 48,
4512
+ children: ITEMS.map((item, i) => {
4513
+ const active = i === cursor;
4514
+ const color = theme[item.color];
4515
+ return /* @__PURE__ */ jsxDEV8("box", {
4516
+ flexDirection: "row",
4517
+ alignItems: "center",
4518
+ backgroundColor: active ? theme.border : "transparent",
4519
+ paddingLeft: 2,
4520
+ paddingRight: 2,
4521
+ paddingTop: 1,
4522
+ paddingBottom: 1,
4523
+ onMouseOver: () => setCursor(i),
4524
+ onMouseDown: () => handleSelect(i),
4525
+ children: [
4526
+ /* @__PURE__ */ jsxDEV8("box", {
4527
+ flexDirection: "column",
4528
+ flexGrow: 1,
4529
+ children: [
4530
+ /* @__PURE__ */ jsxDEV8("text", {
4531
+ fg: active ? color : theme.dim,
4532
+ children: item.label
4533
+ }, undefined, false, undefined, this),
4534
+ /* @__PURE__ */ jsxDEV8("text", {
4535
+ fg: active ? theme.dim : theme.border,
4536
+ children: item.desc
4537
+ }, undefined, false, undefined, this)
4538
+ ]
4539
+ }, undefined, true, undefined, this),
4540
+ active && /* @__PURE__ */ jsxDEV8("text", {
4541
+ fg: color,
4542
+ children: "\u203A"
4543
+ }, undefined, false, undefined, this)
4544
+ ]
4545
+ }, i, true, undefined, this);
4546
+ })
4508
4547
  }, undefined, false, undefined, this)
4509
4548
  ]
4510
4549
  }, undefined, true, undefined, this);
@@ -4514,13 +4553,12 @@ var init_ModelMenuScreen = __esm(() => {
4514
4553
  init_useAppKeyboard();
4515
4554
  init_AppContext();
4516
4555
  init_ThemeContext();
4517
- init_MenuList();
4518
4556
  ITEMS = [
4519
- { label: "Add Verified Provider" },
4520
- { label: "Add Custom Provider" },
4521
- { label: "Add Models to Provider" },
4522
- { label: "List Providers" },
4523
- { label: "Back" }
4557
+ { label: "Add Verified Provider", desc: "from models.dev verified list", color: "accent" },
4558
+ { label: "Add Custom Provider", desc: "configure your own API endpoint", color: "secondary" },
4559
+ { label: "Add Models to Provider", desc: "register models for a provider", color: "primary" },
4560
+ { label: "List Providers", desc: "view all configured providers", color: "text" },
4561
+ { label: "Back", desc: "return to main menu", color: "error" }
4524
4562
  ];
4525
4563
  });
4526
4564
 
@@ -4544,7 +4582,7 @@ var init_usePaste = () => {};
4544
4582
  // src/tui/screens/ModelSelectScreen.tsx
4545
4583
  import { useState as useState6, useEffect as useEffect4, useCallback as useCallback2, useRef as useRef3 } from "react";
4546
4584
  import { useTerminalDimensions } from "@opentui/react";
4547
- import { jsxDEV as jsxDEV10 } from "@opentui/react/jsx-dev-runtime";
4585
+ import { jsxDEV as jsxDEV9 } from "@opentui/react/jsx-dev-runtime";
4548
4586
  function ModelSelectScreen() {
4549
4587
  const { state, dispatch } = useAppContext();
4550
4588
  const navigate = useNavigate();
@@ -4706,12 +4744,12 @@ function ModelSelectScreen() {
4706
4744
  setSearchQuery((q) => q + key.sequence);
4707
4745
  });
4708
4746
  if (state.isLoadingConfig) {
4709
- return /* @__PURE__ */ jsxDEV10("box", {
4747
+ return /* @__PURE__ */ jsxDEV9("box", {
4710
4748
  flexDirection: "column",
4711
4749
  flexGrow: 1,
4712
4750
  alignItems: "center",
4713
4751
  justifyContent: "center",
4714
- children: /* @__PURE__ */ jsxDEV10("text", {
4752
+ children: /* @__PURE__ */ jsxDEV9("text", {
4715
4753
  fg: theme.dim,
4716
4754
  children: "Loading config..."
4717
4755
  }, undefined, false, undefined, this)
@@ -4719,31 +4757,31 @@ function ModelSelectScreen() {
4719
4757
  }
4720
4758
  const nameW = Math.floor((CARD_W - 10) / 2);
4721
4759
  const provW = CARD_W - nameW - 10;
4722
- return /* @__PURE__ */ jsxDEV10("box", {
4760
+ return /* @__PURE__ */ jsxDEV9("box", {
4723
4761
  flexDirection: "column",
4724
4762
  flexGrow: 1,
4725
4763
  alignItems: "center",
4726
4764
  justifyContent: "center",
4727
- children: /* @__PURE__ */ jsxDEV10("box", {
4765
+ children: /* @__PURE__ */ jsxDEV9("box", {
4728
4766
  flexDirection: "column",
4729
4767
  border: true,
4730
- borderStyle: "rounded",
4768
+ borderStyle: "single",
4731
4769
  borderColor: theme.border,
4732
4770
  backgroundColor: theme.background,
4733
4771
  width: CARD_W,
4734
4772
  children: [
4735
- /* @__PURE__ */ jsxDEV10("box", {
4773
+ /* @__PURE__ */ jsxDEV9("box", {
4736
4774
  flexDirection: "row",
4737
4775
  paddingLeft: 2,
4738
4776
  paddingRight: 2,
4739
4777
  paddingTop: 1,
4740
4778
  paddingBottom: 1,
4741
4779
  children: [
4742
- /* @__PURE__ */ jsxDEV10("text", {
4780
+ /* @__PURE__ */ jsxDEV9("text", {
4743
4781
  fg: theme.accent,
4744
4782
  children: "Search: "
4745
4783
  }, undefined, false, undefined, this),
4746
- /* @__PURE__ */ jsxDEV10("text", {
4784
+ /* @__PURE__ */ jsxDEV9("text", {
4747
4785
  fg: theme.text,
4748
4786
  children: [
4749
4787
  searchQuery,
@@ -4752,19 +4790,22 @@ function ModelSelectScreen() {
4752
4790
  }, undefined, true, undefined, this)
4753
4791
  ]
4754
4792
  }, undefined, true, undefined, this),
4755
- /* @__PURE__ */ jsxDEV10("box", {
4793
+ /* @__PURE__ */ jsxDEV9("box", {
4756
4794
  height: 1,
4757
- backgroundColor: theme.border
4795
+ children: /* @__PURE__ */ jsxDEV9("text", {
4796
+ fg: theme.border,
4797
+ children: "\u2500".repeat(150)
4798
+ }, undefined, false, undefined, this)
4758
4799
  }, undefined, false, undefined, this),
4759
- /* @__PURE__ */ jsxDEV10("scrollbox", {
4800
+ /* @__PURE__ */ jsxDEV9("scrollbox", {
4760
4801
  ref: scrollboxRef,
4761
4802
  height: PAGE_SIZE,
4762
4803
  style: { scrollbarOptions: { showArrows: true, trackOptions: { foregroundColor: theme.primary, backgroundColor: theme.border } } },
4763
4804
  children: [
4764
- allRows.length === 0 && /* @__PURE__ */ jsxDEV10("box", {
4805
+ allRows.length === 0 && /* @__PURE__ */ jsxDEV9("box", {
4765
4806
  height: 1,
4766
4807
  paddingLeft: 2,
4767
- children: /* @__PURE__ */ jsxDEV10("text", {
4808
+ children: /* @__PURE__ */ jsxDEV9("text", {
4768
4809
  fg: theme.dim,
4769
4810
  children: "No models found"
4770
4811
  }, undefined, false, undefined, this)
@@ -4773,10 +4814,10 @@ function ModelSelectScreen() {
4773
4814
  let modelCursor = 0;
4774
4815
  return allRows.map((row, i) => {
4775
4816
  if (row.kind === "separator")
4776
- return /* @__PURE__ */ jsxDEV10("box", {
4817
+ return /* @__PURE__ */ jsxDEV9("box", {
4777
4818
  height: 1,
4778
4819
  paddingLeft: 2,
4779
- children: /* @__PURE__ */ jsxDEV10("text", {
4820
+ children: /* @__PURE__ */ jsxDEV9("text", {
4780
4821
  fg: theme.dim,
4781
4822
  children: row.label
4782
4823
  }, undefined, false, undefined, this)
@@ -4791,33 +4832,45 @@ function ModelSelectScreen() {
4791
4832
  nameFg = theme.text;
4792
4833
  else if (isSel)
4793
4834
  nameFg = theme.success;
4794
- return /* @__PURE__ */ jsxDEV10("box", {
4835
+ return /* @__PURE__ */ jsxDEV9("box", {
4795
4836
  height: 1,
4796
4837
  width: "100%",
4797
4838
  flexDirection: "row",
4798
4839
  backgroundColor: isActive ? theme.border : "transparent",
4840
+ onMouseOver: () => setCursor(localCursor),
4841
+ onMouseDown: () => {
4842
+ setCursor(localCursor);
4843
+ setSelected((prev) => {
4844
+ const next = new Set(prev);
4845
+ if (next.has(row.model.key))
4846
+ next.delete(row.model.key);
4847
+ else
4848
+ next.add(row.model.key);
4849
+ return next;
4850
+ });
4851
+ },
4799
4852
  children: [
4800
- /* @__PURE__ */ jsxDEV10("text", {
4853
+ /* @__PURE__ */ jsxDEV9("text", {
4801
4854
  fg: theme.dim,
4802
4855
  width: 2,
4803
4856
  children: " "
4804
4857
  }, undefined, false, undefined, this),
4805
- /* @__PURE__ */ jsxDEV10("text", {
4858
+ /* @__PURE__ */ jsxDEV9("text", {
4806
4859
  fg: nameFg,
4807
4860
  width: nameW,
4808
4861
  children: row.model.name
4809
4862
  }, undefined, false, undefined, this),
4810
- /* @__PURE__ */ jsxDEV10("text", {
4863
+ /* @__PURE__ */ jsxDEV9("text", {
4811
4864
  fg: isActive ? theme.primary : theme.dim,
4812
4865
  width: provW,
4813
4866
  children: row.model.providerName
4814
4867
  }, undefined, false, undefined, this),
4815
- /* @__PURE__ */ jsxDEV10("text", {
4868
+ /* @__PURE__ */ jsxDEV9("text", {
4816
4869
  fg: theme.success,
4817
4870
  width: 2,
4818
4871
  children: isSel ? "\u2713" : " "
4819
4872
  }, undefined, false, undefined, this),
4820
- /* @__PURE__ */ jsxDEV10("text", {
4873
+ /* @__PURE__ */ jsxDEV9("text", {
4821
4874
  fg: theme.accent,
4822
4875
  width: 2,
4823
4876
  children: isActive ? "\u203A" : " "
@@ -4828,38 +4881,35 @@ function ModelSelectScreen() {
4828
4881
  })()
4829
4882
  ]
4830
4883
  }, undefined, true, undefined, this),
4831
- /* @__PURE__ */ jsxDEV10("box", {
4884
+ /* @__PURE__ */ jsxDEV9("box", {
4832
4885
  height: 1,
4833
- backgroundColor: theme.border
4886
+ children: /* @__PURE__ */ jsxDEV9("text", {
4887
+ fg: theme.border,
4888
+ children: "\u2500".repeat(150)
4889
+ }, undefined, false, undefined, this)
4834
4890
  }, undefined, false, undefined, this),
4835
- /* @__PURE__ */ jsxDEV10("box", {
4891
+ /* @__PURE__ */ jsxDEV9("box", {
4836
4892
  flexDirection: "row",
4837
4893
  paddingLeft: 2,
4838
4894
  paddingRight: 2,
4839
4895
  paddingTop: 1,
4840
4896
  paddingBottom: 1,
4841
4897
  children: [
4842
- /* @__PURE__ */ jsxDEV10("text", {
4898
+ /* @__PURE__ */ jsxDEV9("text", {
4843
4899
  fg: theme.secondary,
4844
4900
  children: [
4845
4901
  "Selected: ",
4846
- selected.size,
4847
- " model",
4848
- selected.size !== 1 ? "s" : ""
4902
+ selected.size
4849
4903
  ]
4850
4904
  }, undefined, true, undefined, this),
4851
- recentCount > 0 && /* @__PURE__ */ jsxDEV10("text", {
4905
+ recentCount > 0 && /* @__PURE__ */ jsxDEV9("text", {
4852
4906
  fg: theme.dim,
4853
4907
  children: [
4854
4908
  " [R] recent (",
4855
4909
  recentCount,
4856
4910
  ")"
4857
4911
  ]
4858
- }, undefined, true, undefined, this),
4859
- /* @__PURE__ */ jsxDEV10("text", {
4860
- fg: theme.dim,
4861
- children: " [\u2191\u2193/PgUp/PgDn/wheel] scroll"
4862
- }, undefined, false, undefined, this)
4912
+ }, undefined, true, undefined, this)
4863
4913
  ]
4864
4914
  }, undefined, true, undefined, this)
4865
4915
  ]
@@ -4874,24 +4924,10 @@ var init_ModelSelectScreen = __esm(() => {
4874
4924
  init_usePaste();
4875
4925
  });
4876
4926
 
4877
- // src/tui/components/BarChart.tsx
4878
- import { jsxDEV as jsxDEV11 } from "@opentui/react/jsx-dev-runtime";
4879
- function BarChart({ value, max, width, color, inverted = false }) {
4880
- const normalizedValue = inverted && max > 0 ? Math.max(0, max - value) : value;
4881
- const filled = max === 0 ? 0 : Math.round(normalizedValue / max * width);
4882
- const empty = width - filled;
4883
- const bar = "\u2588".repeat(filled) + "\u2591".repeat(empty);
4884
- return /* @__PURE__ */ jsxDEV11("text", {
4885
- fg: color,
4886
- children: bar
4887
- }, undefined, false, undefined, this);
4888
- }
4889
- var init_BarChart = () => {};
4890
-
4891
4927
  // src/tui/components/GlowBar.tsx
4892
4928
  import { useState as useState7, useEffect as useEffect5 } from "react";
4893
4929
  import { engine, Timeline } from "@opentui/core";
4894
- import { jsxDEV as jsxDEV12 } from "@opentui/react/jsx-dev-runtime";
4930
+ import { jsxDEV as jsxDEV10 } from "@opentui/react/jsx-dev-runtime";
4895
4931
  function blendHex(hex, toward, t) {
4896
4932
  const parse3 = (h) => [
4897
4933
  parseInt(h.slice(1, 3), 16),
@@ -4930,16 +4966,16 @@ function GlowBar({ done, total, running }) {
4930
4966
  const fg = intensity >= 0 ? blendHex(theme.accent, "#ffffff", intensity * 0.55) : blendHex(theme.accent, theme.background, Math.abs(intensity) * 0.5);
4931
4967
  return { ch: "\u2588", fg };
4932
4968
  });
4933
- return /* @__PURE__ */ jsxDEV12("box", {
4969
+ return /* @__PURE__ */ jsxDEV10("box", {
4934
4970
  height: 1,
4935
4971
  flexDirection: "row",
4936
4972
  paddingLeft: 2,
4937
4973
  children: [
4938
- /* @__PURE__ */ jsxDEV12("text", {
4974
+ /* @__PURE__ */ jsxDEV10("text", {
4939
4975
  fg: theme.dim,
4940
4976
  children: "Benchmarking "
4941
4977
  }, undefined, false, undefined, this),
4942
- /* @__PURE__ */ jsxDEV12("text", {
4978
+ /* @__PURE__ */ jsxDEV10("text", {
4943
4979
  fg: theme.accent,
4944
4980
  children: [
4945
4981
  done,
@@ -4948,11 +4984,11 @@ function GlowBar({ done, total, running }) {
4948
4984
  " "
4949
4985
  ]
4950
4986
  }, undefined, true, undefined, this),
4951
- barChars.map((b, i) => /* @__PURE__ */ jsxDEV12("text", {
4987
+ barChars.map((b, i) => /* @__PURE__ */ jsxDEV10("text", {
4952
4988
  fg: b.fg,
4953
4989
  children: b.ch
4954
4990
  }, i, false, undefined, this)),
4955
- /* @__PURE__ */ jsxDEV12("text", {
4991
+ /* @__PURE__ */ jsxDEV10("text", {
4956
4992
  fg: theme.warning,
4957
4993
  children: [
4958
4994
  " ",
@@ -4969,7 +5005,7 @@ var init_GlowBar = __esm(() => {
4969
5005
  });
4970
5006
 
4971
5007
  // src/tui/components/ResultsTable.tsx
4972
- import { jsxDEV as jsxDEV13 } from "@opentui/react/jsx-dev-runtime";
5008
+ import { jsxDEV as jsxDEV11 } from "@opentui/react/jsx-dev-runtime";
4973
5009
  function lpad(s, w) {
4974
5010
  return s.length >= w ? s.slice(0, w) : " ".repeat(w - s.length) + s;
4975
5011
  }
@@ -4983,33 +5019,37 @@ function ResultsTable({ results, pendingCount }) {
4983
5019
  const theme = useTheme();
4984
5020
  const sorted = [...results].sort((a, b) => b.tokensPerSecond - a.tokensPerSecond);
4985
5021
  const C = { rank: 4, model: 16, prov: 10, time: 8, ttft: 7, tps: 9, f1000: 8, out: 6, inp: 6, tot: 6 };
4986
- const totalW = C.rank + C.model + C.prov + C.time + C.ttft + C.tps + C.f1000 + C.out + C.inp + C.tot + 10;
4987
- const sep = "\u2500".repeat(totalW);
4988
5022
  const maxTps = Math.max(...results.map((r) => r.tokensPerSecond), 0);
4989
5023
  const minTtft = Math.min(...results.map((r) => r.timeToFirstToken), Infinity);
4990
5024
  const validF1000s = results.map((r) => r.f1000).filter((f) => f !== Infinity);
4991
5025
  const minF1000 = validF1000s.length > 0 ? Math.min(...validF1000s) : Infinity;
4992
- function row(rank, model, prov, time, ttft, tps, f1000, out, inp, tot) {
4993
- return lpad(rank, C.rank) + " \u2502 " + rpad(model, C.model) + " \u2502 " + rpad(prov, C.prov) + " \u2502 " + lpad(time, C.time) + " \u2502 " + lpad(ttft, C.ttft) + " \u2502 " + lpad(tps, C.tps) + " \u2502 " + lpad(f1000, C.f1000) + " \u2502 " + lpad(out, C.out) + " \u2502 " + lpad(inp, C.inp) + " \u2502 " + lpad(tot, C.tot);
5026
+ function headerRow() {
5027
+ return "\u2502 " + lpad("#", C.rank) + " \u2502 " + rpad("Model", C.model) + " \u2502 " + rpad("Provider", C.prov) + " \u2502 " + lpad("Time(s)", C.time) + " \u2502 " + lpad("TTFT(s)", C.ttft) + " \u2502 " + lpad("Tok/s", C.tps) + " \u2502 " + lpad("F1000(h)", C.f1000) + " \u2502 " + lpad("Out", C.out) + " \u2502 " + lpad("In", C.inp) + " \u2502 " + lpad("Total", C.tot) + " \u2502";
4994
5028
  }
4995
- const header = row("#", "Model", "Provider", "Time(s)", "TTFT(s)", "Tok/s", "F1000(h)", "Out", "In", "Total");
4996
- return /* @__PURE__ */ jsxDEV13("box", {
5029
+ return /* @__PURE__ */ jsxDEV11("box", {
4997
5030
  flexDirection: "column",
4998
- paddingLeft: 1,
4999
- paddingRight: 1,
5031
+ paddingLeft: 2,
5032
+ paddingRight: 2,
5000
5033
  children: [
5001
- /* @__PURE__ */ jsxDEV13("box", {
5034
+ /* @__PURE__ */ jsxDEV11("box", {
5035
+ height: 1,
5036
+ children: /* @__PURE__ */ jsxDEV11("text", {
5037
+ fg: theme.border,
5038
+ children: RULE
5039
+ }, undefined, false, undefined, this)
5040
+ }, undefined, false, undefined, this),
5041
+ /* @__PURE__ */ jsxDEV11("box", {
5002
5042
  height: 1,
5003
- children: /* @__PURE__ */ jsxDEV13("text", {
5043
+ children: /* @__PURE__ */ jsxDEV11("text", {
5004
5044
  fg: theme.accent,
5005
- children: header
5045
+ children: headerRow()
5006
5046
  }, undefined, false, undefined, this)
5007
5047
  }, undefined, false, undefined, this),
5008
- /* @__PURE__ */ jsxDEV13("box", {
5048
+ /* @__PURE__ */ jsxDEV11("box", {
5009
5049
  height: 1,
5010
- children: /* @__PURE__ */ jsxDEV13("text", {
5050
+ children: /* @__PURE__ */ jsxDEV11("text", {
5011
5051
  fg: theme.border,
5012
- children: sep
5052
+ children: RULE
5013
5053
  }, undefined, false, undefined, this)
5014
5054
  }, undefined, false, undefined, this),
5015
5055
  sorted.map((r, i) => {
@@ -5025,97 +5065,105 @@ function ResultsTable({ results, pendingCount }) {
5025
5065
  const isBestTps = r.tokensPerSecond === maxTps && maxTps > 0;
5026
5066
  const isBestTtft = r.timeToFirstToken === minTtft;
5027
5067
  const isBestF1000 = r.f1000 === minF1000 && r.f1000 !== Infinity;
5028
- return /* @__PURE__ */ jsxDEV13("box", {
5068
+ return /* @__PURE__ */ jsxDEV11("box", {
5029
5069
  height: 1,
5030
5070
  flexDirection: "row",
5031
5071
  children: [
5032
- /* @__PURE__ */ jsxDEV13("text", {
5072
+ /* @__PURE__ */ jsxDEV11("text", {
5073
+ fg: theme.dim,
5074
+ children: "\u2502 "
5075
+ }, undefined, false, undefined, this),
5076
+ /* @__PURE__ */ jsxDEV11("text", {
5033
5077
  fg: theme.dim,
5034
5078
  children: [
5035
5079
  lpad(rank, C.rank),
5036
5080
  " \u2502 "
5037
5081
  ]
5038
5082
  }, undefined, true, undefined, this),
5039
- /* @__PURE__ */ jsxDEV13("text", {
5083
+ /* @__PURE__ */ jsxDEV11("text", {
5040
5084
  fg: theme.text,
5041
5085
  children: [
5042
5086
  rpad(trunc(r.model, C.model), C.model),
5043
5087
  " \u2502 "
5044
5088
  ]
5045
5089
  }, undefined, true, undefined, this),
5046
- /* @__PURE__ */ jsxDEV13("text", {
5090
+ /* @__PURE__ */ jsxDEV11("text", {
5047
5091
  fg: theme.dim,
5048
5092
  children: [
5049
5093
  rpad(trunc(r.provider, C.prov), C.prov),
5050
5094
  " \u2502 "
5051
5095
  ]
5052
5096
  }, undefined, true, undefined, this),
5053
- /* @__PURE__ */ jsxDEV13("text", {
5097
+ /* @__PURE__ */ jsxDEV11("text", {
5054
5098
  fg: theme.dim,
5055
5099
  children: [
5056
5100
  lpad(timeSec, C.time),
5057
5101
  " \u2502 "
5058
5102
  ]
5059
5103
  }, undefined, true, undefined, this),
5060
- /* @__PURE__ */ jsxDEV13("text", {
5104
+ /* @__PURE__ */ jsxDEV11("text", {
5061
5105
  fg: isBestTtft ? theme.success : theme.dim,
5062
5106
  children: [
5063
5107
  lpad(ttftSec, C.ttft),
5064
5108
  " \u2502 "
5065
5109
  ]
5066
5110
  }, undefined, true, undefined, this),
5067
- /* @__PURE__ */ jsxDEV13("text", {
5111
+ /* @__PURE__ */ jsxDEV11("text", {
5068
5112
  fg: isBestTps ? theme.success : theme.dim,
5069
5113
  children: [
5070
5114
  lpad(tps, C.tps),
5071
5115
  " \u2502 "
5072
5116
  ]
5073
5117
  }, undefined, true, undefined, this),
5074
- /* @__PURE__ */ jsxDEV13("text", {
5118
+ /* @__PURE__ */ jsxDEV11("text", {
5075
5119
  fg: isBestF1000 ? theme.success : theme.dim,
5076
5120
  children: [
5077
5121
  lpad(f1000Val, C.f1000),
5078
5122
  " \u2502 "
5079
5123
  ]
5080
5124
  }, undefined, true, undefined, this),
5081
- /* @__PURE__ */ jsxDEV13("text", {
5125
+ /* @__PURE__ */ jsxDEV11("text", {
5082
5126
  fg: theme.dim,
5083
5127
  children: [
5084
5128
  lpad(outTok, C.out),
5085
5129
  " \u2502 "
5086
5130
  ]
5087
5131
  }, undefined, true, undefined, this),
5088
- /* @__PURE__ */ jsxDEV13("text", {
5132
+ /* @__PURE__ */ jsxDEV11("text", {
5089
5133
  fg: theme.dim,
5090
5134
  children: [
5091
5135
  lpad(inTok, C.inp),
5092
5136
  " \u2502 "
5093
5137
  ]
5094
5138
  }, undefined, true, undefined, this),
5095
- /* @__PURE__ */ jsxDEV13("text", {
5139
+ /* @__PURE__ */ jsxDEV11("text", {
5096
5140
  fg: theme.dim,
5097
5141
  children: lpad(totTok, C.tot)
5098
5142
  }, undefined, false, undefined, this),
5099
- hasEst && /* @__PURE__ */ jsxDEV13("text", {
5143
+ /* @__PURE__ */ jsxDEV11("text", {
5144
+ fg: theme.dim,
5145
+ children: " \u2502"
5146
+ }, undefined, false, undefined, this),
5147
+ hasEst && /* @__PURE__ */ jsxDEV11("text", {
5100
5148
  fg: theme.warning,
5101
5149
  children: " [est]"
5102
5150
  }, undefined, false, undefined, this)
5103
5151
  ]
5104
5152
  }, `${r.model}-${r.provider}-${i}`, true, undefined, this);
5105
5153
  }),
5106
- /* @__PURE__ */ jsxDEV13("box", {
5154
+ /* @__PURE__ */ jsxDEV11("box", {
5107
5155
  height: 1,
5108
- children: /* @__PURE__ */ jsxDEV13("text", {
5156
+ children: /* @__PURE__ */ jsxDEV11("text", {
5109
5157
  fg: theme.border,
5110
- children: sep
5158
+ children: RULE
5111
5159
  }, undefined, false, undefined, this)
5112
5160
  }, undefined, false, undefined, this),
5113
- pendingCount > 0 && /* @__PURE__ */ jsxDEV13("box", {
5161
+ pendingCount > 0 && /* @__PURE__ */ jsxDEV11("box", {
5114
5162
  height: 1,
5115
- children: /* @__PURE__ */ jsxDEV13("text", {
5163
+ children: /* @__PURE__ */ jsxDEV11("text", {
5116
5164
  fg: theme.dim,
5117
5165
  children: [
5118
- " Waiting for ",
5166
+ "Waiting for ",
5119
5167
  pendingCount,
5120
5168
  " more result",
5121
5169
  pendingCount !== 1 ? "s" : "",
@@ -5126,14 +5174,35 @@ function ResultsTable({ results, pendingCount }) {
5126
5174
  ]
5127
5175
  }, undefined, true, undefined, this);
5128
5176
  }
5177
+ var RULE;
5129
5178
  var init_ResultsTable = __esm(() => {
5130
5179
  init_ThemeContext();
5180
+ RULE = "\u2500".repeat(200);
5131
5181
  });
5132
5182
 
5133
- // src/tui/screens/BenchmarkScreen.tsx
5134
- import { useState as useState8, useEffect as useEffect6, useRef as useRef4, useMemo } from "react";
5135
- import { jsxDEV as jsxDEV14 } from "@opentui/react/jsx-dev-runtime";
5136
- function rankBadge(rank) {
5183
+ // src/tui/components/BarChart.tsx
5184
+ import { jsxDEV as jsxDEV12 } from "@opentui/react/jsx-dev-runtime";
5185
+ function BarChart({ value, max, width, color, inverted = false }) {
5186
+ const normalizedValue = inverted && max > 0 ? Math.max(0, max - value) : value;
5187
+ const filled = max === 0 ? 0 : Math.round(normalizedValue / max * width);
5188
+ const empty = width - filled;
5189
+ const bar = "\u2588".repeat(filled) + "\u2591".repeat(empty);
5190
+ return /* @__PURE__ */ jsxDEV12("text", {
5191
+ fg: color,
5192
+ children: bar
5193
+ }, undefined, false, undefined, this);
5194
+ }
5195
+ var init_BarChart = () => {};
5196
+
5197
+ // src/tui/components/RankingRow.tsx
5198
+ import { jsxDEV as jsxDEV13 } from "@opentui/react/jsx-dev-runtime";
5199
+ function pad(s, w, align) {
5200
+ if (s.length >= w)
5201
+ return s.slice(0, w);
5202
+ const pad2 = " ".repeat(w - s.length);
5203
+ return align === "right" ? pad2 + s : s + pad2;
5204
+ }
5205
+ function rankLabel(rank) {
5137
5206
  if (rank === 1)
5138
5207
  return "1st";
5139
5208
  if (rank === 2)
@@ -5142,6 +5211,73 @@ function rankBadge(rank) {
5142
5211
  return "3rd";
5143
5212
  return `${rank}th`;
5144
5213
  }
5214
+ function RankingRow({ rank, rankFg, metrics, model, modelFg, provider, providerFg, bar, theme }) {
5215
+ const badge = pad(rankLabel(rank), 3, "left");
5216
+ const modelCol = pad(model, 18, "left");
5217
+ const provCol = pad(provider, 12, "left");
5218
+ return /* @__PURE__ */ jsxDEV13("box", {
5219
+ height: 1,
5220
+ flexDirection: "row",
5221
+ paddingLeft: 2,
5222
+ children: [
5223
+ /* @__PURE__ */ jsxDEV13("text", {
5224
+ fg: rankFg,
5225
+ children: [
5226
+ badge,
5227
+ " "
5228
+ ]
5229
+ }, undefined, true, undefined, this),
5230
+ metrics.map((m, i) => /* @__PURE__ */ jsxDEV13("box", {
5231
+ flexDirection: "row",
5232
+ children: [
5233
+ /* @__PURE__ */ jsxDEV13("text", {
5234
+ fg: theme.dim,
5235
+ children: " \u2502 "
5236
+ }, undefined, false, undefined, this),
5237
+ /* @__PURE__ */ jsxDEV13("text", {
5238
+ fg: m.fg,
5239
+ children: [
5240
+ pad(m.text, m.width, m.align ?? "right"),
5241
+ " "
5242
+ ]
5243
+ }, undefined, true, undefined, this)
5244
+ ]
5245
+ }, `m-${i}`, true, undefined, this)),
5246
+ /* @__PURE__ */ jsxDEV13("text", {
5247
+ fg: theme.dim,
5248
+ children: " \u2502 "
5249
+ }, undefined, false, undefined, this),
5250
+ /* @__PURE__ */ jsxDEV13("text", {
5251
+ fg: modelFg,
5252
+ children: [
5253
+ modelCol,
5254
+ " "
5255
+ ]
5256
+ }, undefined, true, undefined, this),
5257
+ /* @__PURE__ */ jsxDEV13("text", {
5258
+ fg: providerFg,
5259
+ children: provCol
5260
+ }, undefined, false, undefined, this),
5261
+ /* @__PURE__ */ jsxDEV13("text", {
5262
+ fg: theme.dim,
5263
+ children: " \u2502 "
5264
+ }, undefined, false, undefined, this),
5265
+ /* @__PURE__ */ jsxDEV13(BarChart, {
5266
+ value: bar.value,
5267
+ max: bar.max,
5268
+ width: bar.width,
5269
+ color: bar.color
5270
+ }, undefined, false, undefined, this)
5271
+ ]
5272
+ }, undefined, true, undefined, this);
5273
+ }
5274
+ var init_RankingRow = __esm(() => {
5275
+ init_BarChart();
5276
+ });
5277
+
5278
+ // src/tui/screens/BenchmarkScreen.tsx
5279
+ import { useState as useState8, useEffect as useEffect6, useRef as useRef4, useMemo } from "react";
5280
+ import { jsxDEV as jsxDEV14 } from "@opentui/react/jsx-dev-runtime";
5145
5281
  function BenchmarkScreen() {
5146
5282
  const { state, dispatch } = useAppContext();
5147
5283
  const navigate = useNavigate();
@@ -5294,7 +5430,10 @@ function BenchmarkScreen() {
5294
5430
  if (tpsRanked.length > 0) {
5295
5431
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5296
5432
  height: 1,
5297
- backgroundColor: theme.border
5433
+ children: /* @__PURE__ */ jsxDEV14("text", {
5434
+ fg: theme.border,
5435
+ children: "\u2500".repeat(150)
5436
+ }, undefined, false, undefined, this)
5298
5437
  }, "div-tps", false, undefined, this));
5299
5438
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5300
5439
  height: 1,
@@ -5310,75 +5449,29 @@ function BenchmarkScreen() {
5310
5449
  const rankFg = rank === 1 ? theme.accent : rank === 2 ? theme.secondary : theme.dim;
5311
5450
  const tps = s.result?.tokensPerSecond ?? 0;
5312
5451
  const timeSec = (s.result?.totalTime ?? 0) / 1000;
5313
- const badge = rankBadge(rank).padStart(3);
5314
- const modelCol = s.model.name.padEnd(18).slice(0, 18);
5315
- const provCol = s.model.providerName.padEnd(12).slice(0, 12);
5316
- rows.push(/* @__PURE__ */ jsxDEV14("box", {
5317
- height: 1,
5318
- flexDirection: "row",
5319
- paddingLeft: 2,
5320
- children: [
5321
- /* @__PURE__ */ jsxDEV14("text", {
5322
- fg: rankFg,
5323
- children: [
5324
- badge,
5325
- " "
5326
- ]
5327
- }, undefined, true, undefined, this),
5328
- /* @__PURE__ */ jsxDEV14("text", {
5329
- fg: theme.dim,
5330
- children: " \u2502 "
5331
- }, undefined, false, undefined, this),
5332
- /* @__PURE__ */ jsxDEV14("text", {
5333
- fg: theme.accent,
5334
- children: [
5335
- tps.toFixed(1).padStart(8),
5336
- " tok/s "
5337
- ]
5338
- }, undefined, true, undefined, this),
5339
- /* @__PURE__ */ jsxDEV14("text", {
5340
- fg: theme.dim,
5341
- children: " \u2502 "
5342
- }, undefined, false, undefined, this),
5343
- /* @__PURE__ */ jsxDEV14("text", {
5344
- fg: theme.secondary,
5345
- children: [
5346
- timeSec.toFixed(2).padStart(6),
5347
- "s "
5348
- ]
5349
- }, undefined, true, undefined, this),
5350
- /* @__PURE__ */ jsxDEV14("text", {
5351
- fg: theme.dim,
5352
- children: " \u2502 "
5353
- }, undefined, false, undefined, this),
5354
- /* @__PURE__ */ jsxDEV14("text", {
5355
- fg: theme.text,
5356
- children: [
5357
- modelCol,
5358
- " "
5359
- ]
5360
- }, undefined, true, undefined, this),
5361
- /* @__PURE__ */ jsxDEV14("text", {
5362
- fg: theme.dim,
5363
- children: [
5364
- provCol,
5365
- " \u2502 "
5366
- ]
5367
- }, undefined, true, undefined, this),
5368
- /* @__PURE__ */ jsxDEV14(BarChart, {
5369
- value: tps,
5370
- max: maxTps,
5371
- width: BAR_W2,
5372
- color: theme.accent
5373
- }, undefined, false, undefined, this)
5374
- ]
5375
- }, `tps-${s.model.id}-${s.model.providerId}`, true, undefined, this));
5452
+ rows.push(/* @__PURE__ */ jsxDEV14(RankingRow, {
5453
+ rank,
5454
+ rankFg,
5455
+ metrics: [
5456
+ { text: `${tps.toFixed(1)} tok/s`, fg: theme.accent, width: 12 },
5457
+ { text: `${timeSec.toFixed(2)}s`, fg: theme.secondary, width: 7 }
5458
+ ],
5459
+ model: s.model.name,
5460
+ modelFg: theme.text,
5461
+ provider: s.model.providerName,
5462
+ providerFg: theme.dim,
5463
+ bar: { value: tps, max: maxTps, width: BAR_W2, color: theme.accent },
5464
+ theme
5465
+ }, `tps-${s.model.id}-${s.model.providerId}`, false, undefined, this));
5376
5466
  }
5377
5467
  }
5378
5468
  if (ttftRanked.length > 0) {
5379
5469
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5380
5470
  height: 1,
5381
- backgroundColor: theme.border
5471
+ children: /* @__PURE__ */ jsxDEV14("text", {
5472
+ fg: theme.border,
5473
+ children: "\u2500".repeat(150)
5474
+ }, undefined, false, undefined, this)
5382
5475
  }, "div-ttft", false, undefined, this));
5383
5476
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5384
5477
  height: 1,
@@ -5394,75 +5487,29 @@ function BenchmarkScreen() {
5394
5487
  const rankFg = rank === 1 ? theme.accent : rank === 2 ? theme.secondary : theme.dim;
5395
5488
  const ttft = (s.result?.timeToFirstToken ?? 0) / 1000;
5396
5489
  const tps = s.result?.tokensPerSecond ?? 0;
5397
- const badge = rankBadge(rank).padStart(3);
5398
- const modelCol = s.model.name.padEnd(18).slice(0, 18);
5399
- const provCol = s.model.providerName.padEnd(12).slice(0, 12);
5400
- rows.push(/* @__PURE__ */ jsxDEV14("box", {
5401
- height: 1,
5402
- flexDirection: "row",
5403
- paddingLeft: 2,
5404
- children: [
5405
- /* @__PURE__ */ jsxDEV14("text", {
5406
- fg: rankFg,
5407
- children: [
5408
- badge,
5409
- " "
5410
- ]
5411
- }, undefined, true, undefined, this),
5412
- /* @__PURE__ */ jsxDEV14("text", {
5413
- fg: theme.dim,
5414
- children: " \u2502 "
5415
- }, undefined, false, undefined, this),
5416
- /* @__PURE__ */ jsxDEV14("text", {
5417
- fg: theme.secondary,
5418
- children: [
5419
- ttft.toFixed(2).padStart(7),
5420
- "s "
5421
- ]
5422
- }, undefined, true, undefined, this),
5423
- /* @__PURE__ */ jsxDEV14("text", {
5424
- fg: theme.dim,
5425
- children: " \u2502 "
5426
- }, undefined, false, undefined, this),
5427
- /* @__PURE__ */ jsxDEV14("text", {
5428
- fg: theme.accent,
5429
- children: [
5430
- tps.toFixed(1).padStart(8),
5431
- " tok/s "
5432
- ]
5433
- }, undefined, true, undefined, this),
5434
- /* @__PURE__ */ jsxDEV14("text", {
5435
- fg: theme.dim,
5436
- children: " \u2502 "
5437
- }, undefined, false, undefined, this),
5438
- /* @__PURE__ */ jsxDEV14("text", {
5439
- fg: theme.text,
5440
- children: [
5441
- modelCol,
5442
- " "
5443
- ]
5444
- }, undefined, true, undefined, this),
5445
- /* @__PURE__ */ jsxDEV14("text", {
5446
- fg: theme.dim,
5447
- children: [
5448
- provCol,
5449
- " \u2502 "
5450
- ]
5451
- }, undefined, true, undefined, this),
5452
- /* @__PURE__ */ jsxDEV14(BarChart, {
5453
- value: ttft,
5454
- max: maxTtftForBar,
5455
- width: BAR_W2,
5456
- color: theme.secondary
5457
- }, undefined, false, undefined, this)
5458
- ]
5459
- }, `ttft-${s.model.id}-${s.model.providerId}`, true, undefined, this));
5490
+ rows.push(/* @__PURE__ */ jsxDEV14(RankingRow, {
5491
+ rank,
5492
+ rankFg,
5493
+ metrics: [
5494
+ { text: `${ttft.toFixed(2)}s`, fg: theme.secondary, width: 7 },
5495
+ { text: `${tps.toFixed(1)} tok/s`, fg: theme.accent, width: 12 }
5496
+ ],
5497
+ model: s.model.name,
5498
+ modelFg: theme.text,
5499
+ provider: s.model.providerName,
5500
+ providerFg: theme.dim,
5501
+ bar: { value: ttft, max: maxTtftForBar, width: BAR_W2, color: theme.secondary },
5502
+ theme
5503
+ }, `ttft-${s.model.id}-${s.model.providerId}`, false, undefined, this));
5460
5504
  }
5461
5505
  }
5462
5506
  if (f1000Ranked.length > 0) {
5463
5507
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5464
5508
  height: 1,
5465
- backgroundColor: theme.border
5509
+ children: /* @__PURE__ */ jsxDEV14("text", {
5510
+ fg: theme.border,
5511
+ children: "\u2500".repeat(150)
5512
+ }, undefined, false, undefined, this)
5466
5513
  }, "div-f1000", false, undefined, this));
5467
5514
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5468
5515
  height: 1,
@@ -5477,89 +5524,31 @@ function BenchmarkScreen() {
5477
5524
  const rank = i + 1;
5478
5525
  const rankFg = rank === 1 ? theme.accent : rank === 2 ? theme.secondary : theme.dim;
5479
5526
  const f1000 = s.result?.f1000 ?? Infinity;
5480
- const f1000Str = f1000 === Infinity ? "\u221E" : f1000.toFixed(2);
5481
- const ttft = (s.result?.timeToFirstToken ?? 0) / 1000;
5527
+ const f1000Str = f1000 === Infinity ? "\u221E" : `${f1000.toFixed(2)}h`;
5482
5528
  const tps = s.result?.tokensPerSecond ?? 0;
5483
- const badge = rankBadge(rank).padStart(3);
5484
- const modelCol = s.model.name.padEnd(18).slice(0, 18);
5485
- const provCol = s.model.providerName.padEnd(12).slice(0, 12);
5486
- rows.push(/* @__PURE__ */ jsxDEV14("box", {
5487
- height: 1,
5488
- flexDirection: "row",
5489
- paddingLeft: 2,
5490
- children: [
5491
- /* @__PURE__ */ jsxDEV14("text", {
5492
- fg: rankFg,
5493
- children: [
5494
- badge,
5495
- " "
5496
- ]
5497
- }, undefined, true, undefined, this),
5498
- /* @__PURE__ */ jsxDEV14("text", {
5499
- fg: theme.dim,
5500
- children: " \u2502 "
5501
- }, undefined, false, undefined, this),
5502
- /* @__PURE__ */ jsxDEV14("text", {
5503
- fg: theme.primary,
5504
- children: [
5505
- f1000Str.padStart(7),
5506
- "h "
5507
- ]
5508
- }, undefined, true, undefined, this),
5509
- /* @__PURE__ */ jsxDEV14("text", {
5510
- fg: theme.dim,
5511
- children: " \u2502 "
5512
- }, undefined, false, undefined, this),
5513
- /* @__PURE__ */ jsxDEV14("text", {
5514
- fg: theme.secondary,
5515
- children: [
5516
- ttft.toFixed(2).padStart(5),
5517
- "s "
5518
- ]
5519
- }, undefined, true, undefined, this),
5520
- /* @__PURE__ */ jsxDEV14("text", {
5521
- fg: theme.dim,
5522
- children: " \u2502 "
5523
- }, undefined, false, undefined, this),
5524
- /* @__PURE__ */ jsxDEV14("text", {
5525
- fg: theme.accent,
5526
- children: [
5527
- tps.toFixed(0).padStart(5),
5528
- " tok/s "
5529
- ]
5530
- }, undefined, true, undefined, this),
5531
- /* @__PURE__ */ jsxDEV14("text", {
5532
- fg: theme.dim,
5533
- children: " \u2502 "
5534
- }, undefined, false, undefined, this),
5535
- /* @__PURE__ */ jsxDEV14("text", {
5536
- fg: theme.text,
5537
- children: [
5538
- modelCol,
5539
- " "
5540
- ]
5541
- }, undefined, true, undefined, this),
5542
- /* @__PURE__ */ jsxDEV14("text", {
5543
- fg: theme.dim,
5544
- children: [
5545
- provCol,
5546
- " \u2502 "
5547
- ]
5548
- }, undefined, true, undefined, this),
5549
- /* @__PURE__ */ jsxDEV14(BarChart, {
5550
- value: f1000 === Infinity ? maxF1000 : f1000,
5551
- max: maxF1000,
5552
- width: BAR_W2,
5553
- color: theme.primary
5554
- }, undefined, false, undefined, this)
5555
- ]
5556
- }, `f1000-${s.model.id}-${s.model.providerId}`, true, undefined, this));
5529
+ rows.push(/* @__PURE__ */ jsxDEV14(RankingRow, {
5530
+ rank,
5531
+ rankFg,
5532
+ metrics: [
5533
+ { text: f1000Str, fg: theme.primary, width: 7 },
5534
+ { text: `${tps.toFixed(0)} tok/s`, fg: theme.accent, width: 12 }
5535
+ ],
5536
+ model: s.model.name,
5537
+ modelFg: theme.text,
5538
+ provider: s.model.providerName,
5539
+ providerFg: theme.dim,
5540
+ bar: { value: f1000 === Infinity ? maxF1000 : f1000, max: maxF1000, width: BAR_W2, color: theme.primary },
5541
+ theme
5542
+ }, `f1000-${s.model.id}-${s.model.providerId}`, false, undefined, this));
5557
5543
  }
5558
5544
  }
5559
5545
  if (allDone && errors.length > 0) {
5560
5546
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5561
5547
  height: 1,
5562
- backgroundColor: theme.border
5548
+ children: /* @__PURE__ */ jsxDEV14("text", {
5549
+ fg: theme.border,
5550
+ children: "\u2500".repeat(150)
5551
+ }, undefined, false, undefined, this)
5563
5552
  }, "div-errors", false, undefined, this));
5564
5553
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5565
5554
  height: 1,
@@ -5620,7 +5609,10 @@ function BenchmarkScreen() {
5620
5609
  }
5621
5610
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5622
5611
  height: 1,
5623
- backgroundColor: theme.border
5612
+ children: /* @__PURE__ */ jsxDEV14("text", {
5613
+ fg: theme.border,
5614
+ children: "\u2500".repeat(150)
5615
+ }, undefined, false, undefined, this)
5624
5616
  }, "div-results", false, undefined, this));
5625
5617
  rows.push(/* @__PURE__ */ jsxDEV14("box", {
5626
5618
  height: 1,
@@ -5726,7 +5718,7 @@ function BenchmarkScreen() {
5726
5718
  /* @__PURE__ */ jsxDEV14("box", {
5727
5719
  flexDirection: "column",
5728
5720
  border: true,
5729
- borderStyle: "rounded",
5721
+ borderStyle: "single",
5730
5722
  borderColor: theme.border,
5731
5723
  backgroundColor: theme.background,
5732
5724
  flexGrow: 1,
@@ -5746,7 +5738,10 @@ function BenchmarkScreen() {
5746
5738
  }, undefined, true, undefined, this),
5747
5739
  /* @__PURE__ */ jsxDEV14("box", {
5748
5740
  height: 1,
5749
- backgroundColor: theme.border
5741
+ children: /* @__PURE__ */ jsxDEV14("text", {
5742
+ fg: theme.border,
5743
+ children: "\u2500".repeat(150)
5744
+ }, undefined, false, undefined, this)
5750
5745
  }, undefined, false, undefined, this),
5751
5746
  /* @__PURE__ */ jsxDEV14("scrollbox", {
5752
5747
  focused: true,
@@ -5766,9 +5761,9 @@ var init_BenchmarkScreen = __esm(() => {
5766
5761
  init_useAppKeyboard();
5767
5762
  init_AppContext();
5768
5763
  init_ThemeContext();
5769
- init_BarChart();
5770
5764
  init_GlowBar();
5771
5765
  init_ResultsTable();
5766
+ init_RankingRow();
5772
5767
  });
5773
5768
 
5774
5769
  // src/tui/screens/AddVerifiedScreen.tsx
@@ -5931,7 +5926,7 @@ function AddVerifiedScreen() {
5931
5926
  children: /* @__PURE__ */ jsxDEV15("box", {
5932
5927
  flexDirection: "column",
5933
5928
  border: true,
5934
- borderStyle: "rounded",
5929
+ borderStyle: "single",
5935
5930
  borderColor: theme.border,
5936
5931
  backgroundColor: theme.background,
5937
5932
  width: CARD_W,
@@ -5947,7 +5942,10 @@ function AddVerifiedScreen() {
5947
5942
  }, undefined, false, undefined, this),
5948
5943
  /* @__PURE__ */ jsxDEV15("box", {
5949
5944
  height: 1,
5950
- backgroundColor: theme.border
5945
+ children: /* @__PURE__ */ jsxDEV15("text", {
5946
+ fg: theme.border,
5947
+ children: "\u2500".repeat(150)
5948
+ }, undefined, false, undefined, this)
5951
5949
  }, undefined, false, undefined, this),
5952
5950
  /* @__PURE__ */ jsxDEV15("box", {
5953
5951
  flexDirection: "column",
@@ -6019,7 +6017,10 @@ function AddVerifiedScreen() {
6019
6017
  }, undefined, true, undefined, this),
6020
6018
  /* @__PURE__ */ jsxDEV15("box", {
6021
6019
  height: 1,
6022
- backgroundColor: theme.border
6020
+ children: /* @__PURE__ */ jsxDEV15("text", {
6021
+ fg: theme.border,
6022
+ children: "\u2500".repeat(150)
6023
+ }, undefined, false, undefined, this)
6023
6024
  }, undefined, false, undefined, this),
6024
6025
  saveSuccess ? /* @__PURE__ */ jsxDEV15("box", {
6025
6026
  flexDirection: "column",
@@ -6095,6 +6096,42 @@ function AddVerifiedScreen() {
6095
6096
  }, undefined, false, undefined, this)
6096
6097
  }, undefined, false, undefined, this)
6097
6098
  ]
6099
+ }, undefined, true, undefined, this),
6100
+ /* @__PURE__ */ jsxDEV15("box", {
6101
+ height: 1,
6102
+ children: /* @__PURE__ */ jsxDEV15("text", {
6103
+ fg: theme.border,
6104
+ children: "\u2500".repeat(150)
6105
+ }, undefined, false, undefined, this)
6106
+ }, undefined, false, undefined, this),
6107
+ /* @__PURE__ */ jsxDEV15("box", {
6108
+ height: 1,
6109
+ flexDirection: "row",
6110
+ paddingLeft: 2,
6111
+ paddingRight: 2,
6112
+ paddingTop: 1,
6113
+ paddingBottom: 1,
6114
+ onMouseDown: () => {
6115
+ setStep("list");
6116
+ setSelectedProvider(null);
6117
+ setApiKey("");
6118
+ setSaveSuccess(false);
6119
+ setSaveError("");
6120
+ },
6121
+ children: [
6122
+ /* @__PURE__ */ jsxDEV15("text", {
6123
+ fg: theme.dim,
6124
+ children: "\u2190 "
6125
+ }, undefined, false, undefined, this),
6126
+ /* @__PURE__ */ jsxDEV15("text", {
6127
+ fg: theme.accent,
6128
+ children: "Back to list"
6129
+ }, undefined, false, undefined, this),
6130
+ /* @__PURE__ */ jsxDEV15("text", {
6131
+ fg: theme.dim,
6132
+ children: " [Esc]"
6133
+ }, undefined, false, undefined, this)
6134
+ ]
6098
6135
  }, undefined, true, undefined, this)
6099
6136
  ]
6100
6137
  }, undefined, true, undefined, this)
@@ -6108,7 +6145,7 @@ function AddVerifiedScreen() {
6108
6145
  children: /* @__PURE__ */ jsxDEV15("box", {
6109
6146
  flexDirection: "column",
6110
6147
  border: true,
6111
- borderStyle: "rounded",
6148
+ borderStyle: "single",
6112
6149
  borderColor: theme.border,
6113
6150
  backgroundColor: theme.background,
6114
6151
  width: CARD_W,
@@ -6135,7 +6172,10 @@ function AddVerifiedScreen() {
6135
6172
  }, undefined, true, undefined, this),
6136
6173
  /* @__PURE__ */ jsxDEV15("box", {
6137
6174
  height: 1,
6138
- backgroundColor: theme.border
6175
+ children: /* @__PURE__ */ jsxDEV15("text", {
6176
+ fg: theme.border,
6177
+ children: "\u2500".repeat(150)
6178
+ }, undefined, false, undefined, this)
6139
6179
  }, undefined, false, undefined, this),
6140
6180
  /* @__PURE__ */ jsxDEV15("scrollbox", {
6141
6181
  ref: scrollboxRef,
@@ -6168,6 +6208,12 @@ function AddVerifiedScreen() {
6168
6208
  width: "100%",
6169
6209
  flexDirection: "row",
6170
6210
  backgroundColor: isActive ? theme.border : "transparent",
6211
+ onMouseOver: () => setCursor(i),
6212
+ onMouseDown: () => {
6213
+ setCursor(i);
6214
+ setSelectedProvider(prov);
6215
+ setStep("confirm");
6216
+ },
6171
6217
  children: [
6172
6218
  /* @__PURE__ */ jsxDEV15("text", {
6173
6219
  fg: theme.dim,
@@ -6196,7 +6242,10 @@ function AddVerifiedScreen() {
6196
6242
  }, undefined, true, undefined, this),
6197
6243
  /* @__PURE__ */ jsxDEV15("box", {
6198
6244
  height: 1,
6199
- backgroundColor: theme.border
6245
+ children: /* @__PURE__ */ jsxDEV15("text", {
6246
+ fg: theme.border,
6247
+ children: "\u2500".repeat(150)
6248
+ }, undefined, false, undefined, this)
6200
6249
  }, undefined, false, undefined, this),
6201
6250
  /* @__PURE__ */ jsxDEV15("box", {
6202
6251
  flexDirection: "row",
@@ -6217,6 +6266,36 @@ function AddVerifiedScreen() {
6217
6266
  children: " [\u2191\u2193/PgUp/PgDn/wheel] scroll"
6218
6267
  }, undefined, false, undefined, this)
6219
6268
  ]
6269
+ }, undefined, true, undefined, this),
6270
+ /* @__PURE__ */ jsxDEV15("box", {
6271
+ height: 1,
6272
+ children: /* @__PURE__ */ jsxDEV15("text", {
6273
+ fg: theme.border,
6274
+ children: "\u2500".repeat(150)
6275
+ }, undefined, false, undefined, this)
6276
+ }, undefined, false, undefined, this),
6277
+ /* @__PURE__ */ jsxDEV15("box", {
6278
+ height: 1,
6279
+ flexDirection: "row",
6280
+ paddingLeft: 2,
6281
+ paddingRight: 2,
6282
+ paddingTop: 1,
6283
+ paddingBottom: 1,
6284
+ onMouseDown: () => navigate("model-menu"),
6285
+ children: [
6286
+ /* @__PURE__ */ jsxDEV15("text", {
6287
+ fg: theme.dim,
6288
+ children: "\u2190 "
6289
+ }, undefined, false, undefined, this),
6290
+ /* @__PURE__ */ jsxDEV15("text", {
6291
+ fg: theme.accent,
6292
+ children: "Back"
6293
+ }, undefined, false, undefined, this),
6294
+ /* @__PURE__ */ jsxDEV15("text", {
6295
+ fg: theme.dim,
6296
+ children: " [Q] or [Esc]"
6297
+ }, undefined, false, undefined, this)
6298
+ ]
6220
6299
  }, undefined, true, undefined, this)
6221
6300
  ]
6222
6301
  }, undefined, true, undefined, this)
@@ -6460,7 +6539,7 @@ function AddCustomScreen() {
6460
6539
  children: /* @__PURE__ */ jsxDEV16("box", {
6461
6540
  flexDirection: "column",
6462
6541
  border: true,
6463
- borderStyle: "rounded",
6542
+ borderStyle: "single",
6464
6543
  borderColor: theme.border,
6465
6544
  backgroundColor: theme.background,
6466
6545
  width: CARD_W,
@@ -6505,7 +6584,7 @@ function AddCustomScreen() {
6505
6584
  children: /* @__PURE__ */ jsxDEV16("box", {
6506
6585
  flexDirection: "column",
6507
6586
  border: true,
6508
- borderStyle: "rounded",
6587
+ borderStyle: "single",
6509
6588
  borderColor: theme.border,
6510
6589
  backgroundColor: theme.background,
6511
6590
  width: CARD_W,
@@ -6529,7 +6608,7 @@ function AddCustomScreen() {
6529
6608
  children: /* @__PURE__ */ jsxDEV16("box", {
6530
6609
  flexDirection: "column",
6531
6610
  border: true,
6532
- borderStyle: "rounded",
6611
+ borderStyle: "single",
6533
6612
  borderColor: theme.border,
6534
6613
  backgroundColor: theme.background,
6535
6614
  width: CARD_W,
@@ -6545,7 +6624,10 @@ function AddCustomScreen() {
6545
6624
  }, undefined, false, undefined, this),
6546
6625
  /* @__PURE__ */ jsxDEV16("box", {
6547
6626
  height: 1,
6548
- backgroundColor: theme.border
6627
+ children: /* @__PURE__ */ jsxDEV16("text", {
6628
+ fg: theme.border,
6629
+ children: "\u2500".repeat(150)
6630
+ }, undefined, false, undefined, this)
6549
6631
  }, undefined, false, undefined, this),
6550
6632
  /* @__PURE__ */ jsxDEV16("box", {
6551
6633
  paddingTop: 1,
@@ -6554,7 +6636,10 @@ function AddCustomScreen() {
6554
6636
  }, undefined, false, undefined, this),
6555
6637
  /* @__PURE__ */ jsxDEV16("box", {
6556
6638
  height: 1,
6557
- backgroundColor: theme.border
6639
+ children: /* @__PURE__ */ jsxDEV16("text", {
6640
+ fg: theme.border,
6641
+ children: "\u2500".repeat(150)
6642
+ }, undefined, false, undefined, this)
6558
6643
  }, undefined, false, undefined, this),
6559
6644
  /* @__PURE__ */ jsxDEV16("box", {
6560
6645
  flexDirection: "column",
@@ -6570,6 +6655,16 @@ function AddCustomScreen() {
6570
6655
  width: "100%",
6571
6656
  flexDirection: "row",
6572
6657
  backgroundColor: i === typeCursor ? theme.border : "transparent",
6658
+ onMouseOver: () => setTypeCursor(i),
6659
+ onMouseDown: () => {
6660
+ setTypeCursor(i);
6661
+ if (i === 2) {
6662
+ navigate("model-menu");
6663
+ } else {
6664
+ setProviderType(i === 1 ? "anthropic" : "openai-compatible");
6665
+ setStep("id");
6666
+ }
6667
+ },
6573
6668
  children: [
6574
6669
  /* @__PURE__ */ jsxDEV16("text", {
6575
6670
  fg: i === typeCursor ? theme.text : theme.dim,
@@ -6771,6 +6866,46 @@ function AddCustomScreen() {
6771
6866
  }, undefined, false, undefined, this)
6772
6867
  }, undefined, false, undefined, this) : null
6773
6868
  ]
6869
+ }, undefined, true, undefined, this),
6870
+ /* @__PURE__ */ jsxDEV16("box", {
6871
+ height: 1,
6872
+ marginTop: 1,
6873
+ children: /* @__PURE__ */ jsxDEV16("text", {
6874
+ fg: theme.border,
6875
+ children: "\u2500".repeat(Math.min(CARD_W, 70))
6876
+ }, undefined, false, undefined, this)
6877
+ }, undefined, false, undefined, this),
6878
+ /* @__PURE__ */ jsxDEV16("box", {
6879
+ height: 1,
6880
+ flexDirection: "row",
6881
+ paddingLeft: 1,
6882
+ paddingRight: 1,
6883
+ onMouseDown: () => {
6884
+ if (step === "type")
6885
+ navigate("model-menu");
6886
+ else {
6887
+ setInputError("");
6888
+ const idx = stepIndex(step);
6889
+ if (idx <= 1)
6890
+ setStep("type");
6891
+ else
6892
+ setStep(STEPS[idx - 1]);
6893
+ }
6894
+ },
6895
+ children: [
6896
+ /* @__PURE__ */ jsxDEV16("text", {
6897
+ fg: theme.dim,
6898
+ children: "\u2190 "
6899
+ }, undefined, false, undefined, this),
6900
+ /* @__PURE__ */ jsxDEV16("text", {
6901
+ fg: theme.accent,
6902
+ children: "Back"
6903
+ }, undefined, false, undefined, this),
6904
+ /* @__PURE__ */ jsxDEV16("text", {
6905
+ fg: theme.dim,
6906
+ children: " [Esc]"
6907
+ }, undefined, false, undefined, this)
6908
+ ]
6774
6909
  }, undefined, true, undefined, this)
6775
6910
  ]
6776
6911
  }, undefined, true, undefined, this)
@@ -6911,42 +7046,74 @@ function AddModelsScreen() {
6911
7046
  children: /* @__PURE__ */ jsxDEV17("box", {
6912
7047
  flexDirection: "column",
6913
7048
  border: true,
6914
- borderStyle: "rounded",
7049
+ borderStyle: "single",
6915
7050
  borderColor: theme.border,
6916
7051
  backgroundColor: theme.background,
6917
7052
  width: CARD_W,
6918
- children: /* @__PURE__ */ jsxDEV17("box", {
6919
- flexDirection: "column",
6920
- paddingLeft: 2,
6921
- paddingRight: 2,
6922
- paddingTop: 1,
6923
- paddingBottom: 1,
6924
- children: [
6925
- /* @__PURE__ */ jsxDEV17("box", {
6926
- height: 1,
6927
- children: /* @__PURE__ */ jsxDEV17("text", {
6928
- fg: theme.success,
6929
- children: [
6930
- "Done! Added ",
6931
- addedModels.length,
6932
- " model",
6933
- addedModels.length !== 1 ? "s" : "",
6934
- " to ",
6935
- selectedProvider?.name,
6936
- "."
6937
- ]
6938
- }, undefined, true, undefined, this)
6939
- }, undefined, false, undefined, this),
6940
- /* @__PURE__ */ jsxDEV17("box", {
6941
- height: 1,
6942
- children: /* @__PURE__ */ jsxDEV17("text", {
6943
- fg: theme.dim,
6944
- children: "Press [Enter] to return"
7053
+ children: [
7054
+ /* @__PURE__ */ jsxDEV17("box", {
7055
+ flexDirection: "column",
7056
+ paddingLeft: 2,
7057
+ paddingRight: 2,
7058
+ paddingTop: 1,
7059
+ paddingBottom: 1,
7060
+ children: [
7061
+ /* @__PURE__ */ jsxDEV17("box", {
7062
+ height: 1,
7063
+ children: /* @__PURE__ */ jsxDEV17("text", {
7064
+ fg: theme.success,
7065
+ children: [
7066
+ "Done! Added ",
7067
+ addedModels.length,
7068
+ " model",
7069
+ addedModels.length !== 1 ? "s" : "",
7070
+ " to ",
7071
+ selectedProvider?.name,
7072
+ "."
7073
+ ]
7074
+ }, undefined, true, undefined, this)
7075
+ }, undefined, false, undefined, this),
7076
+ /* @__PURE__ */ jsxDEV17("box", {
7077
+ height: 1,
7078
+ children: /* @__PURE__ */ jsxDEV17("text", {
7079
+ fg: theme.dim,
7080
+ children: "Press [Enter] to return"
7081
+ }, undefined, false, undefined, this)
6945
7082
  }, undefined, false, undefined, this)
7083
+ ]
7084
+ }, undefined, true, undefined, this),
7085
+ /* @__PURE__ */ jsxDEV17("box", {
7086
+ height: 1,
7087
+ children: /* @__PURE__ */ jsxDEV17("text", {
7088
+ fg: theme.border,
7089
+ children: "\u2500".repeat(150)
6946
7090
  }, undefined, false, undefined, this)
6947
- ]
6948
- }, undefined, true, undefined, this)
6949
- }, undefined, false, undefined, this)
7091
+ }, undefined, false, undefined, this),
7092
+ /* @__PURE__ */ jsxDEV17("box", {
7093
+ height: 1,
7094
+ flexDirection: "row",
7095
+ paddingLeft: 2,
7096
+ paddingRight: 2,
7097
+ paddingTop: 1,
7098
+ paddingBottom: 1,
7099
+ onMouseDown: () => navigate("model-menu"),
7100
+ children: [
7101
+ /* @__PURE__ */ jsxDEV17("text", {
7102
+ fg: theme.dim,
7103
+ children: "\u2190 "
7104
+ }, undefined, false, undefined, this),
7105
+ /* @__PURE__ */ jsxDEV17("text", {
7106
+ fg: theme.accent,
7107
+ children: "Back to menu"
7108
+ }, undefined, false, undefined, this),
7109
+ /* @__PURE__ */ jsxDEV17("text", {
7110
+ fg: theme.dim,
7111
+ children: " [Enter]"
7112
+ }, undefined, false, undefined, this)
7113
+ ]
7114
+ }, undefined, true, undefined, this)
7115
+ ]
7116
+ }, undefined, true, undefined, this)
6950
7117
  }, undefined, false, undefined, this);
6951
7118
  }
6952
7119
  if (step === "add" && selectedProvider) {
@@ -6958,7 +7125,7 @@ function AddModelsScreen() {
6958
7125
  children: /* @__PURE__ */ jsxDEV17("box", {
6959
7126
  flexDirection: "column",
6960
7127
  border: true,
6961
- borderStyle: "rounded",
7128
+ borderStyle: "single",
6962
7129
  borderColor: theme.border,
6963
7130
  backgroundColor: theme.background,
6964
7131
  width: CARD_W,
@@ -6981,7 +7148,10 @@ function AddModelsScreen() {
6981
7148
  }, undefined, true, undefined, this),
6982
7149
  /* @__PURE__ */ jsxDEV17("box", {
6983
7150
  height: 1,
6984
- backgroundColor: theme.border
7151
+ children: /* @__PURE__ */ jsxDEV17("text", {
7152
+ fg: theme.border,
7153
+ children: "\u2500".repeat(150)
7154
+ }, undefined, false, undefined, this)
6985
7155
  }, undefined, false, undefined, this),
6986
7156
  /* @__PURE__ */ jsxDEV17("box", {
6987
7157
  flexDirection: "column",
@@ -7071,6 +7241,43 @@ function AddModelsScreen() {
7071
7241
  }, undefined, false, undefined, this)
7072
7242
  }, undefined, false, undefined, this)
7073
7243
  ]
7244
+ }, undefined, true, undefined, this),
7245
+ /* @__PURE__ */ jsxDEV17("box", {
7246
+ height: 1,
7247
+ children: /* @__PURE__ */ jsxDEV17("text", {
7248
+ fg: theme.border,
7249
+ children: "\u2500".repeat(150)
7250
+ }, undefined, false, undefined, this)
7251
+ }, undefined, false, undefined, this),
7252
+ /* @__PURE__ */ jsxDEV17("box", {
7253
+ height: 1,
7254
+ flexDirection: "row",
7255
+ paddingLeft: 2,
7256
+ paddingRight: 2,
7257
+ paddingTop: 1,
7258
+ paddingBottom: 1,
7259
+ onMouseDown: () => {
7260
+ setStep("pick");
7261
+ setSelectedProvider(null);
7262
+ setModelInput("");
7263
+ setAddedModels([]);
7264
+ setSaveError("");
7265
+ setInputError("");
7266
+ },
7267
+ children: [
7268
+ /* @__PURE__ */ jsxDEV17("text", {
7269
+ fg: theme.dim,
7270
+ children: "\u2190 "
7271
+ }, undefined, false, undefined, this),
7272
+ /* @__PURE__ */ jsxDEV17("text", {
7273
+ fg: theme.accent,
7274
+ children: "Back"
7275
+ }, undefined, false, undefined, this),
7276
+ /* @__PURE__ */ jsxDEV17("text", {
7277
+ fg: theme.dim,
7278
+ children: " [Esc]"
7279
+ }, undefined, false, undefined, this)
7280
+ ]
7074
7281
  }, undefined, true, undefined, this)
7075
7282
  ]
7076
7283
  }, undefined, true, undefined, this)
@@ -7084,7 +7291,7 @@ function AddModelsScreen() {
7084
7291
  children: /* @__PURE__ */ jsxDEV17("box", {
7085
7292
  flexDirection: "column",
7086
7293
  border: true,
7087
- borderStyle: "rounded",
7294
+ borderStyle: "single",
7088
7295
  borderColor: theme.border,
7089
7296
  backgroundColor: theme.background,
7090
7297
  width: CARD_W,
@@ -7100,7 +7307,10 @@ function AddModelsScreen() {
7100
7307
  }, undefined, false, undefined, this),
7101
7308
  /* @__PURE__ */ jsxDEV17("box", {
7102
7309
  height: 1,
7103
- backgroundColor: theme.border
7310
+ children: /* @__PURE__ */ jsxDEV17("text", {
7311
+ fg: theme.border,
7312
+ children: "\u2500".repeat(150)
7313
+ }, undefined, false, undefined, this)
7104
7314
  }, undefined, false, undefined, this),
7105
7315
  /* @__PURE__ */ jsxDEV17("box", {
7106
7316
  flexDirection: "column",
@@ -7133,6 +7343,16 @@ function AddModelsScreen() {
7133
7343
  width: "100%",
7134
7344
  flexDirection: "row",
7135
7345
  backgroundColor: isActive ? theme.border : "transparent",
7346
+ onMouseOver: () => setCursor(i),
7347
+ onMouseDown: () => {
7348
+ setCursor(i);
7349
+ setSelectedProvider(prov);
7350
+ setModelInput("");
7351
+ setAddedModels([]);
7352
+ setSaveError("");
7353
+ setInputError("");
7354
+ setStep("add");
7355
+ },
7136
7356
  children: [
7137
7357
  /* @__PURE__ */ jsxDEV17("text", {
7138
7358
  fg: theme.dim,
@@ -7161,6 +7381,36 @@ function AddModelsScreen() {
7161
7381
  }, prov.id, true, undefined, this);
7162
7382
  })
7163
7383
  ]
7384
+ }, undefined, true, undefined, this),
7385
+ /* @__PURE__ */ jsxDEV17("box", {
7386
+ height: 1,
7387
+ children: /* @__PURE__ */ jsxDEV17("text", {
7388
+ fg: theme.border,
7389
+ children: "\u2500".repeat(150)
7390
+ }, undefined, false, undefined, this)
7391
+ }, undefined, false, undefined, this),
7392
+ /* @__PURE__ */ jsxDEV17("box", {
7393
+ height: 1,
7394
+ flexDirection: "row",
7395
+ paddingLeft: 2,
7396
+ paddingRight: 2,
7397
+ paddingTop: 1,
7398
+ paddingBottom: 1,
7399
+ onMouseDown: () => navigate("model-menu"),
7400
+ children: [
7401
+ /* @__PURE__ */ jsxDEV17("text", {
7402
+ fg: theme.dim,
7403
+ children: "\u2190 "
7404
+ }, undefined, false, undefined, this),
7405
+ /* @__PURE__ */ jsxDEV17("text", {
7406
+ fg: theme.accent,
7407
+ children: "Back"
7408
+ }, undefined, false, undefined, this),
7409
+ /* @__PURE__ */ jsxDEV17("text", {
7410
+ fg: theme.dim,
7411
+ children: " [Esc]"
7412
+ }, undefined, false, undefined, this)
7413
+ ]
7164
7414
  }, undefined, true, undefined, this)
7165
7415
  ]
7166
7416
  }, undefined, true, undefined, this)
@@ -7179,9 +7429,12 @@ function ListProvidersScreen() {
7179
7429
  const { state } = useAppContext();
7180
7430
  const navigate = useNavigate();
7181
7431
  const theme = useTheme();
7432
+ function goBack() {
7433
+ navigate("model-menu");
7434
+ }
7182
7435
  useAppKeyboard((key) => {
7183
7436
  if (key.name === "escape" || key.name === "q") {
7184
- navigate("model-menu");
7437
+ goBack();
7185
7438
  }
7186
7439
  });
7187
7440
  if (state.isLoadingConfig) {
@@ -7196,44 +7449,37 @@ function ListProvidersScreen() {
7196
7449
  }, undefined, false, undefined, this);
7197
7450
  }
7198
7451
  const providers = state.config?.providers ?? [];
7199
- if (providers.length === 0) {
7200
- return /* @__PURE__ */ jsxDEV18("box", {
7201
- flexDirection: "column",
7202
- flexGrow: 1,
7203
- padding: 1,
7204
- children: [
7205
- /* @__PURE__ */ jsxDEV18("text", {
7206
- fg: theme.primary,
7207
- children: "Configured Providers"
7208
- }, undefined, false, undefined, this),
7209
- /* @__PURE__ */ jsxDEV18("box", {
7210
- marginTop: 1,
7211
- children: /* @__PURE__ */ jsxDEV18("text", {
7212
- fg: theme.warning,
7213
- children: "No providers configured yet."
7214
- }, undefined, false, undefined, this)
7215
- }, undefined, false, undefined, this)
7216
- ]
7217
- }, undefined, true, undefined, this);
7218
- }
7219
7452
  return /* @__PURE__ */ jsxDEV18("box", {
7220
7453
  flexDirection: "column",
7221
7454
  flexGrow: 1,
7222
7455
  padding: 1,
7223
7456
  children: [
7224
- /* @__PURE__ */ jsxDEV18("text", {
7225
- fg: theme.primary,
7226
- children: "Configured Providers"
7227
- }, undefined, false, undefined, this),
7228
7457
  /* @__PURE__ */ jsxDEV18("box", {
7229
- marginTop: 1,
7458
+ flexDirection: "row",
7459
+ marginBottom: 1,
7460
+ children: /* @__PURE__ */ jsxDEV18("text", {
7461
+ fg: theme.primary,
7462
+ bold: true,
7463
+ children: "Configured Providers"
7464
+ }, undefined, false, undefined, this)
7465
+ }, undefined, false, undefined, this),
7466
+ providers.length === 0 ? /* @__PURE__ */ jsxDEV18("box", {
7467
+ flexDirection: "column",
7468
+ flexGrow: 1,
7469
+ alignItems: "center",
7470
+ justifyContent: "center",
7471
+ children: /* @__PURE__ */ jsxDEV18("text", {
7472
+ fg: theme.warning,
7473
+ children: "No providers configured yet."
7474
+ }, undefined, false, undefined, this)
7475
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV18("box", {
7230
7476
  flexGrow: 1,
7231
7477
  children: /* @__PURE__ */ jsxDEV18("scrollbox", {
7232
7478
  focused: true,
7233
7479
  children: providers.map((provider, i) => /* @__PURE__ */ jsxDEV18("box", {
7234
7480
  flexDirection: "column",
7235
7481
  border: true,
7236
- borderStyle: "rounded",
7482
+ borderStyle: "single",
7237
7483
  borderColor: theme.border,
7238
7484
  backgroundColor: theme.background,
7239
7485
  marginBottom: 1,
@@ -7266,7 +7512,36 @@ function ListProvidersScreen() {
7266
7512
  ]
7267
7513
  }, i, true, undefined, this))
7268
7514
  }, undefined, false, undefined, this)
7269
- }, undefined, false, undefined, this)
7515
+ }, undefined, false, undefined, this),
7516
+ /* @__PURE__ */ jsxDEV18("box", {
7517
+ height: 1,
7518
+ marginTop: 1,
7519
+ children: /* @__PURE__ */ jsxDEV18("text", {
7520
+ fg: theme.border,
7521
+ children: "\u2500".repeat(70)
7522
+ }, undefined, false, undefined, this)
7523
+ }, undefined, false, undefined, this),
7524
+ /* @__PURE__ */ jsxDEV18("box", {
7525
+ height: 1,
7526
+ flexDirection: "row",
7527
+ paddingLeft: 1,
7528
+ paddingRight: 1,
7529
+ onMouseDown: goBack,
7530
+ children: [
7531
+ /* @__PURE__ */ jsxDEV18("text", {
7532
+ fg: theme.dim,
7533
+ children: "\u2190 "
7534
+ }, undefined, false, undefined, this),
7535
+ /* @__PURE__ */ jsxDEV18("text", {
7536
+ fg: theme.accent,
7537
+ children: "Back"
7538
+ }, undefined, false, undefined, this),
7539
+ /* @__PURE__ */ jsxDEV18("text", {
7540
+ fg: theme.dim,
7541
+ children: " [Q] or [Esc]"
7542
+ }, undefined, false, undefined, this)
7543
+ ]
7544
+ }, undefined, true, undefined, this)
7270
7545
  ]
7271
7546
  }, undefined, true, undefined, this);
7272
7547
  }
@@ -7281,9 +7556,12 @@ import { jsxDEV as jsxDEV19 } from "@opentui/react/jsx-dev-runtime";
7281
7556
  function FAQScreen() {
7282
7557
  const navigate = useNavigate();
7283
7558
  const theme = useTheme();
7559
+ function goBack() {
7560
+ navigate("main-menu");
7561
+ }
7284
7562
  useAppKeyboard((key) => {
7285
7563
  if (key.name === "escape" || key.name === "q") {
7286
- navigate("main-menu");
7564
+ goBack();
7287
7565
  }
7288
7566
  });
7289
7567
  return /* @__PURE__ */ jsxDEV19("box", {
@@ -7294,6 +7572,7 @@ function FAQScreen() {
7294
7572
  children: /* @__PURE__ */ jsxDEV19("box", {
7295
7573
  flexDirection: "column",
7296
7574
  width: 70,
7575
+ flexGrow: 1,
7297
7576
  children: [
7298
7577
  /* @__PURE__ */ jsxDEV19("box", {
7299
7578
  marginBottom: 1,
@@ -7306,13 +7585,14 @@ function FAQScreen() {
7306
7585
  /* @__PURE__ */ jsxDEV19("scrollbox", {
7307
7586
  focused: true,
7308
7587
  flexGrow: 1,
7588
+ style: { scrollbarOptions: { showArrows: true, trackOptions: { foregroundColor: theme.primary, backgroundColor: theme.border } } },
7309
7589
  children: /* @__PURE__ */ jsxDEV19("box", {
7310
7590
  flexDirection: "column",
7311
7591
  children: [
7312
7592
  /* @__PURE__ */ jsxDEV19("box", {
7313
7593
  flexDirection: "column",
7314
7594
  border: true,
7315
- borderStyle: "rounded",
7595
+ borderStyle: "single",
7316
7596
  borderColor: theme.border,
7317
7597
  padding: 1,
7318
7598
  marginBottom: 1,
@@ -7423,7 +7703,7 @@ function FAQScreen() {
7423
7703
  /* @__PURE__ */ jsxDEV19("box", {
7424
7704
  flexDirection: "column",
7425
7705
  border: true,
7426
- borderStyle: "rounded",
7706
+ borderStyle: "single",
7427
7707
  borderColor: theme.border,
7428
7708
  padding: 1,
7429
7709
  marginBottom: 1,
@@ -7489,7 +7769,7 @@ function FAQScreen() {
7489
7769
  /* @__PURE__ */ jsxDEV19("box", {
7490
7770
  flexDirection: "column",
7491
7771
  border: true,
7492
- borderStyle: "rounded",
7772
+ borderStyle: "single",
7493
7773
  borderColor: theme.border,
7494
7774
  padding: 1,
7495
7775
  marginBottom: 1,
@@ -7520,19 +7800,40 @@ function FAQScreen() {
7520
7800
  children: " \u2022 [*] in results means token count was estimated"
7521
7801
  }, undefined, false, undefined, this)
7522
7802
  ]
7523
- }, undefined, true, undefined, this),
7524
- /* @__PURE__ */ jsxDEV19("box", {
7525
- flexDirection: "row",
7526
- justifyContent: "center",
7527
- marginTop: 1,
7528
- children: /* @__PURE__ */ jsxDEV19("text", {
7529
- fg: theme.dim,
7530
- children: "Press [Q] or [Esc] to return to main menu"
7531
- }, undefined, false, undefined, this)
7532
- }, undefined, false, undefined, this)
7803
+ }, undefined, true, undefined, this)
7533
7804
  ]
7534
7805
  }, undefined, true, undefined, this)
7535
- }, undefined, false, undefined, this)
7806
+ }, undefined, false, undefined, this),
7807
+ /* @__PURE__ */ jsxDEV19("box", {
7808
+ height: 1,
7809
+ marginTop: 1,
7810
+ children: /* @__PURE__ */ jsxDEV19("text", {
7811
+ fg: theme.border,
7812
+ children: "\u2500".repeat(70)
7813
+ }, undefined, false, undefined, this)
7814
+ }, undefined, false, undefined, this),
7815
+ /* @__PURE__ */ jsxDEV19("box", {
7816
+ height: 1,
7817
+ width: "100%",
7818
+ flexDirection: "row",
7819
+ paddingLeft: 1,
7820
+ paddingRight: 1,
7821
+ onMouseDown: goBack,
7822
+ children: [
7823
+ /* @__PURE__ */ jsxDEV19("text", {
7824
+ fg: theme.dim,
7825
+ children: "\u2190 "
7826
+ }, undefined, false, undefined, this),
7827
+ /* @__PURE__ */ jsxDEV19("text", {
7828
+ fg: theme.accent,
7829
+ children: "Back to main menu"
7830
+ }, undefined, false, undefined, this),
7831
+ /* @__PURE__ */ jsxDEV19("text", {
7832
+ fg: theme.dim,
7833
+ children: " [Q] or [Esc]"
7834
+ }, undefined, false, undefined, this)
7835
+ ]
7836
+ }, undefined, true, undefined, this)
7536
7837
  ]
7537
7838
  }, undefined, true, undefined, this)
7538
7839
  }, undefined, false, undefined, this);
@@ -7553,7 +7854,7 @@ function getHints(screen, benchResults) {
7553
7854
  case "model-menu":
7554
7855
  return ["[\u2191\u2193] navigate", "[Enter] select", "[Q] back"];
7555
7856
  case "model-select":
7556
- return ["[\u2191\u2193] navigate", "[Tab] select", "[Enter] run", "[A] all", "[N] none", "[R] recent", "[Esc] back"];
7857
+ return ["[\u2191\u2193] nav [Tab] sel [Enter] run", "[A]ll [N]one [R]ecent [Esc] back"];
7557
7858
  case "benchmark": {
7558
7859
  const allDone = benchResults.length > 0 && benchResults.every((r) => r.status === "done" || r.status === "error");
7559
7860
  return allDone ? ["[R] rerun", "[Enter] back to menu", "[Q] back to menu"] : ["Benchmark in progress..."];