Skip to content

Commit d2173a3

Browse files
committed
fix: reset focusOrder on blur and reject stale connectionId in consumer
- PreviewAutomationBroker: Reset focusOrder to 0 when an owner reports blur (focused: false). Previously the focusOrder was preserved, letting a blurred owner keep winning the routing tiebreak over other unfocused peers until they explicitly reported focus. - previewAutomationRequestConsumer: Always drop events whose connectionId does not match the active connection. Previously, when no 'connected' event had been observed, the consumer would accept and switch to any new connectionId, allowing stale events from an older generation to be processed and responded to with a mismatched id.
1 parent 2b98a69 commit d2173a3

2 files changed

Lines changed: 2 additions & 6 deletions

File tree

apps/server/src/mcp/PreviewAutomationBroker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ export const make = Effect.gen(function* PreviewAutomationBrokerMake() {
296296
clients.set(owner.clientId, {
297297
...currentOwner,
298298
focused: owner.focused,
299-
focusOrder: owner.focused ? focusSequence : currentOwner.focusOrder,
299+
focusOrder: owner.focused ? focusSequence : 0,
300300
});
301301
return { ...current, clients, focusSequence };
302302
});

apps/web/src/components/preview/previewAutomationRequestConsumer.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export function createPreviewAutomationRequestConsumerAtom<E>(options: {
3939
get.mount(options.requestHandlerAtom);
4040
let disposed = false;
4141
let activeConnectionId: PreviewAutomationStreamEvent["connectionId"] | null = null;
42-
let connectionExplicitlyAnnounced = false;
4342
let reportedConnectionId: PreviewAutomationStreamEvent["connectionId"] | null = null;
4443
let requestsVersion = 0;
4544

@@ -48,12 +47,10 @@ export function createPreviewAutomationRequestConsumerAtom<E>(options: {
4847
const event = result.value;
4948
if (event.type === "connected") {
5049
activeConnectionId = event.connectionId;
51-
connectionExplicitlyAnnounced = true;
5250
} else if (activeConnectionId === null) {
5351
activeConnectionId = event.connectionId;
5452
} else if (activeConnectionId !== event.connectionId) {
55-
if (connectionExplicitlyAnnounced) return;
56-
activeConnectionId = event.connectionId;
53+
return;
5754
}
5855
if (reportedConnectionId !== event.connectionId) {
5956
reportedConnectionId = event.connectionId;
@@ -98,7 +95,6 @@ export function createPreviewAutomationRequestConsumerAtom<E>(options: {
9895
const initialRequest = get.once(options.requestsAtom);
9996
if (AsyncResult.isSuccess(initialRequest)) {
10097
activeConnectionId = initialRequest.value.connectionId;
101-
connectionExplicitlyAnnounced = initialRequest.value.type === "connected";
10298
if (initialRequest.value.type === "connected") {
10399
reportedConnectionId = initialRequest.value.connectionId;
104100
get.set(options.connectionAtom, initialRequest.value.connectionId);

0 commit comments

Comments
 (0)