Admin view in the web UI

This commit is contained in:
Ian Gulliver
2026-10-14 21:06:30 -07:00
parent b2bd894677
commit 4a2bbe0859
34 changed files with 838 additions and 214 deletions
+27 -12
View File
@@ -282,27 +282,38 @@ func (m *Manager) LiveCount() int {
}
type Usage struct {
Running int
Queued int
Running []api.TurnRef
Queued []api.TurnRef
Caps api.Caps
RateLimits map[string]map[string]any
}
func (m *Manager) Usage(ctx context.Context) (Usage, error) {
u := Usage{RateLimits: map[string]map[string]any{}}
u := Usage{
Running: []api.TurnRef{},
Queued: []api.TurnRef{},
Caps: api.Caps{Global: m.limits.Global, PerVendor: map[string]int{}},
RateLimits: map[string]map[string]any{},
}
for vendor, n := range m.limits.PerVendor {
u.Caps.PerVendor[string(vendor)] = n
}
counts, err := m.store.CountRunning(ctx)
running, err := m.store.SessionsInState(ctx, api.AgentSessionStateRunning)
if err != nil {
return u, err
}
for _, n := range counts {
u.Running += n
for _, sess := range running {
u.Running = append(u.Running, api.TurnRef{SessionId: sess.Id, TaskId: sess.TaskId, Vendor: string(sess.Vendor)})
}
queued, err := m.store.QueuedTurns(ctx)
if err != nil {
return u, err
}
u.Queued = len(queued)
for _, q := range queued {
u.Queued = append(u.Queued, api.TurnRef{SessionId: q.SessionID, TaskId: q.TaskID, Vendor: string(q.Vendor)})
}
m.mu.Lock()
defer m.mu.Unlock()
@@ -325,11 +336,6 @@ func (m *Manager) turn(ctx context.Context, sess api.AgentSession, task api.Task
return m.start(ctx, sess, task, actor, text, images, api.AgentSessionStateIdle)
}
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateQueued, actor)
if err != nil {
return api.AgentSession{}, err
}
err = m.store.EnqueueTurn(ctx, store.QueuedTurn{
SessionID: sess.Id,
Vendor: sess.Vendor,
@@ -342,6 +348,15 @@ func (m *Manager) turn(ctx context.Context, sess api.AgentSession, task api.Task
return api.AgentSession{}, err
}
err = transition(ctx, m.store, sess.Id, api.AgentSessionStateIdle, api.AgentSessionStateQueued, actor)
if err != nil {
derr := m.store.DeleteQueuedTurn(ctx, sess.Id)
if derr != nil {
slog.Error("remove queued turn", "session", sess.Id, "err", derr)
}
return api.AgentSession{}, err
}
return m.store.GetSession(ctx, sess.Id)
}
+1 -1
View File
@@ -753,7 +753,7 @@ func TestConcurrencyQueue(t *testing.T) {
}
usage, err := m.Usage(e.ctx)
if err != nil || usage.Running != 1 || usage.Queued != 1 {
if err != nil || len(usage.Running) != 1 || len(usage.Queued) != 1 || usage.Queued[0].TaskId != second.TaskId {
t.Fatalf("usage %+v %v", usage, err)
}
+103 -80
View File
@@ -312,6 +312,15 @@ type Blob struct {
Id string `json:"id"`
}
// Caps defines model for Caps.
type Caps struct {
// Global Most turns running at once across all vendors.
Global int `json:"global"`
// PerVendor Most turns running at once per vendor, keyed by vendor.
PerVendor map[string]int `json:"per_vendor"`
}
// Error defines model for Error.
type Error struct {
Message string `json:"message"`
@@ -458,19 +467,24 @@ type SessionCreate struct {
// Status defines model for Status.
type Status struct {
ActiveTasks int `json:"active_tasks"`
Caps Caps `json:"caps"`
DbBytes int64 `json:"db_bytes"`
LastEventSeq int64 `json:"last_event_seq"`
// LiveAgents Agent processes currently running.
LiveAgents int `json:"live_agents"`
Projects int `json:"projects"`
QueuedTurns int `json:"queued_turns"`
LiveAgents int `json:"live_agents"`
Projects int `json:"projects"`
// QueuedTurns Turns waiting for room under the caps, in the order they will start.
QueuedTurns []TurnRef `json:"queued_turns"`
// RateLimits The latest rate-limit status each vendor reported, keyed by vendor.
RateLimits map[string]map[string]interface{} `json:"rate_limits"`
RunningTurns int `json:"running_turns"`
SseClients int `json:"sse_clients"`
StartedAt time.Time `json:"started_at"`
RateLimits map[string]map[string]interface{} `json:"rate_limits"`
// RunningTurns Turns running now, oldest session first.
RunningTurns []TurnRef `json:"running_turns"`
SseClients int `json:"sse_clients"`
StartedAt time.Time `json:"started_at"`
}
// Task defines model for Task.
@@ -510,6 +524,13 @@ type TaskCreate struct {
Title string `json:"title"`
}
// TurnRef defines model for TurnRef.
type TurnRef struct {
SessionId string `json:"session_id"`
TaskId string `json:"task_id"`
Vendor string `json:"vendor"`
}
// Unmerged defines model for Unmerged.
type Unmerged struct {
// Commits Commits on the task branch that aren't on the default branch.
@@ -1662,79 +1683,81 @@ 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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",
"//8=",
"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",
}
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
View File
@@ -391,6 +391,7 @@ func (s *Server) GetStatus(w http.ResponseWriter, r *http.Request) {
LiveAgents: s.agents.LiveCount(),
RunningTurns: usage.Running,
QueuedTurns: usage.Queued,
Caps: usage.Caps,
RateLimits: usage.RateLimits,
})
}
+3 -2
View File
@@ -12,6 +12,7 @@ import (
type QueuedTurn struct {
SessionID string
TaskID string
Vendor api.AgentSessionVendor
Actor string
Text string
@@ -59,7 +60,7 @@ func (s *Store) EnqueueTurn(ctx context.Context, q QueuedTurn) error {
func (s *Store) QueuedTurns(ctx context.Context) ([]QueuedTurn, error) {
rows, err := s.db.QueryContext(ctx, `
SELECT q.session_id, s.vendor, q.actor, q.text, q.images, q.created_at
SELECT q.session_id, s.task_id, s.vendor, q.actor, q.text, q.images, q.created_at
FROM turn_queue q JOIN agent_sessions s ON s.id = q.session_id
ORDER BY q.created_at
`)
@@ -74,7 +75,7 @@ func (s *Store) QueuedTurns(ctx context.Context) ([]QueuedTurn, error) {
vendor := ""
images := ""
createdAt := ""
err = rows.Scan(&q.SessionID, &vendor, &q.Actor, &q.Text, &images, &createdAt)
err = rows.Scan(&q.SessionID, &q.TaskID, &vendor, &q.Actor, &q.Text, &images, &createdAt)
if err != nil {
return nil, err
}