import { Effect, Schema } from "effect" import * as Tool from "./tool" import DESCRIPTION_WRITE from "./todowrite.txt" import { Todo } from "../session/todo" export const Parameters = Schema.Struct({ todos: Schema.mutable(Schema.Array(Todo.Info)).annotate({ description: "The updated todo list" }), }) type Metadata = { todos: Todo.Info[] } export const TodoWriteTool = Tool.define( "todowrite", Effect.gen(function* () { const todo = yield* Todo.Service return { description: DESCRIPTION_WRITE, parameters: Parameters, execute: (params: Schema.Schema.Type, ctx: Tool.Context) => Effect.gen(function* () { yield* ctx.ask({ permission: "todowrite", patterns: ["*"], always: ["*"], metadata: {}, }) yield* todo.update({ sessionID: ctx.sessionID, todos: params.todos, }) return { title: `${params.todos.filter((x) => x.status !== "completed").length} todos`, output: JSON.stringify(params.todos, null, 2), metadata: { todos: params.todos, }, } }), } satisfies Tool.DefWithoutID }), )