abel533
a20dffa7a0
fix: 改进滚动 maxOffset 计算
...
使用 totalItems - visibleLines 替代 totalItems - 1
避免滚动到只剩1行内容的极端情况
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
a30dfa9ad0
fix: 修复滚动限制 + 自动检测Shell类型
...
滚动修复:
- scroll() 使用实际渲染行数而非消息数计算 maxOffset
- 解决 /help 等多行输出无法滚动到顶部的问题
Shell 检测:
- Windows 自动检测 PowerShell 7+ > Windows PowerShell > cmd.exe
- 动态调整 BashTool 描述,告知AI使用正确的命令语法
- 系统提示词包含详细的 Shell 使用指南(PowerShell cmdlets)
- header 显示检测到的 Shell 类型
- Unix 优先 bash,回退 sh
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
e47a3445df
fix: 修复代码审查发现的线程安全和边界问题
...
- render() 中对 volatile 字段取快照,避免跨线程竞争
- 光标位置 clamp 到 >= 0,防止小终端越界
- spinner 线程使用独立 spinnerLock 保护启停操作
- PrintStream 使用 try-with-resources 避免资源泄漏
- 终端高度 < 20 时隐藏标题框腾出空间
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
ffb94bb2f7
feat: 添加 Escape/Ctrl+C 中断 Agent 运行功能
...
- AgentLoop 添加 cancel()/resetCancel() 中断机制
- executeLoop 在每次迭代前和API调用后检查取消标志
- Escape 键和 Ctrl+C 在 Agent 运行时触发中断
- 快捷键栏更新提示
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
91190e180b
ui: 改进消息显示,添加空行分隔和更友好的初始提示
...
- 初始消息改为 Ready 提示(header已包含工具/命令信息)
- 用户消息前添加空行分隔,提升对话可读性
- 保持工具调用和系统消息紧凑展示
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
f28d2328ef
refactor: 权限/AskUser回调改为虚拟线程执行,避免锁竞争
...
- handlePermissionInput 回调在虚拟线程中执行
- confirmAskUser 回调在虚拟线程中执行
- 移除 confirmAskUser 中多余的 synchronized 嵌套
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
7199b4f2dd
fix: 修复消息区溢出布局问题,恢复Spacer弹性空白
...
- 消息区添加 .height(maxMessageLines) + .overflow(HIDDEN) 防止溢出
- 恢复 Spacer.create() 在消息少时填充空白
- AskUser工具添加调试日志帮助排查结构化回调
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
65bd5b5d9a
feat: interactive AskUser with arrow-key selection
...
- Add interactive option selection for AskUserQuestion tool
(arrow keys ↑↓, Enter confirm, 1-9 quick select, Esc cancel)
- Last option with '其他/Other' enters free text input mode
- New ASK_USER_STRUCTURED_CALLBACK in AskUserQuestionTool
accepts (question, options) BiFunction for structured interaction
- ClaudeCodeComponent renders option list with ❯ indicator
- Cursor position adjusts for variable-height ask area
- Falls back to simple text prompt when no options provided
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
2f645b9d85
enhance: improve header colors, streaming markdown, scroll preservation
...
- Header: use colored values (API cyan, model green, dir yellow, etc.)
- Markdown: render progressively during streaming (not just after completion)
- Streaming cursor appended to last rendered line
- Scroll: preserve user scroll offset during streaming token updates
- Previously reset to 0 on every token, now keeps user position
- All process info (tool calls, thinking) persists after completion
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
9a437889b7
enhance: ASCII logo header, thinking animation, markdown rendering
...
- Restore original ASCII coffee cup logo in header (dual-column layout)
- Fix shortcutBar to single line with height(1) constraint
- Add spinning animation for thinking indicator (◐◓◑◒ cycle at 120ms)
- Create MarkdownToText converter for assistant messages:
- Headers (# ## ###) with distinct colors and prefixes
- Bold (**text**) rendering
- Inline code (\code\) in yellow
- Code blocks with language label and │ prefix
- Ordered/unordered lists with bullet points
- Streaming messages show raw text; completed messages use markdown
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
b72fcfea79
fix: add thread safety for concurrent state modifications
...
- Add stateLock to synchronize all getState/setState read-modify-write
operations across UI thread and AgentLoop background threads
- Synchronize onInput, onPaste, addMessage, appendToStreamingMessage,
finishStreamingMessage, completeLastToolCall, setThinking, runAgent
- Extract addMessageInternal() to avoid double-locking
- Harden extractToolSummary with explicit indexOf checks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
75ecaeca58
enhance: improve tool call display with smart arg extraction
...
- Add extractToolSummary() to show human-readable tool arguments
(command: $ ..., file_path: path, pattern: ..., query: ...)
- Tool running state shows 'running...' suffix
- Tool completed state shows 'done' suffix
- Match original Claude Code tool status rendering style
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
02ab8c2777
enhance: improve assistant message rendering and console patching
...
- Split multi-line assistant messages into separate rendered lines
- Add streaming cursor (▌) indicator for in-progress responses
- Add patchConsole() to intercept System.out/err during TUI mode
- Handle empty assistant message edge case
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
45283c87e4
fix: improve command handling and add paste support
...
- Add ToolRegistry to ClaudeCodeComponent for proper command context
- Use ByteArrayOutputStream to capture command output in TUI mode
- Add onPaste() override for efficient multi-line paste handling
- Fix constructor to accept toolRegistry parameter
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
199ad6259b
refactor: cleanup unused imports, add conversation summary tracking
...
- Remove unused MarkdownRenderer import and field from ClaudeCodeComponent
- Add onFirstUserInput callback for conversation summary tracking
- Wire conversation summary in JinkReplSession
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago
abel533
601a1c9ea9
feat: add jink TUI framework integration
...
- Add jink dependency (io.mybatis.jink:jink:0.3.0-SNAPSHOT)
- Create UIMessage sealed interface for TUI message model
- Create ClaudeCodeComponent (main jink Component with full layout)
- Header box with rounded magenta border
- Message list with virtual scrolling
- Separator lines above/below input area
- Input area with prompt and placeholder
- Status bar and shortcut key bar
- Create JinkReplSession (jink-based REPL replacing JLine readLine loop)
- AgentLoop integration via callbacks -> setState
- Permission confirmation inline in TUI
- Streaming token display
- Update ClaudeCodeRunner to prefer jink TUI with legacy fallback
- Update AppConfig with JinkReplSession bean
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 month ago