-
Notifications
You must be signed in to change notification settings - Fork 2.6k
fix(task): temporary fix for the ask error #3471
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 2 commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -492,25 +492,30 @@ export class Task extends EventEmitter<ClineEvents> { | |
| partial?: boolean, | ||
| checkpoint?: Record<string, unknown>, | ||
| progressStatus?: ToolProgressStatus, | ||
| options: { | ||
| isNonInteractive?: boolean | ||
| } = {}, | ||
| ): Promise<undefined> { | ||
| if (this.abort) { | ||
| throw new Error(`[Cline#say] task ${this.taskId}.${this.instanceId} aborted`) | ||
| } | ||
|
|
||
| if (partial !== undefined) { | ||
| const lastMessage = this.clineMessages.at(-1) | ||
|
|
||
| const isUpdatingPreviousPartial = | ||
| lastMessage && lastMessage.partial && lastMessage.type === "say" && lastMessage.say === type | ||
|
|
||
| if (partial) { | ||
| if (isUpdatingPreviousPartial) { | ||
| // existing partial message, so update it | ||
| // Existing partial message, so update it. | ||
| lastMessage.text = text | ||
| lastMessage.images = images | ||
| lastMessage.partial = partial | ||
| lastMessage.progressStatus = progressStatus | ||
| this.updateClineMessage(lastMessage) | ||
| } else { | ||
| // this is a new partial message, so add it with partial state | ||
| // This is a new partial message, so add it with partial state. | ||
| const sayTs = Date.now() | ||
| this.lastMessageTs = sayTs | ||
| await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images, partial }) | ||
|
|
@@ -521,15 +526,14 @@ export class Task extends EventEmitter<ClineEvents> { | |
| // This is the complete version of a previously partial | ||
| // message, so replace the partial with the complete version. | ||
| this.lastMessageTs = lastMessage.ts | ||
|
||
| // lastMessage.ts = sayTs | ||
| lastMessage.text = text | ||
| lastMessage.images = images | ||
| lastMessage.partial = false | ||
| lastMessage.progressStatus = progressStatus | ||
| // Instead of streaming partialMessage events, we do a save | ||
| // and post like normal to persist to disk. | ||
| await this.saveClineMessages() | ||
| // More performant than an entire postStateToWebview. | ||
| // More performant than an entire `postStateToWebview`. | ||
| this.updateClineMessage(lastMessage) | ||
| } else { | ||
| // This is a new and complete message, so add it like normal. | ||
|
|
@@ -539,9 +543,17 @@ export class Task extends EventEmitter<ClineEvents> { | |
| } | ||
| } | ||
| } else { | ||
| // this is a new non-partial message, so add it like normal | ||
| // This is a new non-partial message, so add it like normal. | ||
| const sayTs = Date.now() | ||
| this.lastMessageTs = sayTs | ||
|
|
||
| // A "non-interactive" message is a message is one that the user | ||
| // does not need to respond to. We don't want these message types | ||
| // to trigger an update to `lastMessageTs` since they can be created | ||
| // asynchronously and could interrupt a pending ask. | ||
| if (!options.isNonInteractive) { | ||
| this.lastMessageTs = sayTs | ||
| } | ||
|
|
||
| await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images, checkpoint }) | ||
| } | ||
| } | ||
|
|
@@ -559,8 +571,12 @@ export class Task extends EventEmitter<ClineEvents> { | |
| // Start / Abort / Resume | ||
|
|
||
| private async startTask(task?: string, images?: string[]): Promise<void> { | ||
| // conversationHistory (for API) and clineMessages (for webview) need to be in sync | ||
| // if the extension process were killed, then on restart the clineMessages might not be empty, so we need to set it to [] when we create a new Cline client (otherwise webview would show stale messages from previous session) | ||
| // `conversationHistory` (for API) and `clineMessages` (for webview) | ||
| // need to be in sync. | ||
| // If the extension process were killed, then on restart the | ||
| // `clineMessages` might not be empty, so we need to set it to [] when | ||
| // we create a new Cline client (otherwise webview would show stale | ||
| // messages from previous session). | ||
| this.clineMessages = [] | ||
| this.apiConversationHistory = [] | ||
| await this.providerRef.deref()?.postStateToWebview() | ||
|
|
@@ -582,28 +598,25 @@ export class Task extends EventEmitter<ClineEvents> { | |
| } | ||
|
|
||
| public async resumePausedTask(lastMessage: string) { | ||
| // release this Cline instance from paused state | ||
| // Release this Cline instance from paused state. | ||
| this.isPaused = false | ||
| this.emit("taskUnpaused") | ||
|
|
||
| // fake an answer from the subtask that it has completed running and this is the result of what it has done | ||
| // add the message to the chat history and to the webview ui | ||
| // Fake an answer from the subtask that it has completed running and | ||
| // this is the result of what it has done add the message to the chat | ||
| // history and to the webview ui. | ||
| try { | ||
| await this.say("subtask_result", lastMessage) | ||
|
|
||
| await this.addToApiConversationHistory({ | ||
| role: "user", | ||
| content: [ | ||
| { | ||
| type: "text", | ||
| text: `[new_task completed] Result: ${lastMessage}`, | ||
| }, | ||
| ], | ||
| content: [{ type: "text", text: `[new_task completed] Result: ${lastMessage}` }], | ||
| }) | ||
| } catch (error) { | ||
| this.providerRef | ||
| .deref() | ||
| ?.log(`Error failed to add reply from subtast into conversation of parent task, error: ${error}`) | ||
|
|
||
| throw error | ||
| } | ||
| } | ||
|
|
||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.