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:
@@ -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"],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user