1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package cmd
6
7import (
8 "fmt"
9 "strings"
10
11 "git.secluded.site/np/cmd/shared"
12 "git.secluded.site/np/internal/task"
13 "github.com/spf13/cobra"
14)
15
16var rCmd = &cobra.Command{
17 Use: "r",
18 Short: "Resume session",
19 Long: `Resume an interrupted session in a new context window`,
20 RunE: runResume,
21}
22
23func runResume(cmd *cobra.Command, args []string) error {
24 env, err := shared.Environment(cmd)
25 if err != nil {
26 return err
27 }
28
29 sessionDoc, found, err := shared.ActiveSession(cmd, env)
30 if err != nil {
31 return err
32 }
33 if !found {
34 return nil
35 }
36
37 state, err := shared.PrintPlan(cmd, env, sessionDoc.SID)
38 if err != nil {
39 return err
40 }
41
42 // Print instructions for resuming work
43 out := cmd.OutOrStdout()
44 _, _ = fmt.Fprintln(out, strings.Repeat("-", 80))
45 _, _ = fmt.Fprintln(out, env.Localizer.T("session.resume.header"))
46 _, _ = fmt.Fprintln(out, env.Localizer.T("session.resume.guidance"))
47
48 // Provide context about pending work
49 pendingCount := 0
50 inProgressCount := 0
51 for _, t := range state.Tasks {
52 switch t.Status {
53 case task.StatusPending:
54 pendingCount++
55 case task.StatusInProgress:
56 inProgressCount++
57 }
58 }
59
60 if inProgressCount > 0 {
61 _, _ = fmt.Fprintf(cmd.OutOrStdout(), env.Localizer.T("session.resume.in_progress_count"), inProgressCount)
62 }
63 if pendingCount > 0 {
64 _, _ = fmt.Fprintf(cmd.OutOrStdout(), env.Localizer.T("session.resume.pending_count"), pendingCount)
65 }
66
67 return nil
68}