Next-edit: treat empty model output as no-edit
ci / build (push) Canceled after 0s

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:
2026-10-04 00:15:11 +00:00
co-authored by Claude Opus 5.5
parent f92341d1a2
commit 5c99f011e8
2 changed files with 12 additions and 3 deletions
+3 -3
View File
@@ -31,7 +31,7 @@ import { symbolLang } from '../../shared/symbol-lang.ts'
import { SymbolService, mightNeedThis } from './symbols.ts'
import { EditTracker } from './edits.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 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 raw = result.text
const newText = raw.startsWith(NEXT_EDIT_TOKENS.noEdit) ? null : raw
const noEdit = newText === null || newText === oldText || result.stoppedBy === 'limit'
const newText = parseNextEditOutput(raw, oldText)
const noEdit = newText === null || result.stoppedBy === 'limit'
const response = {
requestId: body.requestId, noEdit, startLine, endLine, oldText, newText: noEdit ? null : newText,
recentEdits, errors: errors ?? null, model: state.model,