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
package/src/config.ts ADDED
@@ -0,0 +1,491 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync } from 'node:fs';
2
+ import path, { dirname, join, resolve } from 'node:path';
3
+ import { parseEnv } from 'node:util';
4
+ import { log } from './utils/logger.js';
5
+
6
+ interface PlaywrightConfig {
7
+ browser: 'chromium' | 'firefox' | 'webkit';
8
+ url: string;
9
+ show?: boolean;
10
+ windowSize?: string;
11
+ slowMo?: number;
12
+ chromium?: {
13
+ args?: string[];
14
+ };
15
+ firefox?: {
16
+ args?: string[];
17
+ };
18
+ webkit?: {
19
+ args?: string[];
20
+ };
21
+ timeout?: number;
22
+ waitForAction?: number;
23
+ waitForNavigation?: 'load' | 'domcontentloaded' | 'networkidle';
24
+ waitForTimeout?: number;
25
+ ignoreHTTPSErrors?: boolean;
26
+ userAgent?: string;
27
+ viewport?: {
28
+ width: number;
29
+ height: number;
30
+ };
31
+ args?: string[];
32
+ }
33
+
34
+ type PlaywrightHookFn = (ctx: { page: any; url: string }) => Promise<void> | void;
35
+ type CodeceptJSHookFn = (ctx: { I: any; url: string }) => Promise<void> | void;
36
+
37
+ interface PlaywrightHook {
38
+ type: 'playwright';
39
+ hook: PlaywrightHookFn;
40
+ }
41
+
42
+ interface CodeceptJSHook {
43
+ type: 'codeceptjs';
44
+ hook: CodeceptJSHookFn;
45
+ }
46
+
47
+ type Hook = PlaywrightHook | CodeceptJSHook;
48
+ type HookPatternMap = Record<string, Hook>;
49
+ type HookConfig = Hook | HookPatternMap;
50
+
51
+ interface HooksConfig {
52
+ beforeHook?: HookConfig;
53
+ afterHook?: HookConfig;
54
+ }
55
+
56
+ interface AgentConfig extends HooksConfig {
57
+ model?: any;
58
+ enabled?: boolean;
59
+ systemPrompt?: string;
60
+ rules?: RuleEntry[];
61
+ providerOptions?: Record<string, any>;
62
+ }
63
+
64
+ interface ResearcherAgentConfig extends AgentConfig {
65
+ excludeSelectors?: string[];
66
+ includeSelectors?: string[];
67
+ stopWords?: string[];
68
+ maxElementsToExplore?: number;
69
+ maxExpandableClicks?: number;
70
+ retries?: number;
71
+ sections?: string[];
72
+ errorPageTimeout?: number;
73
+ }
74
+
75
+ interface TesterAgentConfig extends AgentConfig {
76
+ progressCheckInterval?: number;
77
+ }
78
+
79
+ interface PilotAgentConfig extends AgentConfig {
80
+ stepsToReview?: number;
81
+ }
82
+
83
+ interface NavigatorAgentConfig extends AgentConfig {
84
+ addHtmlOnTry?: number;
85
+ maxAttempts?: number;
86
+ }
87
+
88
+ interface PlannerAgentConfig extends AgentConfig {
89
+ styles?: string[];
90
+ stylesDir?: string;
91
+ }
92
+
93
+ interface AgentsConfig {
94
+ tester?: TesterAgentConfig;
95
+ navigator?: NavigatorAgentConfig;
96
+ researcher?: ResearcherAgentConfig;
97
+ planner?: PlannerAgentConfig;
98
+ pilot?: PilotAgentConfig;
99
+ 'experience-compactor'?: AgentConfig;
100
+ captain?: AgentConfig;
101
+ quartermaster?: AgentConfig;
102
+ historian?: AgentConfig;
103
+ fisherman?: AgentConfig;
104
+ chief?: AgentConfig;
105
+ curler?: AgentConfig;
106
+ }
107
+
108
+ interface AIConfig {
109
+ model: any;
110
+ apiKey?: string;
111
+ config?: Record<string, any>;
112
+ langfuse?: {
113
+ enabled?: boolean;
114
+ publicKey?: string;
115
+ secretKey?: string;
116
+ baseUrl?: string;
117
+ };
118
+ tools?: {
119
+ enabled: boolean;
120
+ maxConcurrency: number;
121
+ timeout: number;
122
+ };
123
+ vision?: boolean;
124
+ visionModel?: any;
125
+ agenticModel?: any;
126
+ maxAttempts?: number;
127
+ retryDelay?: number;
128
+ agents?: AgentsConfig;
129
+ }
130
+
131
+ interface HtmlConfig {
132
+ minimal?: {
133
+ include?: string[];
134
+ exclude?: string[];
135
+ };
136
+ combined?: {
137
+ include?: string[];
138
+ exclude?: string[];
139
+ };
140
+ text?: {
141
+ include?: string[];
142
+ exclude?: string[];
143
+ };
144
+ }
145
+
146
+ interface ActionConfig {
147
+ delay?: number;
148
+ retries?: number;
149
+ }
150
+
151
+ interface ReporterConfig {
152
+ enabled?: boolean;
153
+ html?: boolean;
154
+ }
155
+
156
+ type ApiHookFn = (ctx: { headers: Record<string, string>; baseEndpoint: string }) => Promise<Record<string, string> | undefined> | Record<string, string> | undefined;
157
+
158
+ interface ApiConfig {
159
+ baseEndpoint?: string;
160
+ spec?: string[];
161
+ headers?: Record<string, string>;
162
+ bootstrap?: ApiHookFn;
163
+ teardown?: ApiHookFn;
164
+ }
165
+
166
+ interface WebConfig {
167
+ url: string;
168
+ }
169
+
170
+ interface ExplorbotConfig {
171
+ web?: WebConfig;
172
+ playwright: PlaywrightConfig;
173
+ ai: AIConfig;
174
+ html?: HtmlConfig;
175
+ action?: ActionConfig;
176
+ dirs?: {
177
+ knowledge: string;
178
+ experience: string;
179
+ output: string;
180
+ };
181
+ experience?: {
182
+ maxReadLines?: number;
183
+ };
184
+ reporter?: ReporterConfig;
185
+ api?: ApiConfig;
186
+ stepsFile?: string;
187
+ files?: Record<string, string>;
188
+ dynamicPageRegex?: string;
189
+ }
190
+
191
+ const config: ExplorbotConfig = {
192
+ playwright: {
193
+ browser: 'chromium',
194
+ url: 'http://localhost:3000',
195
+ },
196
+
197
+ ai: {
198
+ model: null as any,
199
+ },
200
+ };
201
+
202
+ type RuleEntry = string | Record<string, string>;
203
+
204
+ export const EXPLORBOT_CONFIG_PATHS = ['explorbot.config.js', 'explorbot.config.mjs', 'explorbot.config.ts'];
205
+
206
+ export type {
207
+ ExplorbotConfig,
208
+ PlaywrightConfig,
209
+ AIConfig,
210
+ HtmlConfig,
211
+ ActionConfig,
212
+ AgentConfig,
213
+ AgentsConfig,
214
+ ResearcherAgentConfig,
215
+ NavigatorAgentConfig,
216
+ PlannerAgentConfig,
217
+ Hook,
218
+ HookConfig,
219
+ HooksConfig,
220
+ PlaywrightHook,
221
+ CodeceptJSHook,
222
+ HookPatternMap,
223
+ RuleEntry,
224
+ ReporterConfig,
225
+ ApiConfig,
226
+ WebConfig,
227
+ ApiHookFn,
228
+ };
229
+
230
+ export class ConfigParser {
231
+ private static instance: ConfigParser;
232
+ private config: ExplorbotConfig | null = null;
233
+ private configPath: string | null = null;
234
+
235
+ private constructor() {}
236
+
237
+ public static loadEnv(filePath: string): void {
238
+ const resolved = resolve(filePath);
239
+ if (!existsSync(resolved)) return;
240
+ Object.assign(process.env, parseEnv(readFileSync(resolved, 'utf8')));
241
+ }
242
+
243
+ public static getInstance(): ConfigParser {
244
+ if (!ConfigParser.instance) {
245
+ ConfigParser.instance = new ConfigParser();
246
+ }
247
+ return ConfigParser.instance;
248
+ }
249
+
250
+ public async loadConfig(options?: {
251
+ config?: string;
252
+ path?: string;
253
+ }): Promise<ExplorbotConfig> {
254
+ if (this.config && !options?.config && !options?.path) {
255
+ return this.config;
256
+ }
257
+
258
+ // Store the initial working directory for reference
259
+ if (!process.env.INITIAL_CWD) {
260
+ process.env.INITIAL_CWD = process.cwd();
261
+ }
262
+
263
+ const originalCwd = process.cwd();
264
+ if (options?.path) {
265
+ const resolvedWorkingPath = resolve(options.path);
266
+ process.chdir(resolvedWorkingPath);
267
+ }
268
+
269
+ ConfigParser.loadEnv('.env');
270
+
271
+ try {
272
+ const resolvedPath = options?.config || this.findConfigFile();
273
+
274
+ if (!resolvedPath) {
275
+ throw new Error('No configuration file found. Please create explorbot.config.js or explorbot.config.ts');
276
+ }
277
+
278
+ const configModule = await this.loadConfigModule(resolvedPath);
279
+ const loadedConfig = configModule.default || configModule;
280
+
281
+ if (!loadedConfig) {
282
+ throw new Error('Configuration file is empty or invalid');
283
+ }
284
+
285
+ this.config = this.resolveConfig(loadedConfig as ExplorbotConfig);
286
+ this.configPath = resolvedPath;
287
+
288
+ log(`Configuration loaded from: ${resolvedPath}`);
289
+
290
+ // Restore original directory after successful config load
291
+ if (options?.path && originalCwd !== process.cwd()) {
292
+ process.chdir(originalCwd);
293
+ }
294
+
295
+ return this.config;
296
+ } catch (error) {
297
+ // Restore original directory on error
298
+ if (options?.path && originalCwd !== process.cwd()) {
299
+ process.chdir(originalCwd);
300
+ }
301
+ throw new Error(`Failed to load configuration: ${error}`);
302
+ }
303
+ }
304
+
305
+ public getConfig(): ExplorbotConfig {
306
+ if (!this.config) {
307
+ throw new Error('Configuration not loaded. Call loadConfig() first.');
308
+ }
309
+ return this.config;
310
+ }
311
+
312
+ public getConfigPath(): string | null {
313
+ return this.configPath;
314
+ }
315
+
316
+ public getOutputDir(): string {
317
+ const config = this.getConfig();
318
+ const configPath = this.getConfigPath();
319
+ if (!configPath) throw new Error('Config path not found');
320
+ return path.join(path.dirname(configPath), config.dirs?.output || 'output');
321
+ }
322
+
323
+ public getStatesDir(): string {
324
+ return outputPath('states');
325
+ }
326
+
327
+ public getPlansDir(): string {
328
+ return outputPath('plans');
329
+ }
330
+
331
+ // For testing purposes only
332
+ public static resetForTesting(): void {
333
+ if (ConfigParser.instance) {
334
+ ConfigParser.instance.config = null;
335
+ ConfigParser.instance.configPath = null;
336
+ }
337
+ }
338
+
339
+ // For testing purposes only - sets up minimal default config
340
+ public static setupTestConfig(): void {
341
+ const instance = ConfigParser.getInstance();
342
+ // Create unique directory names for this test run to ensure isolation
343
+ const testId = `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
344
+ const testBaseDir = join(process.cwd(), 'test-dirs', testId);
345
+
346
+ instance.config = {
347
+ playwright: {
348
+ url: 'https://example.com',
349
+ browser: 'chromium',
350
+ show: false,
351
+ },
352
+ ai: {
353
+ model: { modelId: 'test-model', provider: 'test' },
354
+ config: {},
355
+ vision: false,
356
+ },
357
+ dirs: {
358
+ knowledge: join(testBaseDir, 'knowledge'),
359
+ experience: join(testBaseDir, 'experience'),
360
+ output: join(testBaseDir, 'output'),
361
+ },
362
+ };
363
+ instance.configPath = join(testBaseDir, 'test-config');
364
+ }
365
+
366
+ // For testing purposes only - get test directories for cleanup
367
+ public static getTestDirectories(): string[] {
368
+ const instance = ConfigParser.getInstance();
369
+ if (!instance.config?.dirs) return [];
370
+
371
+ return [instance.config.dirs.knowledge, instance.config.dirs.experience, instance.config.dirs.output, dirname(instance.configPath || '')].filter((dir) => dir?.includes('test-dirs'));
372
+ }
373
+
374
+ // For testing purposes only - clean up all test directories
375
+ public static cleanupAllTestDirectories(): void {
376
+ try {
377
+ const testDirsBase = join(process.cwd(), 'test-dirs');
378
+ if (existsSync(testDirsBase)) {
379
+ rmSync(testDirsBase, { recursive: true, force: true });
380
+ }
381
+ } catch (error) {
382
+ // Ignore cleanup errors
383
+ }
384
+ }
385
+
386
+ private findConfigFile(): string | null {
387
+ const possiblePaths = [...EXPLORBOT_CONFIG_PATHS, 'config/explorbot.config.js', 'config/explorbot.config.mjs', 'config/explorbot.config.ts', 'src/config/explorbot.config.js', 'src/config/explorbot.config.mjs', 'src/config/explorbot.config.ts'];
388
+
389
+ for (const path of possiblePaths) {
390
+ const fullPath = resolve(process.cwd(), path);
391
+ if (existsSync(fullPath)) {
392
+ return fullPath;
393
+ }
394
+ }
395
+
396
+ return null;
397
+ }
398
+
399
+ private async loadConfigModule(configPath: string): Promise<any> {
400
+ const ext = configPath.split('.').pop();
401
+
402
+ if (ext === 'ts') {
403
+ try {
404
+ const module = await import(configPath);
405
+ return module;
406
+ } catch (error) {
407
+ const require = (await import('node:module')).createRequire(import.meta.url);
408
+ return require(configPath);
409
+ }
410
+ } else if (ext === 'js' || ext === 'mjs') {
411
+ const module = await import(configPath);
412
+ return module;
413
+ } else {
414
+ const content = readFileSync(configPath, 'utf8');
415
+ return JSON.parse(content);
416
+ }
417
+ }
418
+
419
+ private resolveConfig(config: ExplorbotConfig): ExplorbotConfig {
420
+ if (config.web?.url && !config.playwright?.url) {
421
+ config.playwright = config.playwright || { browser: 'chromium', url: '' };
422
+ config.playwright.url = config.web.url;
423
+ }
424
+ return config;
425
+ }
426
+
427
+ public validateConfig(config: ExplorbotConfig): void {
428
+ if (!config.ai?.model) {
429
+ throw new Error('Missing required configuration field: ai.model');
430
+ }
431
+
432
+ const url = config.playwright?.url || config.web?.url;
433
+ if (!url) {
434
+ throw new Error('Missing required configuration: web.url or playwright.url');
435
+ }
436
+
437
+ try {
438
+ new URL(url);
439
+ } catch {
440
+ throw new Error(`Invalid URL in configuration: ${url}`);
441
+ }
442
+ }
443
+
444
+ private getNestedValue(obj: any, path: string): any {
445
+ return path.split('.').reduce((current, key) => current?.[key], obj);
446
+ }
447
+
448
+ public mergeWithDefaults(config: Partial<ExplorbotConfig>): ExplorbotConfig {
449
+ const defaults = {
450
+ playwright: {
451
+ browser: 'chromium',
452
+ show: false, // we need headless
453
+ },
454
+ action: {
455
+ delay: 1000,
456
+ retries: 3,
457
+ },
458
+ dirs: {
459
+ knowledge: 'knowledge',
460
+ experience: 'experience',
461
+ output: 'output',
462
+ },
463
+ };
464
+
465
+ return this.deepMerge(defaults, config);
466
+ }
467
+
468
+ private deepMerge(target: any, source: any): any {
469
+ const result = { ...target };
470
+
471
+ for (const key in source) {
472
+ if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key]) && source[key].constructor === Object) {
473
+ result[key] = this.deepMerge(result[key] || {}, source[key]);
474
+ } else {
475
+ result[key] = source[key];
476
+ }
477
+ }
478
+
479
+ return result;
480
+ }
481
+
482
+ public ensureDirectory(path: string): void {
483
+ if (!existsSync(path)) {
484
+ mkdirSync(path, { recursive: true });
485
+ }
486
+ }
487
+ }
488
+
489
+ export function outputPath(...segments: string[]): string {
490
+ return path.join(ConfigParser.getInstance().getOutputDir(), ...segments);
491
+ }
@@ -0,0 +1,109 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import * as readline from 'node:readline';
3
+ import { clearActivity } from './activity.ts';
4
+
5
+ export type InputCallback = (prompt: string) => Promise<string | null>;
6
+
7
+ export class ExecutionController extends EventEmitter {
8
+ private static instance: ExecutionController;
9
+ private interrupted = false;
10
+ private inputCallback: InputCallback | null = null;
11
+ private interruptResolvers: Array<() => void> = [];
12
+ private abortController: AbortController | null = null;
13
+
14
+ private constructor() {
15
+ super();
16
+ }
17
+
18
+ static getInstance(): ExecutionController {
19
+ if (!ExecutionController.instance) {
20
+ ExecutionController.instance = new ExecutionController();
21
+ }
22
+ return ExecutionController.instance;
23
+ }
24
+
25
+ setInputCallback(callback: InputCallback): void {
26
+ this.inputCallback = callback;
27
+ }
28
+
29
+ startExecution(): void {
30
+ this.interrupted = false;
31
+ this.abortController = new AbortController();
32
+ }
33
+
34
+ getAbortSignal(): AbortSignal | undefined {
35
+ return this.abortController?.signal;
36
+ }
37
+
38
+ interrupt(): void {
39
+ clearActivity();
40
+ if (this.interrupted) return;
41
+ this.interrupted = true;
42
+ this.abortController?.abort();
43
+ this.emit('interrupt');
44
+ for (const resolve of this.interruptResolvers) {
45
+ resolve();
46
+ }
47
+ this.interruptResolvers = [];
48
+ this.emit('idle');
49
+ }
50
+
51
+ isInterrupted(): boolean {
52
+ return this.interrupted;
53
+ }
54
+
55
+ waitForInterrupt(): Promise<void> {
56
+ if (this.interrupted) {
57
+ return Promise.resolve();
58
+ }
59
+ return new Promise<void>((resolve) => {
60
+ this.interruptResolvers.push(resolve);
61
+ });
62
+ }
63
+
64
+ async checkInterrupt(): Promise<string | null> {
65
+ if (!this.interrupted) return null;
66
+
67
+ const userInput = await this.requestInput('Execution interrupted. What should we do instead?');
68
+ this.interrupted = false;
69
+ return userInput;
70
+ }
71
+
72
+ async handleInterrupt(prompt?: string): Promise<string | null> {
73
+ const message = prompt || 'Execution interrupted. Enter new instruction (or "stop"/"exit" to cancel):';
74
+ const userInput = await this.requestInput(message);
75
+ this.interrupted = false;
76
+ return userInput;
77
+ }
78
+
79
+ async requestInput(prompt: string): Promise<string | null> {
80
+ if (this.inputCallback) {
81
+ return await this.inputCallback(prompt);
82
+ }
83
+
84
+ return await this.readlineInput(prompt);
85
+ }
86
+
87
+ private async readlineInput(prompt: string): Promise<string | null> {
88
+ const rl = readline.createInterface({
89
+ input: process.stdin,
90
+ output: process.stdout,
91
+ });
92
+
93
+ return new Promise<string | null>((resolve) => {
94
+ rl.question(`${prompt}\n> `, (answer) => {
95
+ rl.close();
96
+ const trimmed = answer.trim();
97
+ resolve(trimmed || null);
98
+ });
99
+ });
100
+ }
101
+
102
+ reset(): void {
103
+ this.interrupted = false;
104
+ this.interruptResolvers = [];
105
+ this.abortController = null;
106
+ }
107
+ }
108
+
109
+ export const executionController = ExecutionController.getInstance();