diff --git a/src/vs/workbench/contrib/void/browser/helpers/extractCodeFromResult.ts b/src/vs/workbench/contrib/void/browser/helpers/extractCodeFromResult.ts index 5bf569c2..768f4cfc 100644 --- a/src/vs/workbench/contrib/void/browser/helpers/extractCodeFromResult.ts +++ b/src/vs/workbench/contrib/void/browser/helpers/extractCodeFromResult.ts @@ -98,30 +98,33 @@ class SurroundingsRemover { } - actualRecentlyAdded = (recentlyAddedTextLen: number) => { + deltaInfo = (recentlyAddedTextLen: number) => { // aaaaaatextaaaaaa{recentlyAdded} - // i ^ j + // ^ i j len // | // recentyAddedIdx - const recentlyAddedIdx = this.j - recentlyAddedTextLen + 1 - return this.originalS.substring(Math.max(this.i, recentlyAddedIdx), this.j + 1) + const recentlyAddedIdx = this.originalS.length - recentlyAddedTextLen + const actualDelta = this.originalS.substring(Math.max(this.i, recentlyAddedIdx), this.j + 1) + const ignoredSuffix = this.originalS.substring(Math.max(this.j + 1, recentlyAddedIdx), Infinity) + return [actualDelta, ignoredSuffix] as const } + } -export const extractCodeFromRegular = ({ text, recentlyAddedTextLen }: { text: string, recentlyAddedTextLen: number }): [string, string] => { +export const extractCodeFromRegular = ({ text, recentlyAddedTextLen }: { text: string, recentlyAddedTextLen: number }): [string, string, string] => { const pm = new SurroundingsRemover(text) pm.removeCodeBlock() const s = pm.value() - const actual = pm.actualRecentlyAdded(recentlyAddedTextLen) + const [delta, ignoredSuffix] = pm.deltaInfo(recentlyAddedTextLen) - return [s, actual] + return [s, delta, ignoredSuffix] } @@ -129,7 +132,7 @@ export const extractCodeFromRegular = ({ text, recentlyAddedTextLen }: { text: s // Ollama has its own FIM, we should not use this if we use that -export const extractCodeFromFIM = ({ text, recentlyAddedTextLen, midTag, }: { text: string, recentlyAddedTextLen: number, midTag: string }): [string, string] => { +export const extractCodeFromFIM = ({ text, recentlyAddedTextLen, midTag, }: { text: string, recentlyAddedTextLen: number, midTag: string }): [string, string, string] => { /* ------------- summary of the regex ------------- [optional ` | `` | ```] @@ -151,9 +154,9 @@ export const extractCodeFromFIM = ({ text, recentlyAddedTextLen, midTag, }: { te pm.removeSuffix(``) } const s = pm.value() - const actual = pm.actualRecentlyAdded(recentlyAddedTextLen) + const [delta, ignoredSuffix] = pm.deltaInfo(recentlyAddedTextLen) - return [s, actual] + return [s, delta, ignoredSuffix] // // const regex = /[\s\S]*?(?:`{1,3}\s*([a-zA-Z_]+[\w]*)?[\s\S]*?)?([\s\S]*?)(?:<\/MID>|`{1,3}|$)/; diff --git a/src/vs/workbench/contrib/void/browser/inlineDiffsService.ts b/src/vs/workbench/contrib/void/browser/inlineDiffsService.ts index d59f4d03..fdbf84bb 100644 --- a/src/vs/workbench/contrib/void/browser/inlineDiffsService.ts +++ b/src/vs/workbench/contrib/void/browser/inlineDiffsService.ts @@ -1350,15 +1350,25 @@ class InlineDiffsService extends Disposable implements IInlineDiffsService { } const latestStreamInfo = { line: diffZone.startLine, addedSplitYet: false, col: 1, originalCodeStartLine: 1 } + + // state used in onText: + let fullText = '' + let prevIgnoredSuffix = '' + streamRequestIdRef.current = this._llmMessageService.sendLLMMessage({ useProviderFor: featureName, logging: { loggingName: `startApplying - ${featureName}` }, messages, - onText: ({ newText, fullText }) => { - const [text, deltaText] = extractText(fullText, newText.length) + onText: ({ newText: newText_ }) => { + const newText = prevIgnoredSuffix + newText_ // add the previously ignored suffix because it's no longer the suffix! + fullText += prevIgnoredSuffix + newText + + const [text, deltaText, ignoredSuffix] = extractText(fullText, newText.length) this._writeStreamedDiffZoneLLMText(diffZone, text, deltaText, latestStreamInfo) this._refreshStylesAndDiffsInURI(uri) + + prevIgnoredSuffix = ignoredSuffix }, onFinalMessage: ({ fullText }) => { // console.log('DONE! FULL TEXT\n', extractText(fullText), diffZone.startLine, diffZone.endLine)