task.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import { z } from "zod"
  2. import { RooCodeEventName } from "./events.js"
  3. import type { RooCodeSettings } from "./global-settings.js"
  4. import type { ClineMessage, QueuedMessage, TokenUsage } from "./message.js"
  5. import type { ToolUsage, ToolName } from "./tool.js"
  6. import type { StaticAppProperties, GitProperties, TelemetryProperties } from "./telemetry.js"
  7. import type { TodoItem } from "./todo.js"
  8. /**
  9. * TaskProviderLike
  10. */
  11. export interface TaskProviderLike {
  12. // Tasks
  13. getCurrentTask(): TaskLike | undefined
  14. getRecentTasks(): string[]
  15. createTask(
  16. text?: string,
  17. images?: string[],
  18. parentTask?: TaskLike,
  19. options?: CreateTaskOptions,
  20. configuration?: RooCodeSettings,
  21. ): Promise<TaskLike>
  22. cancelTask(): Promise<void>
  23. clearTask(): Promise<void>
  24. resumeTask(taskId: string): void
  25. // Modes
  26. getModes(): Promise<{ slug: string; name: string }[]>
  27. getMode(): Promise<string>
  28. setMode(mode: string): Promise<void>
  29. // Provider Profiles
  30. getProviderProfiles(): Promise<{ name: string; provider?: string }[]>
  31. getProviderProfile(): Promise<string>
  32. setProviderProfile(providerProfile: string): Promise<void>
  33. // Telemetry
  34. readonly appProperties: StaticAppProperties
  35. readonly gitProperties: GitProperties | undefined
  36. getTelemetryProperties(): Promise<TelemetryProperties>
  37. readonly cwd: string
  38. // Event Emitter
  39. on<K extends keyof TaskProviderEvents>(
  40. event: K,
  41. listener: (...args: TaskProviderEvents[K]) => void | Promise<void>,
  42. ): this
  43. off<K extends keyof TaskProviderEvents>(
  44. event: K,
  45. listener: (...args: TaskProviderEvents[K]) => void | Promise<void>,
  46. ): this
  47. // @TODO: Find a better way to do this.
  48. postStateToWebview(): Promise<void>
  49. }
  50. export type TaskProviderEvents = {
  51. [RooCodeEventName.TaskCreated]: [task: TaskLike]
  52. [RooCodeEventName.TaskStarted]: [taskId: string]
  53. [RooCodeEventName.TaskCompleted]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]
  54. [RooCodeEventName.TaskAborted]: [taskId: string]
  55. [RooCodeEventName.TaskFocused]: [taskId: string]
  56. [RooCodeEventName.TaskUnfocused]: [taskId: string]
  57. [RooCodeEventName.TaskActive]: [taskId: string]
  58. [RooCodeEventName.TaskInteractive]: [taskId: string]
  59. [RooCodeEventName.TaskResumable]: [taskId: string]
  60. [RooCodeEventName.TaskIdle]: [taskId: string]
  61. [RooCodeEventName.TaskPaused]: [taskId: string]
  62. [RooCodeEventName.TaskUnpaused]: [taskId: string]
  63. [RooCodeEventName.TaskSpawned]: [taskId: string]
  64. [RooCodeEventName.TaskDelegated]: [parentTaskId: string, childTaskId: string]
  65. [RooCodeEventName.TaskDelegationCompleted]: [parentTaskId: string, childTaskId: string, summary: string]
  66. [RooCodeEventName.TaskDelegationResumed]: [parentTaskId: string, childTaskId: string]
  67. [RooCodeEventName.TaskUserMessage]: [taskId: string]
  68. [RooCodeEventName.TaskTokenUsageUpdated]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]
  69. [RooCodeEventName.ModeChanged]: [mode: string]
  70. [RooCodeEventName.ProviderProfileChanged]: [config: { name: string; provider?: string }]
  71. }
  72. /**
  73. * TaskLike
  74. */
  75. export interface CreateTaskOptions {
  76. enableCheckpoints?: boolean
  77. consecutiveMistakeLimit?: number
  78. experiments?: Record<string, boolean>
  79. initialTodos?: TodoItem[]
  80. /** Initial status for the task's history item (e.g., "active" for child tasks) */
  81. initialStatus?: "active" | "delegated" | "completed"
  82. }
  83. export enum TaskStatus {
  84. Running = "running",
  85. Interactive = "interactive",
  86. Resumable = "resumable",
  87. Idle = "idle",
  88. None = "none",
  89. }
  90. export const taskMetadataSchema = z.object({
  91. task: z.string().optional(),
  92. images: z.array(z.string()).optional(),
  93. })
  94. export type TaskMetadata = z.infer<typeof taskMetadataSchema>
  95. export interface TaskLike {
  96. readonly taskId: string
  97. readonly rootTaskId?: string
  98. readonly parentTaskId?: string
  99. readonly childTaskId?: string
  100. readonly metadata: TaskMetadata
  101. readonly taskStatus: TaskStatus
  102. readonly taskAsk: ClineMessage | undefined
  103. readonly queuedMessages: QueuedMessage[]
  104. readonly tokenUsage: TokenUsage | undefined
  105. on<K extends keyof TaskEvents>(event: K, listener: (...args: TaskEvents[K]) => void | Promise<void>): this
  106. off<K extends keyof TaskEvents>(event: K, listener: (...args: TaskEvents[K]) => void | Promise<void>): this
  107. approveAsk(options?: { text?: string; images?: string[] }): void
  108. denyAsk(options?: { text?: string; images?: string[] }): void
  109. submitUserMessage(text: string, images?: string[], mode?: string, providerProfile?: string): Promise<void>
  110. abortTask(): void
  111. }
  112. export type TaskEvents = {
  113. // Task Lifecycle
  114. [RooCodeEventName.TaskStarted]: []
  115. [RooCodeEventName.TaskCompleted]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]
  116. [RooCodeEventName.TaskAborted]: []
  117. [RooCodeEventName.TaskFocused]: []
  118. [RooCodeEventName.TaskUnfocused]: []
  119. [RooCodeEventName.TaskActive]: [taskId: string]
  120. [RooCodeEventName.TaskInteractive]: [taskId: string]
  121. [RooCodeEventName.TaskResumable]: [taskId: string]
  122. [RooCodeEventName.TaskIdle]: [taskId: string]
  123. // Subtask Lifecycle
  124. [RooCodeEventName.TaskPaused]: [taskId: string]
  125. [RooCodeEventName.TaskUnpaused]: [taskId: string]
  126. [RooCodeEventName.TaskSpawned]: [taskId: string]
  127. // Task Execution
  128. [RooCodeEventName.Message]: [{ action: "created" | "updated"; message: ClineMessage }]
  129. [RooCodeEventName.TaskModeSwitched]: [taskId: string, mode: string]
  130. [RooCodeEventName.TaskAskResponded]: []
  131. [RooCodeEventName.TaskUserMessage]: [taskId: string]
  132. [RooCodeEventName.QueuedMessagesUpdated]: [taskId: string, messages: QueuedMessage[]]
  133. // Task Analytics
  134. [RooCodeEventName.TaskToolFailed]: [taskId: string, tool: ToolName, error: string]
  135. [RooCodeEventName.TaskTokenUsageUpdated]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]
  136. }