@@ -8,8 +8,11 @@ import { execa } from "execa"
88import { type TaskEvent , TaskCommandName , RooCodeEventName , IpcMessageType , EVALS_SETTINGS } from "@roo-code/types"
99import { IpcClient } from "@roo-code/ipc"
1010
11+ import type { JobPayload , JobType } from "@/types"
12+
1113import { Logger } from "./logger"
1214import { isDockerContainer } from "./utils"
15+ import { SlackNotifier } from "./slack"
1316
1417const TIMEOUT = 30 * 60 * 1_000
1518
@@ -20,13 +23,21 @@ class SubprocessTimeoutError extends Error {
2023 }
2124}
2225
23- type RunTaskOptions = {
26+ type RunTaskOptions < T extends JobType > = {
27+ jobType : T
28+ jobPayload : JobPayload < T >
2429 prompt : string
2530 publish : ( taskEvent : TaskEvent ) => Promise < void >
2631 logger : Logger
2732}
2833
29- export const runTask = async ( { prompt, publish, logger } : RunTaskOptions ) => {
34+ export const runTask = async < T extends JobType > ( {
35+ jobType,
36+ jobPayload,
37+ prompt,
38+ publish,
39+ logger,
40+ } : RunTaskOptions < T > ) => {
3041 const workspacePath = "/Users/cte/Documents/Roomote-Control" // findGitRoot(process.cwd())
3142 const ipcSocketPath = path . resolve ( os . tmpdir ( ) , `${ crypto . randomUUID ( ) . slice ( 0 , 8 ) } .sock` )
3243 const env = { ROO_CODE_IPC_SOCKET_PATH : ipcSocketPath }
@@ -73,13 +84,16 @@ export const runTask = async ({ prompt, publish, logger }: RunTaskOptions) => {
7384 }
7485 }
7586
76- let taskStartedAt = Date . now ( ) // eslint-disable-line @typescript-eslint/no-unused-vars
87+ let taskStartedAt = Date . now ( )
7788 let taskFinishedAt : number | undefined
7889 let taskAbortedAt : number | undefined
7990 let taskTimedOut : boolean = false
8091 let rooTaskId : string | undefined
8192 let isClientDisconnected = false
8293
94+ const slackNotifier = new SlackNotifier ( logger )
95+ let slackThreadTs : string | null = null
96+
8397 const ignoreEvents : Record < "broadcast" | "log" , RooCodeEventName [ ] > = {
8498 broadcast : [ RooCodeEventName . Message ] ,
8599 log : [ RooCodeEventName . TaskTokenUsageUpdated , RooCodeEventName . TaskAskResponded ] ,
@@ -105,14 +119,23 @@ export const runTask = async ({ prompt, publish, logger }: RunTaskOptions) => {
105119 if ( eventName === RooCodeEventName . TaskStarted ) {
106120 taskStartedAt = Date . now ( )
107121 rooTaskId = payload [ 0 ]
122+ slackThreadTs = await slackNotifier . postTaskStarted ( { jobType, jobPayload, rooTaskId } )
108123 }
109124
110125 if ( eventName === RooCodeEventName . TaskAborted ) {
111126 taskAbortedAt = Date . now ( )
127+
128+ if ( slackThreadTs ) {
129+ await slackNotifier . postTaskUpdated ( slackThreadTs , "Task was aborted" , "warning" )
130+ }
112131 }
113132
114133 if ( eventName === RooCodeEventName . TaskCompleted ) {
115134 taskFinishedAt = Date . now ( )
135+
136+ if ( slackThreadTs ) {
137+ await slackNotifier . postTaskCompleted ( slackThreadTs , true , taskFinishedAt - taskStartedAt , rooTaskId )
138+ }
116139 }
117140 } )
118141
@@ -142,6 +165,10 @@ export const runTask = async ({ prompt, publish, logger }: RunTaskOptions) => {
142165 taskTimedOut = true
143166 logger . error ( "time limit reached" )
144167
168+ if ( slackThreadTs ) {
169+ await slackNotifier . postTaskUpdated ( slackThreadTs , "Task timed out after 30 minutes" , "error" )
170+ }
171+
145172 if ( rooTaskId && ! isClientDisconnected ) {
146173 logger . info ( "cancelling task" )
147174 client . sendCommand ( { commandName : TaskCommandName . CancelTask , data : rooTaskId } )
@@ -153,6 +180,11 @@ export const runTask = async ({ prompt, publish, logger }: RunTaskOptions) => {
153180
154181 if ( ! taskFinishedAt && ! taskTimedOut ) {
155182 logger . error ( "client disconnected before task finished" )
183+
184+ if ( slackThreadTs ) {
185+ await slackNotifier . postTaskUpdated ( slackThreadTs , "Client disconnected before task completion" , "error" )
186+ }
187+
156188 throw new Error ( "Client disconnected before task completion." )
157189 }
158190
0 commit comments