Skip to content

Commit ff9484e

Browse files
authored
test server waits to respond until task completed (RooCodeInc#2815)
* test server waits to respond until task completed * removed taskCompleted
1 parent ccc8e47 commit ff9484e

File tree

1 file changed

+60
-3
lines changed

1 file changed

+60
-3
lines changed

src/services/test/TestServer.ts

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,26 @@ import { WebviewProvider } from "../../core/webview"
55
import { AutoApprovalSettings } from "../../shared/AutoApprovalSettings"
66
import { 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+
828
let testServer: http.Server | undefined
929
let 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

Comments
 (0)