返回 DeepSeek-Reasonix
meta_runtime.go
根目录 / desktop / meta_runtime.go
1 package main
2
3 import (
4 "os"
5 "strings"
6
7 "reasonix/internal/agent"
8 "reasonix/internal/boot"
9 "reasonix/internal/event"
10 "reasonix/internal/evidence"
11 goaldomain "reasonix/internal/goal"
12 "reasonix/internal/session"
13 )
14
15 func (a *App) metaForTab(tabID string) Meta {
16 for {
17 a.mu.RLock()
18 tab := a.tabByIDLocked(tabID)
19 snap := snapshotTabRuntimeLocked(tab)
20 runtimeView := a.sessionRuntimeViewLocked(tab)
21 a.mu.RUnlock()
22 if tab == nil {
23 meta := Meta{EventChannel: eventChannel}
24 if ref, ok := a.remoteTabRefFor(tabID); ok {
25 meta.Remote = &ref
26 }
27 return meta
28 }
29 cwd := snap.workspaceRoot
30 if cwd == "" {
31 cwd, _ = os.Getwd()
32 }
33 extras, refreshExtras := tabMetaExtrasFor(tab, cwd, snap.model)
34 if capability, ok := snap.ctrl.(interface{ ImageInputSnapshot() (bool, bool, bool) }); ok {
35 if enabled, fallback, available := capability.ImageInputSnapshot(); available {
36 extras.imageInputEnabled, extras.visionFallbackEnabled = enabled, fallback
37 }
38 }
39 if refreshExtras {
40 a.scheduleTabMetaExtrasRefresh(tab.ID)
41 }
42 autoApproveTools := snap.ctrl != nil && snap.ctrl.AutoApproveTools()
43 goal := snap.currentGoal()
44 goalStatus := snap.currentGoalStatus()
45 var runtimeStateSnapshot *event.RuntimeStateSnapshot
46 var goalView *goaldomain.View
47 var canonicalTodos *[]evidence.TodoItem
48 if snap.ctrl != nil {
49 state := controllerRuntimeState(snap.ctrl)
50 if state.SchemaVersion == 1 {
51 runtimeStateSnapshot = &state
52 goalView = state.Goal
53 canonicalTodos = runtimeSnapshotTodos(state)
54 } else {
55 canonicalTodos = ctrlTodos(snap.ctrl)
56 }
57 }
58 sessionPath := strings.TrimSpace(snap.sessionPath)
59 sessionID := strings.TrimSpace(snap.sessionID)
60 var sessionRef *session.SessionRef
61 if sessionID != "" {
62 ref := session.SessionRef{HostID: localDesktopHostID, SessionID: sessionID}
63 sessionRef = &ref
64 }
65 var sessionRevision int64
66 var sessionDigest string
67 if branchMeta, ok, err := agent.LoadBranchMeta(sessionPath); err == nil && ok {
68 sessionRevision = branchMeta.Revision
69 sessionDigest = branchMeta.ContentDigest
70 }
71 meta := Meta{
72 Label: snap.label, Ready: runtimeView.Phase == sessionRuntimeReady && snap.ctrl != nil,
73 Runtime: runtimeView, StartupErr: snap.startupErr, EventChannel: eventChannel,
74 HistoricalSource: snap.historicalSource,
75 SessionPath: sessionPath, SessionID: sessionID, Session: sessionRef,
76 SessionRevision: sessionRevision, SessionDigest: sessionDigest,
77 SessionGeneration: snap.sessionGeneration, RuntimeStateSnapshot: runtimeStateSnapshot,
78 Cwd: cwd, WorkspaceRoot: cwd, WorkspaceName: tabWorkspaceNameForScope(snap.scope, cwd), WorkspacePath: cwd,
79 GitBranch: extras.gitBranch, ImageInputEnabled: extras.imageInputEnabled,
80 VisionFallbackEnabled: extras.visionFallbackEnabled, AutoApproveTools: autoApproveTools,
81 Bypass: autoApproveTools, CollaborationMode: snap.collaborationMode(),
82 TokenMode: boot.TokenModeFull, AgentPreset: boot.AgentPresetBalanced,
83 ToolApprovalMode: snap.currentToolApprovalMode(), Goal: goal, GoalStatus: goalStatus,
84 GoalView: goalView, GoalRuntime: goalRuntimeViewFromController(snap.ctrl), CanonicalTodos: canonicalTodos,
85 PinnedFiles: buildPinnedContext(snap.workspaceRoot, tab.GetPinnedFiles()).Infos,
86 }
87 a.mu.RLock()
88 currentTab := a.tabByIDLocked(tabID)
89 current := snapshotTabRuntimeLocked(currentTab)
90 valid := currentTab == tab && sameSessionAPI(current.ctrl, snap.ctrl) &&
91 current.sessionID == snap.sessionID && current.sessionPath == snap.sessionPath &&
92 current.sessionGeneration == snap.sessionGeneration
93 a.mu.RUnlock()
94 if valid {
95 return meta
96 }
97 }
98 }
99
100 func runtimeSnapshotTodos(state event.RuntimeStateSnapshot) *[]evidence.TodoItem {
101 todos := make([]evidence.TodoItem, len(state.Todos))
102 for i, todo := range state.Todos {
103 todos[i] = evidence.TodoItem{Content: todo.Content, Status: todo.Status}
104 }
105 return &todos
106 }
107
107 lines GO