// Package updatehistory reconciles detached self-update helper outcomes into // the task history shared by the Web and terminal interfaces. package updatehistory import ( "fmt" "gitgud.io/mike/mpv-manager/pkg/jobhistory" "gitgud.io/mike/mpv-manager/pkg/version" ) // Reconcile records the latest terminal helper result, replacing the Web // handoff record when an origin job ID is available. It clears the outcome // only after task-history persistence succeeds. func Reconcile() error { outcome, err := version.ReadSelfUpdateOutcome() if err != nil || outcome == nil { return err } historyPath, err := jobhistory.FilePath() if err != nil { return fmt.Errorf("resolve job history for self-update outcome: %w", err) } record := recordFromOutcome(outcome) if err := jobhistory.NewStore(historyPath).Upsert(record); err != nil { return fmt.Errorf("persist self-update outcome in job history: %w", err) } if err := version.ClearSelfUpdateOutcome(outcome.TransactionID); err != nil { return fmt.Errorf("acknowledge reconciled self-update outcome: %w", err) } return nil } func recordFromOutcome(outcome *version.SelfUpdateOutcome) jobhistory.Record { id := outcome.OriginJobID if id == "" { id = jobhistory.NewID() } status := "error" message := "MPV Manager update failed" errorText := outcome.Error errorDetails := "The detached update helper did not commit the selected manager version. The previous executable remains available when rollback succeeded." if outcome.State == version.UpdateTransactionCommitted { status = "complete" message = "MPV Manager updated successfully to " + outcome.Version errorText = "" errorDetails = "" } else if outcome.State == version.UpdateTransactionRolledBack { message = "MPV Manager update rolled back" } output := []string{fmt.Sprintf("Detached helper outcome: %s", outcome.State)} for _, target := range outcome.Targets { line := fmt.Sprintf("%s target: %s", target.Role, target.Outcome) if target.Error != "" { line += " (" + target.Error + ")" } output = append(output, line) } completedAt := outcome.CompletedAt return jobhistory.Record{ ID: id, Type: "manager-update", MethodID: version.ComponentID, AppName: "MPV Manager", Status: status, Phase: string(outcome.State), Progress: 100, Message: message, Output: output, Error: errorText, ErrorDetails: errorDetails, StartedAt: completedAt, CompletedAt: &completedAt, } }