package main import ( "context" "net/http" "os" "os/signal" "syscall" "time" "github.com/yourname/cyrene-ai/pkg/plugins/calculator" "github.com/yourname/cyrene-ai/pkg/plugins/crypto" "github.com/yourname/cyrene-ai/pkg/plugins/datetime" fileplugin "github.com/yourname/cyrene-ai/pkg/plugins/file" httpplugin "github.com/yourname/cyrene-ai/pkg/plugins/http" iotcontrol "github.com/yourname/cyrene-ai/pkg/plugins/iot_control" iotquery "github.com/yourname/cyrene-ai/pkg/plugins/iot_query" jsonplugin "github.com/yourname/cyrene-ai/pkg/plugins/json" "github.com/yourname/cyrene-ai/pkg/plugins/manager" "github.com/yourname/cyrene-ai/pkg/plugins/markdown" "github.com/yourname/cyrene-ai/pkg/plugins/random" "github.com/yourname/cyrene-ai/pkg/plugins/sdk" "github.com/yourname/cyrene-ai/pkg/plugins/text" webfetch "github.com/yourname/cyrene-ai/pkg/plugins/web_fetch" websearch "github.com/yourname/cyrene-ai/pkg/plugins/web_search" "github.com/yourname/cyrene-ai/plugin-manager/internal/config" "github.com/yourname/cyrene-ai/plugin-manager/internal/handler" ) func main() { cfg := config.Load() var iotAPI iotquery.IoTClient if cfg.IoTSvcURL != "" { iotAPI = newIoTClient(cfg.IoTSvcURL) } registry := manager.NewToolRegistry() host := newHostAPI(registry) mgr := manager.NewPluginManager(registry, host) builtins := []sdk.Plugin{ &calculator.CalculatorPlugin{}, &datetime.DatetimePlugin{}, &text.TextPlugin{}, &crypto.CryptoPlugin{}, &random.RandomPlugin{}, &markdown.MarkdownPlugin{}, &jsonplugin.JSONPlugin{}, fileplugin.NewFilePlugin(cfg.DataDir), httpplugin.NewHTTPPlugin(), websearch.NewWebSearchPlugin(), webfetch.NewWebFetchPlugin(), iotquery.NewIoTQueryPlugin(iotAPI), } for _, p := range builtins { if err := mgr.Install(p); err != nil { println("WARN: install plugin failed:", err.Error()) } } if iotAPI != nil { ctrlPlugin := iotcontrol.NewIoTControlPlugin(newIoTControllerAdapter(iotAPI, cfg.IoTSvcURL)) if err := mgr.Install(ctrlPlugin); err != nil { println("WARN: install plugin failed:", err.Error()) } } ctx := context.Background() errs := mgr.EnableAll(ctx) for _, e := range errs { println("WARN: enable plugin failed:", e.Error()) } println("Plugin Manager: all built-in plugins enabled") mux := http.NewServeMux() ph := handler.NewPluginHandler(mgr) ph.RegisterRoutes(mux) println("Plugin Manager listening on port", cfg.Port) srv := &http.Server{Addr: ":" + cfg.Port, Handler: mux} go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { println("FATAL:", err.Error()) os.Exit(1) } }() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit println("Shutting down Plugin Manager...") shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() mgr.Shutdown(shutdownCtx) srv.Shutdown(shutdownCtx) println("Plugin Manager stopped") }