finish rebase again

This commit is contained in:
Andrew Pareles 2025-04-28 16:37:50 -07:00
parent 19dda35ff7
commit 54da9fa0f9
3 changed files with 61 additions and 21 deletions

29
.vscode/tasks.json vendored
View file

@ -29,6 +29,34 @@
}
}
},
{ // Void added this
"type": "npm",
"script": "watchreactd",
"label": "React - Build",
"isBackground": true,
"presentation": {
"reveal": "never",
"group": "buildWatchers",
"close": false
},
"problemMatcher": {
"owner": "typescript",
"applyTo": "closedDocuments",
"fileLocation": [
"absolute"
],
"pattern": {
"regexp": "Error: ([^(]+)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\): (.*)$",
"file": 1,
"location": 2,
"message": 3
},
"background": {
"beginsPattern": "Starting compilation",
"endsPattern": "Finished compilation"
}
}
},
{
"type": "npm",
"script": "watch-extensionsd",
@ -61,6 +89,7 @@
"label": "VS Code - Build",
"dependsOn": [
"Core - Build",
"React - Build",
"Ext - Build"
],
"group": {

View file

@ -137,6 +137,7 @@ export type IsRunningType =
| 'LLM' // the LLM is currently streaming
| 'tool' // whether a tool is currently running
| 'awaiting_user' // awaiting user call
| 'idle' // nothing is running now, but the chat should still appear like it's going (used in-between calls)
| undefined
export type ThreadStreamState = {
@ -174,6 +175,12 @@ export type ThreadStreamState = {
llmInfo?: undefined;
toolInfo?: undefined;
interrupt?: undefined;
} | {
isRunning: 'idle';
error?: undefined;
llmInfo?: undefined;
toolInfo?: undefined;
interrupt?: undefined;
}
}
@ -625,7 +632,7 @@ class ChatThreadService extends Disposable implements IChatThreadService {
const { chatMode } = this._settingsService.state.globalSettings // should not change as we loop even if user changes it, so it goes here
// not running at start, clear state
this._setStreamState(threadId, undefined)
this._setStreamState(threadId, { isRunning: 'idle' })
let nMessagesSent = 0
let shouldSendAnotherMessage = true
@ -652,20 +659,20 @@ class ChatThreadService extends Disposable implements IChatThreadService {
chatMode
})
let aborted = false
let shouldRetry = true
let shouldRetryLLM = true
let nAttempts = 0
while (shouldRetry) {
while (shouldRetryLLM) {
if (this.streamState[threadId]?.isRunning) {
// if already streaming, stop
console.log('returning...', this.streamState[threadId])
return
}
shouldRetry = false
shouldRetryLLM = false
let resMessageIsDonePromise: (toolCall?: RawToolCallObj | undefined) => void // resolves when user approves this tool use (or if tool doesn't require approval)
const messageIsDonePromise = new Promise<RawToolCallObj | undefined>((res, rej) => { resMessageIsDonePromise = res })
let aborted = false
const llmCancelToken = this._llmMessageService.sendLLMMessage({
messagesType: 'chatMessages',
chatMode,
@ -691,7 +698,7 @@ class ChatThreadService extends Disposable implements IChatThreadService {
if (nAttempts < CHAT_RETRIES) {
nAttempts += 1
shouldRetry = true
shouldRetryLLM = true
this._setStreamState(threadId, undefined) // clear later so can be interrupted
resMessageIsDonePromise()
}
@ -707,7 +714,7 @@ class ChatThreadService extends Disposable implements IChatThreadService {
onAbort: () => {
// stop the loop to free up the promise, but don't modify state (already handled by whatever stopped it)
aborted = true
this._setStreamState(threadId, undefined)
this._setStreamState(threadId, { isRunning: 'idle' })
resMessageIsDonePromise()
this._metricsService.capture('Agent Loop Done (Aborted)', { nMessagesSent, chatMode })
},
@ -721,27 +728,31 @@ class ChatThreadService extends Disposable implements IChatThreadService {
this._setStreamState(threadId, { isRunning: 'LLM', llmInfo: { displayContentSoFar: '', reasoningSoFar: '', toolCallSoFar: null }, interrupt: Promise.resolve(() => this._llmMessageService.abort(llmCancelToken)) })
const toolCall = await messageIsDonePromise // wait for message to complete
// ending _setStreamStates are all handled above before resMessageIsDonePromise()
if (aborted) { return }
if (shouldRetry) {
if (aborted) {
this._setStreamState(threadId, undefined)
return
}
if (shouldRetryLLM) {
this._setStreamState(threadId, { isRunning: 'idle' })
await timeout(RETRY_DELAY)
continue
}
this._setStreamState(threadId, { isRunning: 'idle' })
// call tool if there is one
const tool: RawToolCallObj | undefined = toolCall
if (!tool) continue // skip the next part if no tool
if (toolCall) {
const { awaitingUserApproval, interrupted } = await this._runToolCall(threadId, toolCall.name, toolCall.id, { preapproved: false, unvalidatedToolParams: toolCall.rawParams })
const { awaitingUserApproval, interrupted } = await this._runToolCall(threadId, tool.name, tool.id, { preapproved: false, unvalidatedToolParams: tool.rawParams })
if (interrupted) {
this._setStreamState(threadId, undefined)
return
}
this._setStreamState(threadId, { isRunning: 'idle' })
this._setStreamState(threadId, undefined)
if (aborted) { return }
if (interrupted) { return }
if (awaitingUserApproval) { isRunningWhenEnd = 'awaiting_user' }
else { shouldSendAnotherMessage = true }
if (awaitingUserApproval) { isRunningWhenEnd = 'awaiting_user' }
else { shouldSendAnotherMessage = true }
}
} // end while (attempts)
} // end while (send message)

View file

@ -504,7 +504,7 @@ export class ToolsService implements IToolsService {
}
// normal command
if (resolveReason.type === 'timeout') {
return `${result_}\nTerminal command ran, but was interrupted by Void after ${MAX_TERMINAL_INACTIVE_TIME}s of inactivity and did not necessarily finish successfully.`
return `${result_}\nTerminal command ran, but was interrupted by Void after ${MAX_TERMINAL_INACTIVE_TIME}s of inactivity and did not necessarily finish successfully. To try with more time, open a persistent terminal and run the command there.`
}
throw new Error(`Unexpected internal error: Terminal command did not resolve with a valid reason.`)
},