@@ -17,6 +17,9 @@ const managerStatusFileName = "lsp-manager.json"
1717
1818const (
1919 ServerRuntimeNotStarted = "not_started"
20+ ServerRuntimeRunning = "running"
21+ ServerRuntimeExited = "exited"
22+ ServerRuntimeFailed = "failed"
2023 ServerRuntimeNoWorkspaceMatch = "no_workspace_match"
2124 ServerRuntimeInvalid = "invalid"
2225)
@@ -47,6 +50,9 @@ type ServerStatus struct {
4750 RuntimeState string `json:"runtime_state"`
4851 Reason string `json:"reason,omitempty"`
4952 MatchReasons []string `json:"match_reasons,omitempty"`
53+ ProcessID int `json:"process_id,omitempty"`
54+ StartedAt string `json:"started_at,omitempty"`
55+ EndedAt string `json:"ended_at,omitempty"`
5056}
5157
5258func SessionManagerStatusPath (sessionPath string , sessionID contracts.ID ) string {
@@ -178,6 +184,30 @@ func CountMatchedServers(servers []ServerStatus) int {
178184 return count
179185}
180186
187+ func UpsertServerStatus (status ManagerStatus , server ServerStatus ) ManagerStatus {
188+ servers := normalizeServerStatuses ([]ServerStatus {server })
189+ if len (servers ) == 0 {
190+ return status
191+ }
192+ server = servers [0 ]
193+ replaced := false
194+ for i , existing := range status .Servers {
195+ if existing .Name == server .Name {
196+ status .Servers [i ] = server
197+ replaced = true
198+ break
199+ }
200+ }
201+ if ! replaced {
202+ status .Servers = append (status .Servers , server )
203+ }
204+ status .Servers = normalizeServerStatuses (status .Servers )
205+ if status .GeneratedAt == "" {
206+ status .GeneratedAt = time .Now ().UTC ().Format (time .RFC3339Nano )
207+ }
208+ return status
209+ }
210+
181211func resolveServerStatus (cwd string , definition ServerDefinition , files []string ) ServerStatus {
182212 status := ServerStatus {
183213 Name : definition .Name ,
@@ -199,7 +229,7 @@ func resolveServerStatus(cwd string, definition ServerDefinition, files []string
199229 return status
200230 }
201231 status .RuntimeState = ServerRuntimeNotStarted
202- status .Reason = "language server process runtime is not wired "
232+ status .Reason = "language server process has not been started "
203233 return status
204234}
205235
@@ -269,6 +299,8 @@ func normalizeServerStatuses(servers []ServerStatus) []ServerStatus {
269299 server .RuntimeState = strings .TrimSpace (server .RuntimeState )
270300 server .Reason = strings .TrimSpace (server .Reason )
271301 server .MatchReasons = sortedTrimmedStrings (server .MatchReasons )
302+ server .StartedAt = strings .TrimSpace (server .StartedAt )
303+ server .EndedAt = strings .TrimSpace (server .EndedAt )
272304 if server .Name == "" {
273305 continue
274306 }
0 commit comments