fix(clients): advance TOML statement lines without document rescans

Reuse the writer's monotonic statement index to find the last physical line
of an assignment. Remove the full line-start scan performed for every key.
Preserve source edits, multiline values, BOM, CRLF and final-line handling.

Add LF/CRLF controls with adjacent assignments, multiline values, an empty
value and EOF without a newline. Validated 85 focused tests across six files,
check:fast, docs:check and discovery of all 1553 test files.

Twelve bounded public CLI uninstall tasks preserve equivalent replies,
configuration and original backups. Warm 10000-assignment elapsed medians
were 0.538/0.520 s and CPU 0.817/0.744 s before/after; small-input timings
were noisy and slower in the candidate. No general speedup, cold-cache,
real-client or analysis-provider claim. Heavy profiling remains stopped.

Fixes #4873
This commit is contained in:
morluto committed 2026-10-18 03:41:32 +08:00
1 parent c43bc0bf66
commit e103ae0ce5
2 files changed
+52 -7

No files matched your search

@@ -9,6 +9,50 @@ import {
const registration = { command: "rea", args: ["mcp"] };
describe("TOML configuration source capacity", () => {
it.each(["\n", "\r\n"])(
"retains adjacent assignments and multiline values with %j breaks",
(newline) => {
const prefix = Array.from(
{ length: 128 },
(_, index) =>
`[foreign.entry_${index}]\nvalue = ${index}\nnote = """first\n# [mcp_servers.rea]\nlast"""\nitems = [\n${index},\n]\n`,
).join("");
// Include a BOM, an empty value, and a final statement without a newline.
const original =
"\uFEFF" +
`${prefix}[mcp_servers.rea]\ncommand = "previous"\n[tail]\nempty = ""\nlast = 7`.replaceAll(
"\n",
newline,
);
const parsed = parseClientConfiguration(original, "toml");
const desired = withClientServers(parsed, {
...parsed.servers,
rea: registration,
});
const configured = serializeClientConfiguration(
desired,
"toml",
original,
);
expect(
configured.startsWith("\uFEFF" + prefix.replaceAll("\n", newline)),
).toBe(true);
expect(parseClientConfiguration(configured, "toml").document).toEqual(
desired,
);
const removed = serializeClientConfiguration(
withClientServers(parsed, {}),
"toml",
configured,
);
const expectedForeignDocument = { ...parsed.document };
delete expectedForeignDocument.mcp_servers;
expect(parseClientConfiguration(removed, "toml").document).toEqual(
expectedForeignDocument,
);
},
);
it("retains a large multiline foreign value inside an inline server table", () => {
const note = `first\n${"x\n".repeat(500_000)}last`;
const original = `mcp_servers = { other = {command="other",env={NOTE="""${note}"""}}}\n`;
@@ -975,12 +975,6 @@ const upsertTomlServerSection = (
appendLines(pending);
pending.length = 0;
};
const lineIndexAt = (offset: number): number => {
let line = 0;
for (let index = 0; index < lineStarts.length; index += 1)
if ((lineStarts[index] ?? 0) <= offset) line = index;
return line;
};
let lineIndex = 0;
while (lineIndex < lines.length) {
const physical = lines[lineIndex] ?? "";
@@ -1015,7 +1009,14 @@ const upsertTomlServerSection = (
let statementEnd = valueEnd;
while (statementEnd < text.length && text[statementEnd] !== "\n")
statementEnd += 1;
const endLine = lineIndexAt(Math.max(statementEnd - 1, lineStart));
const lastOffset = Math.max(statementEnd - 1, lineStart);
let endLine = lineIndex;
// Statements advance through the source; only inspect their own lines.
while (
endLine + 1 < lineStarts.length &&
(lineStarts[endLine + 1] ?? 0) <= lastOffset
)
endLine += 1;
if (skipping) {
discardPending();
lineIndex = endLine + 1;