@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
JavaScript
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