mirror of https://github.com/openclaw/openclaw.git
fix(auto-reply): preserve newlines in stripInlineStatus and extractInlineSimpleCommand
The /\s+/g whitespace normalizer collapsed newlines along with spaces/tabs, destroying paragraph structure in multi-line messages before they reached the LLM. Use /[^\S\n]+/g to only collapse horizontal whitespace while preserving line breaks. Closes #32216 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
5b5ccb0769
commit
6200e242b2
|
|
@ -0,0 +1,54 @@
|
|||
import { describe, expect, it } from "vitest";
|
||||
import { extractInlineSimpleCommand, stripInlineStatus } from "./reply-inline.js";
|
||||
|
||||
describe("stripInlineStatus", () => {
|
||||
it("strips /status directive from message", () => {
|
||||
const result = stripInlineStatus("/status hello world");
|
||||
expect(result.cleaned).toBe("hello world");
|
||||
expect(result.didStrip).toBe(true);
|
||||
});
|
||||
|
||||
it("preserves newlines in multi-line messages", () => {
|
||||
const result = stripInlineStatus("first line\nsecond line\nthird line");
|
||||
expect(result.cleaned).toBe("first line\nsecond line\nthird line");
|
||||
expect(result.didStrip).toBe(false);
|
||||
});
|
||||
|
||||
it("preserves newlines when stripping /status", () => {
|
||||
const result = stripInlineStatus("/status\nfirst paragraph\n\nsecond paragraph");
|
||||
expect(result.cleaned).toBe("first paragraph\n\nsecond paragraph");
|
||||
expect(result.didStrip).toBe(true);
|
||||
});
|
||||
|
||||
it("collapses horizontal whitespace but keeps newlines", () => {
|
||||
const result = stripInlineStatus("hello world\n indented line");
|
||||
expect(result.cleaned).toBe("hello world\n indented line");
|
||||
// didStrip is true because whitespace normalization changed the string
|
||||
expect(result.didStrip).toBe(true);
|
||||
});
|
||||
|
||||
it("returns empty string for whitespace-only input", () => {
|
||||
const result = stripInlineStatus(" ");
|
||||
expect(result.cleaned).toBe("");
|
||||
expect(result.didStrip).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("extractInlineSimpleCommand", () => {
|
||||
it("extracts /help command", () => {
|
||||
const result = extractInlineSimpleCommand("/help some question");
|
||||
expect(result?.command).toBe("/help");
|
||||
expect(result?.cleaned).toBe("some question");
|
||||
});
|
||||
|
||||
it("preserves newlines after extracting command", () => {
|
||||
const result = extractInlineSimpleCommand("/help first line\nsecond line");
|
||||
expect(result?.command).toBe("/help");
|
||||
expect(result?.cleaned).toBe("first line\nsecond line");
|
||||
});
|
||||
|
||||
it("returns null for empty body", () => {
|
||||
expect(extractInlineSimpleCommand("")).toBeNull();
|
||||
expect(extractInlineSimpleCommand(undefined)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
|
@ -24,7 +24,10 @@ export function extractInlineSimpleCommand(body?: string): {
|
|||
if (!command) {
|
||||
return null;
|
||||
}
|
||||
const cleaned = body.replace(match[0], " ").replace(/\s+/g, " ").trim();
|
||||
const cleaned = body
|
||||
.replace(match[0], " ")
|
||||
.replace(/[^\S\n]+/g, " ")
|
||||
.trim();
|
||||
return { command, cleaned };
|
||||
}
|
||||
|
||||
|
|
@ -36,6 +39,11 @@ export function stripInlineStatus(body: string): {
|
|||
if (!trimmed) {
|
||||
return { cleaned: "", didStrip: false };
|
||||
}
|
||||
const cleaned = trimmed.replace(INLINE_STATUS_RE, " ").replace(/\s+/g, " ").trim();
|
||||
// Use [^\S\n]+ instead of \s+ to only collapse horizontal whitespace,
|
||||
// preserving newlines so multi-line messages keep their paragraph structure.
|
||||
const cleaned = trimmed
|
||||
.replace(INLINE_STATUS_RE, " ")
|
||||
.replace(/[^\S\n]+/g, " ")
|
||||
.trim();
|
||||
return { cleaned, didStrip: cleaned !== trimmed };
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue