todo.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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: "opencode.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. todos: params.todos,
  35. },
  36. }
  37. },
  38. })
  39. export const TodoReadTool = Tool.define({
  40. id: "opencode.todoread",
  41. description: "Use this tool to read your todo list",
  42. parameters: z.object({}),
  43. async execute(_params, opts) {
  44. const todos = state()[opts.sessionID] ?? []
  45. return {
  46. metadata: {
  47. todos,
  48. },
  49. output: JSON.stringify(todos, null, 2),
  50. }
  51. },
  52. })