- utils/api_client.py -> utils/api_client/ (mixin-based) - utils/tool_result_formatter.py -> utils/tool_result_formatter/ (by tool category) - core/main_terminal_parts/tools_definition.py -> core/main_terminal_parts/tools_definition/ (by tool group) - Update AGENTS.md, CLAUDE.md, and split memory index - Keep original files as compatibility re-exports - Includes TerminalPanel display adjustment and ToolAction.vue diff line fix
52 lines
1.8 KiB
Python
52 lines
1.8 KiB
Python
"""将工具执行结果转换为对话上下文可用的纯文本摘要。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
from typing import Any, Dict, List, Optional, Tuple
|
||
|
||
|
||
def _format_failure(tag: str, result_data: Dict[str, Any]) -> str:
|
||
error = result_data.get("error") or result_data.get("message") or "未知错误"
|
||
suggestion = result_data.get("suggestion")
|
||
details = result_data.get("details")
|
||
parts = [f"⚠️ {tag} 失败: {error}"]
|
||
if suggestion:
|
||
parts.append(f"建议:{suggestion}")
|
||
elif isinstance(details, str) and details:
|
||
parts.append(f"详情:{details}")
|
||
elif isinstance(details, dict):
|
||
detail_msg = details.get("message") or details.get("error")
|
||
if detail_msg:
|
||
parts.append(f"详情:{detail_msg}")
|
||
return ";".join(parts)
|
||
|
||
def _summarize_output_block(output: Optional[str], truncated: Optional[bool]) -> str:
|
||
if not output:
|
||
return "无可见输出"
|
||
lines = output.splitlines()
|
||
line_count = len(lines)
|
||
char_count = len(output)
|
||
meta = f"输出 {line_count} 行 / {char_count} 字符"
|
||
if truncated:
|
||
meta += "(已截断)"
|
||
return f"{meta}\n```\n{output}\n```"
|
||
|
||
def _preview_text(text: str, limit: int) -> Tuple[str, bool]:
|
||
"""返回截断预览及是否截断标记。"""
|
||
if text is None:
|
||
return "", False
|
||
if len(text) <= limit:
|
||
return text, False
|
||
return text[:limit], True
|
||
|
||
def _summarize_todo_tasks(todo: Optional[Dict[str, Any]]) -> str:
|
||
if not isinstance(todo, dict):
|
||
return ""
|
||
tasks = todo.get("tasks") or []
|
||
parts = []
|
||
for task in tasks:
|
||
status_icon = "✅" if task.get("status") == "done" else "⬜️"
|
||
parts.append(f"{status_icon} task{task.get('index')}: {task.get('title')}")
|
||
return ";".join(parts)
|