diff --git a/packages/cli/src/ui/components/messages/UserMessage.test.tsx b/packages/cli/src/ui/components/messages/UserMessage.test.tsx
index 91b03c969a..6ca4ffa329 100644
--- a/packages/cli/src/ui/components/messages/UserMessage.test.tsx
+++ b/packages/cli/src/ui/components/messages/UserMessage.test.tsx
@@ -44,4 +44,16 @@ describe('UserMessage', () => {
expect(output).toMatchSnapshot();
});
+
+ it('transforms image paths in user message', () => {
+ const message = 'Check out this image: @/path/to/my-image.png';
+ const { lastFrame } = renderWithProviders(
+ ,
+ { width: 80 },
+ );
+ const output = lastFrame();
+
+ expect(output).toContain('[Image my-image.png]');
+ expect(output).toMatchSnapshot();
+ });
});
diff --git a/packages/cli/src/ui/components/messages/UserMessage.tsx b/packages/cli/src/ui/components/messages/UserMessage.tsx
index 5f26bf771c..0c3c99cb12 100644
--- a/packages/cli/src/ui/components/messages/UserMessage.tsx
+++ b/packages/cli/src/ui/components/messages/UserMessage.tsx
@@ -5,10 +5,15 @@
*/
import type React from 'react';
+import { useMemo } from 'react';
import { Text, Box } from 'ink';
import { theme } from '../../semantic-colors.js';
import { SCREEN_READER_USER_PREFIX } from '../../textConstants.js';
import { isSlashCommand as checkIsSlashCommand } from '../../utils/commandUtils.js';
+import {
+ calculateTransformationsForLine,
+ calculateTransformedLine,
+} from '../shared/text-buffer.js';
import { HalfLinePaddedBox } from '../shared/HalfLinePaddedBox.js';
import { DEFAULT_BACKGROUND_OPACITY } from '../../constants.js';
import { useConfig } from '../../contexts/ConfigContext.js';
@@ -27,6 +32,24 @@ export const UserMessage: React.FC = ({ text, width }) => {
const textColor = isSlashCommand ? theme.text.accent : theme.text.secondary;
+ const displayText = useMemo(() => {
+ if (!text) return text;
+ return text
+ .split('\n')
+ .map((line) => {
+ const transformations = calculateTransformationsForLine(line);
+ // We pass a cursor position of [-1, -1] so that no transformations are expanded (e.g. images remain collapsed)
+ const { transformedLine } = calculateTransformedLine(
+ line,
+ 0, // line index doesn't matter since cursor is [-1, -1]
+ [-1, -1],
+ transformations,
+ );
+ return transformedLine;
+ })
+ .join('\n');
+ }, [text]);
+
return (
= ({ text, width }) => {
- {text}
+ {displayText}
diff --git a/packages/cli/src/ui/components/messages/__snapshots__/UserMessage.test.tsx.snap b/packages/cli/src/ui/components/messages/__snapshots__/UserMessage.test.tsx.snap
index b298c864c1..2d9d075a0a 100644
--- a/packages/cli/src/ui/components/messages/__snapshots__/UserMessage.test.tsx.snap
+++ b/packages/cli/src/ui/components/messages/__snapshots__/UserMessage.test.tsx.snap
@@ -18,3 +18,9 @@ exports[`UserMessage > renders slash command message 1`] = `
> /help
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
`;
+
+exports[`UserMessage > transforms image paths in user message 1`] = `
+"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
+ > Check out this image: [Image my-image.png]
+▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
+`;