explorbot 0.0.1 → 0.1.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 (423) hide show
  1. package/README.md +80 -26
  2. package/bin/explorbot-cli.ts +680 -0
  3. package/boat/api-tester/src/ai/chief/styles.ts +15 -0
  4. package/boat/api-tester/src/ai/chief.ts +335 -0
  5. package/boat/api-tester/src/ai/curler-tools.ts +278 -0
  6. package/boat/api-tester/src/ai/curler.ts +306 -0
  7. package/boat/api-tester/src/api-client.ts +28 -0
  8. package/boat/api-tester/src/apibot.ts +203 -0
  9. package/boat/api-tester/src/cli.ts +301 -0
  10. package/boat/api-tester/src/config.ts +190 -0
  11. package/dist/bin/explorbot-cli.js +23 -101
  12. package/dist/boat/api-tester/bin/apibot-cli.js +0 -1
  13. package/dist/boat/api-tester/src/ai/chief/styles.js +0 -1
  14. package/dist/boat/api-tester/src/ai/chief.js +0 -1
  15. package/dist/boat/api-tester/src/ai/curler-tools.js +0 -1
  16. package/dist/boat/api-tester/src/ai/curler.js +0 -1
  17. package/dist/boat/api-tester/src/api-client.js +0 -1
  18. package/dist/boat/api-tester/src/apibot.js +0 -1
  19. package/dist/boat/api-tester/src/cli.js +0 -1
  20. package/dist/boat/api-tester/src/config.js +0 -1
  21. package/dist/src/action-result.js +0 -1
  22. package/dist/src/action.js +14 -12
  23. package/dist/src/activity.js +0 -1
  24. package/dist/src/ai/agent.js +0 -1
  25. package/dist/src/ai/bosun.js +0 -1
  26. package/dist/src/ai/captain/idle-mode.js +0 -1
  27. package/dist/src/ai/captain/mixin.js +0 -1
  28. package/dist/src/ai/captain/test-mode.js +0 -1
  29. package/dist/src/ai/captain/web-mode.js +0 -1
  30. package/dist/src/ai/captain.js +0 -1
  31. package/dist/src/ai/conversation.js +0 -1
  32. package/dist/src/ai/experience-compactor.js +0 -1
  33. package/dist/src/ai/fisherman-tools.js +0 -1
  34. package/dist/src/ai/fisherman.js +0 -1
  35. package/dist/src/ai/historian.js +0 -1
  36. package/dist/src/ai/navigator.js +0 -1
  37. package/dist/src/ai/pilot.js +0 -1
  38. package/dist/src/ai/planner/session-dedup.js +0 -1
  39. package/dist/src/ai/planner/styles.js +0 -1
  40. package/dist/src/ai/planner/subpages.js +42 -7
  41. package/dist/src/ai/planner.js +15 -4
  42. package/dist/src/ai/provider.js +0 -1
  43. package/dist/src/ai/quartermaster.js +0 -1
  44. package/dist/src/ai/researcher/cache.js +13 -9
  45. package/dist/src/ai/researcher/coordinates.js +4 -3
  46. package/dist/src/ai/researcher/deep-analysis.js +16 -20
  47. package/dist/src/ai/researcher/fingerprint-worker.js +0 -1
  48. package/dist/src/ai/researcher/focus.js +0 -1
  49. package/dist/src/ai/researcher/locators.js +1 -2
  50. package/dist/src/ai/researcher/mixin.js +0 -1
  51. package/dist/src/ai/researcher/parser.js +4 -4
  52. package/dist/src/ai/researcher/research-result.js +2 -1
  53. package/dist/src/ai/researcher.js +6 -6
  54. package/dist/src/ai/rules.js +0 -1
  55. package/dist/src/ai/task-agent.js +0 -1
  56. package/dist/src/ai/tester.js +0 -1
  57. package/dist/src/ai/tools.js +4 -1
  58. package/dist/src/api/api-client.js +0 -1
  59. package/dist/src/api/request-result.js +0 -1
  60. package/dist/src/api/request-store.js +0 -1
  61. package/dist/src/api/spec-reader.js +0 -1
  62. package/dist/src/api/xhr-capture.js +0 -1
  63. package/dist/src/browser-server.js +0 -1
  64. package/dist/src/command-handler.js +0 -1
  65. package/dist/src/commands/add-rule-command.js +0 -1
  66. package/dist/src/commands/base-command.js +0 -1
  67. package/dist/src/commands/clean-command.js +0 -1
  68. package/dist/src/commands/context-aria-command.js +0 -1
  69. package/dist/src/commands/context-command.js +2 -3
  70. package/dist/src/commands/context-data-command.js +0 -1
  71. package/dist/src/commands/context-experience-command.js +0 -1
  72. package/dist/src/commands/context-html-command.js +0 -1
  73. package/dist/src/commands/context-knowledge-command.js +0 -1
  74. package/dist/src/commands/debug-command.js +0 -1
  75. package/dist/src/commands/drill-command.js +0 -1
  76. package/dist/src/commands/exit-command.js +0 -1
  77. package/dist/src/commands/explore-command.js +3 -3
  78. package/dist/src/commands/freesail-command.js +0 -1
  79. package/dist/src/commands/help-command.js +0 -1
  80. package/dist/src/commands/index.js +0 -1
  81. package/dist/src/commands/init-command.js +117 -0
  82. package/dist/src/commands/knows-command.js +0 -1
  83. package/dist/src/commands/learn-command.js +0 -1
  84. package/dist/src/commands/navigate-command.js +0 -1
  85. package/dist/src/commands/path-command.js +0 -1
  86. package/dist/src/commands/plan-clear-command.js +0 -1
  87. package/dist/src/commands/plan-command.js +6 -2
  88. package/dist/src/commands/plan-edit-command.js +0 -1
  89. package/dist/src/commands/plan-load-command.js +0 -1
  90. package/dist/src/commands/plan-reload-command.js +0 -1
  91. package/dist/src/commands/plan-save-command.js +0 -1
  92. package/dist/src/commands/research-command.js +0 -1
  93. package/dist/src/commands/start-command.js +0 -1
  94. package/dist/src/commands/status-command.js +0 -1
  95. package/dist/src/commands/test-command.js +0 -1
  96. package/dist/src/components/ActivityPane.js +0 -1
  97. package/dist/src/components/AddKnowledge.js +0 -1
  98. package/dist/src/components/AddRule.js +0 -1
  99. package/dist/src/components/App.js +0 -1
  100. package/dist/src/components/Autocomplete.js +0 -1
  101. package/dist/src/components/InputPane.js +0 -1
  102. package/dist/src/components/InputReadline.js +0 -1
  103. package/dist/src/components/LogPane.js +0 -1
  104. package/dist/src/components/PlanEditor.js +0 -1
  105. package/dist/src/components/PlanPane.js +0 -1
  106. package/dist/src/components/SessionTimer.js +0 -1
  107. package/dist/src/components/StateTransitionPane.js +0 -1
  108. package/dist/src/components/StatusPane.js +0 -1
  109. package/dist/src/components/TaskPane.js +0 -1
  110. package/dist/src/components/Welcome.js +0 -1
  111. package/dist/src/components/WelcomeChecklist.js +0 -1
  112. package/dist/src/components/WelcomeCommands.js +0 -1
  113. package/dist/src/components/autocomplete-store.js +0 -1
  114. package/dist/src/components/parse-keypress.js +0 -1
  115. package/dist/src/config.js +0 -1
  116. package/dist/src/execution-controller.js +0 -1
  117. package/dist/src/experience-tracker.js +0 -1
  118. package/dist/src/explorbot.js +1 -2
  119. package/dist/src/explorer.js +58 -17
  120. package/dist/src/index.js +0 -1
  121. package/dist/src/knowledge-tracker.js +2 -2
  122. package/dist/src/observability.js +0 -1
  123. package/dist/src/reporter.js +0 -1
  124. package/dist/src/state-manager.js +0 -1
  125. package/dist/src/stats.js +0 -1
  126. package/dist/src/test-plan.js +0 -1
  127. package/dist/src/utils/aria.js +0 -1
  128. package/dist/src/utils/cli-name.js +16 -0
  129. package/dist/src/utils/code-extractor.js +0 -1
  130. package/dist/src/utils/context-formatter.js +0 -1
  131. package/dist/src/utils/error-page.js +0 -1
  132. package/dist/src/utils/expandable.js +0 -1
  133. package/dist/src/utils/hooks-runner.js +0 -1
  134. package/dist/src/utils/html-diff.js +0 -1
  135. package/dist/src/utils/html.js +0 -1
  136. package/dist/src/utils/logger.js +0 -1
  137. package/dist/src/utils/loop.js +0 -1
  138. package/dist/src/utils/markdown-parser.js +0 -1
  139. package/dist/src/utils/markdown-query.js +0 -1
  140. package/dist/src/utils/markdown-terminal.js +0 -1
  141. package/dist/src/utils/research-parser.js +0 -1
  142. package/dist/src/utils/retry.js +0 -1
  143. package/dist/src/utils/rules-loader.js +0 -1
  144. package/dist/src/utils/strings.js +0 -1
  145. package/dist/src/utils/test-plan-markdown.js +0 -1
  146. package/dist/src/utils/throttle.js +0 -1
  147. package/dist/src/utils/unique-names.js +0 -1
  148. package/dist/src/utils/url-matcher.js +0 -1
  149. package/dist/src/utils/web-element.js +6 -5
  150. package/dist/src/utils/xpath.js +0 -1
  151. package/package.json +28 -4
  152. package/src/action-result.ts +694 -0
  153. package/src/action.ts +449 -0
  154. package/src/activity.ts +111 -0
  155. package/src/ai/agent.ts +3 -0
  156. package/src/ai/bosun.ts +557 -0
  157. package/src/ai/captain/idle-mode.ts +116 -0
  158. package/src/ai/captain/mixin.ts +22 -0
  159. package/src/ai/captain/test-mode.ts +262 -0
  160. package/src/ai/captain/web-mode.ts +136 -0
  161. package/src/ai/captain.ts +504 -0
  162. package/src/ai/conversation.ts +205 -0
  163. package/src/ai/experience-compactor.ts +284 -0
  164. package/src/ai/fisherman-tools.ts +181 -0
  165. package/src/ai/fisherman.ts +223 -0
  166. package/src/ai/historian.ts +457 -0
  167. package/src/ai/navigator.ts +572 -0
  168. package/src/ai/pilot.ts +776 -0
  169. package/src/ai/planner/session-dedup.ts +35 -0
  170. package/src/ai/planner/styles.ts +17 -0
  171. package/src/ai/planner/subpages.ts +171 -0
  172. package/src/ai/planner.ts +549 -0
  173. package/src/ai/provider.ts +613 -0
  174. package/src/ai/quartermaster.ts +286 -0
  175. package/src/ai/researcher/cache.ts +109 -0
  176. package/src/ai/researcher/coordinates.ts +239 -0
  177. package/src/ai/researcher/deep-analysis.ts +412 -0
  178. package/src/ai/researcher/fingerprint-worker.ts +59 -0
  179. package/src/ai/researcher/focus.ts +42 -0
  180. package/src/ai/researcher/locators.ts +282 -0
  181. package/src/ai/researcher/mixin.ts +4 -0
  182. package/src/ai/researcher/parser.ts +186 -0
  183. package/src/ai/researcher/research-result.ts +116 -0
  184. package/src/ai/researcher.ts +858 -0
  185. package/src/ai/rules.ts +376 -0
  186. package/src/ai/task-agent.ts +141 -0
  187. package/src/ai/tester.ts +939 -0
  188. package/src/ai/tools.ts +1122 -0
  189. package/src/api/api-client.ts +109 -0
  190. package/src/api/request-result.ts +212 -0
  191. package/src/api/request-store.ts +130 -0
  192. package/src/api/spec-reader.ts +174 -0
  193. package/src/api/xhr-capture.ts +100 -0
  194. package/src/browser-server.ts +74 -0
  195. package/src/command-handler.ts +454 -0
  196. package/src/commands/add-rule-command.ts +63 -0
  197. package/src/commands/base-command.ts +27 -0
  198. package/src/commands/clean-command.ts +73 -0
  199. package/src/commands/context-aria-command.ts +22 -0
  200. package/src/commands/context-command.ts +67 -0
  201. package/src/commands/context-data-command.ts +30 -0
  202. package/src/commands/context-experience-command.ts +48 -0
  203. package/src/commands/context-html-command.ts +33 -0
  204. package/src/commands/context-knowledge-command.ts +43 -0
  205. package/src/commands/debug-command.ts +13 -0
  206. package/src/commands/drill-command.ts +34 -0
  207. package/src/commands/exit-command.ts +32 -0
  208. package/src/commands/explore-command.ts +129 -0
  209. package/src/commands/freesail-command.ts +95 -0
  210. package/src/commands/help-command.ts +8 -0
  211. package/src/commands/index.ts +69 -0
  212. package/src/commands/init-command.ts +131 -0
  213. package/src/commands/knows-command.ts +68 -0
  214. package/src/commands/learn-command.ts +44 -0
  215. package/src/commands/navigate-command.ts +18 -0
  216. package/src/commands/path-command.ts +83 -0
  217. package/src/commands/plan-clear-command.ts +14 -0
  218. package/src/commands/plan-command.ts +46 -0
  219. package/src/commands/plan-edit-command.ts +9 -0
  220. package/src/commands/plan-load-command.ts +18 -0
  221. package/src/commands/plan-reload-command.ts +28 -0
  222. package/src/commands/plan-save-command.ts +25 -0
  223. package/src/commands/research-command.ts +45 -0
  224. package/src/commands/start-command.ts +13 -0
  225. package/src/commands/status-command.tsx +23 -0
  226. package/src/commands/test-command.ts +84 -0
  227. package/src/components/ActivityPane.tsx +80 -0
  228. package/src/components/AddKnowledge.tsx +169 -0
  229. package/src/components/AddRule.tsx +174 -0
  230. package/src/components/App.tsx +377 -0
  231. package/src/components/Autocomplete.tsx +63 -0
  232. package/src/components/InputPane.tsx +259 -0
  233. package/src/components/InputReadline.tsx +704 -0
  234. package/src/components/LogPane.tsx +187 -0
  235. package/src/components/PlanEditor.tsx +150 -0
  236. package/src/components/PlanPane.tsx +71 -0
  237. package/src/components/SessionTimer.tsx +35 -0
  238. package/src/components/StateTransitionPane.tsx +149 -0
  239. package/src/components/StatusPane.tsx +62 -0
  240. package/src/components/TaskPane.tsx +119 -0
  241. package/src/components/Welcome.tsx +83 -0
  242. package/src/components/WelcomeChecklist.tsx +118 -0
  243. package/src/components/WelcomeCommands.tsx +102 -0
  244. package/src/components/autocomplete-store.ts +35 -0
  245. package/src/components/parse-keypress.ts +170 -0
  246. package/src/config.ts +491 -0
  247. package/src/execution-controller.ts +109 -0
  248. package/src/experience-tracker.ts +350 -0
  249. package/src/explorbot.ts +405 -0
  250. package/src/explorer.ts +760 -0
  251. package/src/index.tsx +62 -0
  252. package/src/knowledge-tracker.ts +230 -0
  253. package/src/observability.ts +150 -0
  254. package/src/reporter.ts +224 -0
  255. package/src/state-manager.ts +556 -0
  256. package/src/stats.ts +53 -0
  257. package/src/test-plan.ts +432 -0
  258. package/src/utils/aria.ts +629 -0
  259. package/src/utils/cli-name.ts +13 -0
  260. package/src/utils/code-extractor.ts +22 -0
  261. package/src/utils/context-formatter.ts +239 -0
  262. package/src/utils/error-page.ts +23 -0
  263. package/src/utils/expandable.ts +38 -0
  264. package/src/utils/hooks-runner.ts +79 -0
  265. package/src/utils/html-diff.ts +918 -0
  266. package/src/utils/html.ts +1316 -0
  267. package/src/utils/logger.ts +534 -0
  268. package/src/utils/loop.ts +176 -0
  269. package/src/utils/markdown-parser.ts +127 -0
  270. package/src/utils/markdown-query.ts +466 -0
  271. package/src/utils/markdown-terminal.ts +43 -0
  272. package/src/utils/research-parser.ts +11 -0
  273. package/src/utils/retry.ts +73 -0
  274. package/src/utils/rules-loader.ts +118 -0
  275. package/src/utils/strings.ts +13 -0
  276. package/src/utils/test-plan-markdown.ts +332 -0
  277. package/src/utils/throttle.ts +18 -0
  278. package/src/utils/unique-names.ts +14 -0
  279. package/src/utils/url-matcher.ts +45 -0
  280. package/src/utils/web-element.ts +147 -0
  281. package/src/utils/xpath.ts +129 -0
  282. package/dist/bin/explorbot-cli.js.map +0 -1
  283. package/dist/boat/api-tester/bin/apibot-cli.js.map +0 -1
  284. package/dist/boat/api-tester/example/apibot.config.js +0 -31
  285. package/dist/boat/api-tester/example/apibot.config.js.map +0 -1
  286. package/dist/boat/api-tester/src/ai/chief/styles.js.map +0 -1
  287. package/dist/boat/api-tester/src/ai/chief.js.map +0 -1
  288. package/dist/boat/api-tester/src/ai/curler-tools.js.map +0 -1
  289. package/dist/boat/api-tester/src/ai/curler.js.map +0 -1
  290. package/dist/boat/api-tester/src/api-client.js.map +0 -1
  291. package/dist/boat/api-tester/src/apibot.js.map +0 -1
  292. package/dist/boat/api-tester/src/cli.js.map +0 -1
  293. package/dist/boat/api-tester/src/config.js.map +0 -1
  294. package/dist/prompts/audit-rules.md +0 -124
  295. package/dist/src/action-result.js.map +0 -1
  296. package/dist/src/action.js.map +0 -1
  297. package/dist/src/activity.js.map +0 -1
  298. package/dist/src/ai/agent.js.map +0 -1
  299. package/dist/src/ai/bosun.js.map +0 -1
  300. package/dist/src/ai/captain/idle-mode.js.map +0 -1
  301. package/dist/src/ai/captain/mixin.js.map +0 -1
  302. package/dist/src/ai/captain/test-mode.js.map +0 -1
  303. package/dist/src/ai/captain/web-mode.js.map +0 -1
  304. package/dist/src/ai/captain.js.map +0 -1
  305. package/dist/src/ai/conversation.js.map +0 -1
  306. package/dist/src/ai/experience-compactor.js.map +0 -1
  307. package/dist/src/ai/fisherman-tools.js.map +0 -1
  308. package/dist/src/ai/fisherman.js.map +0 -1
  309. package/dist/src/ai/historian.js.map +0 -1
  310. package/dist/src/ai/navigator.js.map +0 -1
  311. package/dist/src/ai/pilot.js.map +0 -1
  312. package/dist/src/ai/planner/session-dedup.js.map +0 -1
  313. package/dist/src/ai/planner/styles.js.map +0 -1
  314. package/dist/src/ai/planner/subpages.js.map +0 -1
  315. package/dist/src/ai/planner.js.map +0 -1
  316. package/dist/src/ai/provider.js.map +0 -1
  317. package/dist/src/ai/quartermaster.js.map +0 -1
  318. package/dist/src/ai/researcher/cache.js.map +0 -1
  319. package/dist/src/ai/researcher/coordinates.js.map +0 -1
  320. package/dist/src/ai/researcher/deep-analysis.js.map +0 -1
  321. package/dist/src/ai/researcher/fingerprint-worker.js.map +0 -1
  322. package/dist/src/ai/researcher/focus.js.map +0 -1
  323. package/dist/src/ai/researcher/locators.js.map +0 -1
  324. package/dist/src/ai/researcher/mixin.js.map +0 -1
  325. package/dist/src/ai/researcher/parser.js.map +0 -1
  326. package/dist/src/ai/researcher/research-result.js.map +0 -1
  327. package/dist/src/ai/researcher.js.map +0 -1
  328. package/dist/src/ai/rules.js.map +0 -1
  329. package/dist/src/ai/task-agent.js.map +0 -1
  330. package/dist/src/ai/tester.js.map +0 -1
  331. package/dist/src/ai/tools.js.map +0 -1
  332. package/dist/src/api/api-client.js.map +0 -1
  333. package/dist/src/api/request-result.js.map +0 -1
  334. package/dist/src/api/request-store.js.map +0 -1
  335. package/dist/src/api/spec-reader.js.map +0 -1
  336. package/dist/src/api/xhr-capture.js.map +0 -1
  337. package/dist/src/browser-server.js.map +0 -1
  338. package/dist/src/command-handler.js.map +0 -1
  339. package/dist/src/commands/add-rule-command.js.map +0 -1
  340. package/dist/src/commands/base-command.js.map +0 -1
  341. package/dist/src/commands/clean-command.js.map +0 -1
  342. package/dist/src/commands/context-aria-command.js.map +0 -1
  343. package/dist/src/commands/context-command.js.map +0 -1
  344. package/dist/src/commands/context-data-command.js.map +0 -1
  345. package/dist/src/commands/context-experience-command.js.map +0 -1
  346. package/dist/src/commands/context-html-command.js.map +0 -1
  347. package/dist/src/commands/context-knowledge-command.js.map +0 -1
  348. package/dist/src/commands/debug-command.js.map +0 -1
  349. package/dist/src/commands/drill-command.js.map +0 -1
  350. package/dist/src/commands/exit-command.js.map +0 -1
  351. package/dist/src/commands/explore-command.js.map +0 -1
  352. package/dist/src/commands/freesail-command.js.map +0 -1
  353. package/dist/src/commands/help-command.js.map +0 -1
  354. package/dist/src/commands/index.js.map +0 -1
  355. package/dist/src/commands/knows-command.js.map +0 -1
  356. package/dist/src/commands/learn-command.js.map +0 -1
  357. package/dist/src/commands/navigate-command.js.map +0 -1
  358. package/dist/src/commands/path-command.js.map +0 -1
  359. package/dist/src/commands/plan-clear-command.js.map +0 -1
  360. package/dist/src/commands/plan-command.js.map +0 -1
  361. package/dist/src/commands/plan-edit-command.js.map +0 -1
  362. package/dist/src/commands/plan-load-command.js.map +0 -1
  363. package/dist/src/commands/plan-reload-command.js.map +0 -1
  364. package/dist/src/commands/plan-save-command.js.map +0 -1
  365. package/dist/src/commands/research-command.js.map +0 -1
  366. package/dist/src/commands/start-command.js.map +0 -1
  367. package/dist/src/commands/status-command.js.map +0 -1
  368. package/dist/src/commands/test-command.js.map +0 -1
  369. package/dist/src/components/ActivityPane.js.map +0 -1
  370. package/dist/src/components/AddKnowledge.js.map +0 -1
  371. package/dist/src/components/AddRule.js.map +0 -1
  372. package/dist/src/components/App.js.map +0 -1
  373. package/dist/src/components/Autocomplete.js.map +0 -1
  374. package/dist/src/components/InputPane.js.map +0 -1
  375. package/dist/src/components/InputReadline.js.map +0 -1
  376. package/dist/src/components/LogPane.js.map +0 -1
  377. package/dist/src/components/PlanEditor.js.map +0 -1
  378. package/dist/src/components/PlanPane.js.map +0 -1
  379. package/dist/src/components/SessionTimer.js.map +0 -1
  380. package/dist/src/components/StateTransitionPane.js.map +0 -1
  381. package/dist/src/components/StatusPane.js.map +0 -1
  382. package/dist/src/components/TaskPane.js.map +0 -1
  383. package/dist/src/components/Welcome.js.map +0 -1
  384. package/dist/src/components/WelcomeChecklist.js.map +0 -1
  385. package/dist/src/components/WelcomeCommands.js.map +0 -1
  386. package/dist/src/components/autocomplete-store.js.map +0 -1
  387. package/dist/src/components/parse-keypress.js.map +0 -1
  388. package/dist/src/config.js.map +0 -1
  389. package/dist/src/execution-controller.js.map +0 -1
  390. package/dist/src/experience-tracker.js.map +0 -1
  391. package/dist/src/explorbot.js.map +0 -1
  392. package/dist/src/explorer.js.map +0 -1
  393. package/dist/src/index.js.map +0 -1
  394. package/dist/src/knowledge-tracker.js.map +0 -1
  395. package/dist/src/observability.js.map +0 -1
  396. package/dist/src/reporter.js.map +0 -1
  397. package/dist/src/state-manager.js.map +0 -1
  398. package/dist/src/stats.js.map +0 -1
  399. package/dist/src/test-plan.js.map +0 -1
  400. package/dist/src/utils/aria.js.map +0 -1
  401. package/dist/src/utils/code-extractor.js.map +0 -1
  402. package/dist/src/utils/context-formatter.js.map +0 -1
  403. package/dist/src/utils/error-page.js.map +0 -1
  404. package/dist/src/utils/expandable.js.map +0 -1
  405. package/dist/src/utils/hooks-runner.js.map +0 -1
  406. package/dist/src/utils/html-diff.js.map +0 -1
  407. package/dist/src/utils/html.js.map +0 -1
  408. package/dist/src/utils/logger.js.map +0 -1
  409. package/dist/src/utils/loop.js.map +0 -1
  410. package/dist/src/utils/markdown-parser.js.map +0 -1
  411. package/dist/src/utils/markdown-query.js.map +0 -1
  412. package/dist/src/utils/markdown-terminal.js.map +0 -1
  413. package/dist/src/utils/research-parser.js.map +0 -1
  414. package/dist/src/utils/retry.js.map +0 -1
  415. package/dist/src/utils/rules-loader.js.map +0 -1
  416. package/dist/src/utils/strings.js.map +0 -1
  417. package/dist/src/utils/test-plan-markdown.js.map +0 -1
  418. package/dist/src/utils/throttle.js.map +0 -1
  419. package/dist/src/utils/unique-names.js.map +0 -1
  420. package/dist/src/utils/url-matcher.js.map +0 -1
  421. package/dist/src/utils/web-element.js.map +0 -1
  422. package/dist/src/utils/xpath.js.map +0 -1
  423. package/prompts/audit-rules.md +0 -124
