{"version":3,"file":"agent/prompts/base.mjs","sources":["webpack://@agent-infra/browser-use/./src/agent/prompts/base.ts"],"sourcesContent":["/**\n * The following code is modified based on\n * https://github.com/nanobrowser/nanobrowser/blob/master/chrome-extension/src/background/agent/prompts/base.ts\n *\n * Apache-2.0 License\n * Copyright (c) 2024 alexchenzl\n * https://github.com/nanobrowser/nanobrowser/blob/master/LICENSE\n */\nimport { HumanMessage, type SystemMessage } from '@langchain/core/messages';\nimport type { AgentContext } from '../types';\nimport { createLogger } from '../../utils';\n\nconst logger = createLogger('agent/prompts/base');\n\n/**\n * Abstract base class for all prompt types\n */\nabstract class BasePrompt {\n  /**\n   * Returns the system message that defines the AI's role and behavior\n   * @returns SystemMessage from LangChain\n   */\n  abstract getSystemMessage(): SystemMessage;\n\n  /**\n   * Returns the user message for the specific prompt type\n   * @param context - Optional context data needed for generating the user message\n   * @returns HumanMessage from LangChain\n   */\n  abstract getUserMessage(context: AgentContext): Promise<HumanMessage>;\n\n  /**\n   * Builds the user message containing the browser state\n   * @param context - The agent context\n   * @returns HumanMessage from LangChain\n   */\n  async buildBrowserStateUserMessage(\n    context: AgentContext,\n  ): Promise<HumanMessage> {\n    const browserState = await context.browserContext.getState();\n    const elementsText = browserState.elementTree.clickableElementsToString(\n      context.options.includeAttributes,\n    );\n\n    const hasContentAbove = (browserState.pixelsAbove || 0) > 0;\n    const hasContentBelow = (browserState.pixelsBelow || 0) > 0;\n\n    let formattedElementsText = '';\n    if (elementsText !== '') {\n      if (hasContentAbove) {\n        formattedElementsText = `... ${browserState.pixelsAbove} pixels above - scroll up to see more ...\\n${elementsText}`;\n      } else {\n        formattedElementsText = `[Start of page]\\n${elementsText}`;\n      }\n\n      if (hasContentBelow) {\n        formattedElementsText = `${formattedElementsText}\\n... ${browserState.pixelsBelow} pixels below - scroll down to see more ...`;\n      } else {\n        formattedElementsText = `${formattedElementsText}\\n[End of page]`;\n      }\n    } else {\n      formattedElementsText = 'empty page';\n    }\n\n    let stepInfoDescription = '';\n    if (context.stepInfo) {\n      stepInfoDescription = `Current step: ${context.stepInfo.stepNumber + 1}/${context.stepInfo.maxSteps}`;\n    }\n\n    const timeStr = new Date().toISOString().slice(0, 16).replace('T', ' '); // Format: YYYY-MM-DD HH:mm\n    stepInfoDescription += `Current date and time: ${timeStr}`;\n\n    let actionResultsDescription = '';\n    if (context.actionResults.length > 0) {\n      for (let i = 0; i < context.actionResults.length; i++) {\n        const result = context.actionResults[i];\n        if (result.extractedContent) {\n          actionResultsDescription += `\\nAction result ${i + 1}/${context.actionResults.length}: ${result.extractedContent}`;\n        }\n        if (result.error) {\n          // only use last 300 characters of error\n          const error = result.error.slice(-300);\n          actionResultsDescription += `\\nAction error ${i + 1}/${context.actionResults.length}: ...${error}`;\n        }\n      }\n    }\n\n    const stateDescription = `\n    [Task history memory ends here]\n    [Current state starts here]\n    You will see the following only once - if you need to remember it and you dont know it yet, write it down in the memory:\n    Current page: {url: ${browserState.url}, title: ${browserState.title}}\n    Other available pages:\n    ${browserState.pages\n      ?.filter((page) => page.url !== browserState.url)\n      .map((page) => ` - {url: ${page.url}, title: ${page.title}}`)\n      .join('\\n')}\n    Interactive elements from current page:\n    ${formattedElementsText}\n    ${stepInfoDescription}\n    ${actionResultsDescription}`;\n\n    if (browserState.screenshot && context.options.useVision) {\n      return new HumanMessage({\n        content: [\n          { type: 'text', text: stateDescription },\n          {\n            type: 'image_url',\n            image_url: {\n              url: `data:image/jpeg;base64,${browserState.screenshot}`,\n            },\n          },\n        ],\n      });\n    }\n\n    return new HumanMessage(stateDescription);\n  }\n}\n\nexport { BasePrompt };\n"],"names":["createLogger","BasePrompt","context","_browserState_pages","browserState","elementsText","hasContentAbove","hasContentBelow","formattedElementsText","stepInfoDescription","timeStr","Date","actionResultsDescription","i","result","error","stateDescription","page","HumanMessage"],"mappings":";;;;;;AAYeA,aAAa;AAK5B,MAAeC;IAmBb,MAAM,6BACJC,OAAqB,EACE;YAuDrBC;QAtDF,MAAMC,eAAe,MAAMF,QAAQ,cAAc,CAAC,QAAQ;QAC1D,MAAMG,eAAeD,aAAa,WAAW,CAAC,yBAAyB,CACrEF,QAAQ,OAAO,CAAC,iBAAiB;QAGnC,MAAMI,kBAAmBF,AAAAA,CAAAA,aAAa,WAAW,IAAI,KAAK;QAC1D,MAAMG,kBAAmBH,AAAAA,CAAAA,aAAa,WAAW,IAAI,KAAK;QAE1D,IAAII,wBAAwB;QAC5B,IAAIH,AAAiB,OAAjBA,cAAqB;YAErBG,wBADEF,kBACsB,CAAC,IAAI,EAAEF,aAAa,WAAW,CAAC,2CAA2C,EAAEC,cAAc,GAE3F,CAAC,iBAAiB,EAAEA,cAAc;YAI1DG,wBADED,kBACsB,GAAGC,sBAAsB,MAAM,EAAEJ,aAAa,WAAW,CAAC,2CAA2C,CAAC,GAEtG,GAAGI,sBAAsB,eAAe,CAAC;QAErE,OACEA,wBAAwB;QAG1B,IAAIC,sBAAsB;QAC1B,IAAIP,QAAQ,QAAQ,EAClBO,sBAAsB,CAAC,cAAc,EAAEP,QAAQ,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC,EAAEA,QAAQ,QAAQ,CAAC,QAAQ,EAAE;QAGvG,MAAMQ,UAAU,IAAIC,OAAO,WAAW,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK;QACnEF,uBAAuB,CAAC,uBAAuB,EAAEC,SAAS;QAE1D,IAAIE,2BAA2B;QAC/B,IAAIV,QAAQ,aAAa,CAAC,MAAM,GAAG,GACjC,IAAK,IAAIW,IAAI,GAAGA,IAAIX,QAAQ,aAAa,CAAC,MAAM,EAAEW,IAAK;YACrD,MAAMC,SAASZ,QAAQ,aAAa,CAACW,EAAE;YACvC,IAAIC,OAAO,gBAAgB,EACzBF,4BAA4B,CAAC,gBAAgB,EAAEC,IAAI,EAAE,CAAC,EAAEX,QAAQ,aAAa,CAAC,MAAM,CAAC,EAAE,EAAEY,OAAO,gBAAgB,EAAE;YAEpH,IAAIA,OAAO,KAAK,EAAE;gBAEhB,MAAMC,QAAQD,OAAO,KAAK,CAAC,KAAK,CAAC;gBACjCF,4BAA4B,CAAC,eAAe,EAAEC,IAAI,EAAE,CAAC,EAAEX,QAAQ,aAAa,CAAC,MAAM,CAAC,KAAK,EAAEa,OAAO;YACpG;QACF;QAGF,MAAMC,mBAAmB,CAAC;;;;wBAIN,EAAEZ,aAAa,GAAG,CAAC,SAAS,EAAEA,aAAa,KAAK,CAAC;;IAErE,EAAE,QAAAD,CAAAA,sBAAAA,aAAa,KAAK,AAAD,IAAjBA,KAAAA,IAAAA,oBACE,MAAM,CAAC,CAACc,OAASA,KAAK,GAAG,KAAKb,aAAa,GAAG,EAC/C,GAAG,CAAC,CAACa,OAAS,CAAC,SAAS,EAAEA,KAAK,GAAG,CAAC,SAAS,EAAEA,KAAK,KAAK,CAAC,CAAC,CAAC,EAC3D,IAAI,CAAC,MAAM;;IAEd,EAAET,sBAAsB;IACxB,EAAEC,oBAAoB;IACtB,EAAEG,0BAA0B;QAE5B,IAAIR,aAAa,UAAU,IAAIF,QAAQ,OAAO,CAAC,SAAS,EACtD,OAAO,IAAIgB,aAAa;YACtB,SAAS;gBACP;oBAAE,MAAM;oBAAQ,MAAMF;gBAAiB;gBACvC;oBACE,MAAM;oBACN,WAAW;wBACT,KAAK,CAAC,uBAAuB,EAAEZ,aAAa,UAAU,EAAE;oBAC1D;gBACF;aACD;QACH;QAGF,OAAO,IAAIc,aAAaF;IAC1B;AACF"}