ff-automationv2 2.2.30 → 2.2.32-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/dist/ai/llmprompts/llmPromptTypes/systemPromptTypes.d.ts +3 -0
  2. package/dist/ai/llmprompts/promptRegistry.js +10 -2
  3. package/dist/ai/llmprompts/systemPrompts/actionExtractorPrompt.js +83 -27
  4. package/dist/ai/llmprompts/systemPrompts/fileVerifyActionExtractorPrompt.d.ts +2 -0
  5. package/dist/ai/llmprompts/systemPrompts/fileVerifyActionExtractorPrompt.js +35 -0
  6. package/dist/ai/llmprompts/systemPrompts/fireflinkElementIndexExtactors.js +35 -0
  7. package/dist/ai/llmprompts/systemPrompts/fireflinkElementIndexExtractor_Mob.js +5 -2
  8. package/dist/ai/llmprompts/systemPrompts/getActionExtractorPrompt.js +4 -2
  9. package/dist/ai/llmprompts/systemPrompts/getActionExtractorPromptMob.js +3 -1
  10. package/dist/ai/llmprompts/systemPrompts/inputContextPrompt.d.ts +2 -0
  11. package/dist/ai/llmprompts/systemPrompts/inputContextPrompt.js +54 -0
  12. package/dist/ai/llmprompts/systemPrompts/mobileKeywordExtractor.js +53 -8
  13. package/dist/ai/llmprompts/systemPrompts/verifyActionExtractorPrompt.js +5 -4
  14. package/dist/ai/llmprompts/systemPrompts/verifyActionExtractorPromptMob.js +1 -1
  15. package/dist/ai/llmprompts/userPrompts/userPrompt.js +2 -0
  16. package/dist/automation/actions/executor.d.ts +14 -6
  17. package/dist/automation/actions/executor.js +968 -251
  18. package/dist/automation/actions/interaction/alert/enterDataToAlert.js +3 -1
  19. package/dist/automation/actions/interaction/alert/getTextPresentOnAlertPopup.js +4 -0
  20. package/dist/automation/actions/interaction/alert/verifyAlertPopUpMessageContainsString.js +1 -1
  21. package/dist/automation/actions/interaction/alert/verifyAlertPopupIsDisplayed.js +1 -1
  22. package/dist/automation/actions/interaction/alert/verifyTextPresentOnAlertPopup.js +1 -1
  23. package/dist/automation/actions/interaction/clear/clearAndEnter.js +6 -3
  24. package/dist/automation/actions/interaction/elementlessActions/getOtp.js +25 -24
  25. package/dist/automation/actions/interaction/enterActions/EnterInputIntoElementFromClipBoardInterface_mob.js +3 -1
  26. package/dist/automation/actions/interaction/enterActions/enterInput.js +5 -2
  27. package/dist/automation/actions/interaction/enterActions/enterInputAndPress.js +5 -2
  28. package/dist/automation/actions/interaction/enterActions/enterUrl.js +5 -2
  29. package/dist/automation/actions/interaction/enterActions/enterusingJs.js +3 -1
  30. package/dist/automation/actions/interaction/enterActions/waitAndEnter.js +5 -2
  31. package/dist/automation/actions/interaction/files/VerifyPDF.d.ts +2 -0
  32. package/dist/automation/actions/interaction/files/VerifyPDF.js +171 -0
  33. package/dist/automation/actions/interaction/get/MOB_GetADBLogsForGivenAppPackage.js +4 -1
  34. package/dist/automation/actions/interaction/get/MOB_GetAllContexts.js +5 -1
  35. package/dist/automation/actions/interaction/get/MOB_GetAllWindowHandles.d.ts +1 -1
  36. package/dist/automation/actions/interaction/get/MOB_GetAllWindowHandles.js +10 -6
  37. package/dist/automation/actions/interaction/get/MOB_GetAltitude.js +5 -1
  38. package/dist/automation/actions/interaction/get/MOB_GetBatteryPercentage.js +5 -1
  39. package/dist/automation/actions/interaction/get/MOB_GetBatteryStatus.d.ts +1 -1
  40. package/dist/automation/actions/interaction/get/MOB_GetBatteryStatus.js +7 -3
  41. package/dist/automation/actions/interaction/get/MOB_GetClipBoardText.js +5 -1
  42. package/dist/automation/actions/interaction/get/MOB_GetCurrentActivity.js +5 -1
  43. package/dist/automation/actions/interaction/get/MOB_GetCurrentAppPackage.js +5 -1
  44. package/dist/automation/actions/interaction/get/MOB_GetCurrentContext.js +5 -1
  45. package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceDate.js +5 -1
  46. package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSettings.js +5 -1
  47. package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceStatus.js +5 -1
  48. package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSystemBars.js +5 -2
  49. package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceTime.js +5 -1
  50. package/dist/automation/actions/interaction/get/MOB_GetCurrentOrientation.js +5 -1
  51. package/dist/automation/actions/interaction/get/MOB_GetCurrentSessionId.js +5 -1
  52. package/dist/automation/actions/interaction/get/MOB_GetDeviceLocation.js +5 -1
  53. package/dist/automation/actions/interaction/get/MOB_GetDeviceName.js +5 -1
  54. package/dist/automation/actions/interaction/get/MOB_GetDeviceOsVersion.js +5 -1
  55. package/dist/automation/actions/interaction/get/MOB_GetDeviceUdid.js +5 -1
  56. package/dist/automation/actions/interaction/get/MOB_GetHeightOfElement.js +5 -1
  57. package/dist/automation/actions/interaction/get/MOB_GetHeightOfScreen.js +4 -0
  58. package/dist/automation/actions/interaction/get/MOB_GetHourFromCurrentDeviceTime.js +5 -1
  59. package/dist/automation/actions/interaction/get/MOB_GetLatitude.js +5 -1
  60. package/dist/automation/actions/interaction/get/MOB_GetLongitude.js +5 -1
  61. package/dist/automation/actions/interaction/get/MOB_GetMinuteFromCurrentDeviceTime.js +5 -1
  62. package/dist/automation/actions/interaction/get/MOB_GetSecondFromCurrentDeviceTime.js +5 -1
  63. package/dist/automation/actions/interaction/get/MOB_GetSizeOfScreen.js +5 -1
  64. package/dist/automation/actions/interaction/get/MOB_GetSupportedPerformanceDataTypes.js +5 -1
  65. package/dist/automation/actions/interaction/get/MOB_GetTextFromElementAndSetToClipBoard.js +5 -1
  66. package/dist/automation/actions/interaction/get/MOB_GetWidthOfElement.js +5 -1
  67. package/dist/automation/actions/interaction/get/MOB_GetWidthOfScreen.js +5 -1
  68. package/dist/automation/actions/interaction/get/browserWindowGetPosition.js +5 -0
  69. package/dist/automation/actions/interaction/get/getAllBrokenImages.js +9 -0
  70. package/dist/automation/actions/interaction/get/getAllBrokenLinkCount.js +9 -0
  71. package/dist/automation/actions/interaction/get/getAllBrokenLinks.js +10 -1
  72. package/dist/automation/actions/interaction/get/getAllConsoleErrors.js +11 -0
  73. package/dist/automation/actions/interaction/get/getAllConsoleInformation.js +12 -1
  74. package/dist/automation/actions/interaction/get/getAllConsoleLogs.js +11 -1
  75. package/dist/automation/actions/interaction/get/getAllConsoleWarnings.js +12 -1
  76. package/dist/automation/actions/interaction/get/getAllCookieNames.js +6 -1
  77. package/dist/automation/actions/interaction/get/getAllCookieValues.js +6 -1
  78. package/dist/automation/actions/interaction/get/getAllSelectedOptions.js +8 -1
  79. package/dist/automation/actions/interaction/get/getAllTheOptionsFromListBoxAsText.js +4 -1
  80. package/dist/automation/actions/interaction/get/getAllTheOptionsFromListBoxAsTextInSortedOrder.js +4 -1
  81. package/dist/automation/actions/interaction/get/getAllTheSelectedOptionsFromListBoxAsText.js +4 -1
  82. package/dist/automation/actions/interaction/get/getAllWindowHandles.js +5 -1
  83. package/dist/automation/actions/interaction/get/getAttribute.js +19 -14
  84. package/dist/automation/actions/interaction/get/getAudioCurrentPlaybackRate.js +4 -1
  85. package/dist/automation/actions/interaction/get/getAudioCurrentSeekTime.js +4 -1
  86. package/dist/automation/actions/interaction/get/getAudioCurrentVolume.js +4 -1
  87. package/dist/automation/actions/interaction/get/getAudioDecodedByte.js +4 -1
  88. package/dist/automation/actions/interaction/get/getAudioDefaultPlaybackRate.js +4 -1
  89. package/dist/automation/actions/interaction/get/getAudioMediaLength.js +4 -1
  90. package/dist/automation/actions/interaction/get/getAudioMediaSource.js +4 -1
  91. package/dist/automation/actions/interaction/get/getBestPracticesScore.js +11 -3
  92. package/dist/automation/actions/interaction/get/getBrowserCount.js +5 -0
  93. package/dist/automation/actions/interaction/get/getBrowserVersion.js +5 -0
  94. package/dist/automation/actions/interaction/get/getCapabilityNames.js +5 -0
  95. package/dist/automation/actions/interaction/get/getClipBoardText.js +13 -0
  96. package/dist/automation/actions/interaction/get/getCollectiveApiResponseTime.js +4 -1
  97. package/dist/automation/actions/interaction/get/getCollectiveApiStatusCode.js +4 -1
  98. package/dist/automation/actions/interaction/get/getCssValue.js +5 -1
  99. package/dist/automation/actions/interaction/get/getCurrentDayOfTheWeek.js +4 -0
  100. package/dist/automation/actions/interaction/get/getCurrentSecondsFromCurrentSystemTime.js +5 -1
  101. package/dist/automation/actions/interaction/get/getCurrentSystemDate.js +4 -0
  102. package/dist/automation/actions/interaction/get/getCurrentSystemDay.js +5 -1
  103. package/dist/automation/actions/interaction/get/getCurrentSystemMonth.js +5 -1
  104. package/dist/automation/actions/interaction/get/getCurrentSystemTime.js +5 -1
  105. package/dist/automation/actions/interaction/get/getCurrentSystemYear.js +5 -1
  106. package/dist/automation/actions/interaction/get/getCurrentWindowHandle.js +13 -26
  107. package/dist/automation/actions/interaction/get/getDataFromApiRequestHeaderForJsonPath.js +5 -4
  108. package/dist/automation/actions/interaction/get/getDataFromApiResponseForJsonPath.js +5 -4
  109. package/dist/automation/actions/interaction/get/getDateWithGivenFormat.js +13 -16
  110. package/dist/automation/actions/interaction/get/getDriverInstance.js +13 -28
  111. package/dist/automation/actions/interaction/get/getFirstContentfulPaint.js +8 -1
  112. package/dist/automation/actions/interaction/get/getFirstSelectedOption.js +5 -1
  113. package/dist/automation/actions/interaction/get/getFullPaintTime.js +8 -1
  114. package/dist/automation/actions/interaction/get/getHTMLCodeOfPage.js +4 -0
  115. package/dist/automation/actions/interaction/get/getHeightOfBrowserWindow.js +5 -0
  116. package/dist/automation/actions/interaction/get/getHeightOfWebElement.js +4 -1
  117. package/dist/automation/actions/interaction/get/getHourFromCurrentSystemTime.js +4 -0
  118. package/dist/automation/actions/interaction/get/getImplicitTimeOut.js +15 -28
  119. package/dist/automation/actions/interaction/get/getLargestContentfulPaint.js +7 -0
  120. package/dist/automation/actions/interaction/get/getListBoxSize.d.ts +1 -1
  121. package/dist/automation/actions/interaction/get/getListBoxSize.js +4 -2
  122. package/dist/automation/actions/interaction/get/getListOfElementsFromLocatorTypeLocatorValue.js +7 -2
  123. package/dist/automation/actions/interaction/get/getLocation.js +14 -8
  124. package/dist/automation/actions/interaction/get/getMinuteFromCurrentSystemTime.js +4 -0
  125. package/dist/automation/actions/interaction/get/getNetworkRouteTime.js +7 -0
  126. package/dist/automation/actions/interaction/get/getNumberOfBrokenImages.js +7 -0
  127. package/dist/automation/actions/interaction/get/getNumberOfLinksPresentInCurrentPage.js +5 -0
  128. package/dist/automation/actions/interaction/get/getNumberOfWorkingLinksFromCurrentPage.js +9 -0
  129. package/dist/automation/actions/interaction/get/getOptions.js +4 -1
  130. package/dist/automation/actions/interaction/get/getPageTitle.js +5 -1
  131. package/dist/automation/actions/interaction/get/getPerformanceMetrics.js +12 -1
  132. package/dist/automation/actions/interaction/get/getPwaScore.js +11 -3
  133. package/dist/automation/actions/interaction/get/getRect.js +9 -2
  134. package/dist/automation/actions/interaction/get/getScreenshot.js +13 -28
  135. package/dist/automation/actions/interaction/get/getScreenshotAs.js +14 -44
  136. package/dist/automation/actions/interaction/get/getSeoScore.js +15 -3
  137. package/dist/automation/actions/interaction/get/getSingleApiRequestPayload.js +5 -3
  138. package/dist/automation/actions/interaction/get/getSingleApiResponse.js +9 -8
  139. package/dist/automation/actions/interaction/get/getSingleApiResponseTime.js +9 -9
  140. package/dist/automation/actions/interaction/get/getSingleApiStatusCode.d.ts +1 -1
  141. package/dist/automation/actions/interaction/get/getSingleApiStatusCode.js +10 -17
  142. package/dist/automation/actions/interaction/get/getSize.js +7 -2
  143. package/dist/automation/actions/interaction/get/getSizeOfBrowserWindow.js +5 -4
  144. package/dist/automation/actions/interaction/get/getStringDataFromLocalFile.js +10 -7
  145. package/dist/automation/actions/interaction/get/getSystemProperty.js +6 -4
  146. package/dist/automation/actions/interaction/get/getTagName.js +9 -2
  147. package/dist/automation/actions/interaction/get/getText.js +7 -2
  148. package/dist/automation/actions/interaction/get/getTheFirstSelectedOptionFromListBoxAsText.js +5 -1
  149. package/dist/automation/actions/interaction/get/getTotalNumberOfCookies.js +6 -1
  150. package/dist/automation/actions/interaction/get/getTunnelIdentifier.js +5 -8
  151. package/dist/automation/actions/interaction/get/getURLPresentInAddressBar.js +5 -1
  152. package/dist/automation/actions/interaction/get/getUserHomeDirectory.js +9 -1
  153. package/dist/automation/actions/interaction/get/getValueByCookieName.js +7 -4
  154. package/dist/automation/actions/interaction/get/getValueFromLocalStorage.js +6 -4
  155. package/dist/automation/actions/interaction/get/getValueOfSystemVariable.js +6 -4
  156. package/dist/automation/actions/interaction/get/getVideoCurrentPlaybackRate.js +4 -1
  157. package/dist/automation/actions/interaction/get/getVideoCurrentSeekTime.js +4 -1
  158. package/dist/automation/actions/interaction/get/getVideoCurrentVolume.js +4 -1
  159. package/dist/automation/actions/interaction/get/getVideoDecodedByte.js +4 -1
  160. package/dist/automation/actions/interaction/get/getVideoDefaultPlaybackRate.js +4 -1
  161. package/dist/automation/actions/interaction/get/getVideoMediaLength.js +4 -1
  162. package/dist/automation/actions/interaction/get/getVideoMediaSource.js +5 -1
  163. package/dist/automation/actions/interaction/get/getWidthOfBrowser.js +6 -1
  164. package/dist/automation/actions/interaction/get/getWidthOfWebElement.js +4 -1
  165. package/dist/automation/actions/interaction/get/getWorkingLinksFromCurrentPage.js +10 -1
  166. package/dist/automation/actions/interaction/get/getWrappedElement.js +5 -1
  167. package/dist/automation/actions/interaction/get/getWrappedOptionFromListBoxAsText.d.ts +1 -1
  168. package/dist/automation/actions/interaction/get/getWrappedOptionFromListBoxAsText.js +4 -2
  169. package/dist/automation/actions/interaction/get/getXLocationOfBrowserWindow.js +4 -3
  170. package/dist/automation/actions/interaction/get/getXLocationOfWebElement.js +7 -2
  171. package/dist/automation/actions/interaction/get/getYLocationOfBrowserWindow.js +6 -1
  172. package/dist/automation/actions/interaction/get/getYLocationOfWebElement.js +7 -2
  173. package/dist/automation/actions/interaction/shadowDom/shadowDomEnter.js +2 -0
  174. package/dist/automation/actions/interaction/shadowDom/shadowDomGetText.js +5 -2
  175. package/dist/automation/actions/interaction/verify/MOB_VerifyBatteryLevel.js +1 -1
  176. package/dist/automation/actions/interaction/verify/VerifyAttributeValue.js +2 -2
  177. package/dist/automation/actions/interaction/verify/VerifyBrowserHtmlCodeContainsString.js +1 -1
  178. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowHeight.js +1 -1
  179. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowTitleContainsString.js +1 -1
  180. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowTitleIsString.js +1 -1
  181. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowUrlContainsExpectedUrl.js +1 -1
  182. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowUrlIsString.js +1 -1
  183. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowWidth.js +1 -1
  184. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowXLocation.js +1 -1
  185. package/dist/automation/actions/interaction/verify/VerifyBrowserWindowYLocation.js +1 -1
  186. package/dist/automation/actions/interaction/verify/VerifyCssAttributeValue.js +1 -1
  187. package/dist/automation/actions/interaction/verify/VerifyElementNotContainsText.js +2 -2
  188. package/dist/automation/actions/interaction/verify/VerifyHeightOfWebElement.js +2 -2
  189. package/dist/automation/actions/interaction/verify/VerifyHexCodeForGivenXYCoordinates.js +1 -1
  190. package/dist/automation/actions/interaction/verify/VerifyIfAllCookiesAreDeleted.js +1 -1
  191. package/dist/automation/actions/interaction/verify/VerifyIfCookieNameIsAdded.js +1 -1
  192. package/dist/automation/actions/interaction/verify/VerifyIfCookieNameIsDeleted.js +1 -1
  193. package/dist/automation/actions/interaction/verify/VerifyIfCookieObjectIsPresent.js +1 -1
  194. package/dist/automation/actions/interaction/verify/VerifyIfGivenOptionIsDuplicate.js +1 -1
  195. package/dist/automation/actions/interaction/verify/VerifyIfImageIsBroken.js +1 -1
  196. package/dist/automation/actions/interaction/verify/VerifyIfLinkIsBroken.js +1 -1
  197. package/dist/automation/actions/interaction/verify/VerifyIfLinkIsWorking.js +1 -1
  198. package/dist/automation/actions/interaction/verify/VerifyIfLinksAreBroken.js +1 -1
  199. package/dist/automation/actions/interaction/verify/VerifyIfLinksAreWorking.js +1 -1
  200. package/dist/automation/actions/interaction/verify/VerifyIfOptionWithTextIsDeselected.js +1 -1
  201. package/dist/automation/actions/interaction/verify/VerifyIfOptionWithValueIsDeselected.js +1 -1
  202. package/dist/automation/actions/interaction/verify/VerifyIfOptionWithValueIsSelected.js +1 -1
  203. package/dist/automation/actions/interaction/verify/VerifyIfOptionWithVisibleTextIsSelected.js +1 -1
  204. package/dist/automation/actions/interaction/verify/VerifyIfSpecifiedOptionIsSelected.js +1 -1
  205. package/dist/automation/actions/interaction/verify/VerifyNavigateURL.js +1 -1
  206. package/dist/automation/actions/interaction/verify/VerifyPartialAttributeValue.js +2 -2
  207. package/dist/automation/actions/interaction/verify/VerifyPartialTitleOfCurrentPage.js +1 -1
  208. package/dist/automation/actions/interaction/verify/VerifyTagName.js +1 -1
  209. package/dist/automation/actions/interaction/verify/VerifyThatSpecifiedOptionIsNotSelected.js +1 -1
  210. package/dist/automation/actions/interaction/verify/VerifyTitleInAllPage.js +1 -1
  211. package/dist/automation/actions/interaction/verify/VerifyTitleOfCurrentPage.js +1 -1
  212. package/dist/automation/actions/interaction/verify/VerifyValueOfElementContainsString.js +1 -1
  213. package/dist/automation/actions/interaction/verify/VerifyValueOfElementIsString.js +1 -1
  214. package/dist/automation/actions/interaction/verify/VerifyWidthOfElement.js +2 -2
  215. package/dist/automation/actions/interaction/verify/VerifyXLocationOfElement.js +2 -2
  216. package/dist/automation/actions/interaction/verify/VerifyYLocationOfElement.js +2 -2
  217. package/dist/automation/actions/interaction/verify/checkIfElementIsDisplayed.js +2 -2
  218. package/dist/automation/actions/interaction/verify/verifypartialtext.js +2 -2
  219. package/dist/automation/actions/interaction/verify/verifytext.js +2 -2
  220. package/dist/automation/actions/interface/FireFlinkResponseSchema.d.ts +22 -1
  221. package/dist/automation/actions/interface/FireFlinkResponseSchema.js +18 -4
  222. package/dist/automation/actions/interface/alertActionInterface.d.ts +11 -0
  223. package/dist/automation/actions/interface/clearActionInterface.d.ts +4 -0
  224. package/dist/automation/actions/interface/getActionInterface.d.ts +150 -141
  225. package/dist/automation/actions/interface/getOtpInterface.d.ts +5 -0
  226. package/dist/automation/actions/interface/interactionActionInterface.d.ts +14 -7
  227. package/dist/automation/actions/interface/shadowDomInterface.d.ts +10 -0
  228. package/dist/automation/actions/interface/verifyActionInterface.d.ts +100 -0
  229. package/dist/core/Errors/InvalidFileTypeError.d.ts +5 -0
  230. package/dist/core/Errors/InvalidFileTypeError.js +14 -0
  231. package/dist/core/constants/supportedActions.js +4 -0
  232. package/dist/core/helpers/elementSelectorResolver.d.ts +11 -0
  233. package/dist/core/helpers/elementSelectorResolver.js +102 -0
  234. package/dist/core/helpers/runnerDomPipeline.d.ts +9 -0
  235. package/dist/core/helpers/runnerDomPipeline.js +97 -0
  236. package/dist/core/helpers/runnerKafkaReporter.d.ts +17 -0
  237. package/dist/core/helpers/runnerKafkaReporter.js +71 -0
  238. package/dist/core/helpers/runnerPostActionHelper.d.ts +2 -0
  239. package/dist/core/helpers/runnerPostActionHelper.js +30 -0
  240. package/dist/core/helpers/stepActionInspector.d.ts +5 -0
  241. package/dist/core/helpers/stepActionInspector.js +113 -0
  242. package/dist/core/helpers/visionFallbackHandler.d.ts +3 -0
  243. package/dist/core/helpers/visionFallbackHandler.js +138 -0
  244. package/dist/core/interfaces/actionInterface.d.ts +7 -5
  245. package/dist/core/interfaces/automationRunnerInterface.d.ts +56 -1
  246. package/dist/core/interfaces/fireflinkScriptPayloadInterface.d.ts +2 -0
  247. package/dist/core/interfaces/llmResponseInterface.d.ts +5 -0
  248. package/dist/core/interfaces/promptInterface.d.ts +9 -2
  249. package/dist/core/interfaces/scriptGenrationDataInterface.d.ts +4 -0
  250. package/dist/core/main/actionHandlerFactory.js +37 -7
  251. package/dist/core/main/executionContext.d.ts +2 -1
  252. package/dist/core/main/executionContext.js +7 -5
  253. package/dist/core/main/runAutomationScript.d.ts +1 -0
  254. package/dist/core/main/runAutomationScript.js +390 -1008
  255. package/dist/core/types/llmResponseType.d.ts +2 -2
  256. package/dist/core/types/promptType.d.ts +3 -1
  257. package/dist/core/types/promptType.js +2 -0
  258. package/dist/fireflinkData/fireflinkScript/appendScriptData.js +3 -0
  259. package/dist/utils/browserCap/capability.js +17 -0
  260. package/dist/utils/helpers/getHelper.d.ts +8 -0
  261. package/dist/utils/helpers/getHelper.js +115 -0
  262. package/dist/utils/helpers/platformSyntax.d.ts +1 -1
  263. package/package.json +2 -1
  264. package/dist/ai/llmprompts/systemPrompts/combinedActionExtractorPrompt.d.ts +0 -2
  265. package/dist/ai/llmprompts/systemPrompts/combinedActionExtractorPrompt.js +0 -36
