explorbot 0.0.1

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 (329) hide show
  1. package/LICENSE +94 -0
  2. package/README.md +267 -0
  3. package/assets/sample-files/sample.docx +0 -0
  4. package/assets/sample-files/sample.mp3 +0 -0
  5. package/assets/sample-files/sample.mp4 +0 -0
  6. package/assets/sample-files/sample.pdf +21 -0
  7. package/assets/sample-files/sample.png +0 -0
  8. package/assets/sample-files/sample.xlsx +0 -0
  9. package/assets/sample-files/sample.zip +0 -0
  10. package/dist/assets/sample-files/sample.docx +0 -0
  11. package/dist/assets/sample-files/sample.mp3 +0 -0
  12. package/dist/assets/sample-files/sample.mp4 +0 -0
  13. package/dist/assets/sample-files/sample.pdf +21 -0
  14. package/dist/assets/sample-files/sample.png +0 -0
  15. package/dist/assets/sample-files/sample.xlsx +0 -0
  16. package/dist/assets/sample-files/sample.zip +0 -0
  17. package/dist/bin/explorbot-cli.js +683 -0
  18. package/dist/bin/explorbot-cli.js.map +1 -0
  19. package/dist/boat/api-tester/bin/apibot-cli.js +5 -0
  20. package/dist/boat/api-tester/bin/apibot-cli.js.map +1 -0
  21. package/dist/boat/api-tester/example/apibot.config.js +31 -0
  22. package/dist/boat/api-tester/example/apibot.config.js.map +1 -0
  23. package/dist/boat/api-tester/src/ai/chief/styles.js +13 -0
  24. package/dist/boat/api-tester/src/ai/chief/styles.js.map +1 -0
  25. package/dist/boat/api-tester/src/ai/chief.js +301 -0
  26. package/dist/boat/api-tester/src/ai/chief.js.map +1 -0
  27. package/dist/boat/api-tester/src/ai/curler-tools.js +263 -0
  28. package/dist/boat/api-tester/src/ai/curler-tools.js.map +1 -0
  29. package/dist/boat/api-tester/src/ai/curler.js +271 -0
  30. package/dist/boat/api-tester/src/ai/curler.js.map +1 -0
  31. package/dist/boat/api-tester/src/api-client.js +26 -0
  32. package/dist/boat/api-tester/src/api-client.js.map +1 -0
  33. package/dist/boat/api-tester/src/apibot.js +166 -0
  34. package/dist/boat/api-tester/src/apibot.js.map +1 -0
  35. package/dist/boat/api-tester/src/cli.js +262 -0
  36. package/dist/boat/api-tester/src/cli.js.map +1 -0
  37. package/dist/boat/api-tester/src/config.js +159 -0
  38. package/dist/boat/api-tester/src/config.js.map +1 -0
  39. package/dist/prompts/audit-rules.md +124 -0
  40. package/dist/rules/chief/general.md +11 -0
  41. package/dist/rules/chief/styles/curious.md +12 -0
  42. package/dist/rules/chief/styles/hacker.md +19 -0
  43. package/dist/rules/chief/styles/normal.md +11 -0
  44. package/dist/rules/chief/styles/psycho.md +17 -0
  45. package/dist/rules/navigator/multiple-locator.md +47 -0
  46. package/dist/rules/navigator/output.md +69 -0
  47. package/dist/rules/navigator/verification-actions.md +122 -0
  48. package/dist/rules/navigator/verification-output.md +53 -0
  49. package/dist/rules/planner/styles/curious.md +39 -0
  50. package/dist/rules/planner/styles/normal.md +21 -0
  51. package/dist/rules/planner/styles/psycho.md +14 -0
  52. package/dist/rules/researcher/list-element.md +11 -0
  53. package/dist/rules/researcher/screenshot-ui-map.md +30 -0
  54. package/dist/rules/researcher/section-ui-map.md +18 -0
  55. package/dist/rules/researcher/ui-map-table.md +18 -0
  56. package/dist/src/action-result.js +574 -0
  57. package/dist/src/action-result.js.map +1 -0
  58. package/dist/src/action.js +388 -0
  59. package/dist/src/action.js.map +1 -0
  60. package/dist/src/activity.js +86 -0
  61. package/dist/src/activity.js.map +1 -0
  62. package/dist/src/ai/agent.js +2 -0
  63. package/dist/src/ai/agent.js.map +1 -0
  64. package/dist/src/ai/bosun.js +443 -0
  65. package/dist/src/ai/bosun.js.map +1 -0
  66. package/dist/src/ai/captain/idle-mode.js +102 -0
  67. package/dist/src/ai/captain/idle-mode.js.map +1 -0
  68. package/dist/src/ai/captain/mixin.js +11 -0
  69. package/dist/src/ai/captain/mixin.js.map +1 -0
  70. package/dist/src/ai/captain/test-mode.js +251 -0
  71. package/dist/src/ai/captain/test-mode.js.map +1 -0
  72. package/dist/src/ai/captain/web-mode.js +124 -0
  73. package/dist/src/ai/captain/web-mode.js.map +1 -0
  74. package/dist/src/ai/captain.js +442 -0
  75. package/dist/src/ai/captain.js.map +1 -0
  76. package/dist/src/ai/conversation.js +176 -0
  77. package/dist/src/ai/conversation.js.map +1 -0
  78. package/dist/src/ai/experience-compactor.js +232 -0
  79. package/dist/src/ai/experience-compactor.js.map +1 -0
  80. package/dist/src/ai/fisherman-tools.js +154 -0
  81. package/dist/src/ai/fisherman-tools.js.map +1 -0
  82. package/dist/src/ai/fisherman.js +184 -0
  83. package/dist/src/ai/fisherman.js.map +1 -0
  84. package/dist/src/ai/historian.js +384 -0
  85. package/dist/src/ai/historian.js.map +1 -0
  86. package/dist/src/ai/navigator.js +493 -0
  87. package/dist/src/ai/navigator.js.map +1 -0
  88. package/dist/src/ai/pilot.js +684 -0
  89. package/dist/src/ai/pilot.js.map +1 -0
  90. package/dist/src/ai/planner/session-dedup.js +28 -0
  91. package/dist/src/ai/planner/session-dedup.js.map +1 -0
  92. package/dist/src/ai/planner/styles.js +15 -0
  93. package/dist/src/ai/planner/styles.js.map +1 -0
  94. package/dist/src/ai/planner/subpages.js +118 -0
  95. package/dist/src/ai/planner/subpages.js.map +1 -0
  96. package/dist/src/ai/planner.js +486 -0
  97. package/dist/src/ai/planner.js.map +1 -0
  98. package/dist/src/ai/provider.js +540 -0
  99. package/dist/src/ai/provider.js.map +1 -0
  100. package/dist/src/ai/quartermaster.js +210 -0
  101. package/dist/src/ai/quartermaster.js.map +1 -0
  102. package/dist/src/ai/researcher/cache.js +95 -0
  103. package/dist/src/ai/researcher/cache.js.map +1 -0
  104. package/dist/src/ai/researcher/coordinates.js +210 -0
  105. package/dist/src/ai/researcher/coordinates.js.map +1 -0
  106. package/dist/src/ai/researcher/deep-analysis.js +364 -0
  107. package/dist/src/ai/researcher/deep-analysis.js.map +1 -0
  108. package/dist/src/ai/researcher/fingerprint-worker.js +46 -0
  109. package/dist/src/ai/researcher/fingerprint-worker.js.map +1 -0
  110. package/dist/src/ai/researcher/focus.js +37 -0
  111. package/dist/src/ai/researcher/focus.js.map +1 -0
  112. package/dist/src/ai/researcher/locators.js +242 -0
  113. package/dist/src/ai/researcher/locators.js.map +1 -0
  114. package/dist/src/ai/researcher/mixin.js +3 -0
  115. package/dist/src/ai/researcher/mixin.js.map +1 -0
  116. package/dist/src/ai/researcher/parser.js +160 -0
  117. package/dist/src/ai/researcher/parser.js.map +1 -0
  118. package/dist/src/ai/researcher/research-result.js +110 -0
  119. package/dist/src/ai/researcher/research-result.js.map +1 -0
  120. package/dist/src/ai/researcher.js +776 -0
  121. package/dist/src/ai/researcher.js.map +1 -0
  122. package/dist/src/ai/rules.js +368 -0
  123. package/dist/src/ai/rules.js.map +1 -0
  124. package/dist/src/ai/task-agent.js +110 -0
  125. package/dist/src/ai/task-agent.js.map +1 -0
  126. package/dist/src/ai/tester.js +840 -0
  127. package/dist/src/ai/tester.js.map +1 -0
  128. package/dist/src/ai/tools.js +980 -0
  129. package/dist/src/ai/tools.js.map +1 -0
  130. package/dist/src/api/api-client.js +91 -0
  131. package/dist/src/api/api-client.js.map +1 -0
  132. package/dist/src/api/request-result.js +177 -0
  133. package/dist/src/api/request-result.js.map +1 -0
  134. package/dist/src/api/request-store.js +109 -0
  135. package/dist/src/api/request-store.js.map +1 -0
  136. package/dist/src/api/spec-reader.js +148 -0
  137. package/dist/src/api/spec-reader.js.map +1 -0
  138. package/dist/src/api/xhr-capture.js +91 -0
  139. package/dist/src/api/xhr-capture.js.map +1 -0
  140. package/dist/src/browser-server.js +67 -0
  141. package/dist/src/browser-server.js.map +1 -0
  142. package/dist/src/command-handler.js +363 -0
  143. package/dist/src/command-handler.js.map +1 -0
  144. package/dist/src/commands/add-rule-command.js +52 -0
  145. package/dist/src/commands/add-rule-command.js.map +1 -0
  146. package/dist/src/commands/base-command.js +14 -0
  147. package/dist/src/commands/base-command.js.map +1 -0
  148. package/dist/src/commands/clean-command.js +67 -0
  149. package/dist/src/commands/clean-command.js.map +1 -0
  150. package/dist/src/commands/context-aria-command.js +18 -0
  151. package/dist/src/commands/context-aria-command.js.map +1 -0
  152. package/dist/src/commands/context-command.js +57 -0
  153. package/dist/src/commands/context-command.js.map +1 -0
  154. package/dist/src/commands/context-data-command.js +25 -0
  155. package/dist/src/commands/context-data-command.js.map +1 -0
  156. package/dist/src/commands/context-experience-command.js +41 -0
  157. package/dist/src/commands/context-experience-command.js.map +1 -0
  158. package/dist/src/commands/context-html-command.js +26 -0
  159. package/dist/src/commands/context-html-command.js.map +1 -0
  160. package/dist/src/commands/context-knowledge-command.js +36 -0
  161. package/dist/src/commands/context-knowledge-command.js.map +1 -0
  162. package/dist/src/commands/debug-command.js +12 -0
  163. package/dist/src/commands/debug-command.js.map +1 -0
  164. package/dist/src/commands/drill-command.js +29 -0
  165. package/dist/src/commands/drill-command.js.map +1 -0
  166. package/dist/src/commands/exit-command.js +26 -0
  167. package/dist/src/commands/exit-command.js.map +1 -0
  168. package/dist/src/commands/explore-command.js +124 -0
  169. package/dist/src/commands/explore-command.js.map +1 -0
  170. package/dist/src/commands/freesail-command.js +84 -0
  171. package/dist/src/commands/freesail-command.js.map +1 -0
  172. package/dist/src/commands/help-command.js +7 -0
  173. package/dist/src/commands/help-command.js.map +1 -0
  174. package/dist/src/commands/index.js +63 -0
  175. package/dist/src/commands/index.js.map +1 -0
  176. package/dist/src/commands/knows-command.js +54 -0
  177. package/dist/src/commands/knows-command.js.map +1 -0
  178. package/dist/src/commands/learn-command.js +35 -0
  179. package/dist/src/commands/learn-command.js.map +1 -0
  180. package/dist/src/commands/navigate-command.js +16 -0
  181. package/dist/src/commands/navigate-command.js.map +1 -0
  182. package/dist/src/commands/path-command.js +70 -0
  183. package/dist/src/commands/path-command.js.map +1 -0
  184. package/dist/src/commands/plan-clear-command.js +13 -0
  185. package/dist/src/commands/plan-clear-command.js.map +1 -0
  186. package/dist/src/commands/plan-command.js +36 -0
  187. package/dist/src/commands/plan-command.js.map +1 -0
  188. package/dist/src/commands/plan-edit-command.js +8 -0
  189. package/dist/src/commands/plan-edit-command.js.map +1 -0
  190. package/dist/src/commands/plan-load-command.js +16 -0
  191. package/dist/src/commands/plan-load-command.js.map +1 -0
  192. package/dist/src/commands/plan-reload-command.js +23 -0
  193. package/dist/src/commands/plan-reload-command.js.map +1 -0
  194. package/dist/src/commands/plan-save-command.js +22 -0
  195. package/dist/src/commands/plan-save-command.js.map +1 -0
  196. package/dist/src/commands/research-command.js +38 -0
  197. package/dist/src/commands/research-command.js.map +1 -0
  198. package/dist/src/commands/start-command.js +12 -0
  199. package/dist/src/commands/start-command.js.map +1 -0
  200. package/dist/src/commands/status-command.js +19 -0
  201. package/dist/src/commands/status-command.js.map +1 -0
  202. package/dist/src/commands/test-command.js +85 -0
  203. package/dist/src/commands/test-command.js.map +1 -0
  204. package/dist/src/components/ActivityPane.js +55 -0
  205. package/dist/src/components/ActivityPane.js.map +1 -0
  206. package/dist/src/components/AddKnowledge.js +122 -0
  207. package/dist/src/components/AddKnowledge.js.map +1 -0
  208. package/dist/src/components/AddRule.js +117 -0
  209. package/dist/src/components/AddRule.js.map +1 -0
  210. package/dist/src/components/App.js +313 -0
  211. package/dist/src/components/App.js.map +1 -0
  212. package/dist/src/components/Autocomplete.js +43 -0
  213. package/dist/src/components/Autocomplete.js.map +1 -0
  214. package/dist/src/components/InputPane.js +207 -0
  215. package/dist/src/components/InputPane.js.map +1 -0
  216. package/dist/src/components/InputReadline.js +598 -0
  217. package/dist/src/components/InputReadline.js.map +1 -0
  218. package/dist/src/components/LogPane.js +123 -0
  219. package/dist/src/components/LogPane.js.map +1 -0
  220. package/dist/src/components/PlanEditor.js +126 -0
  221. package/dist/src/components/PlanEditor.js.map +1 -0
  222. package/dist/src/components/PlanPane.js +51 -0
  223. package/dist/src/components/PlanPane.js.map +1 -0
  224. package/dist/src/components/SessionTimer.js +26 -0
  225. package/dist/src/components/SessionTimer.js.map +1 -0
  226. package/dist/src/components/StateTransitionPane.js +107 -0
  227. package/dist/src/components/StateTransitionPane.js.map +1 -0
  228. package/dist/src/components/StatusPane.js +37 -0
  229. package/dist/src/components/StatusPane.js.map +1 -0
  230. package/dist/src/components/TaskPane.js +96 -0
  231. package/dist/src/components/TaskPane.js.map +1 -0
  232. package/dist/src/components/Welcome.js +52 -0
  233. package/dist/src/components/Welcome.js.map +1 -0
  234. package/dist/src/components/WelcomeChecklist.js +96 -0
  235. package/dist/src/components/WelcomeChecklist.js.map +1 -0
  236. package/dist/src/components/WelcomeCommands.js +61 -0
  237. package/dist/src/components/WelcomeCommands.js.map +1 -0
  238. package/dist/src/components/autocomplete-store.js +22 -0
  239. package/dist/src/components/autocomplete-store.js.map +1 -0
  240. package/dist/src/components/parse-keypress.js +174 -0
  241. package/dist/src/components/parse-keypress.js.map +1 -0
  242. package/dist/src/config.js +249 -0
  243. package/dist/src/config.js.map +1 -0
  244. package/dist/src/execution-controller.js +92 -0
  245. package/dist/src/execution-controller.js.map +1 -0
  246. package/dist/src/experience-tracker.js +294 -0
  247. package/dist/src/experience-tracker.js.map +1 -0
  248. package/dist/src/explorbot.js +348 -0
  249. package/dist/src/explorbot.js.map +1 -0
  250. package/dist/src/explorer.js +611 -0
  251. package/dist/src/explorer.js.map +1 -0
  252. package/dist/src/index.js +56 -0
  253. package/dist/src/index.js.map +1 -0
  254. package/dist/src/knowledge-tracker.js +184 -0
  255. package/dist/src/knowledge-tracker.js.map +1 -0
  256. package/dist/src/observability.js +126 -0
  257. package/dist/src/observability.js.map +1 -0
  258. package/dist/src/reporter.js +185 -0
  259. package/dist/src/reporter.js.map +1 -0
  260. package/dist/src/state-manager.js +427 -0
  261. package/dist/src/state-manager.js.map +1 -0
  262. package/dist/src/stats.js +44 -0
  263. package/dist/src/stats.js.map +1 -0
  264. package/dist/src/test-plan.js +343 -0
  265. package/dist/src/test-plan.js.map +1 -0
  266. package/dist/src/utils/aria.js +588 -0
  267. package/dist/src/utils/aria.js.map +1 -0
  268. package/dist/src/utils/code-extractor.js +21 -0
  269. package/dist/src/utils/code-extractor.js.map +1 -0
  270. package/dist/src/utils/context-formatter.js +205 -0
  271. package/dist/src/utils/context-formatter.js.map +1 -0
  272. package/dist/src/utils/error-page.js +19 -0
  273. package/dist/src/utils/error-page.js.map +1 -0
  274. package/dist/src/utils/expandable.js +35 -0
  275. package/dist/src/utils/expandable.js.map +1 -0
  276. package/dist/src/utils/hooks-runner.js +77 -0
  277. package/dist/src/utils/hooks-runner.js.map +1 -0
  278. package/dist/src/utils/html-diff.js +734 -0
  279. package/dist/src/utils/html-diff.js.map +1 -0
  280. package/dist/src/utils/html.js +1163 -0
  281. package/dist/src/utils/html.js.map +1 -0
  282. package/dist/src/utils/logger.js +465 -0
  283. package/dist/src/utils/logger.js.map +1 -0
  284. package/dist/src/utils/loop.js +126 -0
  285. package/dist/src/utils/loop.js.map +1 -0
  286. package/dist/src/utils/markdown-parser.js +117 -0
  287. package/dist/src/utils/markdown-parser.js.map +1 -0
  288. package/dist/src/utils/markdown-query.js +393 -0
  289. package/dist/src/utils/markdown-query.js.map +1 -0
  290. package/dist/src/utils/markdown-terminal.js +40 -0
  291. package/dist/src/utils/markdown-terminal.js.map +1 -0
  292. package/dist/src/utils/research-parser.js +2 -0
  293. package/dist/src/utils/research-parser.js.map +1 -0
  294. package/dist/src/utils/retry.js +55 -0
  295. package/dist/src/utils/retry.js.map +1 -0
  296. package/dist/src/utils/rules-loader.js +104 -0
  297. package/dist/src/utils/rules-loader.js.map +1 -0
  298. package/dist/src/utils/strings.js +14 -0
  299. package/dist/src/utils/strings.js.map +1 -0
  300. package/dist/src/utils/test-plan-markdown.js +301 -0
  301. package/dist/src/utils/test-plan-markdown.js.map +1 -0
  302. package/dist/src/utils/throttle.js +16 -0
  303. package/dist/src/utils/throttle.js.map +1 -0
  304. package/dist/src/utils/unique-names.js +13 -0
  305. package/dist/src/utils/unique-names.js.map +1 -0
  306. package/dist/src/utils/url-matcher.js +48 -0
  307. package/dist/src/utils/url-matcher.js.map +1 -0
  308. package/dist/src/utils/web-element.js +131 -0
  309. package/dist/src/utils/web-element.js.map +1 -0
  310. package/dist/src/utils/xpath.js +110 -0
  311. package/dist/src/utils/xpath.js.map +1 -0
  312. package/package.json +119 -0
  313. package/prompts/audit-rules.md +124 -0
  314. package/rules/chief/general.md +11 -0
  315. package/rules/chief/styles/curious.md +12 -0
  316. package/rules/chief/styles/hacker.md +19 -0
  317. package/rules/chief/styles/normal.md +11 -0
  318. package/rules/chief/styles/psycho.md +17 -0
  319. package/rules/navigator/multiple-locator.md +47 -0
  320. package/rules/navigator/output.md +69 -0
  321. package/rules/navigator/verification-actions.md +122 -0
  322. package/rules/navigator/verification-output.md +53 -0
  323. package/rules/planner/styles/curious.md +39 -0
  324. package/rules/planner/styles/normal.md +21 -0
  325. package/rules/planner/styles/psycho.md +14 -0
  326. package/rules/researcher/list-element.md +11 -0
  327. package/rules/researcher/screenshot-ui-map.md +30 -0
  328. package/rules/researcher/section-ui-map.md +18 -0
  329. package/rules/researcher/ui-map-table.md +18 -0
