Version: 0.9.48.dev.260428

后端:
1.新增任务批量状态查询能力,补齐入参归一化、单次上限控制、按当前用户隔离与空结果兼容。
2.QuickTask 从纯文本升级为“正文 + business_card”输出,覆盖 task_record/task_query 两类卡片语义。
3.查询链路新增时间窗边界筛选与异常窗口兜底,SSE/timeline 同步扩展 business_card 事件并持久化。

前端:
1.助手面板接入任务状态 hydration 与增量同步,卡片状态可实时联动(完成/撤销、编辑、删除、同步中)。
2.TaskRecord/TaskQuery 卡片升级为可交互任务卡,并新增对话页任务编辑弹窗与回写闭环。
3.助手路由升级为 /assistant/:id?,支持 URL 驱动会话切换与刷新恢复。

仓库:
同步更新 business card 前端对接说明文档。
This commit is contained in:
Losita
2026-04-28 00:32:33 +08:00
parent 20d8f2acae
commit 495d520b20
19 changed files with 1864 additions and 212 deletions

View File

@@ -295,6 +295,7 @@ func canonicalizeTimelineKind(kind string, role string) string {
model.AgentTimelineKindToolCall,
model.AgentTimelineKindToolResult,
model.AgentTimelineKindConfirmRequest,
model.AgentTimelineKindBusinessCard,
model.AgentTimelineKindScheduleCompleted:
return normalizedKind
case "text", "message", "query":
@@ -343,6 +344,8 @@ func mapTimelineKindFromStreamExtra(extra *newagentstream.OpenAIChunkExtra) (str
return model.AgentTimelineKindToolResult, true
case newagentstream.StreamExtraKindConfirm:
return model.AgentTimelineKindConfirmRequest, true
case newagentstream.StreamExtraKindBusinessCard:
return model.AgentTimelineKindBusinessCard, true
case newagentstream.StreamExtraKindScheduleCompleted:
return model.AgentTimelineKindScheduleCompleted, true
default:
@@ -381,8 +384,27 @@ func buildTimelinePayloadFromStreamExtra(extra *newagentstream.OpenAIChunkExtra)
"summary": strings.TrimSpace(extra.Interrupt.Summary),
}
}
if extra.BusinessCard != nil {
payload["business_card"] = cloneStreamBusinessCard(extra.BusinessCard)
}
if len(extra.Meta) > 0 {
payload["meta"] = cloneTimelinePayload(extra.Meta)
}
return payload
}
func cloneStreamBusinessCard(card *newagentstream.StreamBusinessCardExtra) map[string]any {
if card == nil {
return nil
}
cloned := map[string]any{
"card_type": strings.TrimSpace(card.CardType),
"title": strings.TrimSpace(card.Title),
"summary": strings.TrimSpace(card.Summary),
"source": strings.TrimSpace(card.Source),
}
if len(card.Data) > 0 {
cloned["data"] = cloneTimelinePayload(card.Data)
}
return cloned
}