Skip to content

Commit 4379ba4

Browse files
Jasmine ZhangJasmine Zhang
authored andcommitted
fix: preserve copy-safe doctor paths in note boxes
Fixes #94730
1 parent 2ef0589 commit 4379ba4

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

packages/terminal-core/src/note.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,13 @@ export function resolveNoteColumns(columns: number | undefined): number {
186186
return columns;
187187
}
188188

189+
export function resolveNoteOutputColumns(message: string, columns: number): number {
190+
const widestLine = message
191+
.split("\n")
192+
.reduce((max, line) => Math.max(max, visibleWidth(line)), 0);
193+
return Math.max(columns, widestLine + 6);
194+
}
195+
189196
function createNoteOutput(columns: number): NodeJS.WriteStream {
190197
if (process.stdout.columns === columns) {
191198
return process.stdout;
@@ -207,8 +214,9 @@ export function note(message: unknown, title?: string) {
207214
return;
208215
}
209216
const columns = resolveNoteColumns(process.stdout.columns);
210-
clackNote(wrapNoteMessage(message, { columns }), stylePromptTitle(title), {
211-
output: createNoteOutput(columns),
217+
const wrappedMessage = wrapNoteMessage(message, { columns });
218+
clackNote(wrappedMessage, stylePromptTitle(title), {
219+
output: createNoteOutput(resolveNoteOutputColumns(wrappedMessage, columns)),
212220
format: (line) => line,
213221
});
214222
}

packages/terminal-core/src/table.test.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import { note as clackNote } from "@clack/prompts";
12
// Terminal Core tests cover table behavior.
23
import { afterEach, describe, expect, it, vi } from "vitest";
34
import { visibleWidth } from "./ansi.js";
4-
import { resolveNoteColumns, wrapNoteMessage } from "./note.js";
5+
import { resolveNoteColumns, resolveNoteOutputColumns, wrapNoteMessage } from "./note.js";
56
import { renderTable } from "./table.js";
67

78
function mockProcessPlatform(platform: NodeJS.Platform): void {
@@ -348,6 +349,33 @@ describe("wrapNoteMessage", () => {
348349
expect(resolveNoteColumns(120)).toBe(120);
349350
});
350351

352+
it("widens note output columns so clack does not re-wrap copy-sensitive lines", () => {
353+
const wrapped = wrapNoteMessage(
354+
[
355+
"- Found 1 session lock file.",
356+
"- ~/.openclaw/agents/main/sessions/9c2acae5-841f-4aea-936b-fdb513b60202.jsonl.lock pid=86519 (alive) age=2m47s stale=no",
357+
].join("\n"),
358+
{ columns: 80 },
359+
);
360+
const writes: string[] = [];
361+
const output = {
362+
columns: resolveNoteOutputColumns(wrapped, 80),
363+
write(chunk: string) {
364+
writes.push(chunk);
365+
return true;
366+
},
367+
} as unknown as NodeJS.WriteStream;
368+
369+
clackNote(wrapped, "Session locks", { output, format: (line) => line });
370+
371+
const rendered = writes.join("");
372+
expect(rendered).toContain(".jsonl.lock");
373+
expect(rendered).not.toContain(".js\n");
374+
expect(rendered).toContain(
375+
"- ~/.openclaw/agents/main/sessions/9c2acae5-841f-4aea-936b-fdb513b60202.jsonl.lock",
376+
);
377+
});
378+
351379
it("coerces nullish and non-string note messages before wrapping", () => {
352380
expect(wrapNoteMessage(undefined, { maxWidth: 20, columns: 80 })).toBe("");
353381
expect(wrapNoteMessage(null, { maxWidth: 20, columns: 80 })).toBe("");

0 commit comments

Comments
 (0)