mirror of
https://github.com/morluto/rea.git
synced 2026-10-22 05:42:31 -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"] };
|
const registration = { command: "rea", args: ["mcp"] };
|
||||||
|
|
||||||
describe("TOML configuration source capacity", () => {
|
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", () => {
|
it("retains a large multiline foreign value inside an inline server table", () => {
|
||||||
const note = `first\n${"x\n".repeat(500_000)}last`;
|
const note = `first\n${"x\n".repeat(500_000)}last`;
|
||||||
const original = `mcp_servers = { other = {command="other",env={NOTE="""${note}"""}}}\n`;
|
const original = `mcp_servers = { other = {command="other",env={NOTE="""${note}"""}}}\n`;
|
||||||
|
|||||||
@@ -975,12 +975,6 @@ const upsertTomlServerSection = (
|
|||||||
appendLines(pending);
|
appendLines(pending);
|
||||||
pending.length = 0;
|
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;
|
let lineIndex = 0;
|
||||||
while (lineIndex < lines.length) {
|
while (lineIndex < lines.length) {
|
||||||
const physical = lines[lineIndex] ?? "";
|
const physical = lines[lineIndex] ?? "";
|
||||||
@@ -1015,7 +1009,14 @@ const upsertTomlServerSection = (
|
|||||||
let statementEnd = valueEnd;
|
let statementEnd = valueEnd;
|
||||||
while (statementEnd < text.length && text[statementEnd] !== "\n")
|
while (statementEnd < text.length && text[statementEnd] !== "\n")
|
||||||
statementEnd += 1;
|
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) {
|
if (skipping) {
|
||||||
discardPending();
|
discardPending();
|
||||||
lineIndex = endLine + 1;
|
lineIndex = endLine + 1;
|
||||||
|
|||||||
Reference in new issue
Block a user