Fix: remove panics from code

This commit is contained in:
Grail Finder
2026-03-03 14:51:36 +03:00
parent 6b0d03f2d6
commit 8974d2f52c
5 changed files with 36 additions and 13 deletions

View File

@@ -291,7 +291,7 @@ func listRolesWithUser() []string {
return result return result
} }
func loadImage() { func loadImage() error {
filepath := defaultImage filepath := defaultImage
cc := GetCardByRole(cfg.AssistantRole) cc := GetCardByRole(cfg.AssistantRole)
if cc != nil { if cc != nil {
@@ -301,14 +301,15 @@ func loadImage() {
} }
file, err := os.Open(filepath) file, err := os.Open(filepath)
if err != nil { if err != nil {
panic(err) return fmt.Errorf("failed to open image: %w", err)
} }
defer file.Close() defer file.Close()
img, _, err := image.Decode(file) img, _, err := image.Decode(file)
if err != nil { if err != nil {
panic(err) return fmt.Errorf("failed to decode image: %w", err)
} }
imgView.SetImage(img) imgView.SetImage(img)
return nil
} }
func strInSlice(s string, sl []string) bool { func strInSlice(s string, sl []string) bool {

View File

@@ -10,16 +10,18 @@ import (
//go:embed migrations/* //go:embed migrations/*
var migrationsFS embed.FS var migrationsFS embed.FS
func (p *ProviderSQL) Migrate() { func (p *ProviderSQL) Migrate() error {
// Get the embedded filesystem // Get the embedded filesystem
migrationsDir, err := fs.Sub(migrationsFS, "migrations") migrationsDir, err := fs.Sub(migrationsFS, "migrations")
if err != nil { if err != nil {
p.logger.Error("Failed to get embedded migrations directory;", "error", err) 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 // List all .up.sql files
files, err := migrationsFS.ReadDir("migrations") files, err := migrationsFS.ReadDir("migrations")
if err != nil { if err != nil {
p.logger.Error("Failed to read migrations directory;", "error", err) 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 // Execute each .up.sql file
for _, file := range files { for _, file := range files {
@@ -27,11 +29,12 @@ func (p *ProviderSQL) Migrate() {
err := p.executeMigration(migrationsDir, file.Name()) err := p.executeMigration(migrationsDir, file.Name())
if err != nil { if err != nil {
p.logger.Error("Failed to execute migration %s: %v", file.Name(), err) 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!") p.logger.Debug("All migrations executed successfully!")
return nil
} }
func (p *ProviderSQL) executeMigration(migrationsDir fs.FS, fileName string) error { func (p *ProviderSQL) executeMigration(migrationsDir fs.FS, fileName string) error {

View File

@@ -103,7 +103,10 @@ func NewProviderSQL(dbPath string, logger *slog.Logger) FullRepo {
return nil return nil
} }
p := ProviderSQL{db: db, logger: logger} 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 return p
} }

View File

@@ -212,9 +212,13 @@ func init() {
roleToID["assistant"] = basicCard.ID roleToID["assistant"] = basicCard.ID
sa, err := searcher.NewWebSurfer(searcher.SearcherTypeScraper, "") sa, err := searcher.NewWebSurfer(searcher.SearcherTypeScraper, "")
if err != nil { 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 { if err := rag.Init(cfg, logger, store); err != nil {
logger.Warn("failed to init rag; rag_search tool will not be available", "error", err) 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 { func getWebAgentClient() *agent.AgentClient {
webAgentClientOnce.Do(func() { webAgentClientOnce.Do(func() {
if cfg == nil { if cfg == nil {
panic("cfg not initialized") if logger != nil {
logger.Warn("web agent client unavailable: config not initialized")
}
return
} }
if logger == nil { if logger == nil {
panic("logger not initialized") if logger != nil {
logger.Warn("web agent client unavailable: logger not initialized")
}
return
} }
getToken := func() string { getToken := func() string {
if chunkParser == nil { if chunkParser == nil {

12
tui.go
View File

@@ -872,21 +872,27 @@ func init() {
if err != nil { if err != nil {
logger.Error("failed to open attached image", "path", lastImg, "error", err) logger.Error("failed to open attached image", "path", lastImg, "error", err)
// Fall back to showing agent image // Fall back to showing agent image
loadImage() if err := loadImage(); err != nil {
logger.Warn("failed to load agent image", "error", err)
}
} else { } else {
defer file.Close() defer file.Close()
img, _, err := image.Decode(file) img, _, err := image.Decode(file)
if err != nil { if err != nil {
logger.Error("failed to decode attached image", "path", lastImg, "error", err) logger.Error("failed to decode attached image", "path", lastImg, "error", err)
// Fall back to showing agent image // Fall back to showing agent image
loadImage() if err := loadImage(); err != nil {
logger.Warn("failed to load agent image", "error", err)
}
} else { } else {
imgView.SetImage(img) imgView.SetImage(img)
} }
} }
} else { } else {
// No attached image, show agent image as before // 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) pages.AddPage(imgPage, imgView, true, true)
return nil return nil