+ {/* The receipt trails the timestamp so the always-visible checks sit
+ * flush under the bubble's bottom-right corner. Leading them would
+ * park them wherever the hover-revealed time happens to end, and that
+ * width changes as the relative string ticks. */}
+
+
-
{otherFiles.length > 0 && (
diff --git a/client/src/components/Chat/Messages/Content/Parts/__tests__/SteerPart.test.tsx b/client/src/components/Chat/Messages/Content/Parts/__tests__/SteerPart.test.tsx
index 6b4fdc1a06..852b8320e1 100644
--- a/client/src/components/Chat/Messages/Content/Parts/__tests__/SteerPart.test.tsx
+++ b/client/src/components/Chat/Messages/Content/Parts/__tests__/SteerPart.test.tsx
@@ -17,7 +17,7 @@ jest.mock('~/Providers', () => ({
jest.mock('~/components/Chat/Messages/ui/MessageTimestamp', () => ({
__esModule: true,
- default: () => null,
+ default: () => ,
}));
jest.mock('~/components/Chat/Messages/Content/MarkdownLite', () => ({
@@ -119,6 +119,19 @@ describe('SteerPart author label', () => {
const receipt = screen.getByTestId('steer-receipt');
expect(receipt.className).not.toContain('opacity-0');
});
+
+ it('anchors the receipt after the timestamp, at the trailing edge of the row', () => {
+ renderPart();
+ // The timestamp is the hover-revealed half of the row and its width changes
+ // as the relative string ticks; leading the checks with it would park the
+ // one always-visible mark at a moving offset from the bubble's corner.
+ const row = screen.getByTestId('steer-receipt').parentElement;
+ const children = Array.from(row?.children ?? []);
+ expect(children.map((child) => child.getAttribute('data-testid'))).toEqual([
+ 'steer-timestamp',
+ 'steer-receipt',
+ ]);
+ });
});
describe('SteerPart presentation', () => {
diff --git a/client/src/locales/en/translation.json b/client/src/locales/en/translation.json
index 2043309a93..3610b3ff1f 100644
--- a/client/src/locales/en/translation.json
+++ b/client/src/locales/en/translation.json
@@ -2196,7 +2196,7 @@
"com_ui_steer_failed": "Steering failed",
"com_ui_steer_in_flight": "Steering",
"com_ui_steer_in_flight_preempt": "Interrupting",
- "com_ui_steer_interrupting_info": "Interrupt requested. The response will stop at the next safe point, then your message takes over. Reasoning is not interrupted. To interrupt reasoning, stop the response instead.",
+ "com_ui_steer_interrupting_info": "Interrupt requested. The response will stop at the next safe point, then your message takes over. Reasoning and tool calls are not interrupted. To interrupt them, stop the response instead.",
"com_ui_steer_interrupts_default": "Steering interrupts generation",
"com_ui_steer_interrupts_default_info": "When on, Enter stops the response at the next safe point instead of waiting for the agent's next tool step. Either way the partial answer is kept and the response continues.",
"com_ui_steer_interrupts_enable_info": "Switches the during-run default to steering and stops the response at the next safe point. The partial answer is kept and the response continues.",