Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions src/core/task/Task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,14 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
private async addToClineMessages(message: ClineMessage) {
this.clineMessages.push(message)
const provider = this.providerRef.deref()
await provider?.postStateToWebview()
// Send only the new message instead of the entire state
if (provider) {
try {
await provider.postMessageToWebview({ type: "messageCreated", clineMessage: message })
} catch (error) {
// provider.postMessageToWebview already logs; leave as non-fatal
}
}
this.emit(RooCodeEventName.Message, { action: "created", message })
await this.saveClineMessages()

Expand All @@ -584,7 +591,13 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {

private async updateClineMessage(message: ClineMessage) {
const provider = this.providerRef.deref()
await provider?.postMessageToWebview({ type: "messageUpdated", clineMessage: message })
if (provider) {
try {
await provider.postMessageToWebview({ type: "messageUpdated", clineMessage: message })
} catch (error) {
// provider.postMessageToWebview already logs; leave as non-fatal
}
}
this.emit(RooCodeEventName.Message, { action: "updated", message })

const shouldCaptureMessage = message.partial !== true && CloudService.isEnabled()
Expand Down Expand Up @@ -1172,6 +1185,9 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
// the task first.
this.apiConversationHistory = await this.getSavedApiConversationHistory()

// Send initial state to webview (this will now handle incremental message loading)
await this.providerRef.deref()?.postStateToWebview()

const lastClineMessage = this.clineMessages
.slice()
.reverse()
Expand Down
12 changes: 10 additions & 2 deletions src/core/webview/ClineProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -888,7 +888,15 @@ export class ClineProvider
}

public async postMessageToWebview(message: ExtensionMessage) {
await this.view?.webview.postMessage(message)
try {
await this.view?.webview.postMessage(message)
} catch (error) {
// Guard against unhandled promise rejections from webview messaging
const errMsg =
error instanceof Error ? error.message : typeof error === "string" ? error : JSON.stringify(error)
this.log(`[postMessageToWebview] failed to post message '${message.type}': ${errMsg}`)
// Non-fatal: continue without throwing to avoid crashing extension host
}
}

private async getHMRHtmlContent(webview: vscode.Webview): Promise<string> {
Expand Down Expand Up @@ -1554,7 +1562,7 @@ export class ClineProvider

// Check MDM compliance and send user to account tab if not compliant
if (!this.checkMdmCompliance()) {
await this.postMessageToWebview({ type: "action", action: "accountButtonClicked" })
this.postMessageToWebview({ type: "action", action: "accountButtonClicked" })
}
}

Expand Down
1 change: 1 addition & 0 deletions src/shared/ExtensionMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ export interface ExtensionMessage {
| "workspaceUpdated"
| "invoke"
| "messageUpdated"
| "messageCreated"
| "mcpServers"
| "enhancedPrompt"
| "commitSearchResults"
Expand Down
8 changes: 8 additions & 0 deletions webview-ui/src/context/ExtensionStateContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,14 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
setCommands(message.commands ?? [])
break
}
case "messageCreated": {
const clineMessage = message.clineMessage!
setState((prevState) => ({
...prevState,
clineMessages: [...prevState.clineMessages, clineMessage],
}))
break
}
case "messageUpdated": {
const clineMessage = message.clineMessage!
setState((prevState) => {
Expand Down
Loading