From 8974d2f52c68352446a417e922590237c618ef9f Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Tue, 3 Mar 2026 14:51:36 +0300 Subject: [PATCH] Fix: remove panics from code --- helpfuncs.go | 7 ++++--- storage/migrate.go | 7 +++++-- storage/storage.go | 5 ++++- tools.go | 18 ++++++++++++++---- tui.go | 12 +++++++++--- 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/helpfuncs.go b/helpfuncs.go index dab6b61..3132c9d 100644 --- a/helpfuncs.go +++ b/helpfuncs.go @@ -291,7 +291,7 @@ func listRolesWithUser() []string { return result } -func loadImage() { +func loadImage() error { filepath := defaultImage cc := GetCardByRole(cfg.AssistantRole) if cc != nil { @@ -301,14 +301,15 @@ func loadImage() { } file, err := os.Open(filepath) if err != nil { - panic(err) + return fmt.Errorf("failed to open image: %w", err) } defer file.Close() img, _, err := image.Decode(file) if err != nil { - panic(err) + return fmt.Errorf("failed to decode image: %w", err) } imgView.SetImage(img) + return nil } func strInSlice(s string, sl []string) bool { diff --git a/storage/migrate.go b/storage/migrate.go index decfe9c..38f9854 100644 --- a/storage/migrate.go +++ b/storage/migrate.go @@ -10,16 +10,18 @@ import ( //go:embed migrations/* var migrationsFS embed.FS -func (p *ProviderSQL) Migrate() { +func (p *ProviderSQL) Migrate() error { // Get the embedded filesystem migrationsDir, err := fs.Sub(migrationsFS, "migrations") if err != nil { p.logger.Error("Failed to get embedded migrations directory;", "error", err) + return fmt.Errorf("failed to get embedded migrations directory: %w", err) } // List all .up.sql files files, err := migrationsFS.ReadDir("migrations") if err != nil { p.logger.Error("Failed to read migrations directory;", "error", err) + return fmt.Errorf("failed to read migrations directory: %w", err) } // Execute each .up.sql file for _, file := range files { @@ -27,11 +29,12 @@ func (p *ProviderSQL) Migrate() { err := p.executeMigration(migrationsDir, file.Name()) if err != nil { p.logger.Error("Failed to execute migration %s: %v", file.Name(), err) - panic(err) + return fmt.Errorf("failed to execute migration %s: %w", file.Name(), err) } } } p.logger.Debug("All migrations executed successfully!") + return nil } func (p *ProviderSQL) executeMigration(migrationsDir fs.FS, fileName string) error { diff --git a/storage/storage.go b/storage/storage.go index 7294261..9ad9745 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -103,7 +103,10 @@ func NewProviderSQL(dbPath string, logger *slog.Logger) FullRepo { return nil } p := ProviderSQL{db: db, logger: logger} - p.Migrate() + if err := p.Migrate(); err != nil { + logger.Error("migration failed, app cannot start", "error", err) + return nil + } return p } diff --git a/tools.go b/tools.go index dfa8d7b..84ef23d 100644 --- a/tools.go +++ b/tools.go @@ -212,9 +212,13 @@ func init() { roleToID["assistant"] = basicCard.ID sa, err := searcher.NewWebSurfer(searcher.SearcherTypeScraper, "") if err != nil { - panic("failed to init seachagent; error: " + err.Error()) + if logger != nil { + logger.Warn("search agent unavailable; web_search tool disabled", "error", err) + } + WebSearcher = nil + } else { + WebSearcher = sa } - WebSearcher = sa if err := rag.Init(cfg, logger, store); err != nil { logger.Warn("failed to init rag; rag_search tool will not be available", "error", err) } @@ -275,10 +279,16 @@ func updateToolCapabilities() { func getWebAgentClient() *agent.AgentClient { webAgentClientOnce.Do(func() { if cfg == nil { - panic("cfg not initialized") + if logger != nil { + logger.Warn("web agent client unavailable: config not initialized") + } + return } if logger == nil { - panic("logger not initialized") + if logger != nil { + logger.Warn("web agent client unavailable: logger not initialized") + } + return } getToken := func() string { if chunkParser == nil { diff --git a/tui.go b/tui.go index bdf1c9b..6920db2 100644 --- a/tui.go +++ b/tui.go @@ -872,21 +872,27 @@ func init() { if err != nil { logger.Error("failed to open attached image", "path", lastImg, "error", err) // Fall back to showing agent image - loadImage() + if err := loadImage(); err != nil { + logger.Warn("failed to load agent image", "error", err) + } } else { defer file.Close() img, _, err := image.Decode(file) if err != nil { logger.Error("failed to decode attached image", "path", lastImg, "error", err) // Fall back to showing agent image - loadImage() + if err := loadImage(); err != nil { + logger.Warn("failed to load agent image", "error", err) + } } else { imgView.SetImage(img) } } } else { // No attached image, show agent image as before - loadImage() + if err := loadImage(); err != nil { + logger.Warn("failed to load agent image", "error", err) + } } pages.AddPage(imgPage, imgView, true, true) return nil