mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-05-03 03:37:30 +08:00
refactor: stabilize runtime and unify config
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"crypto/sha1"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
@@ -312,7 +313,7 @@ func (sm *SessionManager) rewriteSessionFileLocked(session *Session) error {
|
||||
e := toOpenClawMessageEvent(msg)
|
||||
b, err := json.Marshal(e)
|
||||
if err != nil {
|
||||
continue
|
||||
return fmt.Errorf("marshal session message: %w", err)
|
||||
}
|
||||
if _, err := f.Write(append(b, '\n')); err != nil {
|
||||
return err
|
||||
@@ -671,6 +672,7 @@ func (sm *SessionManager) loadSessions() error {
|
||||
continue
|
||||
}
|
||||
scanner := bufio.NewScanner(f)
|
||||
scanner.Buffer(make([]byte, 0, 64*1024), 8*1024*1024)
|
||||
session.mu.Lock()
|
||||
for scanner.Scan() {
|
||||
if msg, ok := fromJSONLLine(scanner.Bytes()); ok {
|
||||
@@ -678,7 +680,13 @@ func (sm *SessionManager) loadSessions() error {
|
||||
}
|
||||
}
|
||||
session.mu.Unlock()
|
||||
f.Close()
|
||||
closeErr := f.Close()
|
||||
if err := scanner.Err(); err != nil {
|
||||
return fmt.Errorf("scan session file %s: %w", file.Name(), err)
|
||||
}
|
||||
if closeErr != nil {
|
||||
return fmt.Errorf("close session file %s: %w", file.Name(), closeErr)
|
||||
}
|
||||
}
|
||||
|
||||
return sm.writeOpenClawSessionsIndex()
|
||||
|
||||
64
pkg/session/manager_test.go
Normal file
64
pkg/session/manager_test.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package session
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/YspCoder/clawgo/pkg/providers"
|
||||
)
|
||||
|
||||
func TestLoadSessionsReturnsScannerErrorForOversizedLine(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
storage := t.TempDir()
|
||||
line := `{"role":"user","content":"` + strings.Repeat("x", 2*1024*1024) + `"}`
|
||||
if err := os.WriteFile(filepath.Join(storage, "huge.jsonl"), []byte(line+"\n"), 0644); err != nil {
|
||||
t.Fatalf("write session file failed: %v", err)
|
||||
}
|
||||
|
||||
sm := &SessionManager{
|
||||
sessions: map[string]*Session{},
|
||||
storage: storage,
|
||||
}
|
||||
if err := sm.loadSessions(); err != nil {
|
||||
t.Fatalf("expected oversized line to load with expanded scanner buffer, got %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFromJSONLLineParsesOpenClawToolResult(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
line := []byte(`{"type":"message","message":{"role":"toolResult","content":[{"type":"text","text":"done"}],"toolCallId":"call-1"}}`)
|
||||
msg, ok := fromJSONLLine(line)
|
||||
if !ok {
|
||||
t.Fatal("expected line to parse")
|
||||
}
|
||||
if msg.Role != "tool" || msg.ToolCallID != "call-1" || msg.Content != "done" {
|
||||
t.Fatalf("unexpected parsed message: %+v", msg)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRewriteSessionFileLockedPersistsMessages(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
storage := t.TempDir()
|
||||
sm := &SessionManager{storage: storage}
|
||||
session := &Session{
|
||||
Key: "abc",
|
||||
Messages: []providers.Message{
|
||||
{Role: "user", Content: "hello"},
|
||||
},
|
||||
}
|
||||
if err := sm.rewriteSessionFileLocked(session); err != nil {
|
||||
t.Fatalf("rewrite session failed: %v", err)
|
||||
}
|
||||
data, err := os.ReadFile(filepath.Join(storage, "abc.jsonl"))
|
||||
if err != nil {
|
||||
t.Fatalf("read rewritten session failed: %v", err)
|
||||
}
|
||||
if !strings.Contains(string(data), `"role":"user"`) {
|
||||
t.Fatalf("unexpected rewritten session contents: %s", string(data))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user