| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import type {
- ComputerUseHostAdapter,
- Logger,
- } from '@ant/computer-use-mcp/types'
- import { format } from 'util'
- import { logForDebugging } from '../debug.js'
- import { COMPUTER_USE_MCP_SERVER_NAME } from './common.js'
- import { createCliExecutor } from './executor.js'
- import { getChicagoEnabled, getChicagoSubGates } from './gates.js'
- import { requireComputerUseSwift } from './swiftLoader.js'
- class DebugLogger implements Logger {
- silly(message: string, ...args: unknown[]): void {
- logForDebugging(format(message, ...args), { level: 'debug' })
- }
- debug(message: string, ...args: unknown[]): void {
- logForDebugging(format(message, ...args), { level: 'debug' })
- }
- info(message: string, ...args: unknown[]): void {
- logForDebugging(format(message, ...args), { level: 'info' })
- }
- warn(message: string, ...args: unknown[]): void {
- logForDebugging(format(message, ...args), { level: 'warn' })
- }
- error(message: string, ...args: unknown[]): void {
- logForDebugging(format(message, ...args), { level: 'error' })
- }
- }
- let cached: ComputerUseHostAdapter | undefined
- /**
- * Process-lifetime singleton. Built once on first CU tool call; native modules
- * (both `@ant/computer-use-input` and `@ant/computer-use-swift`) are loaded
- * here via the executor factory, which throws on load failure — there is no
- * degraded mode.
- */
- export function getComputerUseHostAdapter(): ComputerUseHostAdapter {
- if (cached) return cached
- cached = {
- serverName: COMPUTER_USE_MCP_SERVER_NAME,
- logger: new DebugLogger(),
- executor: createCliExecutor({
- getMouseAnimationEnabled: () => getChicagoSubGates().mouseAnimation,
- getHideBeforeActionEnabled: () => getChicagoSubGates().hideBeforeAction,
- }),
- ensureOsPermissions: async () => {
- const cu = requireComputerUseSwift()
- const accessibility = (cu as any).tcc.checkAccessibility()
- const screenRecording = (cu as any).tcc.checkScreenRecording()
- return accessibility && screenRecording
- ? { granted: true }
- : { granted: false, accessibility, screenRecording }
- },
- isDisabled: () => !getChicagoEnabled(),
- getSubGates: getChicagoSubGates,
- // cleanup.ts always unhides at turn end — no user preference to disable it.
- getAutoUnhideEnabled: () => true,
- // Pixel-validation JPEG decode+crop. MUST be synchronous (the package
- // does `patch1.equals(patch2)` directly on the return value). Cowork uses
- // Electron's `nativeImage` (sync); our `image-processor-napi` is
- // sharp-compatible and async-only. Returning null → validation skipped,
- // click proceeds — the designed fallback per `PixelCompareResult.skipped`.
- // The sub-gate defaults to false anyway.
- cropRawPatch: () => null,
- }
- return cached
- }
|