todo.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { z } from "zod"
  2. import { Tool } from "./tool"
  3. import DESCRIPTION_WRITE from "./todowrite.txt"
  4. import { App } from "../app/app"
  5. const TodoInfo = z.object({
  6. content: z.string().min(1).describe("Brief description of the task"),
  7. status: z
  8. .enum(["pending", "in_progress", "completed"])
  9. .describe("Current status of the task"),
  10. priority: z
  11. .enum(["high", "medium", "low"])
  12. .describe("Priority level of the task"),
  13. id: z.string().describe("Unique identifier for the todo item"),
  14. })
  15. type TodoInfo = z.infer<typeof TodoInfo>
  16. const state = App.state("todo-tool", () => {
  17. const todos: {
  18. [sessionId: string]: TodoInfo[]
  19. } = {}
  20. return todos
  21. })
  22. export const TodoWriteTool = Tool.define({
  23. id: "todowrite",
  24. description: DESCRIPTION_WRITE,
  25. parameters: z.object({
  26. todos: z.array(TodoInfo).describe("The updated todo list"),
  27. }),
  28. async execute(params, opts) {
  29. const todos = state()
  30. todos[opts.sessionID] = params.todos
  31. return {
  32. output: JSON.stringify(params.todos, null, 2),
  33. metadata: {
  34. title: `${params.todos.filter((x) => x.status !== "completed").length} todos`,
  35. todos: params.todos,
  36. },
  37. }
  38. },
  39. })
  40. export const TodoReadTool = Tool.define({
  41. id: "todoread",
  42. description: "Use this tool to read your todo list",
  43. parameters: z.object({}),
  44. async execute(_params, opts) {
  45. const todos = state()[opts.sessionID] ?? []
  46. return {
  47. metadata: {
  48. todos,
  49. title: `${todos.filter((x) => x.status !== "completed").length} todos`,
  50. },
  51. output: JSON.stringify(todos, null, 2),
  52. }
  53. },
  54. })