web

package
v0.0.0-nightly.20260627 Latest Latest
Warning

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

Go to latest
Published: Jun 26, 2026 License: AGPL-3.0 Imports: 19 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ServeSSE

func ServeSSE(w http.ResponseWriter, r *http.Request, hub *Hub, id string)

func ValidateMode

func ValidateMode(mode string) (string, error)

func ValidateTarget

func ValidateTarget(raw string) (string, error)

Types

type AgentInfo

type AgentInfo struct {
	ID        string                 `json:"id"`
	Name      string                 `json:"name"`
	Commands  []string               `json:"commands,omitempty"`
	Busy      bool                   `json:"busy"`
	ConnectAt time.Time              `json:"connected_at"`
	Identity  webproto.AgentIdentity `json:"identity,omitempty"`
	Stats     webproto.AgentStats    `json:"stats,omitempty"`
}

AgentInfo is the public view of a connected agent.

type AgentPool

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

AgentPool manages connected remote aiscan agents via WebSocket.

func NewAgentPool

func NewAgentPool(hub *Hub, allowedOrigins ...string) *AgentPool

func (*AgentPool) CancelPTY

func (p *AgentPool) CancelPTY(agentID, terminalID string)

func (*AgentPool) CancelTask

func (p *AgentPool) CancelTask(agentID, taskID string)

func (*AgentPool) CloseTerminal

func (p *AgentPool) CloseTerminal(agentID, terminalID string)

func (*AgentPool) Count

func (p *AgentPool) Count() int

func (*AgentPool) DispatchCommand

func (p *AgentPool) DispatchCommand(agentID, taskID, command string) (<-chan taskResult, error)

DispatchCommand sends a command to an agent and returns a channel for the result.

func (*AgentPool) HandleTerminalWS

func (p *AgentPool) HandleTerminalWS(agentID string, w http.ResponseWriter, r *http.Request)

HandleTerminalWS bridges one browser terminal WebSocket to one remote agent. The browser sends pty.* messages; the pool assigns a stream_id and relays matching agent responses back.

func (*AgentPool) HandleWS

func (p *AgentPool) HandleWS(w http.ResponseWriter, r *http.Request)

HandleWS upgrades to WebSocket and manages the agent lifecycle. This single endpoint replaces register + stream + output + complete.

func (*AgentPool) List

func (p *AgentPool) List() []AgentInfo

func (*AgentPool) Pick

func (p *AgentPool) Pick() *remoteAgent

Pick selects an idle agent, or any agent if none idle.

func (*AgentPool) SendAgentMessage

func (p *AgentPool) SendAgentMessage(agentID string, msg WSMessage) error

type BroadcastCallback

type BroadcastCallback func(id string, event HubEvent)

type Handler

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

func NewHandler

func NewHandler(service *Service, agents *AgentPool, ioaHandler http.Handler, static http.Handler) *Handler

func (*Handler) ServeHTTP

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request)

type Hub

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

func NewHub

func NewHub() *Hub

func (*Hub) Broadcast

func (h *Hub) Broadcast(id string, event HubEvent)

func (*Hub) OnBroadcast

func (h *Hub) OnBroadcast(cb BroadcastCallback)

func (*Hub) Subscribe

func (h *Hub) Subscribe(id string) (<-chan HubEvent, func())

type HubEvent

type HubEvent struct {
	Type string
	Data json.RawMessage
}

HubEvent is the unit broadcast through the SSE hub. Type is the SSE event name, Data is pre-serialized JSON written directly to the stream.

type LLMConfig

type LLMConfig struct {
	ConfigPath       string `json:"config_path,omitempty"`
	ConfigLoaded     bool   `json:"config_loaded"`
	Provider         string `json:"provider"`
	BaseURL          string `json:"base_url"`
	APIKey           string `json:"api_key,omitempty"`
	APIKeyConfigured bool   `json:"api_key_configured"`
	Model            string `json:"model"`
	Proxy            string `json:"proxy"`
}

type LLMConfigStore

type LLMConfigStore interface {
	GetLLMConfig(ctx context.Context) (LLMConfig, error)
	SaveLLMConfig(ctx context.Context, cfg LLMConfig) (LLMConfig, error)
}

type SQLiteStore

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

func NewSQLiteStore

func NewSQLiteStore(dbPath string) (*SQLiteStore, error)

func (*SQLiteStore) Close

func (s *SQLiteStore) Close() error

func (*SQLiteStore) Create

