Files
synapbus/internal/admin/server.go
T
Algis DumbrisandClaude Opus 4.6 d5ca5b915f feat: add webhook, k8s, and attachments gc CLI subcommands
Add admin CLI subcommands for managing webhooks, K8s job handlers,
and running attachment garbage collection via the Unix admin socket.

Server-side:
- Add WebhookServiceProvider and K8sServiceProvider interfaces to admin pkg
- Add 7 new command handlers: webhook.{register,list,delete},
  k8s.{register,list,delete}, attachments.gc
- Wire webhook and k8s services into admin.Services struct in main.go

CLI-side:
- Add `synapbus webhook {register,list,delete}` commands
- Add `synapbus k8s {register,list,delete}` commands
- Add `synapbus attachments gc` command
- All commands follow existing patterns (adminRequest, printTable, printJSON)

Tests:
- Add cmd/synapbus/admin_test.go with 9 tests covering command
  registration, required flag validation, and existing command preservation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 07:53:53 +02:00

84 lines
2.9 KiB
Go

// Package admin provides a Unix domain socket server for local administration.
package admin
import (
"context"
"database/sql"
"log/slog"
"net"
"github.com/synapbus/synapbus/internal/agents"
"github.com/synapbus/synapbus/internal/attachments"
"github.com/synapbus/synapbus/internal/auth"
"github.com/synapbus/synapbus/internal/channels"
"github.com/synapbus/synapbus/internal/k8s"
"github.com/synapbus/synapbus/internal/messaging"
"github.com/synapbus/synapbus/internal/search"
"github.com/synapbus/synapbus/internal/trace"
"github.com/synapbus/synapbus/internal/webhooks"
)
// WebhookServiceProvider defines the webhook operations needed by the admin socket.
type WebhookServiceProvider interface {
RegisterWebhook(ctx context.Context, agentName, url string, events []string, secret string) (*webhooks.Webhook, error)
ListWebhooks(ctx context.Context, agentName string) ([]*webhooks.Webhook, error)
DeleteWebhook(ctx context.Context, agentName string, webhookID int64) error
}
// K8sServiceProvider defines the K8s handler operations needed by the admin socket.
type K8sServiceProvider interface {
RegisterHandler(ctx context.Context, agentName string, req k8s.RegisterHandlerRequest) (*k8s.K8sHandler, error)
ListHandlers(ctx context.Context, agentName string) ([]*k8s.K8sHandler, error)
DeleteHandler(ctx context.Context, agentName string, handlerID int64) error
}
// Services holds references to all services the admin socket can control.
type Services struct {
Users *auth.SQLiteUserStore
Sessions auth.SessionStore
Agents *agents.AgentService
Messages *messaging.MessagingService
Channels *channels.Service
Traces trace.TraceStore
EmbeddingStore *search.EmbeddingStore
VectorIndex *search.VectorIndex
SearchService *search.Service
AttachmentService *attachments.Service
WebhookService WebhookServiceProvider
K8sService K8sServiceProvider
DataDir string
RetentionWorker RetentionStatusProvider
}
// RetentionStatusProvider provides retention status information.
type RetentionStatusProvider interface {
Status() map[string]interface{}
}
// AdminServer is a Unix domain socket server for local administration.
type AdminServer struct {
listener net.Listener
db *sql.DB
services *Services
logger *slog.Logger
socketPath string
done chan struct{}
}
// NewServer creates a new admin server bound to a Unix socket at {dataDir}/synapbus.sock.
// If socketPath is non-empty it overrides the default.
func NewServer(socketPath string, db *sql.DB, services *Services, logger *slog.Logger) *AdminServer {
return &AdminServer{
db: db,
services: services,
logger: logger.With("component", "admin"),
socketPath: socketPath,
done: make(chan struct{}),
}
}
// SocketPath returns the path to the Unix socket.
func (s *AdminServer) SocketPath() string {
return s.socketPath
}