UNPKG

giga-code

Version:

A personal AI CLI assistant powered by Grok for local development.

140 lines 7.57 kB
"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; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = __importStar(require("react")); const ink_1 = require("ink"); const types_1 = require("../types"); const confirmation_service_1 = require("../utils/confirmation-service"); const confirmation_dialog_1 = __importDefault(require("./components/confirmation-dialog")); const mode_manager_1 = require("../utils/mode-manager"); function App({ agent }) { const [input, setInput] = (0, react_1.useState)(''); const [history, setHistory] = (0, react_1.useState)([]); const [isProcessing, setIsProcessing] = (0, react_1.useState)(false); const [confirmationOptions, setConfirmationOptions] = (0, react_1.useState)(null); const [currentMode, setCurrentMode] = (0, react_1.useState)(mode_manager_1.modeManager.getCurrentMode()); const { exit } = (0, ink_1.useApp)(); const confirmationService = confirmation_service_1.ConfirmationService.getInstance(); (0, react_1.useEffect)(() => { const handleConfirmationRequest = (options) => { setConfirmationOptions(options); }; confirmationService.on('confirmation-requested', handleConfirmationRequest); return () => { confirmationService.off('confirmation-requested', handleConfirmationRequest); }; }, [confirmationService]); // Reset confirmation service session on app start (0, react_1.useEffect)(() => { confirmationService.resetSession(); }, []); (0, ink_1.useInput)(async (inputChar, key) => { // If confirmation dialog is open, don't handle normal input if (confirmationOptions) { return; } // Handle Shift+Tab for mode cycling (Note: This is handled in ChatInterface now) if (key.shift && key.tab) { return; } if (key.ctrl && inputChar === 'c') { exit(); return; } if (key.return) { if (input.trim() === 'exit' || input.trim() === 'quit') { exit(); return; } if (input.trim()) { setIsProcessing(true); const result = await agent.processCommand(input.trim()); setHistory(prev => [...prev, { command: input.trim(), result }]); setInput(''); setIsProcessing(false); } return; } if (key.backspace || key.delete) { setInput(prev => prev.slice(0, -1)); return; } if (inputChar && !key.ctrl && !key.meta) { setInput(prev => prev + inputChar); } }); const renderResult = (result) => { if (result.success) { return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "green" }, "\u2713 Success"), result.output && (react_1.default.createElement(ink_1.Box, { marginLeft: 2 }, react_1.default.createElement(ink_1.Text, null, result.output))))); } else { return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "red" }, "\u2717 Error"), result.error && (react_1.default.createElement(ink_1.Box, { marginLeft: 2 }, react_1.default.createElement(ink_1.Text, { color: "red" }, result.error))))); } }; const handleConfirmation = (dontAskAgain) => { confirmationService.confirmOperation(true, dontAskAgain); setConfirmationOptions(null); }; const handleRejection = (feedback) => { confirmationService.rejectOperation(feedback); setConfirmationOptions(null); }; if (confirmationOptions) { return (react_1.default.createElement(confirmation_dialog_1.default, { operation: confirmationOptions.operation, filename: confirmationOptions.filename, showVSCodeOpen: confirmationOptions.showVSCodeOpen, onConfirm: handleConfirmation, onReject: handleRejection })); } return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", padding: 1 }, react_1.default.createElement(ink_1.Box, { marginBottom: 1, flexDirection: "column" }, react_1.default.createElement(ink_1.Text, { bold: true, color: "cyan" }, "\uD83D\uDD27 Grok CLI - Text Editor Agent"), react_1.default.createElement(ink_1.Box, { marginTop: 1 }, react_1.default.createElement(ink_1.Text, { bold: true, color: currentMode === types_1.AgentMode.GIGA ? 'yellow' : currentMode === types_1.AgentMode.CHILL ? 'green' : 'blue' }, mode_manager_1.modeManager.getModeDisplayName()), react_1.default.createElement(ink_1.Text, { dimColor: true }, " - ", mode_manager_1.modeManager.getModeDescription()))), react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { dimColor: true }, "Available commands: view, str_replace, create, insert, undo_edit, bash, help"), react_1.default.createElement(ink_1.Text, { dimColor: true }, "Type 'help' for detailed usage, 'exit' or Ctrl+C to quit, Shift+Tab to cycle modes")), react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 }, history.slice(-10).map((entry, index) => (react_1.default.createElement(ink_1.Box, { key: index, flexDirection: "column", marginBottom: 1 }, react_1.default.createElement(ink_1.Box, null, react_1.default.createElement(ink_1.Text, { color: "blue" }, "$ "), react_1.default.createElement(ink_1.Text, null, entry.command)), renderResult(entry.result))))), react_1.default.createElement(ink_1.Box, null, react_1.default.createElement(ink_1.Text, { color: "blue" }, "$ "), react_1.default.createElement(ink_1.Text, null, input, !isProcessing && react_1.default.createElement(ink_1.Text, { color: "white" }, "\u2588")), isProcessing && react_1.default.createElement(ink_1.Text, { color: "yellow" }, " (processing...)")))); } exports.default = App; //# sourceMappingURL=app.js.map