diff --git a/packages/core/src/services/shellExecutionService.test.ts b/packages/core/src/services/shellExecutionService.test.ts index 07ce602b43..1d970fd262 100644 --- a/packages/core/src/services/shellExecutionService.test.ts +++ b/packages/core/src/services/shellExecutionService.test.ts @@ -305,6 +305,24 @@ describe('ShellExecutionService', () => { ); }); + it('should not wrap long lines in the final output', async () => { + // Set a small width to force wrapping + const narrowConfig = { ...shellExecutionConfig, terminalWidth: 10 }; + const longString = '123456789012345'; // 15 chars, should wrap at 10 + + const { result } = await simulateExecution( + 'long-line-command', + (pty) => { + pty.onData.mock.calls[0][0](longString); + pty.onExit.mock.calls[0][0]({ exitCode: 0, signal: null }); + }, + narrowConfig, + ); + + expect(result.exitCode).toBe(0); + expect(result.output.trim()).toBe(longString); + }); + it('should not add extra padding but preserve explicit trailing whitespace', async () => { const { result } = await simulateExecution('cmd', (pty) => { // "value" should not get terminal-width padding diff --git a/packages/core/src/services/shellExecutionService.ts b/packages/core/src/services/shellExecutionService.ts index d137cd19e7..2a04c02814 100644 --- a/packages/core/src/services/shellExecutionService.ts +++ b/packages/core/src/services/shellExecutionService.ts @@ -116,8 +116,28 @@ const getFullBufferText = (terminal: pkg.Terminal): string => { const lines: string[] = []; for (let i = 0; i < buffer.length; i++) { const line = buffer.getLine(i); - const lineContent = line ? line.translateToString(true) : ''; - lines.push(lineContent); + if (!line) { + continue; + } + // If the NEXT line is wrapped, it means it's a continuation of THIS line. + // We should not trim the right side of this line because trailing spaces + // might be significant parts of the wrapped content. + // If it's not wrapped, we trim normally. + let trimRight = true; + if (i + 1 < buffer.length) { + const nextLine = buffer.getLine(i + 1); + if (nextLine?.isWrapped) { + trimRight = false; + } + } + + const lineContent = line.translateToString(trimRight); + + if (line.isWrapped && lines.length > 0) { + lines[lines.length - 1] += lineContent; + } else { + lines.push(lineContent); + } } // Remove trailing empty lines