package shell import ( "io" "os/exec" "sync" "time" ) // Status represents the status of a shell for a workspace. type Status struct { WorkspaceID string `json:"workspaceId"` ShellID string `json:"shellId,omitempty"` Running bool `json:"running"` PID int `json:"pid,omitempty"` } // ExitInfo holds the exit reason of a shell. type ExitInfo struct { Code int Signal string } // Session holds the runtime state of a started shell. type Session struct { ShellID string WorkspaceID string Root string Cmd *exec.Cmd Stdin io.WriteCloser Subscribers map[Subscription]struct{} Exit ExitInfo CreatedAt time.Time mu sync.Mutex } // removeSubscription removes sub from s.Subscribers. It is safe to call when // the subscription is no longer present. func (s *Session) removeSubscription(sub *subscription) { s.mu.Lock() defer s.mu.Unlock() delete(s.Subscribers, sub) }