From 5694c04c78abe2aa226d4d9bdf63883ed14cf81b Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 30 Sep 2026 06:55:32 +0000 Subject: [PATCH] Return persisted receipt message from card action Why: The frontend appends the confirmation receipt locally so it appears immediately; returning the server-persisted message (with its id) keeps the authoritative reconcile duplicate-free. Evidence: go build green; covered by combo test in Dev. Impact: response shape gains receipt field (additive). Refs: proposal 2026-09-30-ui-inbox-command-workspace --- internal/server/server.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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) {