mirror of
https://github.com/morluto/rea.git
synced 2026-10-18 20:10:13 -05:00
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:
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;
|
||||
|
||||
Reference in new issue
Block a user