tools.go

  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}