fix(note): prevent clack from re-breaking copy-sensitive tokens#94746
Conversation
|
Codex review: passed. Reviewed June 18, 2026, 11:58 PM ET / 03:58 UTC. Summary PR surface: Source +8, Tests +28. Total +36 across 2 files. Reproducibility: yes. Current source routes session lock paths through Review metrics: none identified. Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Next step before merge
Security Review detailsBest possible solution: Land this shared terminal-core fix or an equivalent narrow implementation, then close the linked issue and retire duplicate candidate PRs after merge. Do we have a high-confidence way to reproduce the issue? Yes. Current source routes session lock paths through Is this the best way to solve the issue? Yes. The shared terminal-core note helper is the right layer because many doctor/setup note surfaces use it, and widening the virtual Clack stream is narrower than replacing Clack's full box renderer for this bug. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 508e3bf41353. Label changesLabel justifications:
Evidence reviewedPR surface: Source +8, Tests +28. Total +36 across 2 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
wrapNoteMessage correctly preserves copy-sensitive tokens (paths, URLs) as unbroken lines, but clack's note() applies its own internal wrap after our format callback, re-breaking the line at the terminal width. Use a wide virtual stream (columns = max(80, longestLine + 12)) so clack's internal wrap never triggers, letting wrapNoteMessage's output pass through to the terminal intact. Fixes openclaw#94730
…ken preservation Add a focused test in table.test.ts that verifies clack's note() rendering does not re-break copy-sensitive tokens (session lock paths) after wrapNoteMessage preserves them. Uses resolveNoteOutputColumns to widen the virtual output stream, matching the fix in note.ts. Refs openclaw#94730
c408319 to
b17a4ff
Compare
|
/clownfish automerge |
|
Clownfish is on the reef for this PR. 🐠 I tagged A maintainer can call |
|
/clownfish automerge |
|
Clownfish is on the reef for this PR. 🐠 I tagged A maintainer can call |
|
🦞✅ Source: What merged:
Automerge notes:
The automerge loop is complete. Automerge progress:
|
…claw#94746) Summary: - The PR widens the virtual Clack output columns for wrapped terminal notes and adds a rendered-output regression test for copy-sensitive session-lock paths. - PR surface: Source +8, Tests +28. Total +36 across 2 files. - Reproducibility: yes. Current source routes session lock paths through `note()`, and the pinned Clack note renderer hard-wraps final content from `getColumns(output) - 6` after OpenClaw's first wrapping pass. Automerge notes: - PR branch already contained follow-up commit before automerge: test(note): add rendered-output regression test for copy-sensitive to… Validation: - ClawSweeper review passed for head b17a4ff. - Required merge gates passed before the squash merge. Prepared head SHA: b17a4ff Review: openclaw#94746 (comment) Co-authored-by: Dirk <[email protected]>
…claw#94746) Summary: - The PR widens the virtual Clack output columns for wrapped terminal notes and adds a rendered-output regression test for copy-sensitive session-lock paths. - PR surface: Source +8, Tests +28. Total +36 across 2 files. - Reproducibility: yes. Current source routes session lock paths through `note()`, and the pinned Clack note renderer hard-wraps final content from `getColumns(output) - 6` after OpenClaw's first wrapping pass. Automerge notes: - PR branch already contained follow-up commit before automerge: test(note): add rendered-output regression test for copy-sensitive to… Validation: - ClawSweeper review passed for head b17a4ff. - Required merge gates passed before the squash merge. Prepared head SHA: b17a4ff Review: openclaw#94746 (comment) Co-authored-by: Dirk <[email protected]>
Fixes #94730
Summary
openclaw doctormangles long file paths insidenote(...)boxes.wrapNoteMessagecorrectly preserves copy-sensitive tokens as unbroken lines, but clack'snote()applies its own internal wrap after ourformatcallback, re-breaking the line at the terminal width.openclaw doctorin a terminal narrower than the longest path/URL in the output. The mangled path cannot be copy-pasted, defeating the purpose of surfacing it.columns = max(80, longestLine + 12)) in thenote()function so clack's internal wrap never triggers, lettingwrapNoteMessage's output pass through to the terminal intact.wrapNoteMessage,wrapLine,isCopySensitiveToken, orsplitLongWord. The fix is in thenote()function only.note()boxes are now displayed as a single line that can be copy-pasted, regardless of terminal width.packages/terminal-core/src/note.tslines 209-215.Verification
Real behavior proof
Behavior addressed: Long file paths in
openclaw doctornote boxes are split across multiple lines, making them impossible to copy-paste.Environment tested: Linux 6.18.33.1-microsoft-standard-WSL2 (x64), Node.js v24.16.0.
Steps run after the patch:
Evidence after fix (console output):
Observed result: With the old 80-column stream, clack's internal wrap breaks the path at character 74. With the wide virtual stream, the path remains intact as a single line.
Not tested: Live
openclaw doctorrun (requires full gateway setup). The fix only changes the virtual stream width passed to clack'snote().