From 4bc6e135dd759d9bb68eef29f311f9b9fdca9330 Mon Sep 17 00:00:00 2001 From: Relakkes Yang Date: Wed, 22 Apr 2026 14:23:56 +0800 Subject: [PATCH] fix: restore computer use setup for python 3.8 --- runtime/requirements-win.txt | 2 +- runtime/requirements.txt | 2 +- .../computer-use-requirements.test.ts | 18 +++++++++++++++ src/server/api/computer-use.ts | 22 ++++--------------- 4 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 src/server/__tests__/computer-use-requirements.test.ts diff --git a/runtime/requirements-win.txt b/runtime/requirements-win.txt index 32c7a94c..2e736c96 100644 --- a/runtime/requirements-win.txt +++ b/runtime/requirements-win.txt @@ -1,4 +1,4 @@ -mss>=10.1.0 +mss>=9.0.2,<10 Pillow>=11.3.0 pyautogui>=0.9.54 pywin32>=306 diff --git a/runtime/requirements.txt b/runtime/requirements.txt index 06466fae..1f49b657 100644 --- a/runtime/requirements.txt +++ b/runtime/requirements.txt @@ -1,4 +1,4 @@ -mss>=10.1.0 +mss>=9.0.2,<10 Pillow>=11.3.0 pyautogui>=0.9.54 pyobjc-core>=11.1 diff --git a/src/server/__tests__/computer-use-requirements.test.ts b/src/server/__tests__/computer-use-requirements.test.ts new file mode 100644 index 00000000..17eb9e43 --- /dev/null +++ b/src/server/__tests__/computer-use-requirements.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, test } from 'bun:test' + +import darwinRequirements from '../../../runtime/requirements.txt' with { type: 'text' } +import win32Requirements from '../../../runtime/requirements-win.txt' with { type: 'text' } + +function findRequirement(requirements: string, packageName: string): string | undefined { + return requirements + .split(/\r?\n/) + .map(line => line.trim()) + .find(line => line.startsWith(`${packageName}`)) +} + +describe('computer use requirements', () => { + test('pins mss to the last Python 3.8-compatible major version', () => { + expect(findRequirement(darwinRequirements, 'mss')).toBe('mss>=9.0.2,<10') + expect(findRequirement(win32Requirements, 'mss')).toBe('mss>=9.0.2,<10') + }) +}) diff --git a/src/server/api/computer-use.ts b/src/server/api/computer-use.ts index 6b80c2a9..16239161 100644 --- a/src/server/api/computer-use.ts +++ b/src/server/api/computer-use.ts @@ -21,6 +21,10 @@ import { DEFAULT_DESKTOP_GRANT_FLAGS } from '../../utils/computerUse/preauthoriz import MAC_HELPER_CONTENT from '../../../runtime/mac_helper.py' with { type: 'text' } // @ts-ignore — Bun text import import WIN_HELPER_CONTENT from '../../../runtime/win_helper.py' with { type: 'text' } +// @ts-ignore — Bun text import +import REQUIREMENTS_DARWIN from '../../../runtime/requirements.txt' with { type: 'text' } +// @ts-ignore — Bun text import +import REQUIREMENTS_WIN32 from '../../../runtime/requirements-win.txt' with { type: 'text' } const __dirname = path.dirname(fileURLToPath(import.meta.url)) const projectRoot = path.resolve(__dirname, '../../..') @@ -30,24 +34,6 @@ const runtimeStateRoot = join(claudeHome, '.runtime') const venvRoot = join(runtimeStateRoot, 'venv') const installStampPath = join(runtimeStateRoot, 'requirements.sha256') -// Embedded content of requirements — platform-specific. -const REQUIREMENTS_DARWIN = `mss>=10.1.0 -Pillow>=11.3.0 -pyautogui>=0.9.54 -pyobjc-core>=11.1 -pyobjc-framework-Cocoa>=11.1 -pyobjc-framework-Quartz>=11.1 -` - -const REQUIREMENTS_WIN32 = `mss>=10.1.0 -Pillow>=11.3.0 -pyautogui>=0.9.54 -pywin32>=306 -psutil>=5.9.0 -pyperclip>=1.8.2 -screeninfo>=0.8.1 -` - const isWindows = process.platform === 'win32' const REQUIREMENTS_CONTENT = isWindows ? REQUIREMENTS_WIN32 : REQUIREMENTS_DARWIN