Advance the core gitlink and serialize empty lists as arrays

Why: backend main pinned core 019617e (unfetchable post-migration) and the
store List* functions returned nil slices that encode as JSON null, which
crashed the frontend nav with .map on null (the 2026-09-30 white-screen).
Evidence: go test ./... across all packages; store regression
TestEmptyListsSerializeAsEmptyArrays asserts [] for empty project lists.
Impact: all 17 store list sites now initialize empty slices; build-blocker
core pin resolved; frontend no longer receives null for empty lists.
Refs: documents/records/2026-09-30-history-migration.md
This commit is contained in:
weichen
2026-09-30 03:20:57 +00:00
parent 99fb59bdc2
commit 72e6ce66b4
9 changed files with 46 additions and 18 deletions
+2 -2
View File
@@ -61,7 +61,7 @@ func (s *Store) ListUsers() ([]User, error) {
return nil, err
}
defer rows.Close()
var out []User
out := []User{}
for rows.Next() {
var u User
var ca string
@@ -111,7 +111,7 @@ func (s *Store) ListAPIKeys(owner string) ([]APIKeyInfo, error) {
return nil, err
}
defer rows.Close()
var out []APIKeyInfo
out := []APIKeyInfo{}
for rows.Next() {
var k APIKeyInfo
var ca string
+2 -2
View File
@@ -23,7 +23,7 @@ func (s *Store) ListProfiles(owner string) ([]core.AgentProfile, error) {
return nil, err
}
defer rows.Close()
var out []core.AgentProfile
out := []core.AgentProfile{}
for rows.Next() {
var payload string
if err := rows.Scan(&payload); err != nil {
@@ -132,7 +132,7 @@ func (s *Store) ListPlugins() ([]core.PluginManifest, error) {
return nil, err
}
defer rows.Close()
var out []core.PluginManifest
out := []core.PluginManifest{}
for rows.Next() {
var payload string
if err := rows.Scan(&payload); err != nil {
+5 -5
View File
@@ -100,7 +100,7 @@ func (s *Store) ListArtifacts(owner, projectID string) ([]core.Artifact, error)
return nil, err
}
defer rows.Close()
var out []core.Artifact
out := []core.Artifact{}
for rows.Next() {
a, err := scanArtifact(rows.Scan)
if err != nil {
@@ -178,7 +178,7 @@ func (s *Store) ActiveHITLCards(owner, conversationID string) ([]core.HITLCard,
return nil, err
}
defer rows.Close()
var out []core.HITLCard
out := []core.HITLCard{}
for rows.Next() {
var payload string
if err := rows.Scan(&payload); err != nil {
@@ -287,7 +287,7 @@ func (s *Store) searchKnowledgeSQLite(owner string, q core.RetrievalQuery) ([]co
return nil, err
}
defer rows.Close()
var out []core.RetrievalHit
out := []core.RetrievalHit{}
for rows.Next() {
h, err := scanKnowledgeHit(rows)
if err != nil {
@@ -318,7 +318,7 @@ func (s *Store) searchKnowledgeLike(owner string, q core.RetrievalQuery, topK in
return nil, err
}
defer rows.Close()
var out []core.RetrievalHit
out := []core.RetrievalHit{}
for rows.Next() {
var d core.KnowledgeDoc
var own, ca string
@@ -380,7 +380,7 @@ func ftsQuery(text string) string {
}
func splitWords(s string) []string {
var out []string
out := []string{}
cur := []rune{}
for _, r := range s {
if r == ' ' || r == '\t' || r == '\n' {
+28
View File
@@ -0,0 +1,28 @@
package store
import (
"encoding/json"
"testing"
)
// 回归:空列表必须序列化为 [] 而非 null(前端 .map 白屏根因)。
func TestEmptyListsSerializeAsEmptyArrays(t *testing.T) {
s := openTestStore(t)
cs, err := s.ListConversations("owner_none", "prj_none")
if err != nil {
t.Fatalf("ListConversations: %v", err)
}
if cs == nil {
t.Fatal("ListConversations returned nil slice")
}
if b, _ := json.Marshal(cs); string(b) != "[]" {
t.Fatalf("expected [], got %s", b)
}
ps, _ := s.ListProjects("owner_none")
if ps == nil {
t.Fatal("ListProjects returned nil slice")
}
if b, _ := json.Marshal(ps); string(b) != "[]" {
t.Fatalf("expected [], got %s", b)
}
}
+4 -4
View File
@@ -55,7 +55,7 @@ func (s *Store) ListMessages(conversationID string) ([]core.Message, error) {
return nil, err
}
defer rows.Close()
var out []core.Message
out := []core.Message{}
for rows.Next() {
var m core.Message
var parts, ca string
@@ -172,7 +172,7 @@ func (s *Store) ListRunsByConversation(conversationID string) ([]core.Run, error
return nil, err
}
defer rows.Close()
var out []core.Run
out := []core.Run{}
for rows.Next() {
r, err := scanRun(rows.Scan)
if err != nil {
@@ -190,7 +190,7 @@ func (s *Store) ChildRuns(runID string) ([]core.Run, error) {
return nil, err
}
defer rows.Close()
var out []core.Run
out := []core.Run{}
for rows.Next() {
r, err := scanRun(rows.Scan)
if err != nil {
@@ -255,7 +255,7 @@ func (s *Store) EventsAfter(conversationID string, since int64, limit int) ([]co
return nil, err
}
defer rows.Close()
var out []core.StreamEvent
out := []core.StreamEvent{}
for rows.Next() {
var e core.StreamEvent
var typ string
+1 -1
View File
@@ -266,7 +266,7 @@ func (s *Store) MigrationStatus() ([]int, error) {
return nil, err
}
defer rows.Close()
var out []int
out := []int{}
for rows.Next() {
var v int
if err := rows.Scan(&v); err != nil {
+2 -2
View File
@@ -99,7 +99,7 @@ func (s *Store) updateProjectRow(owner, id, query string, args ...any) error {
}
func scanProjects(rows *sql.Rows) ([]core.Project, error) {
var out []core.Project
out := []core.Project{}
for rows.Next() {
var p core.Project
var settings string
@@ -141,7 +141,7 @@ func (s *Store) ListConversations(owner, projectID string) ([]core.Conversation,
return nil, err
}
defer rows.Close()
var out []core.Conversation
out := []core.Conversation{}
for rows.Next() {
var c core.Conversation
var ca, ua string
+1 -1
View File
@@ -25,7 +25,7 @@ func (s *Store) searchKnowledgePG(owner string, q core.RetrievalQuery) ([]core.R
return nil, err
}
defer rows.Close()
var out []core.RetrievalHit
out := []core.RetrievalHit{}
for rows.Next() {
var d core.KnowledgeDoc
var own, ca string