diff --git a/ui-tui/packages/hermes-ink/src/entry-exports.ts b/ui-tui/packages/hermes-ink/src/entry-exports.ts index 58c4e69763..6ef1fc5fbd 100644 --- a/ui-tui/packages/hermes-ink/src/entry-exports.ts +++ b/ui-tui/packages/hermes-ink/src/entry-exports.ts @@ -1,4 +1,3 @@ -export { default as TextInput, UncontrolledTextInput } from 'ink-text-input' export { default as useStderr } from './hooks/use-stderr.js' export { default as useStdout } from './hooks/use-stdout.js' export { Ansi } from './ink/Ansi.js' @@ -13,7 +12,7 @@ export { default as Spacer } from './ink/components/Spacer.js' export { default as Text } from './ink/components/Text.js' export { default as useApp } from './ink/hooks/use-app.js' export { useDeclaredCursor } from './ink/hooks/use-declared-cursor.js' -export { useExternalProcess, withInkSuspended, type RunExternalProcess } from './ink/hooks/use-external-process.js' +export { type RunExternalProcess, useExternalProcess, withInkSuspended } from './ink/hooks/use-external-process.js' export { default as useInput } from './ink/hooks/use-input.js' export { useHasSelection, useSelection } from './ink/hooks/use-selection.js' export { default as useStdin } from './ink/hooks/use-stdin.js' @@ -24,3 +23,4 @@ export { useTerminalViewport } from './ink/hooks/use-terminal-viewport.js' export { default as measureElement } from './ink/measure-element.js' export { createRoot, default as render, renderSync } from './ink/root.js' export { stringWidth } from './ink/stringWidth.js' +export { default as TextInput, UncontrolledTextInput } from 'ink-text-input' diff --git a/ui-tui/src/app/useMainApp.ts b/ui-tui/src/app/useMainApp.ts index f83633cdab..159489eb32 100644 --- a/ui-tui/src/app/useMainApp.ts +++ b/ui-tui/src/app/useMainApp.ts @@ -1,4 +1,4 @@ -import { useApp, useHasSelection, useSelection, useStdout, type ScrollBoxHandle } from '@hermes/ink' +import { type ScrollBoxHandle, useApp, useHasSelection, useSelection, useStdout } from '@hermes/ink' import { useStore } from '@nanostores/react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' @@ -426,9 +426,11 @@ export function useMainApp(gw: GatewayClient) { composerActions, composerRefs, gateway, + panel, sendQueued, session.newSession, session.resetSession, + session.resumeById, stdout, sys ] diff --git a/ui-tui/src/app/useSessionLifecycle.ts b/ui-tui/src/app/useSessionLifecycle.ts index d54e9ae96e..8114916c62 100644 --- a/ui-tui/src/app/useSessionLifecycle.ts +++ b/ui-tui/src/app/useSessionLifecycle.ts @@ -11,7 +11,7 @@ import type { SetupStatusResponse } from '../gatewayTypes.js' import { asRpcResult } from '../lib/rpc.js' -import type { Msg, SessionInfo, Usage } from '../types.js' +import type { Msg, PanelSection, SessionInfo, Usage } from '../types.js' import type { ComposerActions, GatewayRpc, StateSetter } from './interfaces.js' import { patchOverlayState } from './overlayStore.js' @@ -39,7 +39,7 @@ export interface UseSessionLifecycleOptions { colsRef: { current: number } composerActions: ComposerActions gw: GatewayClient - panel: (title: string, sections: import('../types.js').PanelSection[]) => void + panel: (title: string, sections: PanelSection[]) => void rpc: GatewayRpc setHistoryItems: StateSetter setLastUserMsg: StateSetter diff --git a/ui-tui/src/components/textInput.tsx b/ui-tui/src/components/textInput.tsx index 2e7791e25c..f2bbee63cf 100644 --- a/ui-tui/src/components/textInput.tsx +++ b/ui-tui/src/components/textInput.tsx @@ -307,8 +307,11 @@ export function TextInput({ const raw = self.current ? vRef.current : value const display = mask ? raw.replace(/[^\n]/g, mask[0] ?? '*') : raw - const selected = - sel && sel.start !== sel.end ? { end: Math.max(sel.start, sel.end), start: Math.min(sel.start, sel.end) } : null + const selected = useMemo( + () => + sel && sel.start !== sel.end ? { end: Math.max(sel.start, sel.end), start: Math.min(sel.start, sel.end) } : null, + [sel] + ) const layout = useMemo(() => cursorLayout(display, cur, columns), [columns, cur, display])