Compare commits
2
Commits
00f182611c
...
1a5ef6b75c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a5ef6b75c | ||
|
|
fcfe8149bd |
+3
-2
@@ -39,8 +39,9 @@ type WorkCard struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type WorkDecision struct {
|
type WorkDecision struct {
|
||||||
Mode string `json:"mode"` // single | multiple
|
RunID ID `json:"runId,omitempty"` // reserved child identity; reconciles acceptance after restart without rerunning
|
||||||
State string `json:"state"` // open | deferred | submitted
|
Mode string `json:"mode"` // single | multiple
|
||||||
|
State string `json:"state"` // open | deferred | dispatching | submitted
|
||||||
Options []WorkOption `json:"options,omitempty"`
|
Options []WorkOption `json:"options,omitempty"`
|
||||||
SelectedIDs []string `json:"selectedIds,omitempty"`
|
SelectedIDs []string `json:"selectedIds,omitempty"`
|
||||||
FreeText string `json:"freeText,omitempty"`
|
FreeText string `json:"freeText,omitempty"`
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestWorkCardSurvivesPersistedSnapshot(t *testing.T) {
|
||||||
|
completed := time.Date(2026, 10, 15, 6, 0, 0, 0, time.UTC)
|
||||||
|
card := ActivityCard{ID: "card_work", Status: CardDone, Work: &WorkCard{
|
||||||
|
Result: strings.Repeat("完整结果\n", 200) + "最后一项依据",
|
||||||
|
ResultVersion: 2, ReadVersion: 1, CompletedAt: &completed,
|
||||||
|
Decision: &WorkDecision{Mode: "multiple", State: "submitted", Options: []WorkOption{{ID: "summary", Label: "生成摘要"}},
|
||||||
|
SelectedIDs: []string{"summary"}, FreeText: "请突出关键限制", RespondedAt: &completed},
|
||||||
|
}}
|
||||||
|
data, err := json.Marshal(card)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
var restored ActivityCard
|
||||||
|
if err := json.Unmarshal(data, &restored); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if restored.Work == nil || restored.Work.Result != card.Work.Result || restored.Work.ReadVersion != 1 || restored.Work.ResultVersion != 2 {
|
||||||
|
t.Fatalf("complete result or unread version lost: %+v", restored.Work)
|
||||||
|
}
|
||||||
|
if d := restored.Work.Decision; d.State != "submitted" || d.SelectedIDs[0] != "summary" || d.FreeText != "请突出关键限制" || !d.RespondedAt.Equal(completed) {
|
||||||
|
t.Fatalf("decision history lost: %+v", d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLegacyCardOmitsOptionalWork(t *testing.T) {
|
||||||
|
var legacy ActivityCard
|
||||||
|
if err := json.Unmarshal([]byte(`{"id":"old","status":"resolved","body":[{"type":"markdown","markdown":"保留历史"}]}`), &legacy); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
data, err := json.Marshal(legacy)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if legacy.Work != nil || strings.Contains(string(data), `"work"`) || legacy.Body[0].Markdown != "保留历史" {
|
||||||
|
t.Fatalf("legacy payload changed: %s", data)
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -158,7 +158,8 @@ export interface WorkCard {
|
|||||||
decision?: WorkDecision;
|
decision?: WorkDecision;
|
||||||
}
|
}
|
||||||
export interface WorkDecision {
|
export interface WorkDecision {
|
||||||
mode: 'single' | 'multiple'; state: 'open' | 'deferred' | 'submitted';
|
runId?: ID;
|
||||||
|
mode: 'single' | 'multiple'; state: 'open' | 'deferred' | 'dispatching' | 'submitted';
|
||||||
options?: { id: string; label: string }[];
|
options?: { id: string; label: string }[];
|
||||||
selectedIds?: string[]; freeText?: string; respondedAt?: string;
|
selectedIds?: string[]; freeText?: string; respondedAt?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user