diff --git a/internal/server/server.go b/internal/server/server.go index ebacb55..e763afe 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -491,12 +491,14 @@ func (s *Server) cardAction(w http.ResponseWriter, r *http.Request) { return } // 回执消息:确认结论写进对话时间线(含所点按钮语义),审计锚点为 card.resolved 事件。 + // 返回持久化后的回执消息(服务端 id),前端本地追加后与权威对账不重复。 + var receipt *core.Message if card.ConversationID != "" { - msg := core.Message{ID: store.NewID("msg"), ConversationID: card.ConversationID, Role: core.RoleAssistant, CreatedAt: time.Now().UTC()} - msg.Parts = []core.Part{{Type: core.PartText, Text: fmt.Sprintf("✓ 已按「%s」处理「%s」——结论已记录并留痕(card:%s)", label, card.Title, card.ID)}} - _ = s.st.AppendMessage(&msg) + receipt = &core.Message{ID: store.NewID("msg"), ConversationID: card.ConversationID, Role: core.RoleAssistant, CreatedAt: time.Now().UTC()} + receipt.Parts = []core.Part{{Type: core.PartText, Text: fmt.Sprintf("✓ 已按「%s」处理「%s」——结论已记录并留痕(card:%s)", label, card.Title, card.ID)}} + _ = s.st.AppendMessage(receipt) } - writeJSON(w, http.StatusOK, map[string]any{"card": card}) + writeJSON(w, http.StatusOK, map[string]any{"card": card, "receipt": receipt}) } func (s *Server) cardPin(w http.ResponseWriter, r *http.Request) {