@@ -260,4 +260,3 @@ export function createCurlerTools(apiClient, requestState, test, searchSpec) {
260
260
  }),
261
261
  };
262
262
  }
263
- //# sourceMappingURL=curler-tools.js.map
@@ -268,4 +268,3 @@ export class Curler {
268
268
  `;
269
269
  }
270
270
  }
271
- //# sourceMappingURL=curler.js.map
@@ -23,4 +23,3 @@ export class ApiClient extends BaseApiClient {
23
23
  await this.teardownHook(ctx);
24
24
  }
25
25
  }
26
- //# sourceMappingURL=api-client.js.map
@@ -163,4 +163,3 @@ export class ApiBot {
163
163
  return `${sanitized.slice(0, 200)}.md`;
164
164
  }
165
165
  }
166
- //# sourceMappingURL=apibot.js.map
@@ -259,4 +259,3 @@ export default {
259
259
  });
260
260
  return cmd;
261
261
  }
262
- //# sourceMappingURL=cli.js.map
@@ -156,4 +156,3 @@ export class ApibotConfigParser {
156
156
  return result;
157
157
  }
158
158
  }
159
- //# sourceMappingURL=config.js.map
@@ -571,4 +571,3 @@ export class Diff {
571
571
  this._ariaDiffResult = diffAriaSnapshots(this.previous.ariaSnapshot, this.current.ariaSnapshot);
572
572
  }
573
573
  }
574
- //# sourceMappingURL=action-result.js.map
@@ -50,7 +50,7 @@ class Action {
50
50
  return undefined;
51
51
  }
52
52
  }
53
- async capturePageState({ includeScreenshot = false } = {}) {
53
+ async capturePageState({ includeScreenshot = false, ariaSnapshot: preCapuredAria } = {}) {
54
54
  try {
55
55
  const currentState = this.stateManager.getCurrentState();
56
56
  const stateHash = currentState?.hash || 'screenshot';
@@ -90,20 +90,23 @@ class Action {
90
90
  debugLog('Page:', { url, title, size: html.length, html: html.substring(0, 100) });
91
91
  // Capture iframe HTML snapshots
92
92
  const iframeSnapshots = await this.captureIframeSnapshots(html);
93
- let ariaSnapshot = null;
93
+ let ariaSnapshot = preCapuredAria || null;
94
94
  let ariaSnapshotFile = undefined;
95
- try {
96
- const page = this.playwrightHelper.page;
97
- const serializedSnapshot = await page.locator('body').ariaSnapshot();
95
+ if (!ariaSnapshot) {
96
+ try {
97
+ const page = this.playwrightHelper.page;
98
+ ariaSnapshot = await page.locator('body').ariaSnapshot();
99
+ }
100
+ catch (err) {
101
+ debugLog('ARIA snapshot failed:', err instanceof Error ? `${err.message}\n${err.stack}` : err);
102
+ }
103
+ }
104
+ if (ariaSnapshot) {
98
105
  const ariaFileName = `${stateHash}_${timestamp}.aria.yaml`;
99
106
  const ariaPath = join(statesDir, ariaFileName);
100
- fs.writeFileSync(ariaPath, serializedSnapshot, 'utf8');
101
- ariaSnapshot = serializedSnapshot;
107
+ fs.writeFileSync(ariaPath, ariaSnapshot, 'utf8');
102
108
  ariaSnapshotFile = ariaFileName;
103
109
  }
104
- catch (err) {
105
- debugLog('ARIA snapshot failed:', err instanceof Error ? `${err.message}\n${err.stack}` : err);
106
- }
107
110
  const result = new ActionResult({
108
111
  html,
109
112
  title,
@@ -115,7 +118,7 @@ class Action {
115
118
  iframeSnapshots,
116
119
  ariaSnapshot,
117
120
  ariaSnapshotFile,
118
- iframeURL: frame?.url?.() || undefined,
121
+ iframeURL: frame ? frame.url?.() || 'iframe' : undefined,
119
122
  });
120
123
  this.stateManager.updateState(result);
121
124
  return result;
@@ -385,4 +388,3 @@ const unregisterStepLogger = () => {
385
388
  codeceptjs.event.dispatcher.off(codeceptjs.event.step.passed, stepLogger);
386
389
  codeceptjs.event.dispatcher.off(codeceptjs.event.step.failed, stepLogger);
387
390
  };
388
- //# sourceMappingURL=action.js.map
@@ -83,4 +83,3 @@ export const removeActivityListener = (listener) => {
83
83
  activity.removeListener(listener);
84
84
  };
85
85
  export default Activity;
86
- //# sourceMappingURL=activity.js.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=agent.js.map
@@ -440,4 +440,3 @@ export class Bosun extends TaskAgent {
440
440
  return this.currentConversation;
441
441
  }
442
442
  }
443
- //# sourceMappingURL=bosun.js.map
@@ -99,4 +99,3 @@ export function WithIdleMode(Base) {
99
99
  }
100
100
  };
101
101
  }
102
- //# sourceMappingURL=idle-mode.js.map
@@ -8,4 +8,3 @@ export function resolveProjectRoot() {
8
8
  return null;
9
9
  return dirname(configPath);
10
10
  }
11
- //# sourceMappingURL=mixin.js.map
@@ -248,4 +248,3 @@ export function WithTestMode(Base) {
248
248
  }
249
249
  };
250
250
  }
251
- //# sourceMappingURL=test-mode.js.map
@@ -121,4 +121,3 @@ export function WithWebMode(Base) {
121
121
  }
122
122
  };
123
123
  }
124
- //# sourceMappingURL=web-mode.js.map
@@ -439,4 +439,3 @@ export class Captain extends CaptainBase {
439
439
  }
440
440
  }
441
441
  export default Captain;
442
- //# sourceMappingURL=captain.js.map
@@ -173,4 +173,3 @@ export class Conversation {
173
173
  return executions;
174
174
  }
175
175
  }
176
- //# sourceMappingURL=conversation.js.map
@@ -229,4 +229,3 @@ export class ExperienceCompactor {
229
229
  `;
230
230
  }
