Fix attach button trigger and Claude interrupt test race
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
+29
-6
@@ -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) =>
|
||||||
|
|||||||
Reference in New Issue
Block a user