返回 DeepSeek-Reasonix
session_export_v1.go
根目录 / internal / agent / session_export_v1.go
1 package agent
2
3 import (
4 "context"
5 "fmt"
6 "os"
7 "path/filepath"
8 "strings"
9 "time"
10
11 "reasonix/internal/store"
12 )
13
14 // ExportSessionSchemaOne writes the selected head of a schema-2 session as a
15 // self-contained schema-1 session at dst (a .jsonl path): the checkpoint, a
16 // one-record event log, and a meta sidecar older binaries can open. It is
17 // the rollback exit for users who must run a release that predates schema 2.
18 func ExportSessionSchemaOne(src, dst string) error {
19 src, dst = strings.TrimSpace(src), strings.TrimSpace(dst)
20 if src == "" || dst == "" {
21 return fmt.Errorf("export session: source and destination are required")
22 }
23 if !strings.HasSuffix(dst, ".jsonl") {
24 return fmt.Errorf("export session: destination %s must end in .jsonl", dst)
25 }
26 if sessionArtifactExists(dst) {
27 return fmt.Errorf("export session: destination %s already exists", dst)
28 }
29 res, err := loadSessionTranscript(context.Background(), src, defaultSessionReplayLimits, nil)
30 if err != nil {
31 return err
32 }
33 if !res.dag {
34 return fmt.Errorf("export session: %s is not a schema-2 session", src)
35 }
36 if err := os.MkdirAll(filepath.Dir(dst), 0o755); err != nil {
37 return err
38 }
39 digest, err := digestSessionMessages(res.msgs)
40 if err != nil {
41 return err
42 }
43 if err := appendSessionReplaceEvent(dst, res.msgs, digest, 0, "export"); err != nil {
44 return err
45 }
46 if err := writeSessionMessages(dst, res.msgs); err != nil {
47 return err
48 }
49 meta := BranchMeta{ID: BranchID(dst), CreatedAt: time.Now().UTC(), Revision: 1, ContentDigest: digestString(digest), WriterID: SessionWriterID()}
50 if srcMeta, ok, err := LoadBranchMeta(src); err == nil && ok {
51 meta.Name, meta.Scope, meta.WorkspaceRoot = srcMeta.Name, srcMeta.Scope, srcMeta.WorkspaceRoot
52 meta.TopicID, meta.TopicTitle, meta.CustomTitle, meta.Model = srcMeta.TopicID, srcMeta.TopicTitle, srcMeta.CustomTitle, srcMeta.Model
53 meta.ModelIdentity = srcMeta.ModelIdentity
54 meta.CreatedAt = srcMeta.CreatedAt
55 }
56 if err := saveBranchMeta(dst, meta, false); err != nil {
57 return err
58 }
59 if err := writeSessionEventIndex(dst, res.msgs, digest, 1); err != nil {
60 return err
61 }
62 _ = store.SessionEventLog(dst)
63 return nil
64 }
65
65 lines GO