优化: miniapp渲染(图片/checkbox/代码高亮) + MCP规则共享下沉 + 文档重写 + 节点风格对齐

This commit is contained in:
lxy
2026-08-08 21:39:30 +08:00
parent 9eb2995a74
commit e7228231d1
11 changed files with 587 additions and 167 deletions
+22 -53
View File
@@ -79,70 +79,39 @@ pub fn register(registry: &mut AiToolRegistry, db: &Arc<Database>) {
let title = args["title"].as_str().ok_or_else(|| anyhow::anyhow!("缺少 title"))?;
let repo = df_storage::crud::TaskRepo::new(&db);
// ── 知识图谱 Phase 1:queue/parent_id/content_json 校验(对齐 commands::task::create_task IPC)──
// queue:白名单 + 空串默认 todo。create_task 时 status 恒 todo,仅 backlog/todo/decision
// 合法(active/done 须经 move_task_queue 流转,新建直接落违反一致性约束)。
const TASK_QUEUE_VALUES: &[&str] = &["backlog", "todo", "decision", "active", "done"];
let queue = match args.get("queue").and_then(|v| v.as_str()) {
None | Some("") => "todo".to_string(),
Some(q) => {
let q = q.trim();
if !TASK_QUEUE_VALUES.contains(&q) {
anyhow::bail!("非法 queue 值 {:?},合法值: {:?}", q, TASK_QUEUE_VALUES);
}
// 一致性:create_task 时 status 恒 todo,仅 backlog/todo/decision 合法
match q {
"backlog" | "todo" | "decision" => q.to_string(),
other => anyhow::bail!(
"新建任务 queue 不可直接落 {:?}(须经 move_task_queue 流转),当前仅允许 backlog/todo/decision",
other
),
}
}
};
// parent_id:1 级嵌套铁律(对标设计 §2.1 D2)。空串/缺省=None;
// 非空时校验父任务存在 + 父任务自身无 parent_id(防孙任务)。
let parent_id = args
.get("parent_id")
.and_then(|v| v.as_str())
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty());
if let Some(pid) = &parent_id {
let parent = repo
.get_by_id(pid)
.await?
.ok_or_else(|| anyhow::anyhow!("父任务 {pid} 不存在,无法创建子任务"))?;
if parent.parent_id.is_some() {
anyhow::bail!(
"违反 1 级嵌套铁律:父任务 {pid} 自身是子任务(parent_id={:?}),不允许在其下创建孙任务",
parent.parent_id
);
}
}
// content_json:轻量 JSON 合法性校验(非空时须是合法 JSON),结构细节由 AI 消费层负责。
let content_json = match args.get("content_json").and_then(|v| v.as_str()) {
Some(c) if !c.trim().is_empty() => {
serde_json::from_str::<serde_json::Value>(c)
.map_err(|e| anyhow::anyhow!("content_json 不是合法 JSON: {e}"))?;
Some(c.to_string())
}
_ => None,
};
// 共享校验(与 MCP/IPC 同源,一处修改全局生效):queue 白名单+create 一致性 /
// parent_id 1 级嵌套铁律 / content_json JSON 合法性 / priority 值域(0..=3,默认 2=medium)
let queue = df_storage::crud::normalize_queue_for_create(
args.get("queue").and_then(|v| v.as_str()),
)
.map_err(anyhow::Error::msg)?;
let parent_id = df_storage::crud::validate_parent_id(
&repo,
args.get("parent_id").and_then(|v| v.as_str()),
)
.await
.map_err(anyhow::Error::msg)?;
let content_json = df_storage::crud::validate_content_json(
args.get("content_json").and_then(|v| v.as_str()),
)
.map_err(anyhow::Error::msg)?;
let priority = df_storage::crud::normalize_priority(
args.get("priority").and_then(|v| v.as_i64()),
)
.map_err(anyhow::Error::msg)?;
let record = TaskRecord {
id: new_id(), project_id: project_id.to_string(), title: title.to_string(),
description: args["description"].as_str().unwrap_or("").to_string(),
// priority 默认 2(medium):与 commands::task::default_priority 一致,新任务默认中优先级(非 high)
status: TaskStatus::Todo, priority: args["priority"].as_i64().unwrap_or(2) as i32,
status: TaskStatus::Todo, priority,
branch_name: None, assignee: None, workflow_def_id: None, base_branch: None,
review_rounds: 0,
output_json: None,
// F-260619-01 可选关联灵感(空字符串/缺省视为不关联)
idea_id: args.get("idea_id").and_then(|v| v.as_str()).filter(|s| !s.is_empty()).map(String::from),
module_id: args.get("module_id").and_then(|v| v.as_str()).filter(|s| !s.is_empty()).map(String::from),
// 知识图谱 Phase 1 V29 三列:经上方校验的 queue / parent_id / content_json
// 知识图谱 Phase 1 V29 三列:经上方共享校验的 queue / parent_id / content_json
queue,
parent_id,
content_json,