返回 DeepSeek-Reasonix
session_restore.go
根目录 / desktop / session_restore.go
1 package main
2
3 import (
4 "fmt"
5 "os"
6 "path/filepath"
7 )
8
9 func restoreTrashedSessionFile(dir, path string) error {
10 _, key, itemDir, err := validateTrashedSessionPath(dir, path)
11 if err != nil {
12 return err
13 }
14 target := filepath.Join(dir, key)
15 replaceDiscardableTranscript := false
16 if _, err := os.Stat(target); err == nil {
17 discardable, err := liveSessionDiscardable(target)
18 if err != nil {
19 return err
20 }
21 if !discardable {
22 return fmt.Errorf("session already exists: %s", key)
23 }
24 replaceDiscardableTranscript = true
25 } else if !os.IsNotExist(err) {
26 return err
27 }
28 // Preflight every owned destination before removing the verified-empty
29 // transcript. A newly created inbox or other sidecar may already hold work
30 // even while the transcript itself is still discardable.
31 if err := checkRestoreSessionArtifactConflicts(target, key, replaceDiscardableTranscript); err != nil {
32 return err
33 }
34 if err := checkRestoreSubagentConflicts(dir, itemDir); err != nil {
35 return err
36 }
37 if replaceDiscardableTranscript {
38 if err := removeDesktopSessionArtifacts(target); err != nil {
39 return err
40 }
41 }
42 if err := os.MkdirAll(dir, 0o755); err != nil {
43 return err
44 }
45 for _, artifact := range sessionTrashArtifacts(target, key) {
46 if err := movePathIfExists(filepath.Join(itemDir, artifact.name), artifact.src); err != nil {
47 return err
48 }
49 }
50 if err := restoreSubagentArtifacts(dir, itemDir); err != nil {
51 return err
52 }
53 return os.RemoveAll(itemDir)
54 }
55
56 func checkRestoreSessionArtifactConflicts(target, key string, allowDiscardableTranscript bool) error {
57 for _, artifact := range sessionTrashArtifacts(target, key) {
58 if allowDiscardableTranscript && artifact.src == target {
59 continue
60 }
61 if _, err := os.Lstat(artifact.src); err == nil {
62 return fmt.Errorf("session artifact already exists: %s", artifact.name)
63 } else if !os.IsNotExist(err) {
64 return err
65 }
66 }
67 return nil
68 }
69
69 lines GO