@@ -28,6 +28,7 @@ exports.ELEMENTLESS_ACTION = [
28
28
  "SwitchToParentWindow",
29
29
  "SwitchToWindowIfTitleContainsString",
30
30
  "SwitchToNewWindowIfUrlContainsString",
31
+ "ScrollPageToSpecificLocation",
31
32
  "GetPageTitle",
32
33
  "GetBrowserVersion",
33
34
  "GetAllWindowHandles",
@@ -68,6 +69,9 @@ exports.ELEMENTLESS_ACTION = [
68
69
  "GetNetworkRouteTime",
69
70
  "GetPerformanceMetrics",
70
71
  "GetUserHomeDirectory",
72
+ "ConcatString",
73
+ "GetLastModifiedFile",
74
+ "VerifyPDF",
71
75
  "MOB_GetCurrentWindowHandle",
72
76
  "MOB_GetDriverInstance",
73
77
  "MOB_GetADBLogsForGivenAppPackage",
@@ -0,0 +1,11 @@
1
+ import { platform as PlatformType } from "../types/scriptTypesType.js";
2
+ import { ShadowIframeResult } from "../interfaces/automationRunnerInterface.js";
3
+ export { ShadowIframeResult };
4
+ export declare function generateUniqueName(currentName: string | undefined, usedNames: string[]): string | undefined;
5
+ export declare function normalizeSvgSelector(selector: string): string;
6
+ export declare function resolveElementSelector(doc: any, domInfo: any, fireflinkIndex: string, platform: PlatformType, driver: any): Promise<{
7
+ selector: string;
8
+ doc: any;
9
+ domInfo: any;
10
+ }>;
11
+ export declare function handleShadowAndIframe(driver: any, stepAction: string, selector: string, fireflinkIndex: string, domInfo: any, actionHandlers: Record<string, any>, elementName: string, elementType: string): Promise<ShadowIframeResult>;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateUniqueName = generateUniqueName;
4
+ exports.normalizeSvgSelector = normalizeSvgSelector;
5
+ exports.resolveElementSelector = resolveElementSelector;
6
+ exports.handleShadowAndIframe = handleShadowAndIframe;
7
+ const xpathcreation_js_1 = require("../../utils/helpers/xpathcreation.js");
8
+ const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
9
+ const jsFindElement_js_1 = require("../../utils/javascript/jsFindElement.js");
10
+ const runnerDomPipeline_js_1 = require("./runnerDomPipeline.js");
11
+ const logData_js_1 = require("../../utils/logger/logData.js");
12
+ function generateUniqueName(currentName, usedNames) {
13
+ if (!currentName) {
14
+ return currentName;
15
+ }
16
+ const baseName = currentName;
17
+ let newName = baseName;
18
+ let count = 0;
19
+ while (usedNames.includes(newName)) {
20
+ count++;
21
+ newName = `${baseName}_${count}`;
22
+ }
23
+ usedNames.push(newName);
24
+ return newName;
25
+ }
26
+ function normalizeSvgSelector(selector) {
27
+ if (selector.includes("svg")) {
28
+ const match = /svg\[(\d+)\]/.exec(selector);
29
+ const svgIndex = match ? match[1] : "1";
30
+ return selector.replace(/svg\[\d+\]/, `*[name()='svg'][${svgIndex}]`);
31
+ }
32
+ return selector;
33
+ }
34
+ async function resolveElementSelector(doc, domInfo, fireflinkIndex, platform, driver) {
35
+ let selector;
36
+ let updatedDoc = doc;
37
+ let updatedDomInfo = domInfo;
38
+ if (platform === "web") {
39
+ if (!updatedDoc) {
40
+ logData_js_1.logger.info("doc is undefined. Rebuilding document from domInfo.");
41
+ if (!updatedDomInfo || !updatedDomInfo.dom) {
42
+ updatedDomInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
43
+ }
44
+ updatedDoc = runnerDomPipeline_js_1.RunnerDomPipeline.parseDomDocument(updatedDomInfo.dom, "web");
45
+ }
46
+ const ele = updatedDoc.querySelector(`[ff-inspect="${fireflinkIndex}"]`);
47
+ if (ele) {
48
+ selector = ele.getAttribute("ff-xpath") || "";
49
+ }
50
+ else {
51
+ const result = (0, xpathcreation_js_1.getWebXPathByFFIndex)(updatedDomInfo.dom, fireflinkIndex);
52
+ selector = result.xpathPath;
53
+ }
54
+ }
55
+ else {
56
+ const result = await (0, xpathcreation_js_1.getFFIndexAndXPath)(updatedDomInfo.dom, fireflinkIndex);
57
+ selector = result.xpathPath;
58
+ }
59
+ selector = normalizeSvgSelector(selector);
60
+ return { selector, doc: updatedDoc, domInfo: updatedDomInfo };
61
+ }
62
+ async function handleShadowAndIframe(driver, stepAction, selector, fireflinkIndex, domInfo, actionHandlers, elementName, elementType) {
63
+ let updatedStepAction = stepAction;
64
+ let updatedSelector = selector;
65
+ let iframeDomHtml = null;
66
+ if (updatedSelector.includes("shadow")) {
67
+ updatedStepAction = updatedStepAction + "_shadow";
68
+ logData_js_1.logger.info(updatedStepAction);
69
+ }
70
+ else if (updatedSelector.includes("iframe")) {
71
+ const defaultHandler = actionHandlers["switchToDefaultContent"];
72
+ await defaultHandler({ driver });
73
+ const result_if = await driver.executeAsyncScript(jsFindElement_js_1.Find_element_by_ff_js_script, [fireflinkIndex]);
74
+ if (!result_if?.success) {
75
+ logData_js_1.logger.info("Not found");
76
+ return {
77
+ stepAction: updatedStepAction,
78
+ selector: updatedSelector,
79
+ iframeDomHtml: null,
80
+ handled: false,
81
+ };
82
+ }
83
+ const { xpath_if, frames, iframe_dom_html } = result_if;
84
+ updatedSelector = xpath_if;
85
+ iframeDomHtml = iframe_dom_html;
86
+ const frameHandler = actionHandlers["switchToFrame"];
87
+ await frameHandler({
88
+ selector: updatedSelector,
89
+ frames: frames,
90
+ elementName,
91
+ elementType,
92
+ pageDOM: domInfo.dom,
93
+ fireflinkIndex,
94
+ });
95
+ }
96
+ return {
97
+ stepAction: updatedStepAction,
98
+ selector: updatedSelector,
99
+ iframeDomHtml,
100
+ handled: true,
101
+ };
102
+ }
@@ -0,0 +1,9 @@
1
+ import { DomProcessingEngine } from "../../domAnalysis/getRelaventElements.js";
2
+ import { platform as PlatformType } from "../types/scriptTypesType.js";
3
+ import { DomCaptureResult, DomProcessResult } from "../interfaces/automationRunnerInterface.js";
4
+ export { DomCaptureResult, DomProcessResult };
5
+ export declare class RunnerDomPipeline {
6
+ static parseDomDocument(domHtml: string, platform: PlatformType): any;
7
+ static captureAndParseDom(driver: any, platform: PlatformType, stepCount: number, action: string, isRetry?: boolean): Promise<DomCaptureResult>;
8
+ static processRelevantDom(domProcessor: DomProcessingEngine, domInfo: any, keywords: any, stepCount: number, action: string, currentStep: string, platform: PlatformType, driver: any, isRetry?: boolean): Promise<DomProcessResult>;
9
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RunnerDomPipeline = void 0;
4
+ const jsdom_1 = require("jsdom");
5
+ const toon_1 = require("@toon-format/toon");
6
+ const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
7
+ const domSanitizer_js_1 = require("../../utils/helpers/domSanitizer.js");
8
+ const logData_js_1 = require("../../utils/logger/logData.js");
9
+ class RunnerDomPipeline {
10
+ static parseDomDocument(domHtml, platform) {
11
+ if (platform === "web") {
12
+ const parser = new jsdom_1.JSDOM((0, domSanitizer_js_1.sanitizeWebDom)(domHtml));
13
+ return parser.window.document;
14
+ }
15
+ else {
16
+ const parser = new jsdom_1.JSDOM(domHtml, {
17
+ contentType: "text/xml",
18
+ });
19
+ return parser.window.document;
20
+ }
21
+ }
22
+ static async captureAndParseDom(driver, platform, stepCount, action, isRetry = false) {
23
+ try {
24
+ let domInfo;
25
+ let doc;
26
+ if (platform === "web") {
27
+ domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
28
+ const fileName = isRetry
29
+ ? `annotated-dom-retry-${stepCount}`
30
+ : `annotated-dom-${stepCount}`;
31
+ logData_js_1.logger.saveDOM(domInfo.dom, fileName);
32
+ doc = RunnerDomPipeline.parseDomDocument(domInfo.dom, "web");
33
+ }
34
+ else {
35
+ domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOMForMobile)(driver);
36
+ const fileName = isRetry
37
+ ? `annotated-dom-Mob-retry-${stepCount}`
38
+ : `annotated-dom-Mob-${stepCount}`;
39
+ logData_js_1.logger.saveDOM(domInfo.dom, fileName);
40
+ doc = RunnerDomPipeline.parseDomDocument(domInfo.dom, platform);
41
+ }
42
+ return { domInfo, doc };
43
+ }
44
+ catch (error) {
45
+ if (action === "verify") {
46
+ return { domInfo: null, doc: null };
47
+ }
48
+ throw error;
49
+ }
50
+ }
51
+ static async processRelevantDom(domProcessor, domInfo, keywords, stepCount, action, currentStep, platform, driver, isRetry = false) {
52
+ try {
53
+ let extractedRelevantDom;
54
+ let toonDom;
55
+ if (platform === "web") {
56
+ extractedRelevantDom = await domProcessor.webProcess({
57
+ keywords: keywords,
58
+ rawDom: domInfo?.dom,
59
+ stepCount: stepCount,
60
+ stepAction: action,
61
+ step: currentStep,
62
+ platform: platform,
63
+ driver: driver,
64
+ });
65
+ toonDom = (0, toon_1.encode)(extractedRelevantDom || []);
66
+ const fileName = isRetry
67
+ ? `relevant-dom-toon-retry-${stepCount}`
68
+ : `relevant-dom-toon-${stepCount}`;
69
+ logData_js_1.logger.saveText(toonDom, fileName);
70
+ }
71
+ else {
72
+ extractedRelevantDom = await domProcessor.mobileProcess({
73
+ keywords: keywords,
74
+ rawDom: domInfo?.dom,
75
+ stepCount: stepCount,
76
+ stepAction: action,
77
+ step: currentStep,
78
+ platform: platform,
79
+ driver: driver,
80
+ });
81
+ toonDom = (0, toon_1.encode)(extractedRelevantDom || []);
82
+ const fileName = isRetry
83
+ ? `relevant-dom-toon-Mob-retry-${stepCount}`
84
+ : `relevant-dom-toon-Mob-${stepCount}`;
85
+ logData_js_1.logger.saveText(toonDom, fileName);
86
+ }
87
+ return { extractedRelevantDom, toonDom };
88
+ }
89
+ catch (error) {
90
+ if (action === "verify") {
91
+ return { extractedRelevantDom: null, toonDom: undefined };
92
+ }
93
+ throw error;
94
+ }
95
+ }
96
+ }
97
+ exports.RunnerDomPipeline = RunnerDomPipeline;
@@ -0,0 +1,17 @@
1
+ import { fireflinkService } from "../../service/fireflink.service.js";
2
+ import { AutomationRequest } from "../interfaces/executionDetails.js";
3
+ import { IKafkaPayload } from "../interfaces/fireflinkScriptPayloadInterface.js";
4
+ export declare class RunnerKafkaReporter {
5
+ private fireflinkServiceInstance;
6
+ private request;
7
+ constructor(fireflinkServiceInstance: fireflinkService, request: AutomationRequest);
8
+ sendLiveLog(message: any, messageType: string): Promise<void>;
9
+ sendOngoing(message: string): Promise<void>;
10
+ sendRetry(message: string): Promise<void>;
11
+ sendTermination(): Promise<void>;
12
+ sendError(errorDescription?: string): Promise<void>;
13
+ sendExecutionStopped(): Promise<void>;
14
+ sendNextBatch(): Promise<void>;
15
+ sendCompleted(): Promise<void>;
16
+ sendMetadata(kafkaPayload: IKafkaPayload): Promise<void>;
17
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RunnerKafkaReporter = void 0;
4
+ const messageType_js_1 = require("../types/messageType.js");
5
+ const logData_js_1 = require("../../utils/logger/logData.js");
6
+ class RunnerKafkaReporter {
7
+ constructor(fireflinkServiceInstance, request) {
8
+ this.fireflinkServiceInstance = fireflinkServiceInstance;
9
+ this.request = request;
10
+ }
11
+ async sendLiveLog(message, messageType) {
12
+ await this.fireflinkServiceInstance.produceMessageToKafka(this.request.kafkaMessageKey, {
13
+ topic: this.request.topic,
14
+ message: {
15
+ topic: "",
16
+ service: "",
17
+ chatId: "",
18
+ aiPromptPayload: {
19
+ display: false,
20
+ message: "",
21
+ messageId: "",
22
+ branchId: "",
23
+ userId: this.request.userId,
24
+ scriptId: "",
25
+ scriptType: "",
26
+ type: "logs",
27
+ sessionId: "",
28
+ licenseId: this.request.licenseId,
29
+ projectId: this.request.projectId,
30
+ liveLogs: {
31
+ executionId: this.request.kafkaMessageKey,
32
+ message,
33
+ messageType,
34
+ },
35
+ attachment: [],
36
+ },
37
+ },
38
+ });
39
+ }
40
+ async sendOngoing(message) {
41
+ await this.sendLiveLog(message, messageType_js_1.MessageType.LiveLog.Ongoing);
42
+ logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.Ongoing })}`);
43
+ }
44
+ async sendRetry(message) {
45
+ await this.sendLiveLog(message, messageType_js_1.MessageType.LiveLog.retry);
46
+ }
47
+ async sendTermination() {
48
+ logData_js_1.logger.info(`Execution terminated successfully. Script: ${this.request.scriptName}, Test Case ID: ${this.request.testCaseId}`);
49
+ await this.sendLiveLog("Execution terminated by the user", messageType_js_1.MessageType.LiveLog.Termination);
50
+ }
51
+ async sendError(errorDescription) {
52
+ await this.sendLiveLog(errorDescription ?? "errorDescription unknown", messageType_js_1.MessageType.LiveLog.Error);
53
+ logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.Error })}`);
54
+ }
55
+ async sendExecutionStopped() {
56
+ await this.sendLiveLog("Execution stopped", messageType_js_1.MessageType.LiveLog.ExecutionStopped);
57
+ logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.ExecutionStopped })}`);
58
+ }
59
+ async sendNextBatch() {
60
+ await this.sendLiveLog("Invoke the generate_script_from_scenario tool with the remaining test steps to continue the automation execution from where it left off.", messageType_js_1.MessageType.nextBatch);
61
+ logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.nextBatch })}`);
62
+ }
63
+ async sendCompleted() {
64
+ await this.sendLiveLog("Execution completed", messageType_js_1.MessageType.LiveLog.Completed);
65
+ logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.Completed })}`);
66
+ }
67
+ async sendMetadata(kafkaPayload) {
68
+ await this.sendLiveLog(kafkaPayload, messageType_js_1.MessageType.AutomationScriptMetaData);
69
+ }
70
+ }
71
+ exports.RunnerKafkaReporter = RunnerKafkaReporter;
@@ -0,0 +1,2 @@
1
+ import { platform as PlatformType } from "../types/scriptTypesType.js";
2
+ export declare function handlePostActionWeb(platform: PlatformType, driver: any, action: string, beforeHandles: any, scriptAppender: any, stepCount: number): Promise<any | null>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handlePostActionWeb = handlePostActionWeb;
4
+ const isAlertPresent_js_1 = require("../../utils/alertPopup/isAlertPresent.js");
5
+ const jsForToaster_js_1 = require("../../utils/javascript/jsForToaster.js");
6
+ const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
7
+ const newTabTracker_js_1 = require("../../utils/newTab/newTabTracker.js");
8
+ const logData_js_1 = require("../../utils/logger/logData.js");
9
+ async function handlePostActionWeb(platform, driver, action, beforeHandles, scriptAppender, stepCount) {
10
+ let preCapturedDomInfo = null;
11
+ if (platform === "web") {
12
+ const alertPresent = await (0, isAlertPresent_js_1.isAlertPresent)(driver);
13
+ if (!alertPresent) {
14
+ if (action === "click") {
15
+ await driver.executeScript(jsForToaster_js_1.TOAST_WATCHER_JS, []);
16
+ await new Promise((resolve) => setTimeout(resolve, 100));
17
+ const postClickToastDetected = await driver.executeScript("return window.__toastDetected === true;", []);
18
+ if (postClickToastDetected) {
19
+ logData_js_1.logger.info("Toast detected after click");
20
+ preCapturedDomInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
21
+ logData_js_1.logger.saveDOM(preCapturedDomInfo.dom, `toaster-dom-${stepCount}`);
22
+ }
23
+ }
24
+ }
25
+ if (beforeHandles?.length > 0) {
26
+ await (0, newTabTracker_js_1.newTabTracker)(driver, action, beforeHandles, scriptAppender);
27
+ }
28
+ }
29
+ return preCapturedDomInfo;
30
+ }
@@ -0,0 +1,5 @@
1
+ import { StepProcessor } from "../main/stepProcessor.js";
2
+ import { platform as PlatformType } from "../types/scriptTypesType.js";
3
+ import { ResolvedStepAction } from "../interfaces/automationRunnerInterface.js";
4
+ export { ResolvedStepAction };
5
+ export declare function resolveStepActionFromDom(stepProcessor: StepProcessor, platform: PlatformType, action: string, toonDom: any, priorAndNextSteps: string[], currentStep: string, fileType?: string | null): Promise<ResolvedStepAction>;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveStepActionFromDom = resolveStepActionFromDom;
4
+ const promptType_js_1 = require("../types/promptType.js");
5
+ const sameActionsHelper_js_1 = require("../../utils/helpers/sameActionsHelper.js");
6
+ const InvalidFileTypeError_js_1 = require("../Errors/InvalidFileTypeError.js");
7
+ async function resolveStepActionFromDom(stepProcessor, platform, action, toonDom, priorAndNextSteps, currentStep, fileType) {
8
+ let stepResult;
9
+ let stepAction;
10
+ if (action === "verify") {
11
+ if (fileType) {
12
+ const normalizedFileType = fileType.toLowerCase();
13
+ if (normalizedFileType !== "pdf") {
14
+ throw new InvalidFileTypeError_js_1.InvalidFileTypeError(normalizedFileType);
15
+ }
16
+ stepResult = await stepProcessor.getLLMResponse({
17
+ platform,
18
+ type: promptType_js_1.PromptType.FILE_VERIFY_PROMPT,
19
+ args: {
20
+ extractedDomJson: toonDom,
21
+ priorAndNextSteps,
22
+ },
23
+ input: { currentStep },
24
+ });
25
+ }
26
+ else {
27
+ stepResult = await stepProcessor.getLLMResponse({
28
+ platform,
29
+ type: promptType_js_1.PromptType.VERIFY_PROMPT,
30
+ args: {
31
+ extractedDomJson: toonDom,
32
+ priorAndNextSteps,
33
+ },
34
+ input: { currentStep },
35
+ });
36
+ }
37
+ stepAction = stepResult.response.nlpName;
38
+ }
39
+ else if (action === "get") {
40
+ stepResult = await stepProcessor.getLLMResponse({
41
+ platform,
42
+ type: promptType_js_1.PromptType.GET_PROMPT,
43
+ args: {
44
+ extractedDomJson: toonDom,
45
+ priorAndNextSteps,
46
+ },
47
+ input: { currentStep },
48
+ });
49
+ stepAction = stepResult.response.nlpName;
50
+ }
51
+ else if (action === "wait") {
52
+ stepResult = await stepProcessor.getLLMResponse({
53
+ platform,
54
+ type: promptType_js_1.PromptType.WAIT_ACTION_EXTRACTOR_PROMPT,
55
+ args: {
56
+ extractedDomJson: toonDom,
57
+ priorAndNextSteps,
58
+ },
59
+ input: { currentStep },
60
+ });
61
+ stepAction = stepResult.response.nlpName;
62
+ }
63
+ else if (action === "combined") {
64
+ stepResult = await stepProcessor.getLLMResponse({
65
+ platform,
66
+ type: promptType_js_1.PromptType.COMBINED_ACTION_EXTRACTOR_PROMPT,
67
+ args: {
68
+ extractedDomJson: toonDom,
69
+ priorAndNextSteps,
70
+ },
71
+ input: { currentStep },
72
+ });
73
+ stepAction = stepResult.response.nlpName;
74
+ }
75
+ else if (action === "drag_and_drop") {
76
+ stepResult = await stepProcessor.getLLMResponse({
77
+ platform,
78
+ type: promptType_js_1.PromptType.FF_INSPECTOR,
79
+ args: {
80
+ extractedDomJson: toonDom,
81
+ priorAndNextSteps,
82
+ isDrag: true,
83
+ isAlert: false,
84
+ },
85
+ input: { currentStep },
86
+ });
87
+ stepAction = stepResult.response.nlpName;
88
+ }
89
+ else {
90
+ stepResult = await stepProcessor.getLLMResponse({
91
+ platform,
92
+ type: promptType_js_1.PromptType.FF_INSPECTOR,
93
+ args: {
94
+ stepAction: action,
95
+ extractedDomJson: toonDom,
96
+ priorAndNextSteps,
97
+ isAlert: false,
98
+ isDrag: false,
99
+ },
100
+ input: { currentStep },
101
+ });
102
+ if (platform === "web") {
103
+ stepAction = stepResult.response.action;
104
+ }
105
+ else {
106
+ stepAction = stepResult.response.nlpName;
107
+ }
108
+ }
109
+ if (platform === "android" || platform === "ios") {
110
+ stepAction = sameActionsHelper_js_1.sameActionHelper[stepAction] || stepAction;
111
+ }
112
+ return { stepResult, stepAction };
113
+ }
@@ -0,0 +1,3 @@
1
+ import { VisionFallbackParams, VisionFallbackResult } from "../interfaces/automationRunnerInterface.js";
2
+ export { VisionFallbackParams, VisionFallbackResult };
3
+ export declare function executeVisionFallback(params: VisionFallbackParams): Promise<VisionFallbackResult>;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeVisionFallback = executeVisionFallback;
4
+ const generateAnnotatedScreenshots_js_1 = require("../../imageAnalysisWeb/generateAnnotatedScreenshots.js");
5
+ const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
6
+ const annotatedScreenshotMobile_js_1 = require("../../imageAnalysisMobile/annotatedScreenshotMobile.js");
7
+ const xpathcreation_js_1 = require("../../utils/helpers/xpathcreation.js");
8
+ const promptType_js_1 = require("../types/promptType.js");
9
+ const runnerPostActionHelper_js_1 = require("./runnerPostActionHelper.js");
10
+ const runnerDomPipeline_js_1 = require("./runnerDomPipeline.js");
11
+ const logData_js_1 = require("../../utils/logger/logData.js");
12
+ async function executeVisionFallback(params) {
13
+ const { driver, platform, action, step, stepAction, inputValue, stepCount, fallbackAttempt, priorAndNextSteps, listOfSteps, currentElementName, extractorElementName, stepElementType, iframeDomHtml, beforeHandles, context, stepProcessor, actionHandlers, reporter, causeError, } = params;
14
+ let domInfo = params.domInfo;
15
+ let doc = params.doc;
16
+ logData_js_1.logger.error(`execution failed for step "${step}": ${causeError} and going for vision`);
17
+ try {
18
+ let annotatedScreenshot;
19
+ let bounds;
20
+ if (action === "scroll") {
21
+ throw new Error("Scroll action failed element not found", { cause: causeError });
22
+ }
23
+ if (platform === "web") {
24
+ annotatedScreenshot = await (0, generateAnnotatedScreenshots_js_1.generateAnnotatedScreenshots)(driver);
25
+ }
26
+ else {
27
+ domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOMForMobile)(driver);
28
+ let visionResult;
29
+ if (platform === "android") {
30
+ visionResult = await (0, annotatedScreenshotMobile_js_1.annotateScreenshot)(driver, domInfo.dom);
31
+ }
32
+ else {
33
+ visionResult = await (0, annotatedScreenshotMobile_js_1.annotateIosScreenshot)(driver, domInfo.dom);
34
+ }
35
+ annotatedScreenshot = visionResult.boxedImageBuffer;
36
+ bounds = visionResult.boxes;
37
+ }
38
+ let stepResultVision;
39
+ if (platform === "web") {
40
+ stepResultVision = await stepProcessor.getLLMResponse({
41
+ platform,
42
+ type: promptType_js_1.PromptType.VISION_PROMPT,
43
+ args: { priorAndNextSteps },
44
+ input: { currentStep: step, annotatedScreenshot: annotatedScreenshot.primary },
45
+ isVision: true,
46
+ });
47
+ if (stepResultVision.response.fireflinkIndex === "Fire-Flink-0") {
48
+ stepResultVision = await stepProcessor.getLLMResponse({
49
+ platform,
50
+ type: promptType_js_1.PromptType.VISION_PROMPT,
51
+ args: { priorAndNextSteps },
52
+ input: { currentStep: step, annotatedScreenshot: annotatedScreenshot.secondary },
53
+ isVision: true,
54
+ });
55
+ }
56
+ }
57
+ else {
58
+ stepResultVision = await stepProcessor.getLLMResponse({
59
+ platform,
60
+ type: promptType_js_1.PromptType.VISION_PROMPT,
61
+ args: { priorAndNextSteps },
62
+ input: { currentStep: step, annotatedScreenshot },
63
+ isVision: true,
64
+ });
65
+ }
66
+ let fireflinkIndex = stepResultVision.response.fireflinkIndex;
67
+ logData_js_1.logger.info(`fireflinkIndex: ${fireflinkIndex}`);
68
+ if (fireflinkIndex === "Fire-Flink-0") {
69
+ logData_js_1.logger.error(`vision unable to find element for step "${step}"`);
70
+ if (platform === "web") {
71
+ context.scriptAppender.setErrorNLP(stepAction);
72
+ }
73
+ throw new Error(`vision unable to find element for step "${step}"`, { cause: causeError });
74
+ }
75
+ let xpath;
76
+ if (platform === "android" || platform === "ios") {
77
+ const index = Number(fireflinkIndex.split("-").pop());
78
+ const box = bounds[index - 1];
79
+ if (!box) {
80
+ throw new Error(`No bounds found for index ${index}`, { cause: causeError });
81
+ }
82
+ const { x1, y1, x2, y2 } = box;
83
+ const boundsStr = `[${x1},${y1}][${x2},${y2}]`;
84
+ const result = (0, xpathcreation_js_1.getFFIndexAndXPath)(domInfo.dom, boundsStr, platform);
85
+ xpath = result.xpathPath;
86
+ fireflinkIndex = result.ffInspector ?? fireflinkIndex;
87
+ }
88
+ else {
89
+ if (!domInfo || !domInfo.dom || !doc) {
90
+ logData_js_1.logger.info("Re-fetching annotated DOM for vision fallback");
91
+ domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
92
+ doc = runnerDomPipeline_js_1.RunnerDomPipeline.parseDomDocument(domInfo.dom, "web");
93
+ }
94
+ const ele = doc.querySelector(`[ff-inspect="${fireflinkIndex}"]`);
95
+ if (ele) {
96
+ xpath = ele.getAttribute("ff-xpath") || "";
97
+ }
98
+ else {
99
+ const result = (0, xpathcreation_js_1.getWebXPathByFFIndex)(domInfo.dom, fireflinkIndex);
100
+ xpath = result.xpathPath;
101
+ }
102
+ if (!xpath) {
103
+ context.scriptAppender.setErrorNLP(stepAction);
104
+ throw new Error(`Unable to resolve xpath for ${fireflinkIndex}`, { cause: causeError });
105
+ }
106
+ }
107
+ const pageDOM = iframeDomHtml ?? domInfo.dom;
108
+ const handler = actionHandlers[stepAction];
109
+ await handler({
110
+ selector: xpath,
111
+ value: inputValue,
112
+ fireflinkIndex,
113
+ pageDOM,
114
+ elementName: currentElementName || extractorElementName,
115
+ elementType: stepElementType,
116
+ stepIndex: params.stepIndex ?? stepCount,
117
+ currentStep: params.currentStep ?? step,
118
+ manualStep: params.manualStep ?? step,
119
+ stepsInputData: params.stepsInputData,
120
+ filteredSteps: listOfSteps,
121
+ returnTypeVariableName: params.returnTypeVariableName,
122
+ ...(params.variableName ? { variableName: params.variableName } : {}),
123
+ });
124
+ const preCapturedDomInfo = await (0, runnerPostActionHelper_js_1.handlePostActionWeb)(platform, driver, action, beforeHandles, context.scriptAppender, stepCount);
125
+ if (fallbackAttempt === 2) {
126
+ await reporter.sendRetry("Retry successful. Moving on to the next step.");
127
+ }
128
+ return { preCapturedDomInfo, retryNeeded: false };
129
+ }
130
+ catch (error) {
131
+ logData_js_1.logger.error(`vision execution failed for step "${step}": ${error}`);
132
+ if (fallbackAttempt < 2) {
133
+ await reporter.sendRetry("Step failed to execute. Waiting a few seconds before reattempting the same step.");
134
+ return { preCapturedDomInfo: null, retryNeeded: true };
135
+ }
136
+ throw error;
137
+ }
138
+ }