Ryanhub - file viewer
filename: tools/tasks.go
branch: main
back to repo
package tools

import (
	"context"
	"encoding/json"
	"fmt"

	"assistant/memory"
)

var addTaskParams = json.RawMessage(`{
  "type": "object",
  "properties": {
    "title": { "type": "string", "description": "Task description" }
  },
  "required": ["title"],
  "additionalProperties": false
}`)

var listTasksParams = json.RawMessage(`{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}`)

var completeTaskParams = json.RawMessage(`{
  "type": "object",
  "properties": {
    "id": { "type": "integer", "description": "Task id from list_tasks" }
  },
  "required": ["id"],
  "additionalProperties": false
}`)

type addTaskArgs struct {
	Title string `json:"title"`
}

type completeTaskArgs struct {
	ID int64 `json:"id"`
}

func taskTools(store *memory.Store) []Tool {
	return []Tool{
		{
			Name:        "add_task",
			Description: "Add a new open task.",
			Parameters:  addTaskParams,
			Run: func(ctx context.Context, args json.RawMessage) (string, error) {
				var a addTaskArgs
				if err := json.Unmarshal(args, &a); err != nil {
					return "", err
				}
				id, err := store.AddTask(a.Title)
				if err != nil {
					return "", err
				}
				return fmt.Sprintf("Created task #%d: %s", id, a.Title), nil
			},
		},
		{
			Name:        "list_tasks",
			Description: "List open (incomplete) tasks.",
			Parameters:  listTasksParams,
			Run: func(ctx context.Context, args json.RawMessage) (string, error) {
				tasks, err := store.ListOpenTasks()
				if err != nil {
					return "", err
				}
				if len(tasks) == 0 {
					return "No open tasks.", nil
				}
				b, err := json.MarshalIndent(tasks, "", "  ")
				if err != nil {
					return "", err
				}
				return string(b), nil
			},
		},
		{
			Name:        "complete_task",
			Description: "Mark a task done by id.",
			Parameters:  completeTaskParams,
			Run: func(ctx context.Context, args json.RawMessage) (string, error) {
				var a completeTaskArgs
				if err := json.Unmarshal(args, &a); err != nil {
					return "", err
				}
				if err := store.CompleteTask(a.ID); err != nil {
					return "", err
				}
				return fmt.Sprintf("Task %d marked complete.", a.ID), nil
			},
		},
	}
}