返回 DeepSeek-Reasonix
session_open_environment.go
根目录 / desktop / session_open_environment.go
1 package main
2
3 import (
4 "strings"
5
6 "reasonix/desktop/internal/workspacestate"
7 "reasonix/internal/config"
8 "reasonix/internal/control"
9 "reasonix/internal/plugin"
10 )
11
12 type sessionOpenEnvironment struct {
13 snapshot tabRuntimeSnapshot
14 config *config.Config
15 host *plugin.Host
16 oldHost string
17 acquiredHost bool
18 workspaceChanged bool
19 preserveSource bool
20 releaseAdmission func()
21 }
22
23 func (a *App) prepareSessionOpenEnvironment(tab *WorkspaceTab, workspace workspacestate.Workspace) (*sessionOpenEnvironment, error) {
24 snap := a.tabRuntimeSnapshot(tab)
25 prepared := &sessionOpenEnvironment{snapshot: snap, oldHost: snap.sharedHostKey, workspaceChanged: canonicalWorkspaceChanged(snap, workspace)}
26 prepared.preserveSource = controllerHasActiveRuntimeWork(snap.ctrl)
27 prepared.snapshot.sink = &tabEventSink{tabID: tab.ID, app: a}
28 prepared.snapshot.scope, prepared.snapshot.workspaceRoot = canonicalWorkspaceScope(workspace), workspace.Root
29 release, err := a.beginProjectRuntimeAdmission(prepared.snapshot.scope, workspace.Root)
30 if err != nil {
31 return nil, err
32 }
33 prepared.releaseAdmission = release
34 prepared.config, err = config.LoadForRoot(workspace.Root)
35 if err != nil {
36 release()
37 return nil, err
38 }
39 prepared.host = a.lookupSharedHost(snap.sharedHostKey)
40 if prepared.workspaceChanged || snap.ctrl == nil || prepared.preserveSource {
41 prepared.snapshot.sharedHostKey = workspace.Root
42 prepared.host = a.acquireSharedHost(workspace.Root)
43 prepared.acquiredHost = true
44 }
45 return prepared, nil
46 }
47
48 func (a *App) finishSessionOpenEnvironment(prepared *sessionOpenEnvironment, committed bool) {
49 prepared.releaseAdmission()
50 if !prepared.acquiredHost {
51 return
52 }
53 if !committed {
54 a.releaseSharedHost(prepared.snapshot.sharedHostKey)
55 } else if prepared.oldHost != "" && !prepared.preserveSource {
56 a.releaseSharedHost(prepared.oldHost)
57 }
58 }
59
60 // preset is the target session's own restored value; the source surface's
61 // preset never crosses into another session.
62 func prepareCanonicalControllerRuntime(candidate control.SessionAPI, snap tabRuntimeSnapshot, preset string) normalizedTabRuntime {
63 candidate.EnableInteractiveApproval()
64 runtime := snap.normalizedRuntime()
65 runtime.toolApprovalMode = normalizeToolApprovalMode(preset)
66 applyTabToolApprovalModeToController(candidate, runtime.toolApprovalMode)
67 applyTabQualityFloorToController(candidate, runtime.qualityFloor)
68 runtime.collaborationMode, runtime.legacyGoal = "normal", ""
69 if candidate.PlanMode() {
70 runtime.collaborationMode = "plan"
71 }
72 if candidate.GoalStatus() == control.GoalStatusRunning && strings.TrimSpace(candidate.Goal()) != "" && !candidate.PlanMode() {
73 runtime.collaborationMode, runtime.legacyGoal = "goal", strings.TrimSpace(candidate.Goal())
74 }
75 return runtime
76 }
77
77 lines GO