Compare commits

...
Author SHA1 Message Date
pashpashpash f4d95e9e4d removed taskCompleted 2025-04-11 01:15:47 -07:00
pashpashpash 9e7badb1fa test server waits to respond until task completed 2025-04-11 01:10:35 -07:00
+60 -3
View File
@@ -5,6 +5,26 @@ import { WebviewProvider } from "../../core/webview"
import { AutoApprovalSettings } from "../../shared/AutoApprovalSettings"
import { updateGlobalState, getAllExtensionState } from "../../core/storage/state"
// Task completion tracking
let taskCompletionResolver: (() => void) | null = null
// Function to create a new task completion promise
function createTaskCompletionTracker(): Promise<void> {
// Create a new promise that will resolve when the task is completed
return new Promise<void>((resolve) => {
taskCompletionResolver = resolve
})
}
// Function to mark the current task as completed
function completeTask(): void {
if (taskCompletionResolver) {
taskCompletionResolver()
taskCompletionResolver = null
Logger.log("Task marked as completed")
}
}
let testServer: http.Server | undefined
let messageCatcherDisposable: vscode.Disposable | undefined
@@ -118,9 +138,39 @@ export function createTestServer(webviewProvider?: WebviewProvider): http.Server
// Initiate the new task
const taskId = await visibleWebview.controller.initTask(task)
// Return success response with the task ID
res.writeHead(200, { "Content-Type": "application/json" })
res.end(JSON.stringify({ success: true, taskId }))
// Create a completion tracker for this task
const completionPromise = createTaskCompletionTracker()
// Wait for the task to complete with a timeout
const timeoutPromise = new Promise<void>((_, reject) => {
setTimeout(() => reject(new Error("Task completion timeout")), 15 * 60 * 1000) // 15 minute timeout
})
try {
// Wait for either completion or timeout
await Promise.race([completionPromise, timeoutPromise])
// Return success response with the task ID
res.writeHead(200, { "Content-Type": "application/json" })
res.end(
JSON.stringify({
success: true,
taskId,
completed: true,
}),
)
} catch (timeoutError) {
// Task didn't complete within the timeout period
res.writeHead(200, { "Content-Type": "application/json" })
res.end(
JSON.stringify({
success: true,
taskId,
completed: false,
timeout: true,
}),
)
}
} catch (error) {
Logger.log(`Error initiating task: ${error}`)
res.writeHead(500)
@@ -169,6 +219,13 @@ export function createMessageCatcher(webviewProvider: WebviewProvider): vscode.D
const originalPostMessageToWebview = webviewProvider.controller.postMessageToWebview
webviewProvider.controller.postMessageToWebview = async (message) => {
Logger.log("Cline message received: " + JSON.stringify(message))
// Check for completion_result message
if (message.type === "partialMessage" && message.partialMessage?.say === "completion_result") {
// Complete the current task
completeTask()
}
return originalPostMessageToWebview.call(webviewProvider.controller, message)
}
} else {