import { Box, Text } from '@hermes/ink' import { useStore } from '@nanostores/react' import { useGateway } from '../app/gatewayContext.js' import type { AppOverlaysProps } from '../app/interfaces.js' import { $overlayState, patchOverlayState } from '../app/overlayStore.js' import { $uiState } from '../app/uiStore.js' import { FloatBox } from './appChrome.js' import { MaskedPrompt } from './maskedPrompt.js' import { ModelPicker } from './modelPicker.js' import { ApprovalPrompt, ClarifyPrompt } from './prompts.js' import { SessionPicker } from './sessionPicker.js' export function PromptZone({ cols, onApprovalChoice, onClarifyAnswer, onSecretSubmit, onSudoSubmit }: Pick) { const overlay = useStore($overlayState) const ui = useStore($uiState) if (overlay.approval) { return ( ) } if (overlay.clarify) { return ( onClarifyAnswer('')} req={overlay.clarify} t={ui.theme} /> ) } if (overlay.sudo) { return ( ) } if (overlay.secret) { return ( ) } return null } export function FloatingOverlays({ cols, compIdx, completions, onModelSelect, onPickerSelect, pagerPageSize }: Pick) { const { gw } = useGateway() const overlay = useStore($overlayState) const ui = useStore($uiState) const hasAny = overlay.modelPicker || overlay.pager || overlay.picker || completions.length if (!hasAny) { return null } const start = Math.max(0, compIdx - 8) return ( {overlay.picker && ( patchOverlayState({ picker: false })} onSelect={onPickerSelect} t={ui.theme} /> )} {overlay.modelPicker && ( patchOverlayState({ modelPicker: false })} onSelect={onModelSelect} sessionId={ui.sid} t={ui.theme} /> )} {overlay.pager && ( {overlay.pager.title && ( {overlay.pager.title} )} {overlay.pager.lines.slice(overlay.pager.offset, overlay.pager.offset + pagerPageSize).map((line, i) => ( {line} ))} {overlay.pager.offset + pagerPageSize < overlay.pager.lines.length ? `Enter/Space for more ยท q to close (${Math.min(overlay.pager.offset + pagerPageSize, overlay.pager.lines.length)}/${overlay.pager.lines.length})` : `end ยท q to close (${overlay.pager.lines.length} lines)`} )} {!!completions.length && ( {completions.slice(start, compIdx + 8).map((item, i) => { const active = start + i === compIdx return ( {' '} {item.display} {item.meta ? {item.meta} : null} ) })} )} ) }