llama-server leaves special tokens out of content, so the NO_EDIT token arrives as an empty string. The daemon treated that as a rewrite of the region to nothing (Tab would have deleted the region). shared/nextedit.ts parseNextEditOutput() is now used by the daemon and the eval. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J39imRDT8L7xYbWzsVWd8A
This commit is contained in:
+3
-3
@@ -31,7 +31,7 @@ import { symbolLang } from '../../shared/symbol-lang.ts'
|
|||||||
import { SymbolService, mightNeedThis } from './symbols.ts'
|
import { SymbolService, mightNeedThis } from './symbols.ts'
|
||||||
import { EditTracker } from './edits.ts'
|
import { EditTracker } from './edits.ts'
|
||||||
import { locateFile, modeFromModel, parseFimPrompt } from './openai-shim.ts'
|
import { locateFile, modeFromModel, parseFimPrompt } from './openai-shim.ts'
|
||||||
import { NEXT_EDIT_TOKENS } from '../../shared/nextedit.ts'
|
import { NEXT_EDIT_TOKENS, parseNextEditOutput } from '../../shared/nextedit.ts'
|
||||||
|
|
||||||
const { values: args } = parseArgs({ options: { config: { type: 'string', default: 'acd.config.json' } } })
|
const { values: args } = parseArgs({ options: { config: { type: 'string', default: 'acd.config.json' } } })
|
||||||
const config = loadConfig(args.config!)
|
const config = loadConfig(args.config!)
|
||||||
@@ -272,8 +272,8 @@ async function handleNextEdit(body: NextEditRequest, res: http.ServerResponse, c
|
|||||||
|
|
||||||
const oldText = lines.slice(startLine, endLine).join('\n') + (endLine < lines.length ? '\n' : '')
|
const oldText = lines.slice(startLine, endLine).join('\n') + (endLine < lines.length ? '\n' : '')
|
||||||
const raw = result.text
|
const raw = result.text
|
||||||
const newText = raw.startsWith(NEXT_EDIT_TOKENS.noEdit) ? null : raw
|
const newText = parseNextEditOutput(raw, oldText)
|
||||||
const noEdit = newText === null || newText === oldText || result.stoppedBy === 'limit'
|
const noEdit = newText === null || result.stoppedBy === 'limit'
|
||||||
const response = {
|
const response = {
|
||||||
requestId: body.requestId, noEdit, startLine, endLine, oldText, newText: noEdit ? null : newText,
|
requestId: body.requestId, noEdit, startLine, endLine, oldText, newText: noEdit ? null : newText,
|
||||||
recentEdits, errors: errors ?? null, model: state.model,
|
recentEdits, errors: errors ?? null, model: state.model,
|
||||||
|
|||||||
@@ -154,3 +154,12 @@ export function buildNextEditPrompt(input: NextEditInput, encode: Encode, ids: N
|
|||||||
export function nextEditTarget(newRegion: string | null, encode: Encode, ids: NextEditTokenIds): number[] {
|
export function nextEditTarget(newRegion: string | null, encode: Encode, ids: NextEditTokenIds): number[] {
|
||||||
return newRegion === null ? [ids.noEdit, ids.outputEnd] : [...encode(newRegion), ids.outputEnd]
|
return newRegion === null ? [ids.noEdit, ids.outputEnd] : [...encode(newRegion), ids.outputEnd]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model output → rewritten region, or null for "no edit". llama-server leaves special tokens out of `content`, so the
|
||||||
|
* NO_EDIT token usually arrives as an empty string; never treat empty output as "replace the region with nothing".
|
||||||
|
*/
|
||||||
|
export function parseNextEditOutput(raw: string, oldText: string): string | null {
|
||||||
|
if (raw.startsWith(NEXT_EDIT_TOKENS.noEdit) || raw.trim() === '' || raw === oldText) return null
|
||||||
|
return raw
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user