capsule-ai-cli
Version:
The AI Model Orchestrator - Intelligent multi-model workflows with device-locked licensing
54 lines • 2.83 kB
JavaScript
import React from 'react';
import { Box, Text } from 'ink';
import SelectInput from 'ink-select-input';
import { getProviderColor } from '../utils/provider-colors.js';
import { getModelDisplayName } from '../utils/model-display.js';
import { ModelItem } from './ModelItem.js';
export const ModelSelector = ({ models = [], currentModel, provider, onSelect, onClose }) => {
const providerColor = getProviderColor(provider);
const items = models.map(model => ({
label: getModelDisplayName(model),
value: model,
isCurrent: model === currentModel
}));
if (models.length === 0) {
return (React.createElement(Box, { flexDirection: "column", borderStyle: "single", borderColor: "yellow", paddingX: 1 },
React.createElement(Text, { color: "yellow" },
"No models available for provider ",
provider)));
}
const maxVisibleItems = 10;
const showingAllItems = items.length <= maxVisibleItems;
return (React.createElement(Box, { flexDirection: "column", borderStyle: "single", borderColor: providerColor, paddingX: 1 },
React.createElement(Box, { marginBottom: 1 },
React.createElement(Text, { bold: true },
"Select a model for ",
React.createElement(Text, { color: providerColor }, provider),
":")),
React.createElement(Box, { marginBottom: 1 },
React.createElement(Box, { width: 35, flexShrink: 0 },
React.createElement(Text, { dimColor: true }, "Model")),
React.createElement(Box, { width: 8, flexShrink: 0 },
React.createElement(Text, { dimColor: true }, "Context")),
React.createElement(Box, { flexGrow: 1 },
React.createElement(Text, { dimColor: true }, "Input \u2192 Output"))),
React.createElement(SelectInput, { items: items, limit: maxVisibleItems, onSelect: (item) => {
onSelect(item.value);
onClose();
}, itemComponent: ({ isSelected, label }) => {
const item = items.find(i => i.label === label);
if (!item)
return null;
return (React.createElement(ModelItem, { isSelected: isSelected, label: label, value: item.value, provider: provider, isCurrent: item.isCurrent }));
} }),
!showingAllItems && (React.createElement(Box, { marginTop: 1 },
React.createElement(Text, { dimColor: true },
"Showing ",
maxVisibleItems,
" of ",
items.length,
" models"))),
React.createElement(Box, { marginTop: 1 },
React.createElement(Text, { dimColor: true }, "Press ESC to cancel"))));
};
//# sourceMappingURL=ModelSelector.js.map