giga-code
Version:
A personal AI CLI assistant powered by Grok for local development.
214 lines • 12.6 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 });
const react_1 = __importStar(require("react"));
const ink_1 = require("ink");
const prompts_1 = require("../../utils/prompts");
function PromptsList({ onClose, onSelectPrompt, selectedPrompt }) {
const [prompts, setPrompts] = (0, react_1.useState)([]);
const [allOptions, setAllOptions] = (0, react_1.useState)([]);
const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(0);
const [showContent, setShowContent] = (0, react_1.useState)(false);
const [justSelected, setJustSelected] = (0, react_1.useState)(null);
const [showSuccessMessage, setShowSuccessMessage] = (0, react_1.useState)(false);
(0, react_1.useEffect)(() => {
const promptsData = (0, prompts_1.loadPrompts)();
setPrompts(promptsData);
// Create options list with "None" option first, then all prompts
const noneOption = {
name: "GIGA (Default)",
content: "Use default GIGA assistant prompt with file editing and coding tools",
dateAdded: new Date().toISOString(),
isNone: true
};
const options = [noneOption, ...promptsData];
setAllOptions(options);
// Set initial selected index based on current selected prompt
if (selectedPrompt) {
const promptIndex = promptsData.findIndex(p => p.name === selectedPrompt);
if (promptIndex !== -1) {
setSelectedIndex(promptIndex + 1); // +1 because None is first
}
}
else {
setSelectedIndex(0); // None is selected
}
}, [selectedPrompt]);
(0, ink_1.useInput)((inputChar, key) => {
if (key.ctrl && inputChar === "c") {
onClose();
return;
}
if (key.escape) {
if (showContent) {
setShowContent(false);
}
else {
onClose();
}
return;
}
if (!showContent) {
if (key.upArrow) {
setSelectedIndex(prev => prev === 0 ? Math.max(0, allOptions.length - 1) : prev - 1);
return;
}
if (key.downArrow) {
setSelectedIndex(prev => allOptions.length === 0 ? 0 : (prev + 1) % allOptions.length);
return;
}
if (key.return) {
if (allOptions.length > 0 && selectedIndex < allOptions.length) {
// Select this prompt
const selected = allOptions[selectedIndex];
const promptName = 'isNone' in selected && selected.isNone ? null : selected.name;
setJustSelected(promptName);
setShowSuccessMessage(true);
if (onSelectPrompt) {
onSelectPrompt(promptName);
}
// Show success message briefly then close
setTimeout(() => {
onClose();
}, 1000);
}
return;
}
if (inputChar === ' ') {
// Space to select
if (allOptions.length > 0 && selectedIndex < allOptions.length) {
const selected = allOptions[selectedIndex];
const promptName = 'isNone' in selected && selected.isNone ? null : selected.name;
setJustSelected(promptName);
setShowSuccessMessage(true);
if (onSelectPrompt) {
onSelectPrompt(promptName);
}
// Show success message briefly then close
setTimeout(() => {
onClose();
}, 1000);
}
return;
}
if (inputChar === 'v' || inputChar === 'V') {
// 'v' to view content
if (allOptions.length > 0 && selectedIndex < allOptions.length) {
setShowContent(true);
}
return;
}
}
});
if (showSuccessMessage) {
const selectedName = justSelected || "GIGA (Default)";
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
react_1.default.createElement(ink_1.Text, { color: "green" }, "\u2705 System Prompt Changed!"),
react_1.default.createElement(ink_1.Box, { marginBottom: 1, borderStyle: "round", borderColor: "green", paddingX: 1 },
react_1.default.createElement(ink_1.Text, { color: "green" },
"Now using: ",
selectedName)),
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "Closing..."))));
}
if (allOptions.length <= 1) { // Only "GIGA" option exists
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\uD83C\uDFAF Select System Prompt"),
react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray" }, "No custom prompts added. Using default GIGA assistant.")),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 },
react_1.default.createElement(ink_1.Box, { borderStyle: "round", borderColor: "green", paddingX: 1 },
react_1.default.createElement(ink_1.Text, { color: "green" }, "\u25CF GIGA (Default)"))),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Space or Enter to confirm"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Use /add-prompt to add custom system prompts"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Custom prompts completely replace GIGA"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Esc to close"))));
}
if (showContent) {
const selectedOption = allOptions[selectedIndex];
const contentLines = selectedOption.content.split('\n');
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
react_1.default.createElement(ink_1.Text, { color: "yellow" },
"\uD83D\uDCDD Prompt: ",
selectedOption.name),
react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray" }, 'isNone' in selectedOption && selectedOption.isNone
? "Default system prompt"
: `Added: ${new Date(selectedOption.dateAdded).toLocaleDateString()}`)),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: "blue", paddingX: 1, marginBottom: 1, minHeight: 15 }, contentLines.map((line, index) => (react_1.default.createElement(ink_1.Text, { key: index }, line)))),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Space or Enter to select this prompt"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Esc to go back to prompt list"))));
}
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\uD83C\uDFAF Select System Prompt"),
react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray" },
"Current: ",
selectedPrompt || "GIGA (Default)")),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 }, allOptions.map((option, index) => {
const isSelected = index === selectedIndex;
const isCurrentlyActive = selectedPrompt === option.name || (!selectedPrompt && 'isNone' in option && option.isNone);
const dateAdded = 'isNone' in option && option.isNone
? "Default"
: new Date(option.dateAdded).toLocaleDateString();
const preview = option.content.length > 80
? option.content.substring(0, 80) + "..."
: option.content;
// Color coding: green for currently active, blue for selected, gray for others
let borderColor = "gray";
let textColor = "white";
if (isCurrentlyActive) {
borderColor = "green";
textColor = "green";
}
else if (isSelected) {
borderColor = "blue";
textColor = "blue";
}
return (react_1.default.createElement(ink_1.Box, { key: option.name, borderStyle: "round", borderColor: borderColor, paddingX: 1, marginBottom: 1 },
react_1.default.createElement(ink_1.Box, { flexDirection: "column", width: "100%" },
react_1.default.createElement(ink_1.Box, null,
react_1.default.createElement(ink_1.Box, { width: 25 },
react_1.default.createElement(ink_1.Text, { color: textColor },
isCurrentlyActive ? "● " : isSelected ? "▶ " : "○ ",
option.name)),
react_1.default.createElement(ink_1.Box, { flexGrow: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, dateAdded))),
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, preview.replace(/\n/g, ' '))))));
})),
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Use \u2191/\u2193 arrows to navigate"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Space or Enter to select prompt"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press V to view full content"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Custom prompts completely replace GIGA"),
react_1.default.createElement(ink_1.Text, { color: "green", dimColor: true }, "\u2022 Green = Currently active prompt"),
react_1.default.createElement(ink_1.Text, { color: "blue", dimColor: true }, "\u2022 Blue = Currently selected option"),
react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Esc to close"))));
}
exports.default = PromptsList;
//# sourceMappingURL=prompts-list.js.map