mirror of
https://gitcode.com/JianFeeeee/TrulyMEM-TrueHumanMEM.git
synced 2026-09-21 09:28:19 +00:00
Fix: F3 tool details toggle, sidebar width, and sync docs with code
- Fix F3 tool details: use display:none/block instead of re-compose - Increase sidebar width from 40 to 70 for readability - Sync 一键启动指南.md with actual entry points (trulymem_entry.py) - Rewrite 工作记忆链机制说明.md with actual task_* tool APIs - Rewrite 架构.md with actual file structure (38 Python files) - Update docs/README.md with complete feature list
This commit is contained in:
@ -22,7 +22,7 @@ LeftPanel {
|
||||
}
|
||||
|
||||
RightPanel {
|
||||
width: 40;
|
||||
width: 70;
|
||||
dock: right;
|
||||
background: $panel;
|
||||
overflow-y: auto;
|
||||
|
||||
@ -57,6 +57,18 @@ OperationLog {
|
||||
height: 1fr;
|
||||
margin: 1;
|
||||
overflow-y: auto;
|
||||
padding: 1;
|
||||
}
|
||||
|
||||
OperationLog .log-entry {
|
||||
color: $text;
|
||||
margin: 0 0 1 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
OperationLog .log-empty {
|
||||
color: $text-muted;
|
||||
text-style: italic;
|
||||
}
|
||||
|
||||
CypherQueryBox {
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
from textual.containers import Container, Vertical
|
||||
from textual.widgets import Static
|
||||
from textual.message import Message
|
||||
from textual.css.query import NoMatches
|
||||
from ..models.message import Message as MessageModel
|
||||
|
||||
|
||||
@ -14,6 +15,7 @@ class MessageWidget(Container):
|
||||
self._message = message
|
||||
self._show_tool_details = False
|
||||
self._content_widget = None # 保存内容组件的引用
|
||||
self._tool_details_container = None # 保存工具详情容器引用
|
||||
|
||||
def compose(self):
|
||||
"""构建消息组件"""
|
||||
@ -35,37 +37,42 @@ class MessageWidget(Container):
|
||||
# 工具调用指示器
|
||||
if self._message.tool_calls:
|
||||
tool_count = len(self._message.tool_calls)
|
||||
toggle_hint = "(F3折叠)" if self._show_tool_details else "(F3展开)"
|
||||
yield Static(
|
||||
f"[工具:{tool_count}次] (F3展开)",
|
||||
f"[工具:{tool_count}次] {toggle_hint}",
|
||||
classes="tool-indicator"
|
||||
)
|
||||
|
||||
# 工具调用详情(默认折叠)
|
||||
if self._show_tool_details:
|
||||
with Vertical(classes="tool-details"):
|
||||
for i, tool_call in enumerate(self._message.tool_calls, 1):
|
||||
yield Static(
|
||||
f"工具 {i}: {tool_call.name}",
|
||||
classes="tool-name"
|
||||
)
|
||||
yield Static(
|
||||
f"参数: {tool_call.arguments}",
|
||||
classes="tool-args"
|
||||
)
|
||||
# 工具调用详情容器 - 始终创建,但根据状态显示/隐藏
|
||||
self._tool_details_container = Vertical(classes="tool-details")
|
||||
with self._tool_details_container:
|
||||
for i, tool_call in enumerate(self._message.tool_calls, 1):
|
||||
yield Static(
|
||||
f"工具 {i}: {tool_call.name}",
|
||||
classes="tool-name"
|
||||
)
|
||||
yield Static(
|
||||
f"参数: {tool_call.arguments}",
|
||||
classes="tool-args"
|
||||
)
|
||||
|
||||
# 显示执行结果
|
||||
if self._message.tool_results:
|
||||
for result in self._message.tool_results:
|
||||
if result.tool_call_id == tool_call.id:
|
||||
# 显示完整结果,不截断
|
||||
result_text = result.result
|
||||
# 如果结果太长,只显示前1000字符,但提供完整信息
|
||||
if len(result_text) > 1000:
|
||||
result_text = result_text[:1000] + f"\n... (共{len(result.result)}字符,按F3查看完整内容)"
|
||||
yield Static(
|
||||
f"结果: {result_text}",
|
||||
classes="tool-result"
|
||||
)
|
||||
# 显示执行结果
|
||||
if self._message.tool_results:
|
||||
for result in self._message.tool_results:
|
||||
if result.tool_call_id == tool_call.id:
|
||||
# 显示完整结果,不截断
|
||||
result_text = result.result
|
||||
# 如果结果太长,只显示前1000字符,但提供完整信息
|
||||
if len(result_text) > 1000:
|
||||
result_text = result_text[:1000] + f"\n... (共{len(result.result)}字符,按F3查看完整内容)"
|
||||
yield Static(
|
||||
f"结果: {result_text}",
|
||||
classes="tool-result"
|
||||
)
|
||||
|
||||
# 根据状态设置初始显示/隐藏
|
||||
if not self._show_tool_details:
|
||||
self._tool_details_container.styles.display = "none"
|
||||
|
||||
def update_content(self, new_content: str) -> None:
|
||||
"""更新消息内容"""
|
||||
@ -75,6 +82,27 @@ class MessageWidget(Container):
|
||||
|
||||
def toggle_tool_details(self) -> None:
|
||||
"""切换工具详情显示状态"""
|
||||
if self._message.tool_calls:
|
||||
if self._message.tool_calls and self._tool_details_container:
|
||||
self._show_tool_details = not self._show_tool_details
|
||||
self.refresh()
|
||||
|
||||
# 切换显示/隐藏
|
||||
if self._show_tool_details:
|
||||
self._tool_details_container.styles.display = "block"
|
||||
else:
|
||||
self._tool_details_container.styles.display = "none"
|
||||
|
||||
# 更新指示器文字
|
||||
self._update_indicator()
|
||||
|
||||
# 刷新布局
|
||||
self.refresh(layout=True)
|
||||
|
||||
def _update_indicator(self) -> None:
|
||||
"""更新工具调用指示器文字"""
|
||||
try:
|
||||
indicator = self.query_one(".tool-indicator", Static)
|
||||
tool_count = len(self._message.tool_calls)
|
||||
toggle_hint = "(F3折叠)" if self._show_tool_details else "(F3展开)"
|
||||
indicator.update(f"[工具:{tool_count}次] {toggle_hint}")
|
||||
except NoMatches:
|
||||
pass
|
||||
|
||||
@ -34,7 +34,7 @@ class RightPanel(Container):
|
||||
self.styles.width = 0
|
||||
self.styles.display = "none"
|
||||
else:
|
||||
self.styles.width = 40
|
||||
self.styles.width = 70
|
||||
self.styles.display = "block"
|
||||
|
||||
def is_collapsed(self) -> bool:
|
||||
|
||||
Reference in New Issue
Block a user