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
},
},
}
}