diff --git a/api/openapi.yaml b/api/openapi.yaml index e5d809b..8f27b96 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -738,24 +738,22 @@ paths: "404": { $ref: "#/components/responses/Error" } "409": { $ref: "#/components/responses/Error" } - /api/tasks/{taskId}/terminals: - parameters: - - { name: taskId, in: path, required: true, schema: { type: string } } + /api/terminals: get: - operationId: listTaskTerminals + operationId: listTerminals description: > - The task's running terminals, login shells in its worktree, oldest first. A terminals.changed event with the - task's id is broadcast whenever one starts or ends. + Every task's running terminals, login shells in its worktree, each task's oldest first. Whenever one starts or + ends, a terminals.changed event with the task's id is broadcast, whose payload is that task's TerminalList. responses: "200": description: The terminals. content: application/json: - schema: - type: array - items: { $ref: "#/components/schemas/TaskTerminal" } - "404": { $ref: "#/components/responses/Error" } - "409": { $ref: "#/components/responses/Error" } + schema: { $ref: "#/components/schemas/TerminalList" } + + /api/tasks/{taskId}/terminals: + parameters: + - { name: taskId, in: path, required: true, schema: { type: string } } post: operationId: startTaskTerminal description: > @@ -2091,12 +2089,21 @@ components: TaskTerminal: type: object - required: [id, name, started_at] + required: [id, task_id, name, started_at] properties: id: { type: string } + task_id: { type: string } name: { type: string, description: "Shell, or the name of the saved command it was started with." } started_at: { type: string, format: date-time } + TerminalList: + type: object + required: [terminals] + properties: + terminals: + type: array + items: { $ref: "#/components/schemas/TaskTerminal" } + TerminalStart: type: object properties: diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 1a2b614..916f834 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -1513,6 +1513,7 @@ type TaskTerminal struct { // Name Shell, or the name of the saved command it was started with. Name string `json:"name"` StartedAt time.Time `json:"started_at"` + TaskId string `json:"task_id"` } // TaskWorkflow The workflow a task froze when it was created, as it was then. @@ -1534,6 +1535,11 @@ type TeamMember struct { Prompt string `json:"prompt"` } +// TerminalList defines model for TerminalList. +type TerminalList struct { + Terminals []TaskTerminal `json:"terminals"` +} + // TerminalSize defines model for TerminalSize. type TerminalSize struct { Cols int `json:"cols"` @@ -2117,9 +2123,6 @@ type ServerInterface interface { // (PUT /api/tasks/{taskId}/summary-read) MarkSummaryRead(w http.ResponseWriter, r *http.Request, taskId string) - // (GET /api/tasks/{taskId}/terminals) - ListTaskTerminals(w http.ResponseWriter, r *http.Request, taskId string) - // (POST /api/tasks/{taskId}/terminals) StartTaskTerminal(w http.ResponseWriter, r *http.Request, taskId string) @@ -2135,6 +2138,9 @@ type ServerInterface interface { // (GET /api/tasks/{taskId}/workflow/run) GetWorkflowRun(w http.ResponseWriter, r *http.Request, taskId string) + // (GET /api/terminals) + ListTerminals(w http.ResponseWriter, r *http.Request) + // (GET /api/workflows) ListWorkflows(w http.ResponseWriter, r *http.Request) @@ -3987,32 +3993,6 @@ func (siw *ServerInterfaceWrapper) MarkSummaryRead(w http.ResponseWriter, r *htt handler.ServeHTTP(w, r) } -// ListTaskTerminals operation middleware -func (siw *ServerInterfaceWrapper) ListTaskTerminals(w http.ResponseWriter, r *http.Request) { - - var err error - _ = err - - // ------------- Path parameter "taskId" ------------- - var taskId string - - err = runtime.BindStyledParameterWithOptions("simple", "taskId", r.PathValue("taskId"), &taskId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "taskId", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.ListTaskTerminals(w, r, taskId) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // StartTaskTerminal operation middleware func (siw *ServerInterfaceWrapper) StartTaskTerminal(w http.ResponseWriter, r *http.Request) { @@ -4190,6 +4170,20 @@ func (siw *ServerInterfaceWrapper) GetWorkflowRun(w http.ResponseWriter, r *http handler.ServeHTTP(w, r) } +// ListTerminals operation middleware +func (siw *ServerInterfaceWrapper) ListTerminals(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.ListTerminals(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListWorkflows operation middleware func (siw *ServerInterfaceWrapper) ListWorkflows(w http.ResponseWriter, r *http.Request) { @@ -4461,7 +4455,7 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/diff", wrapper.GetTaskDiff) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/dir", wrapper.GetTaskDir) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/file", wrapper.GetTaskFile) - m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/terminals", wrapper.ListTaskTerminals) + m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/terminals", wrapper.ListTerminals) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/tasks/{taskId}/terminals", wrapper.StartTaskTerminal) m.HandleFunc(http.MethodDelete+" "+options.BaseURL+"/api/tasks/{taskId}/terminals/{terminalId}", wrapper.CloseTaskTerminal) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/terminals/{terminalId}", wrapper.GetTaskTerminal) @@ -4508,61 +4502,61 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", @@ -4571,99 +4565,99 @@ var swaggerSpec = []string{ "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", @@ -4672,170 +4666,171 @@ var swaggerSpec = []string{ "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", - "FNp+voIgOyRuwpwUMAxxxJp8NQrtDx/+1wA=", + "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", + "uAkTUcDQwhEz+dUoqT98+F8DAA==", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/internal/server/server.go b/internal/server/server.go index c9f1c18..b12e5af 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -41,6 +41,8 @@ type Server struct { usersMu sync.Mutex users map[string]string + + terminalsMu sync.Mutex } type ctxKey struct{} diff --git a/internal/server/terminal.go b/internal/server/terminal.go index 5eb4f6f..f29d8ac 100644 --- a/internal/server/terminal.go +++ b/internal/server/terminal.go @@ -10,6 +10,7 @@ import ( "github.com/coder/websocket" "g.fc.run/ai/byre/internal/api" + "g.fc.run/ai/byre/internal/store" "g.fc.run/ai/byre/internal/terminal" ) @@ -21,23 +22,27 @@ const ( var newTerminalSize = api.TerminalSize{Cols: 80, Rows: 24} func (s *Server) terminalsChanged(taskID string) { - s.store.Broadcast(api.Event{Kind: "terminals.changed", TaskId: &taskID, Actor: "byre", Payload: map[string]any{}}) -} - -func taskTerminal(term *terminal.Terminal) api.TaskTerminal { - return api.TaskTerminal{Id: term.ID, Name: term.Name, StartedAt: term.Started().UTC()} -} - -func (s *Server) ListTaskTerminals(w http.ResponseWriter, r *http.Request, taskID string) { - _, ok := s.activeTask(w, r, taskID) - if !ok { - return - } - out := []api.TaskTerminal{} + s.terminalsMu.Lock() + defer s.terminalsMu.Unlock() + list := api.TerminalList{Terminals: []api.TaskTerminal{}} for _, term := range s.terminals.List(taskID) { - out = append(out, taskTerminal(term)) + list.Terminals = append(list.Terminals, taskTerminal(taskID, term)) } - writeJSON(w, http.StatusOK, out) + s.store.Broadcast(api.Event{Kind: "terminals.changed", TaskId: &taskID, Actor: "byre", Payload: store.ToPayload(list)}) +} + +func taskTerminal(taskID string, term *terminal.Terminal) api.TaskTerminal { + return api.TaskTerminal{Id: term.ID, TaskId: taskID, Name: term.Name, StartedAt: term.Started().UTC()} +} + +func (s *Server) ListTerminals(w http.ResponseWriter, r *http.Request) { + list := api.TerminalList{Terminals: []api.TaskTerminal{}} + for taskID, terms := range s.terminals.All() { + for _, term := range terms { + list.Terminals = append(list.Terminals, taskTerminal(taskID, term)) + } + } + writeJSON(w, http.StatusOK, list) } func (s *Server) StartTaskTerminal(w http.ResponseWriter, r *http.Request, taskID string) { @@ -64,7 +69,7 @@ func (s *Server) StartTaskTerminal(w http.ResponseWriter, r *http.Request, taskI writeError(w, http.StatusInternalServerError, err) return } - writeJSON(w, http.StatusCreated, taskTerminal(term)) + writeJSON(w, http.StatusCreated, taskTerminal(taskID, term)) } func (s *Server) CloseTaskTerminal(w http.ResponseWriter, r *http.Request, taskID, terminalID string) { diff --git a/internal/terminal/terminal.go b/internal/terminal/terminal.go index 4c3b815..50adbe7 100644 --- a/internal/terminal/terminal.go +++ b/internal/terminal/terminal.go @@ -109,6 +109,16 @@ func (ts *Terminals) List(taskID string) []*Terminal { return slices.Clone(ts.byTask[taskID]) } +func (ts *Terminals) All() map[string][]*Terminal { + ts.mu.Lock() + defer ts.mu.Unlock() + out := map[string][]*Terminal{} + for taskID, terms := range ts.byTask { + out[taskID] = slices.Clone(terms) + } + return out +} + func (ts *Terminals) Get(taskID, id string) *Terminal { ts.mu.Lock() defer ts.mu.Unlock() diff --git a/mac/Sources/Byre/Startup.swift b/mac/Sources/Byre/Startup.swift index fb509f2..3e379d8 100644 --- a/mac/Sources/Byre/Startup.swift +++ b/mac/Sources/Byre/Startup.swift @@ -236,7 +236,8 @@ final class Connection { async let inbox: Void = store.loadInbox() async let lead: Void = store.loadLeadSessions() async let reads: Void = store.loadSummaryReads() - _ = try await (me, projects, inbox, lead, reads) + async let terminals: Void = store.loadTerminals() + _ = try await (me, projects, inbox, lead, reads, terminals) try await store.loadFocus() guard !stopped else { await store.stop() diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index cae6e0e..0f392b4 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -60,6 +60,7 @@ final class Store { var tasks: [String: [ByreTask]] = [:] var sessions: [String: [AgentSession]] = [:] var inbox: [InboxItem] = [] + private(set) var terminals: [String: [TaskTerminal]] = [:] private(set) var selectedTaskId: String? var pinned: Int? var connected = false @@ -85,6 +86,7 @@ final class Store { private var taskFeeds: [String: Feed] = [:] @ObservationIgnored private var historyLoads: Set = [] @ObservationIgnored private var requestSeqs: [String: Int] = [:] + @ObservationIgnored private var terminalChanges = 0 @ObservationIgnored private var globalStream: EventStream? @ObservationIgnored private var leadStream: EventStream? @ObservationIgnored private var stopped = false @@ -367,6 +369,20 @@ final class Store { drafts?.prune(self) } + func loadTerminals() async throws { + let latest = claimRequest("terminals") + let changes = terminalChanges + let list = try await api.client.listTerminals().ok.body.json + if !latest() { + return + } + if changes != terminalChanges { + try await loadTerminals() + return + } + terminals = Dictionary(grouping: list.terminals, by: \.taskId) + } + func loadLeadSessions() async throws { leadSessions = try await api.client.listLeadSessions().ok.body.json } @@ -607,6 +623,9 @@ final class Store { }, onState: { [weak self] up in self?.connected = up if up { + self?.spawn("load terminals") { + try await self?.loadTerminals() + } self?.paneFocus.reconnected() reconnected() } @@ -632,6 +651,10 @@ final class Store { taskFeeds[taskId]?.push(ev) confirmSend(taskId, ev) } + if ev.kind == "terminals.changed", let taskId = ev.taskId { + terminalChanges += 1 + terminals[taskId] = try! decodePayload(ev.payload, as: TerminalList.self).terminals + } if ev.seq == 0 { events.send(ev) return diff --git a/mac/Sources/Byre/Terminal.swift b/mac/Sources/Byre/Terminal.swift index 74f4c85..fa50dac 100644 --- a/mac/Sources/Byre/Terminal.swift +++ b/mac/Sources/Byre/Terminal.swift @@ -7,6 +7,7 @@ let exitedCode = 4000 private let retryAfter = Duration.seconds(2) typealias TaskTerminal = Components.Schemas.TaskTerminal +typealias TerminalList = Components.Schemas.TerminalList typealias SavedCommand = Components.Schemas.SavedCommand @MainActor @@ -17,24 +18,23 @@ func terminalFocused() -> Bool { struct TerminalTab: View { @Environment(Store.self) private var store @Environment(Overlays.self) private var overlays - @ViewState private var list: [TaskTerminal]? @ViewState private var commands: [SavedCommand] = [] @ViewState private var selected: String? @ViewState private var status = "" @ViewState private var failure: String? - @ViewState private var started = false - @ViewState private var loads = 0 + @ViewState private var starting = false @ViewState private var off: (() -> Void)? var body: some View { let taskId = store.selectedTaskId let task = taskId.flatMap { store.findTask($0) } - let current = list?.first { $0.id == selected }?.id ?? list?.first?.id + let list = taskId.flatMap { store.terminals[$0] } ?? [] + let current = list.first { $0.id == selected }?.id ?? list.first?.id VStack(spacing: 0) { HStack(alignment: .firstTextBaseline, spacing: 12) { ScrollView(.horizontal, showsIndicators: false) { HStack(alignment: .firstTextBaseline, spacing: 4) { - ForEach(list ?? [], id: \.id) { term in + ForEach(list, id: \.id) { term in HStack(alignment: .firstTextBaseline, spacing: 0) { RangeTabButton(label: term.name, active: term.id == current, help: "Show this terminal") { selected = term.id @@ -77,13 +77,11 @@ struct TerminalTab: View { store?.findTask(taskId)?.status == .active }, show: { text in status = text - }, lost: { - load() }) .id("\(taskId) \(current)") } else if let failure { EmptyText(text: failure, error: true) - } else if list != nil { + } else if !starting { EmptyText(text: "No terminals are open in this task.") } } else if taskId == nil { @@ -98,23 +96,16 @@ struct TerminalTab: View { .background(Palette.bg) } .onChange(of: "\(taskId ?? "") \(task?.status.rawValue ?? "")", initial: true) { - list = nil selected = nil status = "" failure = nil - started = false - load() - } - .onChange(of: store.connected) { - if store.connected { - load() + starting = false + if task?.status == .active && list.isEmpty { + start(nil) } } .onAppear { off = store.events.add { ev in - if ev.kind == "terminals.changed" && ev.taskId == store.selectedTaskId { - load() - } if ev.kind == "command.saved" || ev.kind == "command.deleted" { loadCommands() } @@ -124,30 +115,6 @@ struct TerminalTab: View { .onDisappear { off?() off = nil - loads += 1 - } - } - - private func load() { - guard let taskId = store.selectedTaskId, store.findTask(taskId)?.status == .active else { - return - } - loads += 1 - let n = loads - Task { - do { - let loaded = try await store.api.client.listTaskTerminals(path: .init(taskId: taskId)).ok.body.json - if n != loads { - return - } - list = loaded - failure = nil - if loaded.isEmpty && !started { - start(nil) - } - } catch { - failure = errorText(error) - } } } @@ -165,17 +132,17 @@ struct TerminalTab: View { guard let taskId = store.selectedTaskId else { return } - started = true + starting = true Task { do { let term = try await store.api.client.startTaskTerminal(path: .init(taskId: taskId), body: .json(.init(commandId: commandId))).created.body.json if store.selectedTaskId == taskId { selected = term.id - load() } } catch { failure = errorText(error) } + starting = false } } @@ -199,11 +166,10 @@ struct TerminalHost: NSViewRepresentable { let terminalId: String let active: @MainActor () -> Bool let show: @MainActor (String) -> Void - let lost: @MainActor () -> Void @Environment(\.colorScheme) private var scheme func makeCoordinator() -> TerminalSession { - TerminalSession(api: api, taskId: taskId, terminalId: terminalId, active: active, show: show, lost: lost) + TerminalSession(api: api, taskId: taskId, terminalId: terminalId, active: active, show: show) } func makeNSView(context: Context) -> TerminalView { @@ -261,20 +227,18 @@ final class TerminalSession: NSObject, TerminalViewDelegate, URLSessionWebSocket let terminalId: String let active: @MainActor () -> Bool let show: @MainActor (String) -> Void - let lost: @MainActor () -> Void weak var view: TerminalView? var scheme: ColorScheme? private var ws: URLSessionWebSocketTask? private var retry: Task? private var done = false - init(api: API, taskId: String, terminalId: String, active: @escaping @MainActor () -> Bool, show: @escaping @MainActor (String) -> Void, lost: @escaping @MainActor () -> Void) { + init(api: API, taskId: String, terminalId: String, active: @escaping @MainActor () -> Bool, show: @escaping @MainActor (String) -> Void) { self.api = api self.taskId = taskId self.terminalId = terminalId self.active = active self.show = show - self.lost = lost } func connect() { @@ -345,7 +309,6 @@ final class TerminalSession: NSObject, TerminalViewDelegate, URLSessionWebSocket return } show("disconnected, reconnecting…") - lost() retry = Task { try? await Task.sleep(for: retryAfter) if !Task.isCancelled {