func (s *SQLiteStore) Create(ctx context.Context, job *ScanJob) error

func (*SQLiteStore) Delete

func (s *SQLiteStore) Delete(ctx context.Context, id string) error

func (*SQLiteStore) Get

func (s *SQLiteStore) Get(ctx context.Context, id string) (*ScanJob, error)

func (*SQLiteStore) List

func (s *SQLiteStore) List(ctx context.Context, limit int) ([]*ScanJob, error)

func (*SQLiteStore) Update

func (s *SQLiteStore) Update(ctx context.Context, job *ScanJob) error

type ScanJob

type ScanJob struct {
	ID        string         `json:"id"`
	Target    string         `json:"target"`
	Mode      string         `json:"mode"`
	Verify    bool           `json:"verify,omitempty"`
	Sniper    bool           `json:"sniper,omitempty"`
	AI        bool           `json:"ai,omitempty"`
	Deep      bool           `json:"deep,omitempty"`
	Status    ScanStatus     `json:"status"`
	Progress  string         `json:"progress,omitempty"`
	Report    string         `json:"report,omitempty"`
	Result    *output.Result `json:"result,omitempty"`
	Error     string         `json:"error,omitempty"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
}

type ScanRequest

type ScanRequest struct {
	Target string `json:"target"`
	Mode   string `json:"mode"`
	Verify bool   `json:"verify,omitempty"`
	Sniper bool   `json:"sniper,omitempty"`
	AI     bool   `json:"ai,omitempty"`
	Deep   bool   `json:"deep,omitempty"`
}

func (ScanRequest) AnalysisOptions

func (r ScanRequest) AnalysisOptions() (verify, sniper, deep bool)

type ScanStatus

type ScanStatus string
const (
	StatusQueued    ScanStatus = "queued"
	StatusRunning   ScanStatus = "running"
	StatusCompleted ScanStatus = "completed"
	StatusFailed    ScanStatus = "failed"
	StatusCanceled  ScanStatus = "canceled"
)

type Service

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

func NewService

func NewService(cfg ServiceConfig) *Service

func (*Service) CancelScan

func (s *Service) CancelScan(id string) error

func (*Service) Close

func (s *Service) Close()

func (*Service) GetLLMConfig

func (s *Service) GetLLMConfig(ctx context.Context) (LLMConfig, error)

func (*Service) GetReport

func (s *Service) GetReport(ctx context.Context, id string) (string, error)

func (*Service) GetScan

func (s *Service) GetScan(ctx context.Context, id string) (*ScanJob, error)

func (*Service) Hub

func (s *Service) Hub() *Hub

func (*Service) ListScans

func (s *Service) ListScans(ctx context.Context) ([]*ScanJob, error)

func (*Service) SaveLLMConfig

func (s *Service) SaveLLMConfig(ctx context.Context, cfg LLMConfig) (LLMConfig, error)

func (*Service) SetAgentPool

func (s *Service) SetAgentPool(pool *AgentPool)

func (*Service) Status

func (s *Service) Status() ServiceStatus

func (*Service) SubmitScan

func (s *Service) SubmitScan(ctx context.Context, target, mode string, verify, sniper, deep bool) (*ScanJob, error)

type ServiceConfig

type ServiceConfig struct {
	Store         Store
	App           *runner.App
	ConfigStore   LLMConfigStore
	AppFactory    func(ctx context.Context) (*runner.App, error)
	AgentPool     *AgentPool
	MaxConcurrent int
	ScanTimeout   time.Duration
}

type ServiceStatus

type ServiceStatus struct {
	LLMAvailable        bool   `json:"llm_available"`
	LLMProvider         string `json:"llm_provider,omitempty"`
	LLMModel            string `json:"llm_model,omitempty"`
	LLMAPIKeyConfigured bool   `json:"llm_api_key_configured,omitempty"`
	ConfigPath          string `json:"config_path,omitempty"`
	ConfigLoaded        bool   `json:"config_loaded"`
	Agents              int    `json:"agents"`
}

type Store

type Store interface {
	Create(ctx context.Context, job *ScanJob) error
	Get(ctx context.Context, id string) (*ScanJob, error)
	List(ctx context.Context, limit int) ([]*ScanJob, error)
	Update(ctx context.Context, job *ScanJob) error
	Delete(ctx context.Context, id string) error
}

type WSMessage

type WSMessage = webproto.Message

WSMessage is the single message type for all agent↔web communication.

Jump to

Keyboard shortcuts

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