@gui-agent/operator-nutjs
Version:
computer operator based NutJS for GUI Agent
1 lines • 18.6 kB
Source Map (JSON)
{"version":3,"file":"NutJSOperator.mjs","sources":["webpack://@gui-agent/operator-nutjs/./src/NutJSOperator.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n Coordinates,\n SupportedActionType,\n ScreenshotOutput,\n ExecuteParams,\n ExecuteOutput,\n BaseAction,\n} from '@gui-agent/shared/types';\nimport { Operator, ScreenContext } from '@gui-agent/shared/base';\nimport { ConsoleLogger, LogLevel } from '@agent-infra/logger';\nimport {\n screen,\n Button,\n Key,\n Point,\n keyboard,\n mouse,\n sleep,\n straightTo,\n clipboard,\n} from '@computer-use/nut-js';\nimport { Jimp } from 'jimp';\n\nconst defaultLogger = new ConsoleLogger(undefined, LogLevel.DEBUG);\n\nexport class NutJSOperator extends Operator {\n private logger: ConsoleLogger;\n private _screenContext: ScreenContext | null = null;\n\n constructor(logger: ConsoleLogger = defaultLogger) {\n super();\n this.logger = logger.spawn('[NutJSOperator]');\n }\n\n protected async initialize(): Promise<void> {\n const grabImage = await screen.grab();\n const screenWithScale = await grabImage.toBGR();\n this._screenContext = {\n screenWidth: screenWithScale.width / screenWithScale.pixelDensity.scaleX,\n screenHeight: screenWithScale.height / screenWithScale.pixelDensity.scaleY,\n scaleX: screenWithScale.pixelDensity.scaleX,\n scaleY: screenWithScale.pixelDensity.scaleY,\n };\n }\n\n protected supportedActions(): Array<SupportedActionType> {\n throw new Error('Method not implemented.');\n }\n\n protected screenContext(): ScreenContext {\n // Assert that _screenContext is not null\n if (!this._screenContext) {\n throw new Error('The Operator not initialized');\n }\n return this._screenContext;\n }\n\n protected async screenshot(): Promise<ScreenshotOutput> {\n const grabImage = await screen.grab();\n const screenWithScale = await grabImage.toRGB();\n const scaleFactor = screenWithScale.pixelDensity.scaleX;\n\n this.logger.info(\n 'scaleX',\n screenWithScale.pixelDensity.scaleX,\n 'scaleY',\n screenWithScale.pixelDensity.scaleY,\n );\n\n const screenWithScaleImage = await Jimp.fromBitmap({\n width: screenWithScale.width,\n height: screenWithScale.height,\n data: Buffer.from(screenWithScale.data),\n });\n\n const width = screenWithScale.width / screenWithScale.pixelDensity.scaleX;\n const height = screenWithScale.height / screenWithScale.pixelDensity.scaleY;\n\n const physicalScreenImage = await screenWithScaleImage\n .resize({\n w: width,\n h: height,\n })\n .getBuffer('image/jpeg'); // Use png format to avoid compression\n\n this.logger.info(`screenshot: ${width}x${height}, scaleFactor: ${scaleFactor}`);\n\n return {\n base64: physicalScreenImage.toString('base64'),\n contentType: 'image/jpeg',\n status: 'success',\n };\n }\n\n protected async execute(params: ExecuteParams): Promise<ExecuteOutput> {\n const { actions } = params;\n for (const action of actions) {\n this.logger.info('execute action', action);\n await this.singleActionExecutor(action);\n }\n return {\n status: 'success',\n };\n }\n\n private async singleActionExecutor(action: BaseAction) {\n const { type: actionType, inputs: actionInputs } = action;\n switch (actionType) {\n case 'move':\n case 'move_to':\n case 'mouse_move':\n case 'hover': {\n const { point } = actionInputs;\n if (!point) {\n throw new Error('point is required when mouse move');\n }\n const { realX, realY } = await this.calculateRealCoords(point);\n await this.moveStraightTo(realX, realY);\n break;\n }\n case 'click':\n case 'left_click':\n case 'left_single': {\n await this.handleClick(actionInputs, Button.LEFT);\n break;\n }\n case 'left_double':\n case 'double_click': {\n await this.handleClick(actionInputs, Button.LEFT, 2);\n break;\n }\n case 'right_click':\n case 'right_single': {\n await this.handleClick(actionInputs, Button.RIGHT);\n break;\n }\n case 'middle_click': {\n await this.handleClick(actionInputs, Button.MIDDLE);\n break;\n }\n case 'left_click_drag':\n case 'drag':\n case 'select': {\n // end_box\n const { start: startPoint, end: endPoint } = actionInputs;\n if (!startPoint) {\n throw new Error('start point is required when drag/select');\n }\n if (!endPoint) {\n throw new Error('end point is required when drag/select');\n }\n\n const { realX: startX, realY: startY } = await this.calculateRealCoords(startPoint);\n const { realX: endX, realY: endY } = await this.calculateRealCoords(endPoint);\n this.logger.info(`drag: start(${startX},${startY}) -> end(${endX},${endY})`);\n if (startX > endX || startY > endY) {\n throw new Error('start point must be top left of end point');\n }\n\n await this.moveStraightTo(startX, startY);\n await sleep(100);\n await mouse.drag(straightTo(new Point(endX, endY)));\n break;\n }\n case 'type': {\n const { content: contentStr } = actionInputs;\n const content = contentStr.trim();\n if (!content) {\n throw new Error('content is required when type');\n }\n this.logger.info('type', content);\n const stripContent = content.replace(/\\\\n$/, '').replace(/\\n$/, '');\n keyboard.config.autoDelayMs = 0;\n if (process.platform === 'win32') {\n const originalClipboard = await clipboard.getContent();\n await clipboard.setContent(stripContent);\n await keyboard.pressKey(Key.LeftControl, Key.V);\n await sleep(50);\n await keyboard.releaseKey(Key.LeftControl, Key.V);\n await sleep(50);\n await clipboard.setContent(originalClipboard);\n } else {\n await keyboard.type(stripContent);\n }\n if (content.endsWith('\\n') || content.endsWith('\\\\n')) {\n await keyboard.pressKey(Key.Enter);\n await keyboard.releaseKey(Key.Enter);\n }\n keyboard.config.autoDelayMs = 500;\n break;\n }\n case 'hotkey': {\n const { key: keyStr } = actionInputs;\n const keys = this.getHotkeys(keyStr);\n await keyboard.pressKey(...keys);\n await keyboard.releaseKey(...keys);\n break;\n }\n case 'press': {\n const { key: keyStr } = actionInputs;\n const keys = this.getHotkeys(keyStr);\n await keyboard.pressKey(...keys);\n break;\n }\n case 'release': {\n const { key: keyStr } = actionInputs;\n const keys = this.getHotkeys(keyStr);\n await keyboard.releaseKey(...keys);\n break;\n }\n case 'scroll': {\n const { direction, point } = actionInputs;\n // if startX and startY is not null, move mouse to\n if (point) {\n const { realX, realY } = await this.calculateRealCoords(point);\n await this.moveStraightTo(realX, realY);\n }\n switch (direction?.toLowerCase()) {\n case 'up':\n await mouse.scrollUp(5 * 100);\n break;\n case 'down':\n await mouse.scrollDown(5 * 100);\n break;\n default:\n this.logger.warn(`Unsupported scroll direction: ${direction}`);\n throw new Error(`Unsupported scroll direction: ${direction}`);\n }\n break;\n }\n case 'wait': {\n this.logger.warn(\n 'The operator should not process wait action',\n JSON.stringify(actionInputs),\n );\n let sleepTime = 5000;\n if (actionInputs?.time) {\n sleepTime = actionInputs.time * 1000;\n }\n await sleep(sleepTime);\n break;\n }\n case 'finished':\n this.logger.info('finished, do nothing');\n break;\n default: {\n this.logger.warn(`Unsupported action: ${actionType}`);\n throw new Error(`Unsupported action: ${actionType}`);\n }\n }\n }\n\n private async calculateRealCoords(\n coords: Coordinates,\n ): Promise<{ realX: number; realY: number }> {\n if (!coords.normalized) {\n if (!coords.raw) {\n throw new Error('Invalide coordinates');\n }\n return {\n realX: coords.raw.x,\n realY: coords.raw.y,\n };\n }\n const screenContext = await this.getScreenContext();\n return {\n realX: coords.normalized.x * screenContext.screenWidth,\n realY: coords.normalized.y * screenContext.screenHeight,\n };\n }\n\n private async moveStraightTo(startX: number | null, startY: number | null) {\n if (startX === null || startY === null) {\n return;\n }\n await mouse.move(straightTo(new Point(startX, startY)));\n }\n\n // TODO: the supported keys should be more\n private getHotkeys(keyStr: string | undefined): Key[] {\n if (keyStr) {\n const platformCommandKey = process.platform === 'darwin' ? Key.LeftCmd : Key.LeftWin;\n const platformCtrlKey = process.platform === 'darwin' ? Key.LeftCmd : Key.LeftControl;\n const keyMap = {\n return: Key.Enter,\n ctrl: platformCtrlKey,\n shift: Key.LeftShift,\n alt: Key.LeftAlt,\n 'page down': Key.PageDown,\n 'page up': Key.PageUp,\n meta: platformCommandKey,\n win: platformCommandKey,\n command: platformCommandKey,\n cmd: platformCommandKey,\n ',': Key.Comma,\n arrowup: Key.Up,\n arrowdown: Key.Down,\n arrowleft: Key.Left,\n arrowright: Key.Right,\n } as const;\n\n const lowercaseKeyMap = Object.fromEntries(\n Object.entries(Key).map(([k, v]) => [k.toLowerCase(), v]),\n ) as {\n [K in keyof typeof Key as Lowercase<K>]: (typeof Key)[K];\n };\n\n const keys = keyStr\n .split(/[\\s+]/)\n .map((k) => k.toLowerCase())\n .map(\n (k) =>\n keyMap[k as keyof typeof keyMap] ?? lowercaseKeyMap[k as Lowercase<keyof typeof Key>],\n )\n .filter(Boolean);\n this.logger.info('hotkey: ', keys);\n return keys;\n } else {\n this.logger.error('hotkey error: ', `${keyStr} is not a valid key`);\n throw new Error(`Error: ${keyStr} is not a valid key`);\n }\n }\n\n private async handleClick(\n actionInputs: Record<string, unknown>,\n button: Button,\n clickNum: 1 | 2 = 1,\n ) {\n const { point } = actionInputs;\n if (!point) {\n throw new Error('point is required when click');\n }\n const { realX, realY } = await this.calculateRealCoords(point);\n await this.moveStraightTo(realX, realY);\n await sleep(100);\n if (clickNum === 2) {\n await mouse.doubleClick(button);\n } else {\n await mouse.click(button);\n }\n }\n}\n"],"names":["defaultLogger","ConsoleLogger","undefined","LogLevel","NutJSOperator","Operator","grabImage","screen","screenWithScale","Error","scaleFactor","screenWithScaleImage","Jimp","Buffer","width","height","physicalScreenImage","params","actions","action","actionType","actionInputs","point","realX","realY","Button","startPoint","endPoint","startX","startY","endX","endY","sleep","mouse","straightTo","Point","contentStr","content","stripContent","keyboard","process","originalClipboard","clipboard","Key","keyStr","keys","direction","JSON","sleepTime","coords","screenContext","platformCommandKey","platformCtrlKey","keyMap","lowercaseKeyMap","Object","k","v","Boolean","button","clickNum","logger"],"mappings":"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"}