12
"github.com/jmorganca/ollama/app/store"
13
"github.com/jmorganca/ollama/app/tray"
19
ctx, cancel := context.WithCancel(context.Background())
22
t, err := tray.NewTray()
24
log.Fatalf("Failed to start: %s", err)
26
callbacks := t.GetCallbacks()
28
signals := make(chan os.Signal, 1)
29
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
32
slog.Debug("starting callback loop")
35
case <-callbacks.Quit:
36
slog.Debug("quit called")
39
slog.Debug("shutting down due to signal")
41
case <-callbacks.Update:
42
err := DoUpgrade(cancel, done)
44
slog.Warn(fmt.Sprintf("upgrade attempt failed: %s", err))
46
case <-callbacks.ShowLogs:
48
case <-callbacks.DoFirstUse:
51
slog.Warn(fmt.Sprintf("Failed to launch getting started shell: %s", err))
58
if !store.GetFirstTimeRun() {
59
slog.Debug("First time run")
60
err = t.DisplayFirstUseNotification()
62
slog.Debug(fmt.Sprintf("XXX failed to display first use notification %v", err))
64
store.SetFirstTimeRun(true)
66
slog.Debug("Not first time, skipping first run notification")
69
if IsServerRunning(ctx) {
70
slog.Info("Detected another instance of ollama running, exiting")
73
done, err = SpawnServer(ctx, CLIName)
75
// TODO - should we retry in a backoff loop?
76
// TODO - should we pop up a warning and maybe add a menu item to view application logs?
77
slog.Error(fmt.Sprintf("Failed to spawn ollama server %s", err))
78
done = make(chan int, 1)
83
StartBackgroundUpdaterChecker(ctx, t.UpdateAvailable)
87
slog.Info("Waiting for ollama server to shutdown...")
91
slog.Info("Ollama app exiting")