fix: delete agent 500 error + dynamic personality + deployment guide

- Fix delete agent 500: clean up FK records (agent_llm_logs, permissions,
  schedules, executions, team_members) and unbind goals/tasks before delete
- Remove hardcoded personality templates in Android, replace with dynamic
  system prompt generation from name + description
- Set promptSectionsEnabled=false to bypass PromptComposer for personality
- Add Tencent Cloud Linux deployment guide (Docker Compose)
- Accumulated backend service updates, frontend UI fixes, Android app changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 01:17:21 +08:00
parent 86b98865e3
commit beff3fac8d
1084 changed files with 117315 additions and 1281 deletions

View File

@@ -495,6 +495,7 @@ async def file_write_tool(file_path: str, content: str, mode: str = "w") -> str:
f.write(raw)
else:
path.write_text(raw, encoding="utf-8")
logger.info("file_write 成功: %s (%d bytes)", path, enc_len)
return json.dumps(
{
"success": True,
@@ -6076,6 +6077,103 @@ CREATE_GITEA_ISSUE_SCHEMA = {
}
# ═══════════════════════════════════════════════════════════════
# 项目扫描工具 — 程序化扫描项目关键源文件
# ═══════════════════════════════════════════════════════════════
async def project_scan_tool(target_dir: str) -> str:
"""扫描项目目录,自动识别项目类型并读取关键源文件内容。
支持 Android (Kotlin/Java)、前端 (Vue/React)、Python (FastAPI/Flask)、Go 等项目类型。
自动按优先级读取 ViewModel/Screen/Repository/API 等核心文件。
返回格式化的 Markdown可直接用于代码分析。
Args:
target_dir: 项目根目录的绝对路径
Returns:
JSON: project_type, files_scanned, source_code (Markdown 格式)
"""
try:
from app.services.project_scanner import (
identify_project_type,
scan_source_code,
)
path = Path(target_dir).resolve()
if not path.exists():
return json.dumps(
{"error": f"目录不存在: {target_dir}"},
ensure_ascii=False,
)
if not path.is_dir():
return json.dumps(
{"error": f"路径不是目录: {target_dir}"},
ensure_ascii=False,
)
# 安全检查:遵守 LOCAL_FILE_TOOLS_ROOT 限制
try:
# 复用 file_read 的路径解析逻辑
from app.services.builtin_tools import _local_file_workspace_root
root = _local_file_workspace_root()
except Exception:
root = Path(".").resolve().parent
try:
path.relative_to(root)
except ValueError:
return json.dumps(
{"error": f"目录不在允许的范围内: {target_dir},允许根: {root}"},
ensure_ascii=False,
)
ptype = identify_project_type(path)
if not ptype:
# 列出目录结构作为降级方案
try:
top_items = sorted(
[p for p in path.iterdir() if not p.name.startswith('.')],
key=lambda p: (p.is_file(), p.name)
)[:50]
listing = "\n".join(
f"- {p.name}{'/' if p.is_dir() else ''}" for p in top_items
)
return json.dumps({
"project_type": "unknown",
"files_scanned": 0,
"source_code": f"## 目录结构: `{path}`\n\n{listing}\n",
}, ensure_ascii=False)
except (PermissionError, OSError) as e:
return json.dumps(
{"error": f"无法访问目录: {e}"},
ensure_ascii=False,
)
result_md = scan_source_code(path)
if not result_md:
return json.dumps({
"project_type": ptype,
"files_scanned": 0,
"source_code": f"未找到匹配的源文件 (项目类型: {ptype})\n",
}, ensure_ascii=False)
# 粗略统计文件数
file_count = result_md.count("#### `")
return json.dumps({
"project_type": ptype,
"files_scanned": file_count,
"source_code": result_md,
}, ensure_ascii=False)
except Exception as e:
logger.exception("项目扫描工具异常: %s", e)
return json.dumps(
{"error": f"项目扫描失败: {e}"},
ensure_ascii=False,
)
# ═══════════════════════════════════════════════════════════════
# 测试结果解析工具 — 支持 JSON / XML / CSV 格式
# ═══════════════════════════════════════════════════════════════
@@ -6288,3 +6386,26 @@ PARSE_TEST_RESULT_FILE_SCHEMA = {
},
},
}
PROJECT_SCAN_SCHEMA = {
"type": "function",
"function": {
"name": "project_scan",
"description": (
"扫描项目目录自动识别项目类型Android Kotlin/Java、Vue/React 前端、Python、Go 等),"
"并按优先级读取关键源文件ViewModel > Screen > Repository > API > DAO > 其他)。"
"返回格式化的 Markdown 源码清单和项目类型信息适合在代码审查、Bug 分析、架构评审前使用。"
"注意:单次最多读取 12 个文件、总大小不超过 50KB大文件会自动截断。"
),
"parameters": {
"type": "object",
"properties": {
"target_dir": {
"type": "string",
"description": "要扫描的项目根目录绝对路径,例如 D:/aaa/aiagent/android",
},
},
"required": ["target_dir"],
},
},
}