@@ -0,0 +1,493 @@
1
+ import dedent from 'dedent';
2
+ import { ActionResult } from '../action-result.js';
3
+ import { ExperienceTracker } from '../experience-tracker.js';
4
+ import { KnowledgeTracker } from '../knowledge-tracker.js';
5
+ import { normalizeUrl } from '../state-manager.js';
6
+ import { extractCodeBlocks } from '../utils/code-extractor.js';
7
+ import { HooksRunner } from "../utils/hooks-runner.js";
8
+ import { createDebug, pluralize, tag } from '../utils/logger.js';
9
+ import { loop, pause } from '../utils/loop.js';
10
+ import { Researcher } from "./researcher.js";
11
+ import { actionRule, locatorRule } from './rules.js';
12
+ import { RulesLoader } from "../utils/rules-loader.js";
13
+ import { isInteractive } from './task-agent.js';
14
+ const debugLog = createDebug('explorbot:navigator');
15
+ class Navigator {
16
+ emoji = '🧭';
17
+ provider;
18
+ experienceCompactor;
19
+ knowledgeTracker;
20
+ experienceTracker;
21
+ currentAction = null;
22
+ currentUrl = null;
23
+ hooksRunner;
24
+ MAX_ATTEMPTS = Number.parseInt(process.env.MAX_ATTEMPTS || '5');
25
+ systemPrompt = dedent `
26
+ <role>
27
+ You are senior test automation engineer with master QA skills.
28
+ You write test automation in CodeceptJS.
29
+ </role>
30
+ <task>
31
+ You are given the web page and a message from user.
32
+ You need to resolve the state of the page based on the message.
33
+ </task>
34
+ `;
35
+ freeSailSystemPrompt = dedent `
36
+ <role>
37
+ You help with exploratory web navigation.
38
+ </role>
39
+ <rules>
40
+ Always propose a single next navigation target, preferring least-visited pages.
41
+ Base the suggestion only on the provided research notes and HTML snapshot.
42
+ The target MUST be a URL path starting with "/" (e.g., /requirements, /dashboard/settings).
43
+ Only use URLs that appear in the HTML (href attributes) or in the visited URLs list. Never guess or invent URLs.
44
+ Never return page names, link text, or headings as targets.
45
+ Respond with exactly two lines:
46
+ Next: <target>
47
+ Reason: <short justification>
48
+ </rules>
49
+ `;
50
+ explorer;
51
+ constructor(explorer, provider, experienceCompactor, experienceTracker) {
52
+ this.provider = provider;
53
+ this.explorer = explorer;
54
+ this.experienceCompactor = experienceCompactor;
55
+ this.knowledgeTracker = new KnowledgeTracker();
56
+ this.experienceTracker = experienceTracker || new ExperienceTracker();
57
+ this.hooksRunner = new HooksRunner(explorer, explorer.getConfig());
58
+ }
59
+ isOnExpectedPage(expectedUrl, stateManager) {
60
+ const currentUrl = stateManager.getCurrentState()?.url || '';
61
+ return normalizeUrl(currentUrl) === normalizeUrl(expectedUrl);
62
+ }
63
+ async visit(url) {
64
+ try {
65
+ const action = this.explorer.createAction();
66
+ await action.execute(`I.amOnPage('${url}')`);
67
+ const currentUrl = action.stateManager.getCurrentState()?.url || '';
68
+ if (currentUrl === 'about:blank' || currentUrl === '') {
69
+ throw new Error(`Navigation to "${url}" opened an empty page. The target must be a valid URL path starting with "/".`);
70
+ }
71
+ await this.hooksRunner.runBeforeHook('navigator', url);
72
+ if (!this.isOnExpectedPage(url, action.stateManager)) {
73
+ const actualPath = action.stateManager.getCurrentState()?.url || '';
74
+ const actionResult = action.actionResult || ActionResult.fromState(action.stateManager.getCurrentState());
75
+ const originalMessage = `Navigate to: ${url}. Current page: ${actualPath}`;
76
+ this.currentAction = action;
77
+ this.currentUrl = url;
78
+ const resolved = await this.resolveState(originalMessage, actionResult);
79
+ if (!resolved) {
80
+ throw new Error(`Navigation to ${url} failed: redirected to ${actualPath} and could not resolve`);
81
+ }
82
+ }
83
+ else if (action.lastError) {
84
+ const actionResult = action.actionResult || ActionResult.fromState(action.stateManager.getCurrentState());
85
+ const originalMessage = `
86
+ I tried to navigate to: ${url}
87
+ And I expected to see the URL in the browser
88
+ But I got error: ${action.lastError?.message || 'Navigation failed'}.
89
+ `.trim();
90
+ this.currentAction = action;
91
+ this.currentUrl = url;
92
+ const resolved = await this.resolveState(originalMessage, actionResult);
93
+ if (!resolved) {
94
+ throw new Error(`Navigation to ${url} failed: ${action.lastError?.message}`);
95
+ }
96
+ }
97
+ await action.caputrePageWithScreenshot();
98
+ await this.hooksRunner.runAfterHook('navigator', url);
99
+ }
100
+ catch (error) {
101
+ const errorMessage = error instanceof Error ? error.message : String(error);
102
+ if (errorMessage.includes('ERR_CONNECTION_REFUSED')) {
103
+ const urlMatch = errorMessage.match(/at (https?:\/\/[^\s/]+)/);
104
+ const baseUrl = urlMatch ? urlMatch[1] : url;
105
+ throw new Error(`Connection refused: ${baseUrl} is not accessible. Is the server running?`);
106
+ }
107
+ throw error;
108
+ }
109
+ }
110
+ async resolveState(message, actionResult) {
111
+ tag('info').log('AI Navigator resolving state at', actionResult.url);
112
+ debugLog('Resolution message:', message);
113
+ let knowledge = '';
114
+ let experience = '';
115
+ const relevantKnowledge = this.knowledgeTracker.getRelevantKnowledge(actionResult);
116
+ if (relevantKnowledge.length > 0) {
117
+ const knowledgeContent = relevantKnowledge.map((k) => k.content).join('\n\n');
118
+ knowledge = `
119
+ <hint>
120
+ Here is relevant knowledge for this page:
121
+ ${knowledgeContent}
122
+ </hint>`;
123
+ }
124
+ const relevantExperience = this.experienceTracker.getRelevantExperience(actionResult).map((experience) => experience.content);
125
+ if (relevantExperience.length > 0) {
126
+ const experienceContent = relevantExperience.join('\n\n---\n\n');
127
+ experience = await this.experienceCompactor.compactExperience(experienceContent);
128
+ tag('substep').log(`Found ${relevantExperience.length} experience ${pluralize(relevantExperience.length, 'file')} for: ${actionResult.url}`);
129
+ experience = dedent `
130
+ <experience>
131
+ Here is the experience of interacting with the page.
132
+ Learn from it AND DO NOT REPEAT THE SAME MISTAKES.
133
+ If there was found successful solution to an issue, propose it as a first solution.
134
+ If there are no successful solutions, analyze failed intentions and actions to avoid them.
135
+ Do not try again same failed solutions
136
+
137
+ Focus on successful solutions and avoid actions and locators that caused errors in past.
138
+
139
+ ${experienceContent}
140
+
141
+ </experience>`;
142
+ }
143
+ const prompt = dedent `
144
+ <message>
145
+ ${message}
146
+ </message>
147
+
148
+ <task>
149
+ Identify the actual request of the user.
150
+ Identify what is expected by user.
151
+ Identify what might have caused the error.
152
+ Propose different solutions to achieve the result.
153
+ Solution should be valid CodeceptJS code.
154
+ Use only data from the <page> context to plan the solution.
155
+ Try various ways to achieve the result
156
+ </task>
157
+
158
+
159
+ <page>
160
+ ${actionResult.toAiContext()}
161
+
162
+ <page_html>
163
+ ${await actionResult.simplifiedHtml()}
164
+ </page_html>
165
+ </page>
166
+
167
+
168
+ ${knowledge}
169
+
170
+ ${actionRule}
171
+
172
+ ${experience}
173
+
174
+ ${locatorRule}
175
+
176
+ ${RulesLoader.loadRules('navigator', ['multiple-locator', 'output'], actionResult.url || '').replace('{{maxAttempts}}', String(this.MAX_ATTEMPTS))}
177
+ `;
178
+ const conversation = this.provider.startConversation(this.systemPrompt, 'navigator');
179
+ conversation.addUserText(prompt);
180
+ let codeBlocks = [];
181
+ let htmlContextAdded = false;
182
+ let codeBlockIndex = 0;
183
+ let totalAttempts = 0;
184
+ let resolved = false;
185
+ await loop(async ({ stop }) => {
186
+ if (codeBlocks.length === 0) {
187
+ const result = await this.provider.invokeConversation(conversation);
188
+ if (!result)
189
+ return;
190
+ const aiResponse = result?.response?.text;
191
+ debugLog('AI:', aiResponse?.split('\n')[0]);
192
+ debugLog('Received AI response:', aiResponse.length, 'characters');
193
+ codeBlocks = extractCodeBlocks(aiResponse ?? '');
194
+ codeBlockIndex = 0;
195
+ }
196
+ if (codeBlocks.length === 0) {
197
+ stop();
198
+ return;
199
+ }
200
+ const codeBlock = codeBlocks[codeBlockIndex];
201
+ if (!codeBlock) {
202
+ if (!htmlContextAdded) {
203
+ htmlContextAdded = true;
204
+ tag('substep').log('Adding HTML context for better resolution...');
205
+ conversation.addUserText(dedent `
206
+ Previous solutions did not work. Here is the full HTML context:
207
+
208
+ <page_html>
209
+ ${await actionResult.simplifiedHtml()}
210
+ </page_html>
211
+
212
+ Please suggest new solutions based on this additional context.
213
+ `);
214
+ codeBlocks = [];
215
+ return;
216
+ }
217
+ stop();
218
+ return;
219
+ }
220
+ codeBlockIndex++;
221
+ totalAttempts++;
222
+ debugLog(`Attempting resolution: ${codeBlock}`);
223
+ resolved = await this.currentAction.attempt(codeBlock, message);
224
+ if (this.currentUrl) {
225
+ await this.currentAction.getActor().wait(2);
226
+ const freshState = await this.currentAction.capturePageState();
227
+ if (normalizeUrl(freshState.url || '') === normalizeUrl(this.currentUrl)) {
228
+ resolved = true;
229
+ }
230
+ else if (resolved) {
231
+ tag('warning').log(`URL verification failed: expected ${this.currentUrl}, got ${freshState.url}`);
232
+ resolved = false;
233
+ }
234
+ }
235
+ if (resolved) {
236
+ tag('success').log('Navigation resolved successfully');
237
+ stop();
238
+ return;
239
+ }
240
+ }, {
241
+ maxAttempts: this.MAX_ATTEMPTS * 2,
242
+ observability: {
243
+ agent: 'navigator',
244
+ },
245
+ catch: async (error) => {
246
+ debugLog(error);
247
+ resolved = false;
248
+ },
249
+ });
250
+ if (!resolved && this.currentUrl) {
251
+ await this.currentAction.getActor().wait(1);
252
+ if (this.isOnExpectedPage(this.currentUrl, this.currentAction.stateManager)) {
253
+ resolved = true;
254
+ tag('success').log('Navigation resolved after delayed redirect');
255
+ }
256
+ }
257
+ if (!resolved && totalAttempts > 0) {
258
+ tag('error').log(`Navigation failed after ${totalAttempts} attempts`);
259
+ }
260
+ if (!resolved && isInteractive()) {
261
+ const userInput = await pause(`Navigator failed to resolve. Current: ${this.currentAction.stateManager.getCurrentState()?.url}\n` + `Target: ${this.currentUrl}\nEnter CodeceptJS commands (or press Enter to skip):`);
262
+ if (userInput?.trim()) {
263
+ resolved = await this.currentAction.attempt(userInput, message);
264
+ if (resolved && this.currentUrl) {
265
+ await this.currentAction.getActor().wait(1);
266
+ if (!this.isOnExpectedPage(this.currentUrl, this.currentAction.stateManager)) {
267
+ resolved = false;
268
+ }
269
+ }
270
+ }
271
+ }
272
+ return resolved;
273
+ }
274
+ async freeSail(opts, actionResult) {
275
+ const stateManager = this.explorer.getStateManager();
276
+ const state = stateManager.getCurrentState();
277
+ if (!state) {
278
+ return null;
279
+ }
280
+ const currentActionResult = actionResult || ActionResult.fromState(state);
281
+ const research = Researcher.getCachedResearch(state) || '';
282
+ const combinedHtml = await currentActionResult.combinedHtml();
283
+ const history = stateManager.getStateHistory();
284
+ const visitCounts = new Map();
285
+ const countVisit = (value) => {
286
+ if (!value)
287
+ return;
288
+ const normalized = normalizeUrl(value);
289
+ if (normalized)
290
+ visitCounts.set(normalized, (visitCounts.get(normalized) || 0) + 1);
291
+ };
292
+ for (const transition of history) {
293
+ countVisit(transition.toState.url);
294
+ }
295
+ countVisit(state.url);
296
+ if (opts?.visitedUrls) {
297
+ for (const url of opts.visitedUrls) {
298
+ const normalized = normalizeUrl(url);
299
+ if (normalized && !visitCounts.has(normalized)) {
300
+ visitCounts.set(normalized, 1);
301
+ }
302
+ }
303
+ }
304
+ const sortedVisits = [...visitCounts.entries()].sort((a, b) => a[1] - b[1]);
305
+ const visitedBlock = sortedVisits.length > 0 ? sortedVisits.map(([url, count]) => `${url} (${count} ${count === 1 ? 'visit' : 'visits'})`).join('\n') : 'none';
306
+ let strategyInstruction = '';
307
+ if (opts?.strategy === 'deep') {
308
+ strategyInstruction = 'Prefer nearby pages with low visit counts. Explore depth-first: prioritize newly discovered pages close to current URL.';
309
+ }
310
+ else if (opts?.strategy === 'shallow') {
311
+ strategyInstruction = 'Pick the globally least-visited page. Spread exploration breadth-first across many different pages.';
312
+ }
313
+ let scopeInstruction = '';
314
+ if (opts?.scope) {
315
+ scopeInstruction = `IMPORTANT: Only suggest URLs that start with "${opts.scope}". Do not suggest URLs outside this scope.`;
316
+ }
317
+ const prompt = dedent `
318
+ <research>
319
+ ${research || 'No cached research available'}
320
+ </research>
321
+
322
+ <page_html>
323
+ ${combinedHtml}
324
+ </page_html>
325
+
326
+ <context>
327
+ Current URL: ${currentActionResult.url || 'unknown'}
328
+ Visited URLs (sorted by visit count):
329
+ ${visitedBlock}
330
+ </context>
331
+
332
+ <task>
333
+ Suggest the next navigation target, preferring least-visited pages.
334
+ ${strategyInstruction}
335
+ ${scopeInstruction}
336
+ </task>
337
+ `;
338
+ const conversation = this.provider.startConversation(this.freeSailSystemPrompt, 'navigator');
339
+ conversation.addUserText(prompt);
340
+ const minVisits = sortedVisits.length > 0 ? sortedVisits[0][1] : 0;
341
+ let suggestion = null;
342
+ await loop(async ({ stop }) => {
343
+ const result = await this.provider.invokeConversation(conversation);
344
+ const text = result?.response?.text?.trim();
345
+ if (!text) {
346
+ stop();
347
+ return;
348
+ }
349
+ const nextMatch = text.match(/Next:\s*(.+)/i);
350
+ const reasonMatch = text.match(/Reason:\s*(.+)/i);
351
+ const target = nextMatch?.[1]?.trim();
352
+ if (!target) {
353
+ stop();
354
+ return;
355
+ }
356
+ const normalizedTarget = normalizeUrl(target);
357
+ if (opts?.scope && !target.startsWith(opts.scope)) {
358
+ conversation.addUserText(`"${target}" is outside scope "${opts.scope}". Suggest a URL within scope.`);
359
+ return;
360
+ }
361
+ if (!target.startsWith('/') && !target.startsWith('http')) {
362
+ conversation.addUserText(`"${target}" is not a valid URL path. Suggest a URL path starting with "/".`);
363
+ return;
364
+ }
365
+ const targetVisits = visitCounts.get(normalizedTarget) || 0;
366
+ if (targetVisits >= 5 && minVisits < 5) {
367
+ conversation.addUserText(`"${target}" has been visited ${targetVisits} times. Choose a less-visited page from this list:\n${visitedBlock}`);
368
+ return;
369
+ }
370
+ suggestion = {
371
+ target,
372
+ reason: `${reasonMatch?.[1]?.trim() || ''} (visited ${targetVisits}x)`,
373
+ };
374
+ stop();
375
+ }, {
376
+ maxAttempts: 3,
377
+ observability: {
378
+ agent: 'navigator',
379
+ },
380
+ });
381
+ return suggestion;
382
+ }
383
+ async verifyState(message, actionResult) {
384
+ tag('info').log('AI Navigator verifying state at', actionResult.url);
385
+ debugLog('Verification message:', message);
386
+ let knowledge = '';
387
+ let experience = '';
388
+ const relevantKnowledge = this.knowledgeTracker.getRelevantKnowledge(actionResult);
389
+ if (relevantKnowledge.length > 0) {
390
+ const knowledgeContent = relevantKnowledge.map((k) => k.content).join('\n\n');
391
+ knowledge = `
392
+ <hint>
393
+ Here is relevant knowledge for this page:
394
+ ${knowledgeContent}
395
+ </hint>`;
396
+ }
397
+ const relevantExperience = this.experienceTracker.getRelevantExperience(actionResult).map((exp) => exp.content);
398
+ if (relevantExperience.length > 0) {
399
+ const experienceContent = relevantExperience.join('\n\n---\n\n');
400
+ experience = await this.experienceCompactor.compactExperience(experienceContent);
401
+ tag('substep').log(`Found ${relevantExperience.length} experience ${pluralize(relevantExperience.length, 'file')} for: ${actionResult.url}`);
402
+ experience = dedent `
403
+ <experience>
404
+ Here is the experience of interacting with the page.
405
+ Learn from it AND DO NOT REPEAT THE SAME MISTAKES.
406
+ If there was found successful solution to an issue, propose it as a first solution.
407
+
408
+ ${experienceContent}
409
+
410
+ </experience>`;
411
+ }
412
+ const prompt = dedent `
413
+ <message>
414
+ ${message}
415
+ </message>
416
+
417
+ <task>
418
+ Identify what assertion the user wants to verify on the page.
419
+ Propose different CodeceptJS assertion code blocks to verify the expected state.
420
+ Use only data from the <page> context to plan the verification.
421
+ Try various locators and approaches to verify the assertion.
422
+
423
+ IMPORTANT: Each code block must verify the SPECIFIC claim in the message, not just a generic aspect of it.
424
+ Bad: I.seeElement({"role":"button","aria-pressed":"true"}) — matches ANY button, not the specific one
425
+ Good: I.see("My Item", ".starred-list") — checks the specific item mentioned in the message
426
+ If the message mentions a specific item, name, or value, EVERY assertion must include that specific text or identifier.
427
+ Do not generate assertions that would pass even if the specific claim is false.
428
+ </task>
429
+
430
+ <page>
431
+ ${actionResult.toAiContext()}
432
+
433
+ <page_html>
434
+ ${await actionResult.simplifiedHtml()}
435
+ </page_html>
436
+ </page>
437
+
438
+ ${knowledge}
439
+
440
+ ${RulesLoader.loadRules('navigator', ['verification-actions'], actionResult.url || '')}
441
+
442
+ ${locatorRule}
443
+
444
+ ${experience}
445
+ `;
446
+ debugLog('Sending verification prompt to AI provider');
447
+ tag('debug').log('Prompt:', prompt);
448
+ const conversation = this.provider.startConversation(this.systemPrompt, 'navigator');
449
+ conversation.addUserText(prompt);
450
+ let codeBlocks = [];
451
+ const successfulCodes = [];
452
+ const action = this.explorer.createAction();
453
+ await loop(async ({ stop, iteration }) => {
454
+ if (codeBlocks.length === 0) {
455
+ const result = await this.provider.invokeConversation(conversation);
456
+ if (!result)
457
+ return;
458
+ const aiResponse = result?.response?.text;
459
+ debugLog('Received AI response:', aiResponse.length, 'characters');
460
+ tag('step').log('Verifying assertion...');
461
+ codeBlocks = extractCodeBlocks(aiResponse ?? '');
462
+ }
463
+ if (codeBlocks.length === 0) {
464
+ return;
465
+ }
466
+ const codeBlock = codeBlocks[iteration - 1];
467
+ if (!codeBlock) {
468
+ stop();
469
+ return;
470
+ }
471
+ const verified = await action.attempt(codeBlock, message, false);
472
+ if (verified) {
473
+ tag('success').log('Verification passed');
474
+ successfulCodes.push(codeBlock);
475
+ }
476
+ }, {
477
+ maxAttempts: this.MAX_ATTEMPTS,
478
+ observability: {
479
+ agent: 'navigator',
480
+ },
481
+ catch: async (error) => {
482
+ debugLog(error);
483
+ },
484
+ });
485
+ const totalAttempted = Math.min(codeBlocks.length, this.MAX_ATTEMPTS);
486
+ const verified = totalAttempted <= 1 ? successfulCodes.length > 0 : successfulCodes.length > totalAttempted / 2;
487
+ actionResult.addVerification(message, verified);
488
+ this.explorer.getStateManager().updateState(actionResult);
489
+ return { verified, successfulCodes, totalAttempted };
490
+ }
491
+ }
492
+ export { Navigator };
493
+ //# sourceMappingURL=navigator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../../src/ai/navigator.ts"],"names":[],"mappings":"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"}