Fix attach button trigger and Claude interrupt test race

This commit is contained in:
Mohamed Boudra
2026-03-25 22:31:24 +07:00
parent 1318372e81
commit 30cba9550e
2 changed files with 44 additions and 19 deletions
+15 -13
View File
@@ -950,18 +950,20 @@ export const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(funct
<View style={styles.leftButtonGroup}> <View style={styles.leftButtonGroup}>
{onPickImages && ( {onPickImages && (
<Tooltip delayDuration={0} enabledOnDesktop enabledOnMobile={false}> <Tooltip delayDuration={0} enabledOnDesktop enabledOnMobile={false}>
<TooltipTrigger <TooltipTrigger asChild>
onPress={onPickImages} <Pressable
disabled={!isConnected || disabled} onPress={onPickImages}
accessibilityLabel="Attach images" disabled={!isConnected || disabled}
accessibilityRole="button" accessibilityLabel="Attach images"
style={({ hovered }) => [ accessibilityRole="button"
styles.attachButton, style={({ hovered }) => [
hovered && styles.iconButtonHovered, styles.attachButton,
(!isConnected || disabled) && styles.buttonDisabled, hovered && styles.iconButtonHovered,
]} (!isConnected || disabled) && styles.buttonDisabled,
> ]}
<Paperclip size={buttonIconSize} color={theme.colors.foreground} /> >
<Paperclip size={buttonIconSize} color={theme.colors.foreground} />
</Pressable>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top" align="center" offset={8}> <TooltipContent side="top" align="center" offset={8}>
<Text style={styles.tooltipText}>Attach images</Text> <Text style={styles.tooltipText}>Attach images</Text>
@@ -1203,7 +1205,7 @@ const styles = StyleSheet.create(((theme: any) => ({
leftButtonGroup: { leftButtonGroup: {
flexDirection: "row", flexDirection: "row",
alignItems: "flex-end", alignItems: "flex-end",
gap: Platform.OS === "web" ? theme.spacing[2] : theme.spacing[1], gap: theme.spacing[1],
}, },
rightButtonGroup: { rightButtonGroup: {
flexDirection: "row", flexDirection: "row",
@@ -336,11 +336,7 @@ describe("Agent event stream redesign — integration", () => {
const handle = await createSession({ cwdPrefix: "event-stream-interrupt-" }); const handle = await createSession({ cwdPrefix: "event-stream-interrupt-" });
try { try {
const { turnId } = await handle.session.startTurn( let turnId: string | null = null;
"write a very long essay about the history of computing",
);
// Use a single subscription to avoid missing events between unsubscribe/resubscribe
const events = await new Promise<AgentStreamEvent[]>((resolve, reject) => { const events = await new Promise<AgentStreamEvent[]>((resolve, reject) => {
const collected: AgentStreamEvent[] = []; const collected: AgentStreamEvent[] = [];
let interrupted = false; let interrupted = false;
@@ -352,10 +348,14 @@ describe("Agent event stream redesign — integration", () => {
const unsubscribe = handle.session.subscribe((event) => { const unsubscribe = handle.session.subscribe((event) => {
collected.push(event); collected.push(event);
if (!turnId && event.type === "turn_started" && hasTurnId(event)) {
turnId = event.turnId;
}
// Once we see turn_started, fire the interrupt // Once we see turn_started, fire the interrupt
if ( if (
!interrupted && !interrupted &&
turnId &&
event.type === "turn_started" && event.type === "turn_started" &&
hasTurnId(event) && hasTurnId(event) &&
event.turnId === turnId event.turnId === turnId
@@ -365,14 +365,37 @@ describe("Agent event stream redesign — integration", () => {
} }
// Resolve when we get a terminal event for this turn // Resolve when we get a terminal event for this turn
if (isTerminalEvent(event) && hasTurnId(event) && event.turnId === turnId) { if (turnId && isTerminalEvent(event) && hasTurnId(event) && event.turnId === turnId) {
clearTimeout(timeout); clearTimeout(timeout);
unsubscribe(); unsubscribe();
resolve(collected); resolve(collected);
} }
}); });
void handle.session
.startTurn("write a very long essay about the history of computing")
.then((result) => {
if (turnId && turnId !== result.turnId) {
clearTimeout(timeout);
unsubscribe();
reject(
new Error(
`Observed turn_started for ${turnId} but startTurn returned ${result.turnId}`,
),
);
return;
}
turnId = result.turnId;
})
.catch((error) => {
clearTimeout(timeout);
unsubscribe();
reject(error);
});
}); });
expect(turnId).toBeDefined();
// turn_canceled or turn_failed arrives for that turnId // turn_canceled or turn_failed arrives for that turnId
const terminal = events.find( const terminal = events.find(
(e) => (e) =>