mirror of
https://github.com/stablyai/orca.git
synced 2026-10-02 08:02:02 +00:00
fix(runtime): fence diagnostics by shared-control capability
This commit is contained in:
@@ -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'])
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user