feat(tui,gemini): implement verbose transfer and url image fetch

This commit is contained in:
William Valentin
2026-02-17 10:58:14 -08:00
parent 77ae15b3e2
commit e3b6f9df7c
8 changed files with 254 additions and 30 deletions
+18 -3
View File
@@ -51,6 +51,7 @@ export interface AppProps {
hookEngine?: HookEngine;
modelProviderConfigs?: Partial<Record<ModelProvider, ModelConfig>>;
contextThresholdPct?: number;
onTransfer?: (target: string) => string | void;
onExit?: () => void;
}
@@ -64,6 +65,7 @@ export function App({
hookEngine,
modelProviderConfigs,
contextThresholdPct,
onTransfer,
onExit,
}: AppProps): React.ReactElement {
const { exit } = useApp();
@@ -92,6 +94,9 @@ export function App({
if (!agent) {return;}
const handleToolEvent = (event: ToolUseEvent) => {
if (!verbose) {
return;
}
if (event.type === 'start') {
const label = formatToolName(event.tool);
const argsStr = event.args ? ` (${formatToolArgs(event.args)})` : '';
@@ -114,7 +119,7 @@ export function App({
return () => {
agent.setOnToolUse(undefined);
};
}, [agent]);
}, [agent, verbose]);
// Inline confirmations for dangerous tools (e.g. shell.exec) in fullscreen mode.
useEffect(() => {
@@ -367,9 +372,18 @@ export function App({
case 'fullscreen':
return;
case 'transfer':
setMessages(prev => [...prev, session.addMessage({ role: 'assistant', content: 'Transfer not supported in fullscreen mode.' })]);
case 'transfer': {
if (!onTransfer) {
setMessages(prev => [...prev, session.addMessage({ role: 'assistant', content: 'Transfer target is not available in fullscreen mode.' })]);
return;
}
const result = onTransfer(command.target);
const content = typeof result === 'string' && result.trim()
? result
: `Transfer requested: ${command.target}`;
setMessages(prev => [...prev, session.addMessage({ role: 'assistant', content })]);
return;
}
case 'queue': {
if (!command.action || command.action === 'show') {
@@ -572,6 +586,7 @@ export function App({
tokenUsage.inputTokens,
tokenUsage.outputTokens,
modelProviderConfigs,
onTransfer,
]);
return (