diff --git a/src/cli/tui.ts b/src/cli/tui.ts index b8aa360..e16b7a7 100644 --- a/src/cli/tui.ts +++ b/src/cli/tui.ts @@ -13,8 +13,38 @@ const toolColors = { cyan: '\x1b[36m', green: '\x1b[32m', red: '\x1b[31m', + bold: '\x1b[1m', }; +/** Format a tool name like "gmail.list" → "Gmail: List" */ +function formatToolName(name: string): string { + const parts = name.split('.'); + return parts.map((p, i) => { + const capitalized = p.charAt(0).toUpperCase() + p.slice(1); + return i === 0 && parts.length > 1 ? capitalized + ':' : capitalized; + }).join(' '); +} + +/** Format tool args as a compact, readable summary instead of raw JSON. */ +function formatToolArgs(args: unknown): string { + if (!args || typeof args !== 'object') return ''; + const entries = Object.entries(args as Record); + if (entries.length === 0) return ''; + + const parts = entries.map(([key, value]) => { + if (typeof value === 'string') { + const display = value.length > 60 ? value.slice(0, 57) + '...' : value; + return `${key}: "${display}"`; + } + if (typeof value === 'number' || typeof value === 'boolean') { + return `${key}: ${value}`; + } + return `${key}: ${JSON.stringify(value)}`; + }); + + return parts.join(', '); +} + function loadSystemPrompt(): string { const paths = [ resolve(process.cwd(), 'SOUL.md'), @@ -48,7 +78,7 @@ export function registerTuiCommand(program: Command): void { setLogLevel(config.log_level); const { MinimalTui, startFullscreenTui } = await import('../frontends/tui/index.js'); const { NativeAgent } = await import('../backends/index.js'); - const { ToolRegistry, ToolExecutor, allBuiltinTools, createWebSearchTools, createProcessTools, ProcessManager } = await import('../tools/index.js'); + const { ToolRegistry, ToolExecutor, allBuiltinTools, createWebSearchTools, createProcessTools, ProcessManager, createGmailTools } = await import('../tools/index.js'); const { HookEngine } = await import('../hooks/index.js'); const { createModelRouter } = await import('../daemon/index.js'); @@ -97,6 +127,13 @@ export function registerTuiCommand(program: Command): void { toolRegistry.register(tool); } + // Register Gmail tools if configured + if (config.automation.gmail?.enabled) { + for (const tool of createGmailTools(config.automation.gmail)) { + toolRegistry.register(tool); + } + } + const toolExecutor = new ToolExecutor(toolRegistry, hookEngine); const session = sessionManager.getSession('tui', 'local'); @@ -109,8 +146,9 @@ export function registerTuiCommand(program: Command): void { toolExecutor, onToolUse: (event) => { if (event.type === 'start') { - const argsStr = event.args ? ` ${toolColors.dim}${JSON.stringify(event.args)}${toolColors.reset}` : ''; - process.stdout.write(`${toolColors.cyan}> ${event.tool}${toolColors.reset}${argsStr}\n`); + const label = formatToolName(event.tool); + const argsStr = event.args ? ` ${toolColors.dim}(${formatToolArgs(event.args)})${toolColors.reset}` : ''; + process.stdout.write(`${toolColors.cyan}> ${toolColors.bold}${label}${toolColors.reset}${argsStr}\n`); } else if (event.type === 'end' && event.result) { const icon = event.result.success ? `${toolColors.green}done` : `${toolColors.red}error`; const detail = event.result.success