Files
cline/cli/src/components/FeaturedModelPicker.tsx
T
BeeandSaoud Rizwan ac22d5d81a chore: add CLI type checking and caching to ci workflow (#9049)
* chore: add CLI type checking and caching to ci workflow

- Added a new cache step for CLI dependencies in the GitHub Actions test workflow to improve build performance.
- Included a step to install CLI dependencies using `npm ci`.
- Updated the `ci:check-all` script in `package.json` to include CLI type checking.
- Added a `cli:typecheck` script to handle type checking within the CLI directory.

* Fix type and import issues for cli

* Includes CI tests in test workflow

* use npx npm-run-all

* update ci:check-all

* ci: skip npm ci steps on cache hit in test workflow

Update the test workflow to conditionally run npm installation steps only when a cache hit is not found. This optimization reduces CI execution time by avoiding redundant dependency installations when the node_modules are already restored from cache.

* ci: update cache keys and add dependency verification in test workflow

Updated the cache keys for root, webview-ui, cli, and testing-platform dependencies by adding a version prefix (v1). This ensures a clean cache state and helps avoid potential corruption or mismatch issues.

Additionally, added a verification step in the test job to log cache hit status and check for the presence of key dependencies like biome and globby. This helps diagnose issues where the cache might be restored but dependencies are not correctly available for subsequent steps.

* update Verify and fix root dependencies

* fix type check script

* add isSettingsKey check

* update settingskey set

* apply feedback

* npx

* feat: flashing dot for streaming chat messages in CI (#9054)

Introduce an ink-spinner to the DotRow component to provide visual feedback when messages are being streamed. This improves the CLI user experience by clearly indicating that a tool call or message is currently in progress.

- Add `flashing` prop to `DotRow` component
- Replace static dot with `toggle8` spinner when `flashing` is true
- Update `ChatMessage` to pass `flashing` state based on `isStreaming` and `partial` message properties

Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>

* ci: simplify dependency caching using built-in npm cache

Replace manual actions/cache steps with setup-node's built-in npm caching feature across all workflow jobs. This change:

- Removes redundant cache action steps for root, webview-ui, cli, and testing-platform dependencies
- Uses setup-node's native `cache: 'npm'` option with `cache-dependency-path` to handle multiple package-lock.json files
- Eliminates conditional installation steps based on cache hits
- Reduces workflow complexity and maintenance overhead while maintaining caching functionality

The built-in caching provides the same performance benefits with less configuration and better integration with the Node.js setup action.

---------

Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
2026-02-04 03:34:14 +08:00

107 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Featured model picker component
* Shows curated models with labels (Best, New, Trending, FREE) and optional "Browse all" option
* Used in both onboarding (AuthView) and settings (SettingsPanelContent)
*/
import { Box, Text } from "ink"
import React from "react"
import { COLORS } from "../constants/colors"
import { type FeaturedModel, getAllFeaturedModels } from "../constants/featured-models"
interface FeaturedModelPickerProps {
selectedIndex: number
title?: string
showBrowseAll?: boolean
helpText?: string
}
export const FeaturedModelPicker: React.FC<FeaturedModelPickerProps> = ({
selectedIndex,
title,
showBrowseAll = true,
helpText = "Arrows to navigate, Enter to select",
}) => {
const featuredModels = getAllFeaturedModels()
return (
<Box flexDirection="column">
{title && (
<Text>
<Text bold color={COLORS.primaryBlue}>
{title}
</Text>
<Text> </Text>
</Text>
)}
{featuredModels.map((model, i) => {
const isSelected = i === selectedIndex
return (
<Box flexDirection="column" key={model.id} marginBottom={1}>
<Box>
<Text color={isSelected ? COLORS.primaryBlue : undefined}>{isSelected ? " " : " "}</Text>
<Text bold color={isSelected ? COLORS.primaryBlue : "white"}>
{model.name}
</Text>
{model.label && (
<Text>
<Text> </Text>
<Text backgroundColor={model.label === "FREE" ? "gray" : COLORS.primaryBlue} color="black">
{" "}
{model.label}{" "}
</Text>
</Text>
)}
</Box>
<Box paddingLeft={2}>
<Text color="gray">{model.description}</Text>
</Box>
</Box>
)
})}
{showBrowseAll && (
<Box>
<Text color={selectedIndex === featuredModels.length ? COLORS.primaryBlue : "white"}>
{selectedIndex === featuredModels.length ? " " : " "}
Browse all models...
</Text>
</Box>
)}
<Text> </Text>
<Text color="gray">{helpText}</Text>
</Box>
)
}
/**
* Get the maximum valid index for the featured model picker
* (includes "Browse all" option if showBrowseAll is true)
*/
export function getFeaturedModelMaxIndex(showBrowseAll: boolean = true): number {
const featuredModels = getAllFeaturedModels()
return showBrowseAll ? featuredModels.length : featuredModels.length - 1
}
/**
* Check if the selected index is the "Browse all" option
*/
export function isBrowseAllSelected(selectedIndex: number): boolean {
const featuredModels = getAllFeaturedModels()
return selectedIndex === featuredModels.length
}
/**
* Get the featured model at the given index, or null if "Browse all" is selected
*/
export function getFeaturedModelAtIndex(index: number): FeaturedModel | null {
const featuredModels = getAllFeaturedModels()
if (index >= 0 && index < featuredModels.length) {
return featuredModels[index]
}
return null
}