1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package config
6
7import (
8 "errors"
9
10 "github.com/charmbracelet/huh"
11
12 "git.secluded.site/lunatask-mcp-server/internal/config"
13)
14
15// Tool identifiers for the multi-select.
16const (
17 toolGetTimestamp = "get_timestamp"
18 toolCreateTask = "create_task"
19 toolUpdateTask = "update_task"
20 toolDeleteTask = "delete_task"
21 toolTrackHabitActivity = "track_habit_activity"
22)
23
24// runToolsStep runs the tools configuration step.
25func runToolsStep(cfg *config.Config) wizardNav {
26 cfg.Tools.ApplyDefaults()
27
28 selected := toolsToSlice(&cfg.Tools)
29
30 err := huh.NewMultiSelect[string]().
31 Title("Enable MCP tools").
32 Description("Space to toggle, Enter to confirm.").
33 Options(
34 huh.NewOption("get_timestamp - Parse natural language dates", toolGetTimestamp).
35 Selected(cfg.Tools.GetTimestamp),
36 huh.NewOption("create_task - Create new tasks", toolCreateTask).
37 Selected(cfg.Tools.CreateTask),
38 huh.NewOption("update_task - Modify existing tasks", toolUpdateTask).
39 Selected(cfg.Tools.UpdateTask),
40 huh.NewOption("delete_task - Permanently delete tasks", toolDeleteTask).
41 Selected(cfg.Tools.DeleteTask),
42 huh.NewOption("track_habit_activity - Record habit completions", toolTrackHabitActivity).
43 Selected(cfg.Tools.TrackHabitActivity),
44 ).
45 Value(&selected).
46 Run()
47 if err != nil {
48 if errors.Is(err, huh.ErrUserAborted) {
49 return navQuit
50 }
51
52 return navQuit
53 }
54
55 sliceToTools(selected, &cfg.Tools)
56
57 return navNext
58}
59
60// configureTools runs the tools configuration from the main menu.
61func configureTools(cfg *config.Config) error {
62 nav := runToolsStep(cfg)
63 if nav == navQuit {
64 return errQuit
65 }
66
67 return nil
68}
69
70// toolsToSlice converts ToolsConfig bools to a slice of enabled tool names.
71func toolsToSlice(tools *config.ToolsConfig) []string {
72 var enabled []string
73
74 if tools.GetTimestamp {
75 enabled = append(enabled, toolGetTimestamp)
76 }
77
78 if tools.CreateTask {
79 enabled = append(enabled, toolCreateTask)
80 }
81
82 if tools.UpdateTask {
83 enabled = append(enabled, toolUpdateTask)
84 }
85
86 if tools.DeleteTask {
87 enabled = append(enabled, toolDeleteTask)
88 }
89
90 if tools.TrackHabitActivity {
91 enabled = append(enabled, toolTrackHabitActivity)
92 }
93
94 return enabled
95}
96
97// sliceToTools converts a slice of tool names back to ToolsConfig bools.
98func sliceToTools(selected []string, tools *config.ToolsConfig) {
99 enabledSet := make(map[string]bool)
100 for _, s := range selected {
101 enabledSet[s] = true
102 }
103
104 tools.GetTimestamp = enabledSet[toolGetTimestamp]
105 tools.CreateTask = enabledSet[toolCreateTask]
106 tools.UpdateTask = enabledSet[toolUpdateTask]
107 tools.DeleteTask = enabledSet[toolDeleteTask]
108 tools.TrackHabitActivity = enabledSet[toolTrackHabitActivity]
109}