{"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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"}