giga-code
Version:
A personal AI CLI assistant powered by Grok for local development.
241 lines • 12.5 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExpertModels = void 0;
const react_1 = __importStar(require("react"));
const ink_1 = require("ink");
const fuzzy_search_1 = require("../../utils/fuzzy-search");
const expert_models_manager_1 = require("../../utils/expert-models-manager");
const instance_models_1 = require("../../utils/instance-models");
const ExpertModels = ({ onExit }) => {
const { exit } = (0, ink_1.useApp)();
const [config, setConfig] = (0, react_1.useState)({
enabled: false,
fastModel: null,
codeModel: null,
reasoningModel: null,
toolsModel: null,
});
const [availableModels, setAvailableModels] = (0, react_1.useState)([]);
const [currentField, setCurrentField] = (0, react_1.useState)('enabled');
const [searchQuery, setSearchQuery] = (0, react_1.useState)('');
const [filteredModels, setFilteredModels] = (0, react_1.useState)([]);
const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(0);
const [showModelPicker, setShowModelPicker] = (0, react_1.useState)(false);
(0, react_1.useEffect)(() => {
// Load current expert models configuration
const expertConfig = expert_models_manager_1.expertModelsManager.getExpertModelsConfig();
setConfig(expertConfig);
// Load available models
const instanceModels = (0, instance_models_1.getInstanceAvailableModels)();
const models = instanceModels.map(m => ({
name: m.model,
provider: m.description.split('(')[1]?.split(')')[0] || 'Unknown'
}));
setAvailableModels(models);
setFilteredModels(models);
}, []);
(0, react_1.useEffect)(() => {
if (searchQuery) {
const filtered = (0, fuzzy_search_1.fuzzySearch)(searchQuery, availableModels, (model) => model.name);
setFilteredModels(filtered);
}
else {
setFilteredModels(availableModels);
}
setSelectedIndex(0);
}, [searchQuery, availableModels]);
(0, ink_1.useInput)((input, key) => {
if (key.escape) {
if (showModelPicker) {
setShowModelPicker(false);
setSearchQuery('');
}
else {
onExit();
}
return;
}
if (showModelPicker) {
if (key.upArrow) {
setSelectedIndex(Math.max(0, selectedIndex - 1));
}
else if (key.downArrow) {
setSelectedIndex(Math.min(filteredModels.length - 1, selectedIndex + 1));
}
else if (key.return) {
const selectedModel = filteredModels[selectedIndex];
if (selectedModel) {
const newConfig = { ...config };
switch (currentField) {
case 'fast':
newConfig.fastModel = selectedModel.name;
break;
case 'code':
newConfig.codeModel = selectedModel.name;
break;
case 'reasoning':
newConfig.reasoningModel = selectedModel.name;
break;
case 'tools':
newConfig.toolsModel = selectedModel.name;
break;
}
setConfig(newConfig);
expert_models_manager_1.expertModelsManager.setExpertModelsConfig(newConfig);
}
setShowModelPicker(false);
setSearchQuery('');
}
else if (key.backspace || key.delete) {
setSearchQuery(searchQuery.slice(0, -1));
}
else if (input && !key.ctrl && !key.meta) {
setSearchQuery(searchQuery + input);
}
}
else {
if (key.upArrow) {
const fields = ['enabled', 'fast', 'code', 'reasoning', 'tools'];
const currentIndex = fields.indexOf(currentField);
setCurrentField(fields[Math.max(0, currentIndex - 1)]);
}
else if (key.downArrow) {
const fields = ['enabled', 'fast', 'code', 'reasoning', 'tools'];
const currentIndex = fields.indexOf(currentField);
setCurrentField(fields[Math.min(fields.length - 1, currentIndex + 1)]);
}
else if (key.return) {
if (currentField === 'enabled') {
const newConfig = { ...config, enabled: !config.enabled };
setConfig(newConfig);
expert_models_manager_1.expertModelsManager.setExpertModelsConfig(newConfig);
}
else {
setShowModelPicker(true);
}
}
else if (key.backspace || key.delete) {
if (currentField !== 'enabled') {
const newConfig = { ...config };
switch (currentField) {
case 'fast':
newConfig.fastModel = null;
break;
case 'code':
newConfig.codeModel = null;
break;
case 'reasoning':
newConfig.reasoningModel = null;
break;
case 'tools':
newConfig.toolsModel = null;
break;
}
setConfig(newConfig);
expert_models_manager_1.expertModelsManager.setExpertModelsConfig(newConfig);
}
}
}
});
if (showModelPicker) {
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
react_1.default.createElement(ink_1.Text, { bold: true, color: "cyan" },
"Select Model for ",
currentField === 'fast' ? 'Fast Operations' :
currentField === 'code' ? 'Code Tasks' :
currentField === 'reasoning' ? 'Complex Reasoning' : 'Tool Operations'),
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Type to search, \u2191\u2193 to navigate, Enter to select, Esc to cancel"),
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
react_1.default.createElement(ink_1.Text, null,
"Search: ",
searchQuery)),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
filteredModels.slice(0, 10).map((model, index) => (react_1.default.createElement(ink_1.Box, { key: model.name },
react_1.default.createElement(ink_1.Text, { color: index === selectedIndex ? 'cyan' : 'white' },
index === selectedIndex ? '► ' : ' ',
model.name,
" ",
react_1.default.createElement(ink_1.Text, { dimColor: true },
"(",
model.provider,
")"))))),
filteredModels.length > 10 && (react_1.default.createElement(ink_1.Text, { dimColor: true },
"... and ",
filteredModels.length - 10,
" more")))));
}
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
react_1.default.createElement(ink_1.Text, { bold: true, color: "cyan" }, "Expert Models Configuration"),
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Use different models for different types of tasks"),
react_1.default.createElement(ink_1.Text, { dimColor: true }, "\u2191\u2193 to navigate, Enter to toggle/select, Backspace to clear, Esc to exit"),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 2 },
react_1.default.createElement(ink_1.Box, null,
react_1.default.createElement(ink_1.Text, { color: currentField === 'enabled' ? 'cyan' : 'white' },
currentField === 'enabled' ? '► ' : ' ',
"Expert Mode: ",
config.enabled ?
react_1.default.createElement(ink_1.Text, { color: "green" }, "Enabled") :
react_1.default.createElement(ink_1.Text, { color: "red" }, "Disabled"))),
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
react_1.default.createElement(ink_1.Text, { color: currentField === 'fast' ? 'cyan' : config.enabled ? 'white' : 'gray' },
currentField === 'fast' ? '► ' : ' ',
"Fast Operations: ",
config.fastModel ?
react_1.default.createElement(ink_1.Text, { color: "green" }, config.fastModel) :
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Not set"))),
react_1.default.createElement(ink_1.Box, null,
react_1.default.createElement(ink_1.Text, { color: currentField === 'code' ? 'cyan' : config.enabled ? 'white' : 'gray' },
currentField === 'code' ? '► ' : ' ',
"Code Tasks: ",
config.codeModel ?
react_1.default.createElement(ink_1.Text, { color: "green" }, config.codeModel) :
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Not set"))),
react_1.default.createElement(ink_1.Box, null,
react_1.default.createElement(ink_1.Text, { color: currentField === 'reasoning' ? 'cyan' : config.enabled ? 'white' : 'gray' },
currentField === 'reasoning' ? '► ' : ' ',
"Complex Reasoning: ",
config.reasoningModel ?
react_1.default.createElement(ink_1.Text, { color: "green" }, config.reasoningModel) :
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Not set"))),
react_1.default.createElement(ink_1.Box, null,
react_1.default.createElement(ink_1.Text, { color: currentField === 'tools' ? 'cyan' : config.enabled ? 'white' : 'gray' },
currentField === 'tools' ? '► ' : ' ',
"Tool Operations: ",
config.toolsModel ?
react_1.default.createElement(ink_1.Text, { color: "green" }, config.toolsModel) :
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Not set")))),
react_1.default.createElement(ink_1.Box, { marginTop: 2 },
react_1.default.createElement(ink_1.Text, { dimColor: true },
"\u2022 Fast: File navigation, simple commands",
'\n',
"\u2022 Code: Code editing, refactoring, syntax fixes",
'\n',
"\u2022 Reasoning: Complex problem solving, architecture decisions",
'\n',
"\u2022 Tools: Multi-tool workflows, complex orchestration"))));
};
exports.ExpertModels = ExpertModels;
//# sourceMappingURL=expert-models.js.map