import { Option, SelectProps } from '@inkjs/ui' import chalk from 'chalk' import { Box, Text, useInput } from 'ink' import Link from 'ink-link' import React, { useState } from 'react' import { getTheme } from '../../utils/theme' import { Select } from '../CustomSelect/select' import type { Tool } from '../../Tool' import type { NormalizedMessage } from '../../utils/messages' import { BinaryFeedbackOption } from './BinaryFeedbackOption' import type { AssistantMessage } from '../../query' import type { BinaryFeedbackChoose } from './utils' import { useExitOnCtrlCD } from '../../hooks/useExitOnCtrlCD' import { BinaryFeedbackChoice } from './utils' import { PRODUCT_NAME } from '../../constants/product' const HELP_URL = 'https://go/cli-feedback' type BinaryFeedbackOption = Option & { value: BinaryFeedbackChoice } // Make options a function to avoid early theme access during module initialization export function getOptions(): BinaryFeedbackOption[] { return [ { // This option combines the follow user intents: // - The two options look about equally good to me // - I don't feel confident enough to choose // - I don't want to choose right now label: 'Choose for me', value: 'no-preference', }, { label: 'Left option looks better', value: 'prefer-left', }, { label: 'Right option looks better', value: 'prefer-right', }, { label: `Neither, and tell ${PRODUCT_NAME} what to do differently (${chalk.bold.hex(getTheme().warning)('esc')})`, value: 'neither', }, ] } type Props = { m1: AssistantMessage m2: AssistantMessage onChoose?: BinaryFeedbackChoose debug: boolean erroredToolUseIDs: Set inProgressToolUseIDs: Set normalizedMessages: NormalizedMessage[] tools: Tool[] unresolvedToolUseIDs: Set verbose: boolean } export function BinaryFeedbackView({ m1, m2, onChoose, debug, erroredToolUseIDs, inProgressToolUseIDs, normalizedMessages, tools, unresolvedToolUseIDs, verbose, }: Props) { const theme = getTheme() const [focused, setFocus] = useState('no-preference') const [focusValue, setFocusValue] = useState(undefined) const exitState = useExitOnCtrlCD(() => process.exit(1)) useInput((_input, key) => { if (key.leftArrow) { setFocusValue('prefer-left') } else if (key.rightArrow) { setFocusValue('prefer-right') } else if (key.escape) { onChoose?.('neither') } }) return ( <> [ANT-ONLY] Help train {PRODUCT_NAME} [?] How do you want to proceed?