auto-sync: 2026-06-03 18:28:40

This commit is contained in:
cfdaily
2026-06-03 18:28:40 +08:00
parent bb1ffc8edc
commit 14e757f01e
3 changed files with 46 additions and 0 deletions
+13
View File
@@ -319,6 +319,19 @@ async def add_comment(project_id: str, task_id: str, body: Dict[str, Any]):
mentions=merged_mentions)
if merged_mentions:
bb.record_mentions(cid, task_id, merged_mentions)
# #10: SSE 通知前端黑板有新 comment
try:
from src.api.sse_routes import get_broker
broker = get_broker()
broker.publish_sync("comment_added", {
"project_id": project_id,
"task_id": task_id,
"comment_id": cid,
"author": body["author"],
})
except Exception:
pass
return {"ok": True, "comment_id": cid, "mentions": merged_mentions}
+25
View File
@@ -744,6 +744,10 @@ export function startSSE() {
s.loadV2Tasks();
}
_pushSseEvent({ id: `sse-${Date.now()}`, type: 'info', title: `任务更新`, message: `${data.old_status || '?'}${data.new_status || '?'}`, time: new Date().toISOString(), read: false, source: 'event', taskId: data.task_id, projectId: data.project_id });
// #10: task_updated 时也刷新 TaskModal(如果正在显示)
if (s.modalTaskId === data.task_id) {
s.loadV2TaskDetail(data.task_id);
}
} catch { /* ignore */ }
});
_es.addEventListener('task_created', () => {
@@ -775,6 +779,27 @@ export function startSSE() {
_pushSseEvent({ id: `sse-${Date.now()}`, type: 'error', title: `任务失败`, message: `${data.task_id || ''} 执行失败`, time: new Date().toISOString(), read: false, source: 'event', taskId: data.task_id, projectId: data.project_id });
} catch { /* ignore */ }
});
// #10: comment_added → 刷新 TaskModal
_es.addEventListener('comment_added', (e: MessageEvent) => {
try {
const data = JSON.parse(e.data);
const s = useStore.getState();
// 双重检查:task_id + project_id 防跨项目误刷新
if (s.modalTaskId === data.task_id && (s.v2taskDetail as any)?._projectId === data.project_id) {
s.loadV2TaskDetail(data.task_id);
}
} catch { /* ignore */ }
});
// #10: checkpoint_resolved → 刷新 TaskModal
_es.addEventListener('checkpoint_resolved', (e: MessageEvent) => {
try {
const data = JSON.parse(e.data);
const s = useStore.getState();
if (s.modalTaskId === data.task_id && (s.v2taskDetail as any)?._projectId === data.project_id) {
s.loadV2TaskDetail(data.task_id);
}
} catch { /* ignore */ }
});
_es.onerror = () => {
_es?.close();
_es = null;