fix: stabilize ci checks

This commit is contained in:
Peter Steinberger
2026-01-19 00:34:16 +00:00
parent 2f6b5ffdfe
commit d9384785a3
35 changed files with 197 additions and 268 deletions

View File

@@ -13,8 +13,16 @@ const mockTheme: SearchableSelectListTheme = {
};
const testItems = [
{ value: "anthropic/claude-3-opus", label: "anthropic/claude-3-opus", description: "Claude 3 Opus" },
{ value: "anthropic/claude-3-sonnet", label: "anthropic/claude-3-sonnet", description: "Claude 3 Sonnet" },
{
value: "anthropic/claude-3-opus",
label: "anthropic/claude-3-opus",
description: "Claude 3 Opus",
},
{
value: "anthropic/claude-3-sonnet",
label: "anthropic/claude-3-sonnet",
description: "Claude 3 Sonnet",
},
{ value: "openai/gpt-4", label: "openai/gpt-4", description: "GPT-4" },
{ value: "openai/gpt-4-turbo", label: "openai/gpt-4-turbo", description: "GPT-4 Turbo" },
{ value: "google/gemini-pro", label: "google/gemini-pro", description: "Gemini Pro" },
@@ -50,7 +58,11 @@ describe("SearchableSelectList", () => {
const items = [
{ value: "openrouter/auto", label: "openrouter/auto", description: "Routes to best" },
{ value: "opus-direct", label: "opus-direct", description: "Direct opus model" },
{ value: "anthropic/claude-3-opus", label: "anthropic/claude-3-opus", description: "Claude 3 Opus" },
{
value: "anthropic/claude-3-opus",
label: "anthropic/claude-3-opus",
description: "Claude 3 Opus",
},
];
const list = new SearchableSelectList(items, 5, mockTheme);
@@ -66,7 +78,11 @@ describe("SearchableSelectList", () => {
it("exact label match beats description match", () => {
const items = [
{ value: "provider/other", label: "provider/other", description: "This mentions opus in description" },
{
value: "provider/other",
label: "provider/other",
description: "This mentions opus in description",
},
{ value: "provider/opus-model", label: "provider/opus-model", description: "Something else" },
];
const list = new SearchableSelectList(items, 5, mockTheme);

View File

@@ -98,7 +98,11 @@ export class SearchableSelectList implements Component {
exactLabel.sort(this.compareByScore);
wordBoundary.sort(this.compareByScore);
descriptionMatches.sort(this.compareByScore);
const fuzzyMatches = fuzzyFilter(fuzzyCandidates, query, (i) => `${i.label} ${i.description ?? ""}`);
const fuzzyMatches = fuzzyFilter(
fuzzyCandidates,
query,
(i) => `${i.label} ${i.description ?? ""}`,
);
return [
...exactLabel.map((s) => s.item),
...wordBoundary.map((s) => s.item),
@@ -133,7 +137,10 @@ export class SearchableSelectList implements Component {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
private compareByScore = (a: { item: SelectItem; score: number }, b: { item: SelectItem; score: number }) => {
private compareByScore = (
a: { item: SelectItem; score: number },
b: { item: SelectItem; score: number },
) => {
if (a.score !== b.score) return a.score - b.score;
return this.getItemLabel(a.item).localeCompare(this.getItemLabel(b.item));
};
@@ -190,7 +197,10 @@ export class SearchableSelectList implements Component {
// Calculate visible range with scrolling
const startIndex = Math.max(
0,
Math.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),
Math.min(
this.selectedIndex - Math.floor(this.maxVisible / 2),
this.filteredItems.length - this.maxVisible,
),
);
const endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);
@@ -211,7 +221,12 @@ export class SearchableSelectList implements Component {
return lines;
}
private renderItemLine(item: SelectItem, isSelected: boolean, width: number, query: string): string {
private renderItemLine(
item: SelectItem,
isSelected: boolean,
width: number,
query: string,
): string {
const prefix = isSelected ? "→ " : " ";
const prefixWidth = prefix.length;
const displayValue = this.getItemLabel(item);

View File

@@ -7,7 +7,11 @@ import {
import { normalizeAgentId } from "../routing/session-key.js";
import { helpText, parseCommand } from "./commands.js";
import type { ChatLog } from "./components/chat-log.js";
import { createSearchableSelectList, createSelectList, createSettingsList } from "./components/selectors.js";
import {
createSearchableSelectList,
createSelectList,
createSettingsList,
} from "./components/selectors.js";
import type { GatewayChatClient } from "./gateway-chat.js";
import { formatStatusSummary } from "./tui-status-summary.js";
import type {

View File

@@ -22,10 +22,7 @@ import { editorTheme, theme } from "./theme/theme.js";
import { createCommandHandlers } from "./tui-command-handlers.js";
import { createEventHandlers } from "./tui-event-handlers.js";
import { formatTokens } from "./tui-formatters.js";
import {
buildWaitingStatusMessage,
defaultWaitingPhrases,
} from "./tui-waiting.js";
import { buildWaitingStatusMessage, defaultWaitingPhrases } from "./tui-waiting.js";
import { createOverlayHandlers } from "./tui-overlays.js";
import { createSessionActions } from "./tui-session-actions.js";
import type {
@@ -335,8 +332,7 @@ export async function runTui(opts: TuiOptions) {
// Pick a phrase once per waiting session.
if (!waitingPhrase) {
const idx = Math.floor(Math.random() * defaultWaitingPhrases.length);
waitingPhrase =
defaultWaitingPhrases[idx] ?? defaultWaitingPhrases[0] ?? "waiting";
waitingPhrase = defaultWaitingPhrases[idx] ?? defaultWaitingPhrases[0] ?? "waiting";
}
waitingTick = 0;