web

package
v1.3.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 7, 2026 License: MIT Imports: 33 Imported by: 0

Documentation

Index

Constants

View Source
const (
	ErrCodeUnauthorized     = "UNAUTHORIZED"
	ErrCodeForbidden        = "MUTATIONS_DISABLED"
	ErrCodeNotFound         = "NOT_FOUND"
	ErrCodeBadRequest       = "INVALID_REQUEST"
	ErrCodeMethodNotAllowed = "METHOD_NOT_ALLOWED"
	ErrCodeRateLimited      = "RATE_LIMITED"
	ErrCodeInternalError    = "INTERNAL_ERROR"
	ErrCodeNotImplemented   = "NOT_IMPLEMENTED"
	ErrCodeReadOnly         = "READ_ONLY"
)

Error code constants for API error responses.

View Source
const (
	MenuItemTypeGroup   = "group"
	MenuItemTypeSession = "session"
)

Variables

View Source
var ErrTmuxSessionNotFound = errors.New("tmux session not found")

Functions

func EnsurePushVAPIDKeys

func EnsurePushVAPIDKeys(profile, subject string) (publicKey, privateKey string, generated bool, err error)

EnsurePushVAPIDKeys returns a persisted VAPID keypair for the given profile. If no key file exists yet, it generates one via webpush.GenerateVAPIDKeys().

Types

type Config

type Config struct {
	ListenAddr          string
	Profile             string
	ReadOnly            bool
	WebMutations        bool // When false, POST/PATCH/DELETE endpoints return 403
	Token               string
	MenuData            MenuDataLoader
	PushVAPIDPublicKey  string
	PushVAPIDPrivateKey string
	PushVAPIDSubject    string
	PushTestInterval    time.Duration
}

Config defines runtime options for the web server.

type CreateGroupRequest added in v1.3.4

type CreateGroupRequest struct {
	Name       string `json:"name"`
	ParentPath string `json:"parentPath,omitempty"`
}

CreateGroupRequest is the body for POST /api/groups.

type CreateSessionRequest added in v1.3.4

type CreateSessionRequest struct {
	Title       string `json:"title"`
	Tool        string `json:"tool"`
	ProjectPath string `json:"projectPath"`
	GroupPath   string `json:"groupPath,omitempty"`
}

CreateSessionRequest is the body for POST /api/sessions.

type MemoryMenuData

type MemoryMenuData struct {
	// contains filtered or unexported fields
}

MemoryMenuData is an in-memory menu snapshot store used by web mode. It can optionally fall back to a loader (e.g. storage-backed) until the first in-memory snapshot is published.

func NewMemoryMenuData

func NewMemoryMenuData(fallback MenuDataLoader) *MemoryMenuData

NewMemoryMenuData creates an in-memory menu data store.

func (*MemoryMenuData) LoadMenuSnapshot

func (m *MemoryMenuData) LoadMenuSnapshot() (*MenuSnapshot, error)

LoadMenuSnapshot returns the latest in-memory snapshot. If no snapshot exists yet, it falls back once to the configured loader.

func (*MemoryMenuData) SetSnapshot

func (m *MemoryMenuData) SetSnapshot(snapshot *MenuSnapshot)

SetSnapshot replaces the stored menu snapshot.

func (*MemoryMenuData) UpdateSessionStates

func (m *MemoryMenuData) UpdateSessionStates(states map[string]MenuSessionState, generatedAt time.Time)

UpdateSessionStates updates status/tool fields in-place for existing sessions.

type MenuDataLoader interface {
	LoadMenuSnapshot() (*MenuSnapshot, error)
}

MenuDataLoader provides menu snapshots for web APIs and push notifications.

type MenuGroup struct {
	Name         string `json:"name"`
	Path         string `json:"path"`
	Expanded     bool   `json:"expanded"`
	Order        int    `json:"order"`
	SessionCount int    `json:"sessionCount"`
}

MenuGroup contains metadata for a group item.

type MenuItem struct {
	Index               int          `json:"index"`
	Type                string       `json:"type"`
	Level               int          `json:"level"`
	Path                string       `json:"path,omitempty"`
	Group               *MenuGroup   `json:"group,omitempty"`
	Session             *MenuSession `json:"session,omitempty"`
	IsLastInGroup       bool         `json:"isLastInGroup,omitempty"`
	IsSubSession        bool         `json:"isSubSession,omitempty"`
	IsLastSubSession    bool         `json:"isLastSubSession,omitempty"`
	ParentIsLastInGroup bool         `json:"parentIsLastInGroup,omitempty"`
}

MenuItem represents one row in the flattened navigation list.

type MenuSession struct {
	ID              string         `json:"id"`
	Title           string         `json:"title"`
	Tool            string         `json:"tool"`
	Status          session.Status `json:"status"`
	GroupPath       string         `json:"groupPath"`
	ProjectPath     string         `json:"projectPath"`
	ParentSessionID string         `json:"parentSessionId,omitempty"`
	Order           int            `json:"order"`
	TmuxSession     string         `json:"tmuxSession,omitempty"`
	CreatedAt       time.Time      `json:"createdAt"`
	LastAccessedAt  time.Time      `json:"lastAccessedAt,omitempty"`
}

