Documentation
¶
Index ¶
- Constants
- Variables
- func EnsurePushVAPIDKeys(profile, subject string) (publicKey, privateKey string, generated bool, err error)
- type Assets
- type Config
- type CreateGroupRequest
- type CreateSessionRequest
- type MCPCatalogEntry
- type MCPCatalogResponse
- type MCPManager
- type MemoryMenuData
- type MenuDataLoader
- type MenuGroup
- type MenuItem
- type MenuSession
- type MenuSessionState
- type MenuSnapshot
- type ProfilesResponse
- type RenameGroupRequest
- type SSECostEvent
- type SSEDeleteEvent
- type SSEGroupDeleteEvent
- type SSEGroupEvent
- type SSESessionEvent
- type Server
- func (s *Server) Addr() string
- func (s *Server) Handler() http.Handler
- func (s *Server) HasMCPManager() bool
- func (s *Server) HasMutator() bool
- func (s *Server) SetCostStore(store *costs.Store)
- func (s *Server) SetMCPManager(m MCPManager)
- func (s *Server) SetMutator(m SessionMutator)
- func (s *Server) SetSkillsService(svc SkillsService)
- func (s *Server) Shutdown(ctx context.Context) error
- func (s *Server) Start() error
- func (s *Server) String() string
- type SessionActionResponse
- type SessionChildNode
- type SessionChildrenResponse
- type SessionDataService
- type SessionMCPsResponse
- type SessionMutator
- type SettingsResponse
- type SkillsService
Constants ¶
const ( 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.
const ( MenuItemTypeGroup = "group" MenuItemTypeSession = "session" )
const DefaultUndoWindow = 30 * time.Second
DefaultUndoWindow is the default Chrome-style undo grace period for session deletes (POST /api/sessions/undelete). Mirrors the TUI ctrl+z in-memory undo stack window.
Variables ¶
var ErrTmuxSessionNotFound = errors.New("tmux session not found")
var ErrUndoExpired = errors.New("undo window expired")
ErrUndoExpired is returned by SessionMutator.UndoDelete when the most recent delete is older than the configured undo window.
var ErrUndoNothing = errors.New("nothing to undo")
ErrUndoNothing is returned by SessionMutator.UndoDelete when the undo stack is empty.
Functions ¶
Types ¶
type Assets ¶ added in v1.5.0
type Assets struct {
// contains filtered or unexported fields
}
Assets manages the manifest-based mapping from logical source paths (e.g. "app/main.js") to hashed bundle output paths (e.g. "dist/main.a1b2c3.js"). In dev mode (no manifest present) or when the AGENTDECK_WEB_BUNDLE=0 env var is set, ResolveAsset falls back to serving the unbundled source file at /static/<logical>.
PERF-H: the manifest is emitted by bundle.go (go:generate entry point) which drives github.com/evanw/esbuild/pkg/api. The dev/prod fork keeps live-reload friendly while shipping hashed, bundled JS in production.
func LoadAssets ¶ added in v1.5.0
LoadAssets reads a manifest file from a filesystem path and returns an Assets instance. A missing manifest is NOT an error — the returned instance operates in dev mode (fallback to /static/<logical>). The AGENTDECK_WEB_BUNDLE=0 env var forces dev mode even if the manifest is present, which is the rollback lever.
func LoadAssetsFromFS ¶ added in v1.5.0
LoadAssetsFromFS reads a manifest from an io/fs.FS (e.g. the server's embed.FS). Used by the server at startup so the manifest can travel inside the binary. Missing file → dev mode.
func (*Assets) ResolveAsset ¶ added in v1.5.0
ResolveAsset maps a logical source path to the URL the browser should fetch. In dev mode: "/static/<logical>". In prod mode: "/static/<hashed>". Unknown logical paths fall back to the logical form so missing-asset regressions surface as 404s rather than silent manifest lookups.
func (*Assets) SubstitutePlaceholders ¶ added in v1.5.0
SubstitutePlaceholders replaces every {{ASSET:logical}} token in the input string with the resolved URL. Used to fill index.html at serve time so the on-disk file stays hand-written (Pitfall 3 mitigation: dirty-tree check remains clean because the bundler never writes back to index.html).
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"`
ModelID string `json:"modelId,omitempty"`
}
CreateSessionRequest is the body for POST /api/sessions.
type MCPCatalogEntry ¶ added in v1.9.25
type MCPCatalogEntry struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Transport string `json:"transport,omitempty"`
Command string `json:"command,omitempty"`
URL string `json:"url,omitempty"`
}
MCPCatalogEntry describes one MCP available in the catalog (config.toml).
type MCPCatalogResponse ¶ added in v1.9.25
type MCPCatalogResponse struct {
MCPs []MCPCatalogEntry `json:"mcps"`
}
MCPCatalogResponse is returned by GET /api/mcps.
type MCPManager ¶ added in v1.9.25
type MCPManager interface {
ListCatalog() []MCPCatalogEntry
ListAttached(projectPath string) (map[string][]string, error)
Attach(projectPath, name, scope string) error
Detach(projectPath, name, scope string) error
Move(projectPath, name, fromScope, toScope string) error
}
MCPManager is the seam between web HTTP handlers and the on-disk MCP catalog + scope-specific config files. Tests inject a fake; production gets defaultMCPManager which delegates to internal/session.
func NewDefaultMCPManager ¶ added in v1.9.25
func NewDefaultMCPManager() MCPManager
NewDefaultMCPManager returns the production MCPManager that reads/writes real config files via internal/session helpers.
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 ¶
type MenuDataLoader interface {
LoadMenuSnapshot() (*MenuSnapshot, error)
}
MenuDataLoader provides menu snapshots for web APIs and push notifications.
type MenuGroup ¶
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 ¶
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 ¶
type MenuSession struct {
ID string `json:"id"`
Title string `json:"title"`
Tool string `json:"tool"`
ModelID string `json:"modelId,omitempty"`
Model string `json:"model,omitempty"`
ModelVersion string `json:"modelVersion,omitempty"`
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"`
// TmuxSocketName is the tmux -L selector captured at session creation
// (Instance.TmuxSocketName). Surfaced so the web PTY bridge can reach
// sessions running on an isolated socket (issue #687, v1.7.50).
TmuxSocketName string `json:"tmuxSocketName,omitempty"`
CreatedAt time.Time `json:"createdAt"`
LastAccessedAt time.Time `json:"lastAccessedAt,omitempty"`
IsConductor bool `json:"isConductor,omitempty"`
ClaudeSessionID string `json:"claudeSessionId,omitempty"`
GeminiSessionID string `json:"geminiSessionId,omitempty"`
GeminiModel string `json:"geminiModel,omitempty"`
GeminiYoloMode *bool `json:"geminiYoloMode,omitempty"`
CodexSessionID string `json:"codexSessionId,omitempty"`
OpenCodeSessionID string `json:"opencodeSessionId,omitempty"`
LatestPrompt string `json:"latestPrompt,omitempty"`
Notes string `json:"notes,omitempty"`
Color string `json:"color,omitempty"`
Command string `json:"command,omitempty"`
Wrapper string `json:"wrapper,omitempty"`
Channels []string `json:"channels,omitempty"`
ExtraArgs []string `json:"extraArgs,omitempty"`
ToolOptionsJSON json.RawMessage `json:"toolOptions,omitempty"`
Sandbox *session.SandboxConfig `json:"sandbox,omitempty"`
SandboxContainer string `json:"sandboxContainer,omitempty"`
SSHHost string `json:"sshHost,omitempty"`
SSHRemotePath string `json:"sshRemotePath,omitempty"`
MultiRepoEnabled bool `json:"multiRepoEnabled,omitempty"`
AdditionalPaths []string `json:"additionalPaths,omitempty"`
MultiRepoTempDir string `json:"multiRepoTempDir,omitempty"`
MultiRepoWorktrees []session.MultiRepoWorktree `json:"multiRepoWorktrees,omitempty"`
WorktreePath string `json:"worktreePath,omitempty"`
WorktreeRepoRoot string `json:"worktreeRepoRoot,omitempty"`
WorktreeBranch string `json:"worktreeBranch,omitempty"`
TitleLocked bool `json:"titleLocked,omitempty"`
NoTransitionNotify bool `json:"noTransitionNotify,omitempty"`
LoadedMCPNames []string `json:"loadedMcpNames,omitempty"`
// claude_analytics has no underlying struct on *Instance so the matrix
// keeps it MISSING; only gemini is exposed today.
GeminiAnalytics *session.GeminiSessionAnalytics `json:"geminiAnalytics,omitempty"`
}
MenuSession contains metadata for a session item.
type MenuSessionState ¶
MenuSessionState is a lightweight status/tool update for one session.
type MenuSnapshot ¶
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
SSEDeleteEvent is emitted on session:deleted events.
type SSEGroupDeleteEvent ¶ added in v1.3.4
SSEGroupDeleteEvent is emitted on group:deleted events.
type SSEGroupEvent ¶ added in v1.3.4
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 (*Server) HasMCPManager ¶ added in v1.9.25
HasMCPManager reports whether the MCP manager seam is wired.
func (*Server) HasMutator ¶ added in v1.7.75
HasMutator reports whether a SessionMutator has been wired. Mutating endpoints (POST/PATCH/DELETE) return 503 NOT_IMPLEMENTED when this is false, even if WebMutations is true. Exposed for regression tests on the `agent-deck web` bootstrap path.
func (*Server) SetCostStore ¶ added in v0.26.4
func (*Server) SetMCPManager ¶ added in v1.9.25
func (s *Server) SetMCPManager(m MCPManager)
SetMCPManager wires the MCP manager implementation (production or test).
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) SetSkillsService ¶ added in v1.9.25
func (s *Server) SetSkillsService(svc SkillsService)
SetSkillsService injects an alternate SkillsService (used by tests). When nil, handlers fall back to defaultSkillsService.
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 SessionChildNode ¶ added in v1.9.26
type SessionChildNode struct {
*MenuSession
Children []*SessionChildNode `json:"children"`
}
SessionChildNode is one node in the children-tree response. It inlines the standard MenuSession fields and adds a recursive `children` array. `children` is always non-nil — even leaves render as `"children":[]` so JS consumers don't have to null-check.
type SessionChildrenResponse ¶ added in v1.9.26
type SessionChildrenResponse struct {
SessionID string `json:"sessionId"`
Children []*SessionChildNode `json:"children"`
}
SessionChildrenResponse is the body of GET /api/sessions/{id}/children.
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 SessionMCPsResponse ¶ added in v1.9.25
type SessionMCPsResponse struct {
SessionID string `json:"sessionId"`
Local []string `json:"local"`
Global []string `json:"global"`
User []string `json:"user"`
}
SessionMCPsResponse is returned by GET /api/sessions/{id}/mcps.
type SessionMutator ¶ added in v1.3.4
type SessionMutator interface {
CreateSession(title, tool, projectPath, groupPath, modelID string) (string, error)
StartSession(sessionID string) error
StopSession(sessionID string) error
RestartSession(sessionID string) error
DeleteSession(sessionID string) error
// CloseSession stops the session process while keeping its metadata
// in storage (TUI Shift+D — non-destructive close).
CloseSession(sessionID string) error
ForkSession(sessionID string) (string, error)
// UndoDelete restores the most-recently deleted session if it was
// deleted within the implementation's undo window. Returns the
// restored session id. Implementations should return ErrUndoNothing
// when the stack is empty and ErrUndoExpired when the most recent
// entry is older than the window — the handler maps both to 404.
UndoDelete() (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.
type SkillsService ¶ added in v1.9.25
type SkillsService interface {
ListCatalog() ([]session.SkillCandidate, error)
ListAttached(projectPath string) ([]session.ProjectSkillAttachment, error)
Attach(projectPath, tool, skillRef, source string) (*session.ProjectSkillAttachment, error)
Detach(projectPath, skillRef, source string) (*session.ProjectSkillAttachment, error)
}
SkillsService is the seam between web HTTP handlers and the on-disk skill catalog/attachment functions in internal/session. Tests inject a fake; production gets defaultSkillsService which delegates straight to the session package.
Source Files
¶
- api_types.go
- assets.go
- auth.go
- handlers_children.go
- handlers_costs.go
- handlers_events.go
- handlers_groups.go
- handlers_mcps.go
- handlers_menu.go
- handlers_push.go
- handlers_sessions.go
- handlers_settings.go
- handlers_skills.go
- handlers_system.go
- handlers_ws.go
- memory_menu_data.go
- menu_snapshot_builder.go
- middleware.go
- push_service.go
- server.go
- session_data_service.go
- snapshot_hook_refresh.go
- static_files.go
- terminal_bridge.go
- vapid_keys.go