231
231
  }
232
- //# sourceMappingURL=experience-compactor.js.map
@@ -151,4 +151,3 @@ function extractKeyFields(body, result = {}, depth = 0) {
151
151
  }
152
152
  return result;
153
153
  }
154
- //# sourceMappingURL=fisherman-tools.js.map
@@ -181,4 +181,3 @@ export class Fisherman {
181
181
  `;
182
182
  }
183
183
  }
184
- //# sourceMappingURL=fisherman.js.map
@@ -381,4 +381,3 @@ export class Historian {
381
381
  .join('\n');
382
382
  }
383
383
  }
384
- //# sourceMappingURL=historian.js.map
@@ -490,4 +490,3 @@ class Navigator {
490
490
  }
491
491
  }
492
492
  export { Navigator };
493
- //# sourceMappingURL=navigator.js.map
@@ -681,4 +681,3 @@ export class Pilot {
681
681
  `;
682
682
  }
683
683
  }
684
- //# sourceMappingURL=pilot.js.map
@@ -25,4 +25,3 @@ export function WithSessionDedup(Base) {
25
25
  }
26
26
  };
27
27
  }
28
- //# sourceMappingURL=session-dedup.js.map
@@ -12,4 +12,3 @@ export function getStyles() {
12
12
  export function getActiveStyle(iteration, override) {
13
13
  return RulesLoader.getActiveStyle(getStyles(), iteration, override);
14
14
  }
15
- //# sourceMappingURL=styles.js.map
@@ -1,10 +1,11 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
+ import { ConfigParser } from "../../config.js";
3
4
  import { normalizeUrl } from "../../state-manager.js";
4
5
  const planRegistry = new Map();
5
- export function registerPlan(url, plan, feature) {
6
+ export function registerPlan(url, plan, feature, stateHash) {
6
7
  const key = buildKey(url, feature);
7
- planRegistry.set(key, { plan, feature, url });
8
+ planRegistry.set(key, { plan, feature, url, stateHash });
8
9
  }
9
10
  export function getRegisteredPlan(url, feature) {
10
11
  return planRegistry.get(buildKey(url, feature));
@@ -26,7 +27,36 @@ function buildKey(url, feature) {
26
27
  return `${normalized}::${feature}`;
27
28
  return normalized;
28
29
  }
29
- function isTemplateMatch(urlA, urlB) {
30
+ export function isDynamicSegment(segment) {
31
+ try {
32
+ const configRegex = ConfigParser.getInstance().getConfig().dynamicPageRegex;
33
+ if (configRegex)
34
+ return new RegExp(configRegex, 'i').test(segment);
35
+ }
36
+ catch {
37
+ /* config not loaded yet */
38
+ }
39
+ // numeric: /users/123
40
+ if (/^\d+$/.test(segment))
41
+ return true;
42
+ // UUID: /items/550e8400-e29b-41d4-a716-446655440000
43
+ if (/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(segment))
44
+ return true;
45
+ // ULID: /items/01ARZ3NDEKTSV4RRFFQ69G5FAV
46
+ if (/^[0-9A-HJKMNP-TV-Z]{26}$/.test(segment))
47
+ return true;
48
+ // hex ID (4+ chars): /suite/70dae98a
49
+ if (/^[a-f0-9]{4,}$/i.test(segment))
50
+ return true;
51
+ // hex-prefixed slug (8+ hex before dash): /suite/95ef0c94-mobile
52
+ if (/^[a-f0-9]{8,}-/i.test(segment))
53
+ return true;
54
+ // short mixed alphanumeric (digits + letters, ≤8 chars, no dash): /item/x7f2
55
+ if (segment.length <= 8 && !segment.includes('-') && /\d/.test(segment) && /[a-z]/i.test(segment))
56
+ return true;
57
+ return false;
58
+ }
59
+ export function isTemplateMatch(urlA, urlB) {
30
60
  const partsA = normalizeUrl(urlA).split('/');
31
61
  const partsB = normalizeUrl(urlB).split('/');
32
62
  if (partsA.length !== partsB.length)
@@ -38,12 +68,18 @@ function isTemplateMatch(urlA, urlB) {
38
68
  diffCount++;
39
69
  if (diffCount > 1)
40
70
  return false;
41
- const isNumericOrShortId = /^\d+$|^[a-f0-9]{4,}$/i;
42
- if (!isNumericOrShortId.test(partsA[i]) && !isNumericOrShortId.test(partsB[i]))
71
+ if (!isDynamicSegment(partsA[i]) && !isDynamicSegment(partsB[i]))
43
72
  return false;
44
73
  }
45
74
  return diffCount === 1;
46
75
  }
76
+ export function getPlannedByStateHash(hash) {
77
+ for (const record of planRegistry.values()) {
78
+ if (record.stateHash === hash)
79
+ return record;
80
+ }
81
+ return null;
82
+ }
47
83
  const SubPagePickSchema = z.object({
48
84
  url: z.string().nullable(),
49
85
  reason: z.string(),
@@ -58,7 +94,7 @@ export function WithSubPages(Base) {
58
94
  const pagePath = normalizeUrl(page.url);
59
95
  if (!pagePath.startsWith(currentPath) || pagePath === currentPath)
60
96
  continue;
61
- if (isPagePlanned(page.url))
97
+ if (this.findSimilarPlan(page.url))
62
98
  continue;
63
99
  if (candidates.some((c) => normalizeUrl(c.url) === pagePath))
64
100
  continue;
@@ -115,4 +151,3 @@ export function WithSubPages(Base) {
115
151
  }
116
152
  };
117
153
  }
118
- //# sourceMappingURL=subpages.js.map
@@ -14,7 +14,8 @@ import { mdq } from '../utils/markdown-query.js';
14
14
  import { Conversation } from "./conversation.js";
15
15
  import { getActiveStyle, getStyles } from "./planner/styles.js";
16
16
  import { WithSessionDedup } from "./planner/session-dedup.js";
17
- import { WithSubPages, getRegisteredPlan, registerPlan } from "./planner/subpages.js";
17
+ import { WithSubPages, getPlannedByStateHash, getRegisteredPlan, registerPlan } from "./planner/subpages.js";
18
+ import { findSimilarStateHash } from "./researcher/cache.js";
18
19
  import { hasFocusedSection } from "./researcher/focus.js";
19
20
  import { POSSIBLE_SECTIONS, Researcher } from "./researcher.js";
20
21
  import { fileUploadRule, protectionRule } from "./rules.js";
@@ -108,13 +109,24 @@ export class Planner extends PlannerBase {
108
109
  debugLog('Planning:', state?.url);
109
110
  if (!state)
110
111
  throw new Error('No state found');
111
- if (!this.freshStart && !feature && !this.currentPlan && state.url) {
112
+ if (!feature && !this.currentPlan && state.url) {
112
113
  const similar = this.findSimilarPlan(state.url);
113
114
  if (similar) {
114
115
  tag('info').log(`Similar page already planned: ${similar.url} (${similar.plan.tests.length} tests)`);
115
116
  this.registerPlanInSession(similar.plan);
116
117
  return similar.plan;
117
118
  }
119
+ const actionResult = ActionResult.fromState(state);
120
+ const combinedHtml = await actionResult.combinedHtml();
121
+ const similarHash = await findSimilarStateHash(combinedHtml);
122
+ if (similarHash) {
123
+ const planned = getPlannedByStateHash(similarHash);
124
+ if (planned) {
125
+ tag('info').log(`Page content similar to already-planned: ${planned.url} — skipping`);
126
+ this.registerPlanInSession(planned.plan);
127
+ return planned.plan;
128
+ }
129
+ }
118
130
  }
119
131
  if (!this.freshStart && !this.currentPlan && state.url) {
120
132
  this.currentPlan = Planner.getCachedPlan(state.url);
@@ -185,7 +197,7 @@ export class Planner extends PlannerBase {
185
197
  tag('success').log(`Planning complete! ${this.currentPlan.tests.length} tests in plan: ${this.currentPlan.title}`);
186
198
  tag('info').log(`Planning style: ${this.lastStyleName} (available: ${availableStyles})`);
187
199
  if (state.url)
188
- registerPlan(state.url, this.currentPlan, feature);
200
+ registerPlan(state.url, this.currentPlan, feature, state.hash);
189
201
  this.registerPlanInSession(this.currentPlan);
190
202
  return this.currentPlan;
191
203
  }
@@ -483,4 +495,3 @@ export class Planner extends PlannerBase {
483
495
  return conversation;
484
496
  }
485
497
  }
486
- //# sourceMappingURL=planner.js.map
@@ -537,4 +537,3 @@ export class Provider {
537
537
  }
538
538
  }
539
539
  export { AiError, Provider as AIProvider };
540
- //# sourceMappingURL=provider.js.map
@@ -207,4 +207,3 @@ Focus on what would confuse a real user or caused the agent to make mistakes.`;
207
207
  return content;
208
208
  }
209
209
  }
210
- //# sourceMappingURL=quartermaster.js.map
@@ -59,7 +59,7 @@ export function saveResearch(hash, text, combinedHtml) {
59
59
  }
60
60
  return researchFile;
61
61
  }
62
- export function findSimilarResearch(combinedHtml) {
62
+ function findSimilarMatch(combinedHtml) {
63
63
  const statesDir = getStatesDir();
64
64
  if (!existsSync(statesDir))
65
65
  return Promise.resolve(null);
@@ -76,13 +76,8 @@ export function findSimilarResearch(combinedHtml) {
76
76
  resolve(null);
77
77
  return;
78
78
  }
79
- debugLog(`Similar research found: ${matchHash} (${similarity}% similar)`);
80
- const research = getCachedResearch(matchHash);
81
- if (research) {
82
- resolve(research);
83
- return;
84
- }
85
- resolve(null);
79
+ debugLog(`Similar fingerprint found: ${matchHash} (${similarity}% similar)`);
80
+ resolve({ hash: matchHash, similarity });
86
81
  };
87
82
  worker.postMessage({
88
83
  html: combinedHtml,
@@ -92,4 +87,13 @@ export function findSimilarResearch(combinedHtml) {
92
87
  });
93
88
  });
94
89
  }
95
- //# sourceMappingURL=cache.js.map
90
+ export async function findSimilarResearch(combinedHtml) {
91
+ const match = await findSimilarMatch(combinedHtml);
92
+ if (!match)
93
+ return null;
94
+ return getCachedResearch(match.hash) || null;
95
+ }
96
+ export async function findSimilarStateHash(combinedHtml) {
97
+ const match = await findSimilarMatch(combinedHtml);
98
+ return match?.hash || null;
99
+ }
@@ -115,9 +115,11 @@ export function WithCoordinates(Base) {
115
115
  const text = aiResult.text || '';
116
116
  const rows = mdq(text).query('table').toJson();
117
117
  for (const row of rows) {
118
- const eidx = Number.parseInt(row.eidx, 10);
119
- if (Number.isNaN(eidx))
118
+ let eidx = (row.eidx || '').trim();
119
+ if (!eidx || eidx === '-')
120
120
  continue;
121
+ if (/^\d+$/.test(eidx))
122
+ eidx = `e${eidx}`;
121
123
  const val = (v) => (v && v !== '-' ? v : null);
122
124
  elements.set(eidx, {
123
125
  coordinates: val(row.Coordinates),
@@ -207,4 +209,3 @@ export function WithCoordinates(Base) {
207
209
  }
208
210
  };
209
211
  }
210
- //# sourceMappingURL=coordinates.js.map
@@ -68,7 +68,7 @@ export function WithDeepAnalysis(Base) {
68
68
  From this UI research, identify elements that could reveal hidden UI when clicked
69
69
  (dropdown menus, popups, expandable panels, accordion sections, overflow menus, tab switches).
70
70
 
71
- Available eidx numbers: ${eidxList}
71
+ Available eidx refs: ${eidxList}
72
72
 
73
73
  ${researchText}
74
74
 
@@ -76,7 +76,7 @@ export function WithDeepAnalysis(Base) {
76
76
  - Only pick elements that HIDE content until clicked (menus, dropdowns, accordions, tabs)
77
77
  - Skip regular links, data items, and navigation
78
78
  - For repeated elements (same expand button on every row), pick only the FIRST one
79
- - Respond with comma-separated eidx numbers only, e.g.: 3, 7, 15
79
+ - Respond with comma-separated eidx refs only, e.g.: e3, e7, e15
80
80
  `;
81
81
  const model = this.provider.getModelForAgent('researcher');
82
82
  const textCall = this.provider.chat([{ role: 'user', content: textPrompt }], model, {
@@ -87,7 +87,7 @@ export function WithDeepAnalysis(Base) {
87
87
  const screenshot = this.actionResult?.screenshot;
88
88
  if (screenshot && this.provider.hasVision()) {
89
89
  const visionPrompt = dedent `
90
- This screenshot has interactive elements labeled with eidx numbers (solid bordered boxes with numbers).
90
+ This screenshot has interactive elements labeled with eidx refs (solid bordered boxes with labels).
91
91
  Identify elements that could reveal hidden UI when clicked.
92
92
 
93
93
  Look for: overflow/ellipsis menus, chevron dropdowns, hamburger menus,
@@ -96,30 +96,27 @@ export function WithDeepAnalysis(Base) {
96
96
  Rules:
97
97
  - For repeated icons (same icon on every list row), pick only the FIRST one
98
98
  - Skip regular text buttons, links, and navigation items
99
- - Respond with comma-separated eidx numbers only, e.g.: 3, 7, 15
99
+ - Respond with comma-separated eidx refs only, e.g.: e3, e7, e15
100
100
  `;
101
101
  visionCall = this.provider.processImage(visionPrompt, screenshot.toString('base64'));
102
102
  }
103
103
  const [textRes, visionRes] = await Promise.all([textCall, visionCall]);
104
104
  const eidxSet = new Set();
105
+ const parseRefs = (text) => {
106
+ if (!text)
107
+ return [];
108
+ const matches = text.match(/e?\d+/g) || [];
109
+ const refs = matches.map((m) => (m.startsWith('e') ? m : `e${m}`));
110
+ return refs.filter((r) => allElements.has(r));
111
+ };
105
112
  for (const res of [textRes, visionRes]) {
106
- if (!res?.text)
107
- continue;
108
- const nums = res.text.match(/\d+/g)?.map(Number) || [];
109
- for (const n of nums) {
110
- if (allElements.has(n))
111
- eidxSet.add(n);
113
+ for (const ref of parseRefs(res?.text)) {
114
+ eidxSet.add(ref);
112
115
  }
113
116
  }
114
- const textNums = textRes?.text
115
- ?.match(/\d+/g)
116
- ?.map(Number)
117
- .filter((n) => allElements.has(n)) || [];
118
- const visionNums = visionRes?.text
119
- ?.match(/\d+/g)
120
- ?.map(Number)
121
- .filter((n) => allElements.has(n)) || [];
122
- debugLog(`Text model picked eidx: [${textNums.join(', ')}], Vision model picked eidx: [${visionNums.join(', ')}]`);
117
+ const textRefs = parseRefs(textRes?.text);
118
+ const visionRefs = parseRefs(visionRes?.text);
119
+ debugLog(`Text model picked eidx: [${textRefs.join(', ')}], Vision model picked eidx: [${visionRefs.join(', ')}]`);
123
120
  return [...eidxSet].map((eidx) => allElements.get(eidx));
124
121
  }
125
122
  _buildClickCommands(el) {
@@ -361,4 +358,3 @@ export function WithDeepAnalysis(Base) {
361
358
  }
362
359
  };
363
360
  }
364
- //# sourceMappingURL=deep-analysis.js.map
@@ -43,4 +43,3 @@ self.onmessage = (event) => {
43
43
  const matched = bestSimilarity >= threshold;
44
44
  self.postMessage({ matchHash: matched ? bestHash : null, similarity: bestSimilarity });
45
45
  };
46
- //# sourceMappingURL=fingerprint-worker.js.map
@@ -34,4 +34,3 @@ export function pickDefaultFocusedSection(sections) {
34
34
  const candidate = sections.find((s) => s.containerCss && !FOCUS_SKIP_SECTIONS.has(s.name.toLowerCase().replace(/^section:\s*/, '')));
35
35
  return candidate?.name || null;
36
36
  }
37
- //# sourceMappingURL=focus.js.map
@@ -126,7 +126,7 @@ export function WithLocators(Base) {
126
126
  for (const fixedSection of fixedSections) {
127
127
  const originalSections = parseResearchSections(result.text);
128
128
  const original = originalSections.find((s) => s.name === fixedSection.name);
129
- if (!original)
129
+ if (!original || original.elements.length === 0)
130
130
  continue;
131
131
  if (fixedSection.containerCss && fixedSection.containerCss !== original.containerCss) {
132
132
  debugLog(`Fixed container for "${fixedSection.name}": '${original.containerCss}' → '${fixedSection.containerCss}'`);
@@ -239,4 +239,3 @@ export function WithLocators(Base) {
239
239
  }
240
240
  };
241
241
  }
242
- //# sourceMappingURL=locators.js.map
@@ -1,3 +1,2 @@
1
1
  import { createDebug } from '../../utils/logger.js';
2
2
  export const debugLog = createDebug('explorbot:researcher');
3
- //# sourceMappingURL=mixin.js.map
@@ -37,8 +37,9 @@ export function mapRowToElement(row) {
37
37
  const name = stripQuotes(colMap.element || '');
38
38
  if (!name)
39
39
  return null;
40
- const eidxRaw = (colMap.eidx || '').trim();
41
- const eidxNum = eidxRaw ? Number.parseInt(eidxRaw, 10) : Number.NaN;
40
+ let eidxRaw = (colMap.eidx || '').trim();
41
+ if (eidxRaw && /^\d+$/.test(eidxRaw))
42
+ eidxRaw = `e${eidxRaw}`;
42
43
  const aria = parseAriaLocator(colMap.aria || '-');
43
44
  return {
44
45
  name,
@@ -49,7 +50,7 @@ export function mapRowToElement(row) {
49
50
  coordinates: (colMap.coordinates || '-').trim() === '-' ? null : colMap.coordinates.trim(),
50
51
  color: (colMap.color || '-').trim() === '-' || (colMap.color || '').trim() === '' ? null : colMap.color.trim(),
51
52
  icon: (colMap.icon || '-').trim() === '-' || (colMap.icon || '').trim() === '' ? null : colMap.icon.trim(),
52
- eidx: Number.isNaN(eidxNum) ? null : eidxNum,
53
+ eidx: eidxRaw && eidxRaw !== '-' ? eidxRaw : null,
53
54
  };
54
55
  }
55
56
  export function extractContainerFromBlockquote(sectionMarkdown) {
@@ -157,4 +158,3 @@ function formatSectionLine(s) {
157
158
  parts.push('**Focused**');
158
159
  return parts.join(' ');
159
160
  }
160
- //# sourceMappingURL=parser.js.map
@@ -62,6 +62,8 @@ export class ResearchResult {
62
62
  this.rebuildSectionInText(section);
63
63
  }
64
64
  rebuildSectionInText(section) {
65
+ if (section.elements.length === 0)
66
+ return;
65
67
  const newTable = rebuildSectionMarkdown(section);
66
68
  const escaped = section.name.replace(/"/g, '\\"');
67
69
  let sectionQuery = mdq(this.text).query(`section2(~"${escaped}")`);
@@ -107,4 +109,3 @@ export class ResearchResult {
107
109
  return [...ordered, ...rest];
108
110
  }
109
111
  }
110
- //# sourceMappingURL=research-result.js.map
@@ -98,9 +98,9 @@ export class Researcher extends ResearcherBase {
98
98
  setActivity(`${this.emoji} Researching...`, 'action');
99
99
  await this.ensureNavigated(state.url, screenshot && this.provider.hasVision());
100
100
  await this.hooksRunner.runBeforeHook('researcher', state.url);
101
- const annotatedCount = await this.explorer.annotateElements();
102
- debugLog(`Annotated ${annotatedCount} interactive elements with eidx`);
103
- this.actionResult = await this.explorer.createAction().capturePageState({ includeScreenshot: screenshot && this.provider.hasVision() });
101
+ const { ariaSnapshot, elements: annotatedElements } = await this.explorer.annotateElements();
102
+ debugLog(`Annotated ${annotatedElements.length} interactive elements with eidx`);
103
+ this.actionResult = await this.explorer.createAction().capturePageState({ includeScreenshot: screenshot && this.provider.hasVision(), ariaSnapshot });
104
104
  if (isErrorPage(this.actionResult)) {
105
105
  const recovered = await this.waitForPageLoad(screenshot);
106
106
  if (!recovered) {
@@ -117,7 +117,7 @@ export class Researcher extends ResearcherBase {
117
117
  }
118
118
  debugLog('Researching web page:', this.actionResult.url);
119
119
  const combinedHtml = await this.actionResult.combinedHtml();
120
- if (!deep) {
120
+ if (!deep && !force) {
121
121
  const similar = await findSimilarResearch(combinedHtml);
122
122
  if (similar) {
123
123
  tag('info').log('Similar research found, reusing cached result');
@@ -325,9 +325,10 @@ export class Researcher extends ResearcherBase {
325
325
  return false;
326
326
  try {
327
327
  await withRetry(async () => {
328
- await this.explorer.annotateElements();
328
+ const { ariaSnapshot } = await this.explorer.annotateElements();
329
329
  this.actionResult = await this.explorer.createAction().capturePageState({
330
330
  includeScreenshot: screenshot && this.provider.hasVision(),
331
+ ariaSnapshot,
331
332
  });
332
333
  if (isErrorPage(this.actionResult))
333
334
  throw new Error('Error page detected');
@@ -773,4 +774,3 @@ export class Researcher extends ResearcherBase {
773
774
  await action.execute(`I.pressKey('Escape')`);
774
775
  }
775
776
  }
776
- //# sourceMappingURL=researcher.js.map
@@ -365,4 +365,3 @@ export const actionRule = dedent `
365
365
 
366
366
  </actions>
367
367
  `;
368
- //# sourceMappingURL=rules.js.map
@@ -107,4 +107,3 @@ export class TaskAgent {
107
107
  this.recentToolCalls = [];
108
108
  }
109
109
  }
110
- //# sourceMappingURL=task-agent.js.map
@@ -837,4 +837,3 @@ export class Tester extends TaskAgent {
837
837
  };
838
838
  }
839
839
  }
840
- //# sourceMappingURL=tester.js.map
@@ -301,7 +301,11 @@ export function createCodeceptJSTools(explorer, task) {
301
301
  const previousState = ActionResult.fromState(stateManager.getCurrentState());
302
302
  const formLocator = codeLines[0] || 'form';
303
303
  const action = explorer.createAction();
304
+ const wasInIframe = await explorer.isInsideIframe();
304
305
  await action.attempt(codeBlock, explanation);
306
+ if (action.lastError && !wasInIframe && (await explorer.isInsideIframe())) {
307
+ await explorer.switchToMainFrame();
308
+ }
305
309
  const toolResult = await ActionResult.fromState(stateManager.getCurrentState()).toToolResult(previousState, formLocator);
306
310
  if (action.lastError) {
307
311
  const message = action.lastError ? String(action.lastError) : 'Unknown error';
@@ -977,4 +981,3 @@ function getNotFoundSuggestion(errorMessage) {
977
981
  4. Prefer ARIA locators: { "role": "button", "text": "visible text" }
978
982
  `;
979
983
  }
980
- //# sourceMappingURL=tools.js.map
@@ -88,4 +88,3 @@ export class ApiClient {
88
88
  resetRequestCounter();
89
89
  }
90
90
  }
91
- //# sourceMappingURL=api-client.js.map