fix(mcp): list_envoy_returns SQL 修复——pw.name 改为 JOIN project_profiles pp 取 pp.name

This commit is contained in:
lanrtop 2026-07-09 16:09:38 +09:00
parent fd869ee161
commit 92da0fda0d

View File

@ -57,6 +57,14 @@ pub fn tools_list_result() -> Value {
"required": ["project_id"]
}
},
{
"name": "list_envoy_returns",
"description": "列出所有子项目通过「炼境使者」发回炼境的待处理洞察,按项目分组展示。炼境会话启动时调用,用于检查是否有需要处置的治理反馈(模板 bug、验证有效的实践、体系改进假设。无需任何参数。",
"inputSchema": {
"type": "object",
"properties": {}
}
},
{
"name": "append_project_note",
"description": "将 Claude 的分析结论或复盘记录写入项目笔记,供未来会话和用户在炼境中查阅。完成 M/L 复杂度任务后必须调用,写入结构化复盘笔记。",
@ -370,6 +378,9 @@ pub async fn tools_call(params: Option<&Value>) -> Value {
let pid = args.get("project_id").and_then(|v| v.as_str()).unwrap_or("");
get_project_mentor_context(pid)
}
"list_envoy_returns" => {
list_envoy_returns()
}
"append_project_note" => {
let pid = args.get("project_id").and_then(|v| v.as_str()).unwrap_or("");
let content = args.get("content").and_then(|v| v.as_str()).unwrap_or("");
@ -887,6 +898,46 @@ fn get_project_mentor_context(project_id: &str) -> Result<String, String> {
Ok(ctx.mentor_markdown)
}
fn list_envoy_returns() -> Result<String, String> {
let conn = db::pool().get().map_err(|e| e.to_string())?;
let mut stmt = conn
.prepare(
"SELECT pn.id, pp.name, pn.content, pn.created_at
FROM project_notes pn
JOIN project_workspaces pw ON pn.project_id = pw.id
JOIN project_profiles pp ON pw.profile_id = pp.id
WHERE pn.content LIKE '使%'
ORDER BY pn.created_at DESC
LIMIT 50",
)
.map_err(|e| e.to_string())?;
let rows: Vec<(i64, String, String, String)> = stmt
.query_map([], |row| {
Ok((
row.get::<_, i64>(0)?,
row.get::<_, String>(1)?,
row.get::<_, String>(2)?,
row.get::<_, String>(3)?,
))
})
.map_err(|e| e.to_string())?
.filter_map(|r| r.ok())
.collect();
if rows.is_empty() {
return Ok("📭 暂无待处理的炼境使者回传".to_string());
}
let mut out = format!("📬 炼境使者回传(共 {} 条)\n\n", rows.len());
for (_id, project_name, content, created_at) in &rows {
let date = &created_at[..created_at.len().min(10)];
out.push_str(&format!("---\n**来源**: {} | **时间**: {}\n{}\n\n", project_name, date, content));
}
out.push_str("---\n💡 处置参考fix_template → 改接入包模板文件update_convention → 改 CONVENTIONS.mdlog_for_review → 记录待观察,暂不动模板");
Ok(out)
}
fn append_project_note(project_id: &str, content: &str) -> Result<String, String> {
if content.trim().is_empty() {
return Err("笔记内容不能为空".to_string());