@@ -5,6 +5,26 @@ import { WebviewProvider } from "../../core/webview"
55import { AutoApprovalSettings } from "../../shared/AutoApprovalSettings"
66import { updateGlobalState , getAllExtensionState } from "../../core/storage/state"
77
8+ // Task completion tracking
9+ let taskCompletionResolver : ( ( ) => void ) | null = null
10+
11+ // Function to create a new task completion promise
12+ function createTaskCompletionTracker ( ) : Promise < void > {
13+ // Create a new promise that will resolve when the task is completed
14+ return new Promise < void > ( ( resolve ) => {
15+ taskCompletionResolver = resolve
16+ } )
17+ }
18+
19+ // Function to mark the current task as completed
20+ function completeTask ( ) : void {
21+ if ( taskCompletionResolver ) {
22+ taskCompletionResolver ( )
23+ taskCompletionResolver = null
24+ Logger . log ( "Task marked as completed" )
25+ }
26+ }
27+
828let testServer : http . Server | undefined
929let messageCatcherDisposable : vscode . Disposable | undefined
1030
@@ -120,9 +140,39 @@ export function createTestServer(webviewProvider?: WebviewProvider): http.Server
120140 // Initiate the new task
121141 const taskId = await visibleWebview . controller . initTask ( task )
122142
123- // Return success response with the task ID
124- res . writeHead ( 200 , { "Content-Type" : "application/json" } )
125- res . end ( JSON . stringify ( { success : true , taskId } ) )
143+ // Create a completion tracker for this task
144+ const completionPromise = createTaskCompletionTracker ( )
145+
146+ // Wait for the task to complete with a timeout
147+ const timeoutPromise = new Promise < void > ( ( _ , reject ) => {
148+ setTimeout ( ( ) => reject ( new Error ( "Task completion timeout" ) ) , 15 * 60 * 1000 ) // 15 minute timeout
149+ } )
150+
151+ try {
152+ // Wait for either completion or timeout
153+ await Promise . race ( [ completionPromise , timeoutPromise ] )
154+
155+ // Return success response with the task ID
156+ res . writeHead ( 200 , { "Content-Type" : "application/json" } )
157+ res . end (
158+ JSON . stringify ( {
159+ success : true ,
160+ taskId,
161+ completed : true ,
162+ } ) ,
163+ )
164+ } catch ( timeoutError ) {
165+ // Task didn't complete within the timeout period
166+ res . writeHead ( 200 , { "Content-Type" : "application/json" } )
167+ res . end (
168+ JSON . stringify ( {
169+ success : true ,
170+ taskId,
171+ completed : false ,
172+ timeout : true ,
173+ } ) ,
174+ )
175+ }
126176 } catch ( error ) {
127177 Logger . log ( `Error initiating task: ${ error } ` )
128178 res . writeHead ( 500 )
@@ -171,6 +221,13 @@ export function createMessageCatcher(webviewProvider: WebviewProvider): vscode.D
171221 const originalPostMessageToWebview = webviewProvider . controller . postMessageToWebview
172222 webviewProvider . controller . postMessageToWebview = async ( message ) => {
173223 Logger . log ( "Cline message received: " + JSON . stringify ( message ) )
224+
225+ // Check for completion_result message
226+ if ( message . type === "partialMessage" && message . partialMessage ?. say === "completion_result" ) {
227+ // Complete the current task
228+ completeTask ( )
229+ }
230+
174231 return originalPostMessageToWebview . call ( webviewProvider . controller , message )
175232 }
176233 } else {
0 commit comments