@ui-tars/operator-nut-js
Version:
Operator Nut JS SDK for UI-TARS
1 lines • 18 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["webpack://@ui-tars/operator-nut-js/./src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n Operator,\n useContext,\n parseBoxToScreenCoords,\n StatusEnum,\n type ScreenshotOutput,\n type ExecuteParams,\n type ExecuteOutput,\n} from '@ui-tars/sdk/core';\nimport { Jimp } from 'jimp';\nimport {\n screen,\n Button,\n Key,\n Point,\n Region,\n centerOf,\n keyboard,\n mouse,\n sleep,\n straightTo,\n clipboard,\n} from '@computer-use/nut-js';\nimport Big from 'big.js';\n\nconst moveStraightTo = async (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};\nexport class NutJSOperator extends Operator {\n static MANUAL = {\n ACTION_SPACES: [\n `click(start_box='[x1, y1, x2, y2]')`,\n `left_double(start_box='[x1, y1, x2, y2]')`,\n `right_single(start_box='[x1, y1, x2, y2]')`,\n `drag(start_box='[x1, y1, x2, y2]', end_box='[x3, y3, x4, y4]')`,\n `hotkey(key='')`,\n `type(content='') #If you want to submit your input, use \"\\\\n\" at the end of \\`content\\`.`,\n `scroll(start_box='[x1, y1, x2, y2]', direction='down or up or right or left')`,\n `wait() #Sleep for 5s and take a screenshot to check for any changes.`,\n `finished()`,\n `call_user() # Submit the task and call the user when the task is unsolvable, or when you need the user's help.`,\n ],\n };\n\n public async screenshot(): Promise<ScreenshotOutput> {\n const { logger } = useContext();\n const grabImage = await screen.grab();\n const screenWithScale = await grabImage.toRGB(); // widthScale = screenWidth * scaleX\n\n const scaleFactor = screenWithScale.pixelDensity.scaleX;\n\n logger.info(\n '[NutjsOperator]',\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/png'); // Use png format to avoid compression\n\n const output = {\n base64: physicalScreenImage.toString('base64'),\n scaleFactor,\n };\n\n logger?.info(\n `[NutjsOperator] screenshot: ${width}x${height}, scaleFactor: ${scaleFactor}`,\n );\n return output;\n }\n\n async execute(params: ExecuteParams): Promise<ExecuteOutput> {\n const { logger } = useContext();\n const { parsedPrediction, screenWidth, screenHeight, scaleFactor } = params;\n\n const { action_type, action_inputs } = parsedPrediction;\n const startBoxStr = action_inputs?.start_box || '';\n\n logger.info('[NutjsOperator] execute', scaleFactor);\n const { x: startX, y: startY } = parseBoxToScreenCoords({\n boxStr: startBoxStr,\n screenWidth,\n screenHeight,\n });\n\n logger.info(`[NutjsOperator Position]: (${startX}, ${startY})`);\n\n // execute configs\n mouse.config.mouseSpeed = 3600;\n\n // if (startBoxStr) {\n // const region = await nutScreen.highlight(\n // new Region(startX, startY, 100, 100),\n // );\n // logger.info('[execute] [Region]', region);\n // }\n\n const getHotkeys = (keyStr: string | undefined): Key[] => {\n if (keyStr) {\n const platformCommandKey =\n process.platform === 'darwin' ? Key.LeftCmd : Key.LeftWin;\n const platformCtrlKey =\n process.platform === 'darwin' ? Key.LeftCmd : Key.LeftControl;\n const keyMap: Record<string, Key> = {\n return: Key.Enter,\n enter: Key.Enter,\n backspace: Key.Backspace,\n delete: Key.Delete,\n ctrl: platformCtrlKey,\n shift: Key.LeftShift,\n alt: Key.LeftAlt,\n space: Key.Space,\n 'page down': Key.PageDown,\n pagedown: Key.PageDown,\n 'page up': Key.PageUp,\n pageup: Key.PageUp,\n meta: platformCommandKey,\n win: platformCommandKey,\n command: platformCommandKey,\n cmd: platformCommandKey,\n comma: Key.Comma,\n ',': Key.Comma,\n up: Key.Up,\n down: Key.Down,\n left: Key.Left,\n right: Key.Right,\n arrowup: Key.Up,\n arrowdown: Key.Down,\n arrowleft: Key.Left,\n arrowright: Key.Right,\n };\n\n const keys = keyStr\n .split(/[\\s+]/)\n .map(\n (k) =>\n keyMap[k.toLowerCase()] ||\n Key[k.toUpperCase() as keyof typeof Key],\n );\n logger.info('[NutjsOperator] hotkey: ', keys);\n return keys;\n } else {\n logger.error(\n '[NutjsOperator] hotkey error: ',\n `${keyStr} is not a valid key`,\n );\n return [];\n }\n };\n\n switch (action_type) {\n case 'wait':\n logger.info('[NutjsOperator] wait', action_inputs);\n await sleep(5000);\n break;\n\n case 'mouse_move':\n case 'hover':\n logger.info('[NutjsOperator] mouse_move');\n await moveStraightTo(startX, startY);\n break;\n\n case 'click':\n case 'left_click':\n case 'left_single':\n logger.info('[NutjsOperator] left_click');\n await moveStraightTo(startX, startY);\n await sleep(100);\n await mouse.click(Button.LEFT);\n break;\n\n case 'left_double':\n case 'double_click':\n logger.info(`[NutjsOperator] ${action_type}(${startX}, ${startY})`);\n await moveStraightTo(startX, startY);\n await sleep(100);\n await mouse.doubleClick(Button.LEFT);\n break;\n\n case 'right_click':\n case 'right_single':\n logger.info('[NutjsOperator] right_click');\n await moveStraightTo(startX, startY);\n await sleep(100);\n await mouse.click(Button.RIGHT);\n break;\n\n case 'middle_click':\n logger.info('[NutjsOperator] middle_click');\n await moveStraightTo(startX, startY);\n await mouse.click(Button.MIDDLE);\n break;\n\n case 'left_click_drag':\n case 'drag':\n case 'select': {\n logger.info('[NutjsOperator] drag', action_inputs);\n // end_box\n if (action_inputs?.end_box) {\n const { x: endX, y: endY } = parseBoxToScreenCoords({\n boxStr: action_inputs.end_box,\n screenWidth,\n screenHeight,\n });\n\n if (startX && startY && endX && endY) {\n // calculate x and y direction difference\n const diffX = Big(endX).minus(startX).toNumber();\n const diffY = Big(endY).minus(startY).toNumber();\n\n await mouse.drag(\n straightTo(centerOf(new Region(startX, startY, diffX, diffY))),\n );\n }\n }\n break;\n }\n\n case 'type': {\n const content = action_inputs.content?.trim();\n logger.info('[NutjsOperator] type', content);\n if (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\n if (content.endsWith('\\n') || content.endsWith('\\\\n')) {\n await keyboard.pressKey(Key.Enter);\n await keyboard.releaseKey(Key.Enter);\n }\n\n keyboard.config.autoDelayMs = 500;\n }\n break;\n }\n\n case 'hotkey': {\n const keyStr = action_inputs?.key || action_inputs?.hotkey;\n const keys = getHotkeys(keyStr);\n if (keys.length > 0) {\n await keyboard.pressKey(...keys);\n await keyboard.releaseKey(...keys);\n }\n break;\n }\n\n case 'press': {\n const keyStr = action_inputs?.key || action_inputs?.hotkey;\n const keys = getHotkeys(keyStr);\n if (keys.length > 0) {\n await keyboard.pressKey(...keys);\n }\n break;\n }\n\n case 'release': {\n const keyStr = action_inputs?.key || action_inputs?.hotkey;\n const keys = getHotkeys(keyStr);\n if (keys.length > 0) {\n await keyboard.releaseKey(...keys);\n }\n break;\n }\n\n case 'scroll': {\n const { direction } = action_inputs;\n // if startX and startY is not null, move mouse to startX, startY\n if (startX !== null && startY !== null) {\n await moveStraightTo(startX, startY);\n }\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 console.warn(\n `[NutjsOperator] Unsupported scroll direction: ${direction}`,\n );\n }\n break;\n }\n\n case 'error_env':\n case 'call_user':\n case 'finished':\n case 'user_stop':\n return { status: StatusEnum.END };\n\n default:\n logger.warn(`Unsupported action: ${action_type}`);\n }\n }\n}\n"],"names":["moveStraightTo","startX","startY","mouse","straightTo","Point","NutJSOperator","Operator","logger","useContext","grabImage","screen","screenWithScale","scaleFactor","screenWithScaleImage","Jimp","Buffer","width","height","physicalScreenImage","output","params","parsedPrediction","screenWidth","screenHeight","action_type","action_inputs","startBoxStr","parseBoxToScreenCoords","getHotkeys","keyStr","platformCommandKey","process","Key","platformCtrlKey","keyMap","keys","k","sleep","Button","endX","endY","diffX","Big","diffY","centerOf","Region","_action_inputs_content","content","stripContent","keyboard","originalClipboard","clipboard","direction","console","StatusEnum"],"mappings":"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"}