package plugin import ( "context" "connectrpc.com/connect" "git.dev.alexdunmow.com/block/core/ai" "git.dev.alexdunmow.com/block/core/auth" "git.dev.alexdunmow.com/block/core/content" "git.dev.alexdunmow.com/block/core/crypto" "git.dev.alexdunmow.com/block/core/gating" "git.dev.alexdunmow.com/block/core/menus" "git.dev.alexdunmow.com/block/core/settings" "git.dev.alexdunmow.com/block/core/subscriptions" "github.com/google/uuid" ) // ServiceDeps provides dependencies that plugins need for RPC service handlers. type ServiceDeps struct { // Capability interfaces — typed access to CMS functionality Content content.Content Settings settings.Settings Gating gating.Gating Crypto crypto.Crypto Menus menus.Menus PublicUsers auth.PublicUsers Subscriptions subscriptions.Subscriptions // Database — for plugin's own sqlc queries Pool Pool // RPC interceptors — core-provided Connect handler options Interceptors connect.Option // Site configuration MediaPath string AppURL string // AI ToolRegistry ai.ToolRegistry AITextCall func(ctx context.Context, taskKey, systemPrompt, userMessage string) (string, error) // Email EmailSender EmailSender // Plugin interop Bridge PluginBridge // Extension points — typed as narrow interfaces where possible JobRunner JobRunner EmbeddingService EmbeddingService RAGService RAGService } // JobRunner submits background jobs for async processing. type JobRunner interface { Submit(ctx context.Context, jobType string, config []byte) error } // EmbeddingService generates and manages text embeddings. type EmbeddingService interface { GenerateEmbedding(ctx context.Context, text string) ([]float32, error) EmbedContent(ctx context.Context, sourceType string, sourceID uuid.UUID, text string) (bool, error) IsAvailable() bool } // ContentFetcher retrieves the title and full text for a content item so the // RAG service can re-index it after changes. Plugins register one per content type. type ContentFetcher func(ctx context.Context, contentID uuid.UUID) (title string, text string, err error) // RAGService provides retrieval-augmented generation for AI agents. type RAGService interface { Query(ctx context.Context, query string, limit int) ([]RAGResult, error) RegisterContentFetcher(contentType string, fetcher ContentFetcher) OnContentChanged(ctx context.Context, contentType string, contentID uuid.UUID) } // RAGResult is a single result from a RAG query. type RAGResult struct { Content string Score float64 Metadata map[string]string }