diff --git a/packages/computer-use/cua/src/application-access.ts b/packages/computer-use/cua/src/application-access.ts index 0331c1f554..7666198fad 100644 --- a/packages/computer-use/cua/src/application-access.ts +++ b/packages/computer-use/cua/src/application-access.ts @@ -81,6 +81,8 @@ export class ApplicationAccess { const saved = identity.persistable && this.options.grants().some(grant => grant.id === identity.id) let scope: Selection['scope'] = 'persistent' if (!saved && this.rejected.get(agent)?.has(identity.id)) throw this.denied(identity) + // The awaited user decision can outlive the helper, so re-read its live getter. + // oxlint-disable-next-line typescript/no-unnecessary-condition if (client.disposed) throw new NativeError('NATIVE_CLOSED', 'Helper is closed; acquire fresh application handles') if (!saved) { const questions = this.ctx.get('userQuestions') diff --git a/packages/computer-use/cua/tests/api.spec.ts b/packages/computer-use/cua/tests/api.spec.ts index e97a98cc90..95e6baea5a 100644 --- a/packages/computer-use/cua/tests/api.spec.ts +++ b/packages/computer-use/cua/tests/api.spec.ts @@ -30,7 +30,7 @@ function fixture(withSink = true) { snapshotId: `snapshot-${++generation}`, tree: `Tree ${generation}`, truncated: false, windows: params.windowId === undefined ? windows : windows.filter(window => window.windowId === params.windowId), } - case 'screenshot': return { mimeType: 'image/png', data: PNG, pixelWidth: 1, pixelHeight: 1, windowId: params.windowId!, bounds, coordinateSpace: 'window-points' } + case 'screenshot': return { mimeType: 'image/png', data: PNG, pixelWidth: 1, pixelHeight: 1, windowId: params.windowId, bounds, coordinateSpace: 'window-points' } default: return delivered } }) diff --git a/packages/computer-use/cua/tests/provider-lifecycle.spec.ts b/packages/computer-use/cua/tests/provider-lifecycle.spec.ts index 34b7aafbd8..c0227c73de 100644 --- a/packages/computer-use/cua/tests/provider-lifecycle.spec.ts +++ b/packages/computer-use/cua/tests/provider-lifecycle.spec.ts @@ -24,12 +24,13 @@ import { SessionId } from '@deepseek-ai/dsh-session' import Subprocess from '@deepseek-ai/dsh-subprocess' import { expect, it, onTestFinished, vi } from 'vitest' import * as NativeProvider from '../src/index.ts' +import type { NativeClient } from '../src/native-client.ts' import type { NativeBuildSpec } from '../src/native-build.ts' const native = vi.hoisted(() => ({ prepare: vi.fn<(spec: NativeBuildSpec) => Promise>(), architecture: vi.fn(() => 'arm64' as const), - request: vi.fn(), dispose: vi.fn(), instances: [] as Array<{ disposed: boolean }>, + request: vi.fn(), dispose: vi.fn(), instances: [] as Array<{ disposed: boolean }>, })) vi.mock('../src/native-build.ts', async importOriginal => ({ ...await importOriginal(),