onetime.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package cmd
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/fatih/color"
  6. "github.com/letta/letta-schedules-cli/internal/client"
  7. "github.com/letta/letta-schedules-cli/internal/config"
  8. "github.com/letta/letta-schedules-cli/internal/parser"
  9. "github.com/olekukonko/tablewriter"
  10. "github.com/spf13/cobra"
  11. )
  12. var onetimeCmd = &cobra.Command{
  13. Use: "onetime",
  14. Short: "Manage one-time schedules",
  15. Long: "Create, list, view, and delete one-time schedules for Letta agents",
  16. }
  17. var onetimeCreateCmd = &cobra.Command{
  18. Use: "create",
  19. Short: "Create a new one-time schedule",
  20. RunE: func(cmd *cobra.Command, args []string) error {
  21. agentID, _ := cmd.Flags().GetString("agent-id")
  22. message, _ := cmd.Flags().GetString("message")
  23. role, _ := cmd.Flags().GetString("role")
  24. executeAt, _ := cmd.Flags().GetString("execute-at")
  25. if agentID == "" || message == "" || executeAt == "" {
  26. return fmt.Errorf("agent-id, message, and execute-at are required")
  27. }
  28. // Parse natural language time to ISO 8601
  29. parsedTime, err := parser.ParseTime(executeAt)
  30. if err != nil {
  31. return fmt.Errorf("failed to parse execute-at: %w", err)
  32. }
  33. cfg, err := config.Load()
  34. if err != nil {
  35. return err
  36. }
  37. if err := cfg.Validate(); err != nil {
  38. return err
  39. }
  40. apiClient := client.NewClient(cfg.BaseURL, cfg.APIKey)
  41. schedule, err := apiClient.CreateOneTimeSchedule(client.OneTimeScheduleCreate{
  42. AgentID: agentID,
  43. Message: message,
  44. Role: role,
  45. ExecuteAt: parsedTime,
  46. })
  47. if err != nil {
  48. return fmt.Errorf("failed to create schedule: %w", err)
  49. }
  50. color.Green("✓ One-time schedule created successfully")
  51. fmt.Printf("\nSchedule ID: %s\n", schedule.ID)
  52. fmt.Printf("Agent ID: %s\n", schedule.AgentID)
  53. fmt.Printf("Execute At: %s\n", schedule.ExecuteAt)
  54. fmt.Printf("Message: %s\n", schedule.Message)
  55. return nil
  56. },
  57. }
  58. var onetimeListCmd = &cobra.Command{
  59. Use: "list",
  60. Short: "List all one-time schedules",
  61. RunE: func(cmd *cobra.Command, args []string) error {
  62. cfg, err := config.Load()
  63. if err != nil {
  64. return err
  65. }
  66. if err := cfg.Validate(); err != nil {
  67. return err
  68. }
  69. apiClient := client.NewClient(cfg.BaseURL, cfg.APIKey)
  70. schedules, err := apiClient.ListOneTimeSchedules()
  71. if err != nil {
  72. return fmt.Errorf("failed to list schedules: %w", err)
  73. }
  74. if len(schedules) == 0 {
  75. fmt.Println("No one-time schedules found")
  76. return nil
  77. }
  78. table := tablewriter.NewWriter(os.Stdout)
  79. table.SetHeader([]string{"Schedule ID", "Agent ID", "Execute At", "Message"})
  80. table.SetAutoWrapText(false)
  81. table.SetAutoFormatHeaders(true)
  82. table.SetHeaderAlignment(tablewriter.ALIGN_LEFT)
  83. table.SetAlignment(tablewriter.ALIGN_LEFT)
  84. table.SetCenterSeparator("")
  85. table.SetColumnSeparator("")
  86. table.SetRowSeparator("")
  87. table.SetHeaderLine(false)
  88. table.SetBorder(false)
  89. table.SetTablePadding("\t")
  90. table.SetNoWhiteSpace(true)
  91. for _, s := range schedules {
  92. table.Append([]string{
  93. s.ID,
  94. s.AgentID,
  95. s.ExecuteAt,
  96. truncate(s.Message, 50),
  97. })
  98. }
  99. table.Render()
  100. return nil
  101. },
  102. }
  103. var onetimeGetCmd = &cobra.Command{
  104. Use: "get [schedule-id]",
  105. Short: "Get details of a one-time schedule",
  106. Args: cobra.ExactArgs(1),
  107. RunE: func(cmd *cobra.Command, args []string) error {
  108. scheduleID := args[0]
  109. cfg, err := config.Load()
  110. if err != nil {
  111. return err
  112. }
  113. if err := cfg.Validate(); err != nil {
  114. return err
  115. }
  116. apiClient := client.NewClient(cfg.BaseURL, cfg.APIKey)
  117. schedule, err := apiClient.GetOneTimeSchedule(scheduleID)
  118. if err != nil {
  119. return fmt.Errorf("failed to get schedule: %w", err)
  120. }
  121. fmt.Printf("Schedule ID: %s\n", schedule.ID)
  122. fmt.Printf("Agent ID: %s\n", schedule.AgentID)
  123. fmt.Printf("Execute At: %s\n", schedule.ExecuteAt)
  124. fmt.Printf("Message: %s\n", schedule.Message)
  125. fmt.Printf("Role: %s\n", schedule.Role)
  126. fmt.Printf("Created At: %s\n", schedule.CreatedAt.Format("2006-01-02 15:04:05"))
  127. return nil
  128. },
  129. }
  130. var onetimeDeleteCmd = &cobra.Command{
  131. Use: "delete [schedule-id]",
  132. Short: "Delete a one-time schedule",
  133. Args: cobra.ExactArgs(1),
  134. RunE: func(cmd *cobra.Command, args []string) error {
  135. scheduleID := args[0]
  136. cfg, err := config.Load()
  137. if err != nil {
  138. return err
  139. }
  140. if err := cfg.Validate(); err != nil {
  141. return err
  142. }
  143. apiClient := client.NewClient(cfg.BaseURL, cfg.APIKey)
  144. if err := apiClient.DeleteOneTimeSchedule(scheduleID); err != nil {
  145. return fmt.Errorf("failed to delete schedule: %w", err)
  146. }
  147. color.Green("✓ Schedule deleted successfully")
  148. return nil
  149. },
  150. }
  151. func init() {
  152. rootCmd.AddCommand(onetimeCmd)
  153. onetimeCmd.AddCommand(onetimeCreateCmd)
  154. onetimeCreateCmd.Flags().String("agent-id", "", "Agent ID (required)")
  155. onetimeCreateCmd.Flags().String("message", "", "Message to send (required)")
  156. onetimeCreateCmd.Flags().String("role", "user", "Message role (default: user)")
  157. onetimeCreateCmd.Flags().String("execute-at", "", "When to execute (required)\n Examples: 'in 5 minutes', 'tomorrow at 9am', 'next monday at 3pm', '2025-11-07T10:00:00Z'")
  158. onetimeCmd.AddCommand(onetimeListCmd)
  159. onetimeCmd.AddCommand(onetimeGetCmd)
  160. onetimeCmd.AddCommand(onetimeDeleteCmd)
  161. }