UNPKG

@nanocollective/nanocoder

Version:

A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter

34 lines 3.51 kB
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime"; import { Box, Text } from 'ink'; import Spinner from 'ink-spinner'; import CancellingIndicator from '../../components/cancelling-indicator.js'; import QuestionPrompt from '../../components/question-prompt.js'; import ToolConfirmation from '../../components/tool-confirmation.js'; import ToolExecutionIndicator from '../../components/tool-execution-indicator.js'; import UserInput from '../../components/user-input.js'; import { useTheme } from '../../hooks/useTheme.js'; import { LiveCompactCounts } from '../../utils/tool-result-display.js'; /** * Chat input component that handles user input and tool interactions. * * Unlike ChatHistory, this component CAN be conditionally mounted/unmounted. * It does not contain ink's Static component, so it's safe to hide when * modal dialogs are shown. */ export function ChatInput({ isCancelling, isToolExecuting, isToolConfirmationMode, isQuestionMode, pendingToolCalls, currentToolIndex, pendingQuestion, onQuestionAnswer, mcpInitialized, client, nonInteractivePrompt, nonInteractiveLoadingMessage, customCommands, inputDisabled, developmentMode, contextPercentUsed, compactToolCounts, onToggleCompactDisplay, compactToolDisplay, onToolConfirm, onToolCancel, onSubmit, onCancel, onToggleMode, }) { const { colors } = useTheme(); const loadingLabel = nonInteractivePrompt ? (nonInteractiveLoadingMessage ?? 'Loading...') : 'Loading...'; return (_jsxs(Box, { flexDirection: "column", marginLeft: -1, children: [compactToolCounts && Object.keys(compactToolCounts).length > 0 && (_jsx(LiveCompactCounts, { counts: compactToolCounts })), isCancelling && _jsx(CancellingIndicator, {}), isToolConfirmationMode && pendingToolCalls[currentToolIndex] ? (_jsx(ToolConfirmation, { toolCall: pendingToolCalls[currentToolIndex], onConfirm: onToolConfirm, onCancel: onToolCancel })) : /* Tool Execution - skip indicator for streaming tools (they show their own progress) */ isToolExecuting && pendingToolCalls[currentToolIndex] && pendingToolCalls[currentToolIndex].function.name !== 'execute_bash' ? (_jsx(ToolExecutionIndicator, { toolName: pendingToolCalls[currentToolIndex].function.name, currentIndex: currentToolIndex, totalTools: pendingToolCalls.length })) : /* Question Prompt (ask_question tool) */ isQuestionMode && pendingQuestion ? (_jsx(QuestionPrompt, { question: pendingQuestion, onAnswer: onQuestionAnswer })) : /* User Input */ mcpInitialized && client && !nonInteractivePrompt ? (_jsx(UserInput, { customCommands: customCommands, onSubmit: msg => void onSubmit(msg), disabled: inputDisabled, onCancel: onCancel, onToggleMode: onToggleMode, onToggleCompactDisplay: onToggleCompactDisplay, compactToolDisplay: compactToolDisplay, developmentMode: developmentMode, contextPercentUsed: contextPercentUsed })) : /* Client Missing */ mcpInitialized && !client ? (_jsx(_Fragment, {})) : /* Non-Interactive Complete */ nonInteractivePrompt && !nonInteractiveLoadingMessage ? (_jsx(Text, { color: colors.secondary, children: "Completed. Exiting." })) : ( /* Loading */ _jsxs(Text, { color: colors.secondary, children: [_jsx(Spinner, { type: "dots" }), " ", loadingLabel] }))] })); } //# sourceMappingURL=chat-input.js.map