MenuSession contains metadata for a session item.

type MenuSessionState struct {
	Status session.Status
	Tool   string
}

MenuSessionState is a lightweight status/tool update for one session.

type MenuSnapshot struct {
	Profile       string     `json:"profile"`
	GeneratedAt   time.Time  `json:"generatedAt"`
	TotalGroups   int        `json:"totalGroups"`
	TotalSessions int        `json:"totalSessions"`
	Items         []MenuItem `json:"items"`
}

MenuSnapshot is a flattened, ordered representation of session navigation data.

func BuildMenuSnapshot

func BuildMenuSnapshot(profile string, instances []*session.Instance, groupsData []*session.GroupData, generatedAt time.Time) *MenuSnapshot

BuildMenuSnapshot converts in-memory session/group state into a flattened web DTO.

type ProfilesResponse added in v1.3.4

type ProfilesResponse struct {
	Current  string   `json:"current"`
	Profiles []string `json:"profiles"`
}

ProfilesResponse is returned by GET /api/profiles.

type RenameGroupRequest added in v1.3.4

type RenameGroupRequest struct {
	Name string `json:"name"`
}

RenameGroupRequest is the body for PATCH /api/groups/:path.

type SSECostEvent added in v1.3.4

type SSECostEvent struct {
	EventType string  `json:"eventType"`
	SessionID string  `json:"sessionId"`
	Cost      float64 `json:"cost"`
}

SSECostEvent is emitted on cost:updated events.

type SSEDeleteEvent added in v1.3.4

type SSEDeleteEvent struct {
	EventType string `json:"eventType"`
	ID        string `json:"id"`
}

SSEDeleteEvent is emitted on session:deleted events.

type SSEGroupDeleteEvent added in v1.3.4

type SSEGroupDeleteEvent struct {
	EventType string `json:"eventType"`
	Path      string `json:"path"`
}

SSEGroupDeleteEvent is emitted on group:deleted events.

type SSEGroupEvent added in v1.3.4

type SSEGroupEvent struct {
	EventType string     `json:"eventType"`
	Group     *MenuGroup `json:"group"`
}

SSEGroupEvent is emitted on group:created and group:updated events.

type SSESessionEvent added in v1.3.4

type SSESessionEvent struct {
	EventType string       `json:"eventType"`
	Session   *MenuSession `json:"session"`
}

SSESessionEvent is emitted on session:created and session:updated events.

type Server

type Server struct {
	// contains filtered or unexported fields
}

Server wraps an HTTP server for Agent Deck web mode.

func NewServer

func NewServer(cfg Config) *Server

NewServer creates a new web server with base routes and middleware.

func (*Server) Addr

func (s *Server) Addr() string

Addr returns the listen address.

func (*Server) Handler

func (s *Server) Handler() http.Handler

Handler returns the configured HTTP handler (used by tests).

func (*Server) SetCostStore added in v0.26.4

func (s *Server) SetCostStore(store *costs.Store)

func (*Server) SetMutator added in v1.3.4

func (s *Server) SetMutator(m SessionMutator)

SetMutator injects the session mutator implementation (typically *ui.WebMutator).

func (*Server) Shutdown

func (s *Server) Shutdown(ctx context.Context) error

Shutdown gracefully stops the server.

func (*Server) Start

func (s *Server) Start() error

Start starts the HTTP server and blocks until shutdown or error. Returns nil on graceful shutdown.

func (*Server) String

func (s *Server) String() string

type SessionActionResponse added in v1.3.4

type SessionActionResponse struct {
	SessionID string         `json:"sessionId"`
	Status    session.Status `json:"status"`
}

SessionActionResponse is returned by session action endpoints.

type SessionDataService

type SessionDataService struct {
	// contains filtered or unexported fields
}

SessionDataService loads profile session data and transforms it into web-friendly DTOs.

func NewSessionDataService

func NewSessionDataService(profile string) *SessionDataService

NewSessionDataService creates a SessionDataService for a profile.

func (*SessionDataService) LoadMenuSnapshot

func (s *SessionDataService) LoadMenuSnapshot() (*MenuSnapshot, error)

LoadMenuSnapshot loads sessions/groups and returns a deterministic flattened menu DTO.

func (*SessionDataService) Profile

func (s *SessionDataService) Profile() string

Profile returns the effective profile this service reads from.

type SessionMutator added in v1.3.4

type SessionMutator interface {
	CreateSession(title, tool, projectPath, groupPath string) (string, error)
	StartSession(sessionID string) error
	StopSession(sessionID string) error
	RestartSession(sessionID string) error
	DeleteSession(sessionID string) error
	ForkSession(sessionID string) (string, error)
	CreateGroup(name, parentPath string) (string, error)
	RenameGroup(groupPath, newName string) error
	DeleteGroup(groupPath string) error
}

SessionMutator is implemented by internal/ui.WebMutator and injected at startup. It bridges web HTTP handlers to the TUI session/group management methods.

type SettingsResponse added in v1.3.4

type SettingsResponse struct {
	Profile      string `json:"profile"`
	ReadOnly     bool   `json:"readOnly"`
	WebMutations bool   `json:"webMutations"`
	Version      string `json:"version"`
}

SettingsResponse is returned by GET /api/settings.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL