fix(runtime): fence diagnostics by shared-control capability

This commit is contained in:
Merge Sim
2026-08-31 11:10:46 -07:00
parent e360c53e72
commit 45d303efba
3 changed files with 38 additions and 3 deletions
@@ -1,3 +1,5 @@
import { REMOTE_RUNTIME_SHARED_CONTROL_CAPABILITY } from '../../../../shared/protocol-version'
const diagnosticsGenerationByEnvironment = new Map<string, number>()
export function acceptRuntimeEnvironmentDiagnosticsGeneration(
@@ -25,7 +27,7 @@ export function mergePushedRuntimeEnvironmentDiagnostics(args: {
}): void {
if (
!acceptRuntimeEnvironmentDiagnosticsGeneration(args.environmentId, args.transportGeneration) ||
!args.current?.status
!args.current?.status?.capabilities?.includes(REMOTE_RUNTIME_SHARED_CONTROL_CAPABILITY)
) {
return
}
@@ -1,5 +1,6 @@
import { describe, expect, it } from 'vitest'
import { create } from 'zustand'
import { REMOTE_RUNTIME_SHARED_CONTROL_CAPABILITY } from '../../../../shared/protocol-version'
import type { RuntimeStatus } from '../../../../shared/runtime-types'
import { createRuntimeStatusSlice, type RuntimeStatusSlice } from './runtime-status'
@@ -27,7 +28,9 @@ function createSliceStore() {
describe('runtime-status diagnostics', () => {
it('merges transport diagnostics into the complete status and fences stale pushes', () => {
const store = createSliceStore()
const status = makeStatus()
const status = makeStatus({
capabilities: ['browser.screencast.v1', REMOTE_RUNTIME_SHARED_CONTROL_CAPABILITY]
})
store.getState().setRuntimeEnvironmentStatus('env-a', { status, checkedAt: 1 })
const closed = {
state: 'closed' as const,
@@ -45,7 +48,10 @@ describe('runtime-status diagnostics', () => {
})
expect(store.getState().runtimeStatusByEnvironmentId.get('env-a')?.status).toMatchObject({
runtimeId: 'runtime-a',
capabilities: ['browser.screencast.v1'],
capabilities: expect.arrayContaining([
'browser.screencast.v1',
REMOTE_RUNTIME_SHARED_CONTROL_CAPABILITY
]),
liveTabCount: 3,
remoteControl: closed
})
@@ -58,4 +64,26 @@ describe('runtime-status diagnostics', () => {
store.getState().runtimeStatusByEnvironmentId.get('env-a')?.status?.remoteControl?.state
).toBe('closed')
})
it('ignores diagnostics after the latest status drops shared-control support', () => {
const store = createSliceStore()
const status = makeStatus({ capabilities: [] })
store.getState().setRuntimeEnvironmentStatus('env-a', { status, checkedAt: 1 })
store.getState().publishRuntimeEnvironmentDiagnostics({
environmentId: 'env-a',
transportGeneration: 3,
diagnostics: {
state: 'reconnecting',
pendingRequestCount: 0,
subscriptionCount: 1,
reconnectAttempt: 2,
lastConnectedAt: 1,
lastClose: { code: 1006, reason: 'network' },
lastError: 'connection lost'
}
})
expect(store.getState().runtimeStatusByEnvironmentId.get('env-a')?.status).toBe(status)
})
})
@@ -32,11 +32,16 @@ describe('RemoteRuntimeSharedControlConnection', () => {
expect(first).toMatchObject({ ok: true, result: { method: 'worktree.ps' } })
expect(second).toMatchObject({ ok: true, result: { method: 'session.tabs.listAll' } })
expect(server.connectionCount()).toBe(1)
expect(server.auths).toContainEqual({
type: 'e2ee_auth',
deviceToken: 'device-token',
clientCapabilities: remoteRuntimeClientCapabilities()
})
expect(server.requests.map((request) => request.method)).toEqual([
'worktree.ps',
'session.tabs.listAll'
])
expect((connection.close(), states)).toEqual(
expect.arrayContaining(['awaiting_ready', 'ready', 'closed'])
)