verstak-desktop/internal/api/app.go

93 lines
3.0 KiB
Go

// Package api provides Wails-bound methods for the frontend.
package api
import (
"github.com/verstak/verstak-desktop/internal/core/capability"
"github.com/verstak/verstak-desktop/internal/core/contribution"
"github.com/verstak/verstak-desktop/internal/core/events"
"github.com/verstak/verstak-desktop/internal/core/permissions"
"github.com/verstak/verstak-desktop/internal/core/plugin"
)
// App is the main application struct exposed to the Wails frontend.
type App struct {
capRegistry *capability.Registry
contribRegistry *contribution.Registry
permRegistry *permissions.Registry
eventBus *events.Bus
plugins []plugin.Plugin
}
// NewApp creates a new App instance.
func NewApp(
capReg *capability.Registry,
contribReg *contribution.Registry,
permReg *permissions.Registry,
bus *events.Bus,
plugins []plugin.Plugin,
) *App {
return &App{
capRegistry: capReg,
contribRegistry: contribReg,
permRegistry: permReg,
eventBus: bus,
plugins: plugins,
}
}
// Startup is called when the app starts.
func (a *App) Startup() error {
return nil
}
// ─── Plugin Manager API ─────────────────────────────────────
// GetPlugins returns all discovered plugins.
func (a *App) GetPlugins() []plugin.Plugin {
return a.plugins
}
// GetCapabilities returns all registered capabilities.
func (a *App) GetCapabilities() []capability.Entry {
return a.capRegistry.List()
}
// GetPermissions returns all known permissions.
func (a *App) GetPermissions() []permissions.Entry {
return a.permRegistry.List()
}
// GetContributions returns all registered contributions.
func (a *App) GetContributions() ContributionSummary {
return ContributionSummary{
Views: a.contribRegistry.Views(),
Commands: a.contribRegistry.Commands(),
SettingsPanels: a.contribRegistry.SettingsPanels(),
SidebarItems: a.contribRegistry.SidebarItems(),
FileActions: a.contribRegistry.FileActions(),
NoteActions: a.contribRegistry.NoteActions(),
SearchProviders: a.contribRegistry.SearchProviders(),
}
}
// ReloadPlugins re-discovers plugins from disk.
func (a *App) ReloadPlugins() {
discoveryDirs := []string{
"~/.config/verstak/plugins",
"./plugins",
}
plugins, _ := plugin.DiscoverPlugins(discoveryDirs)
a.plugins = plugins
}
// ContributionSummary aggregates all contribution types for the frontend.
type ContributionSummary struct {
Views []contribution.ContributionView `json:"views"`
Commands []contribution.ContributionCommand `json:"commands"`
SettingsPanels []contribution.ContributionSettingsPanel `json:"settingsPanels"`
SidebarItems []contribution.ContributionSidebarItem `json:"sidebarItems"`
FileActions []contribution.ContributionAction `json:"fileActions"`
NoteActions []contribution.ContributionAction `json:"noteActions"`
SearchProviders []contribution.ContributionSearchProvider `json:"searchProviders"`
}