explorbot 0.0.1 → 0.0.5

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 +679 -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 +19 -98
  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 +0 -1
  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 +0 -1
  41. package/dist/src/ai/planner.js +0 -1
  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 +0 -1
  45. package/dist/src/ai/researcher/coordinates.js +0 -1
  46. package/dist/src/ai/researcher/deep-analysis.js +0 -1
  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 +0 -1
  50. package/dist/src/ai/researcher/mixin.js +0 -1
  51. package/dist/src/ai/researcher/parser.js +0 -1
  52. package/dist/src/ai/researcher/research-result.js +0 -1
  53. package/dist/src/ai/researcher.js +0 -1
  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 +0 -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 +0 -1
  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 +2 -2
  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 +115 -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 +0 -1
  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 +0 -1
  119. package/dist/src/explorer.js +0 -1
  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 +0 -1
  150. package/dist/src/utils/xpath.js +0 -1
  151. package/package.json +27 -3
  152. package/src/action-result.ts +694 -0
  153. package/src/action.ts +445 -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 +141 -0
  172. package/src/ai/planner.ts +536 -0
  173. package/src/ai/provider.ts +613 -0
  174. package/src/ai/quartermaster.ts +286 -0
  175. package/src/ai/researcher/cache.ts +103 -0
  176. package/src/ai/researcher/coordinates.ts +238 -0
  177. package/src/ai/researcher/deep-analysis.ts +415 -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 +115 -0
  184. package/src/ai/researcher.ts +857 -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 +1117 -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 +128 -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 +41 -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 +490 -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 +713 -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 +145 -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
@@ -0,0 +1,457 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import dedent from 'dedent';
4
+ import { z } from 'zod';
5
+ import { ActionResult } from '../action-result.ts';
6
+ import { ConfigParser } from '../config.ts';
7
+ import { ExperienceTracker, type SessionExperienceEntry, type SessionStep } from '../experience-tracker.ts';
8
+ import { type Reporter, type ReporterStep } from '../reporter.ts';
9
+ import type { StateManager } from '../state-manager.ts';
10
+ import { type Plan, type Task, Test } from '../test-plan.ts';
11
+ import { createDebug, tag } from '../utils/logger.ts';
12
+ import type { Conversation, ToolExecution } from './conversation.ts';
13
+ import type { Provider } from './provider.ts';
14
+ import { extractStatePath } from '../utils/url-matcher.ts';
15
+ import { ASSERTION_TOOLS, CODECEPT_TOOLS } from './tools.ts';
16
+
17
+ const debugLog = createDebug('explorbot:historian');
18
+
19
+ export class Historian {
20
+ private provider: Provider;
21
+ private experienceTracker: ExperienceTracker;
22
+ private reporter?: Reporter;
23
+ private stateManager?: StateManager;
24
+
25
+ constructor(provider: Provider, experienceTracker?: ExperienceTracker, reporter?: Reporter, stateManager?: StateManager) {
26
+ this.provider = provider;
27
+ this.experienceTracker = experienceTracker || new ExperienceTracker();
28
+ this.reporter = reporter;
29
+ this.stateManager = stateManager;
30
+ }
31
+
32
+ async saveSession(task: Task, initialState: ActionResult, conversation: Conversation): Promise<void> {
33
+ debugLog('Saving session experience');
34
+
35
+ const result = this.determineResult(task);
36
+ const toolExecutions = conversation.getToolExecutions();
37
+
38
+ if (task instanceof Test) {
39
+ task.generatedCode = this.toCode(conversation, task.description);
40
+ }
41
+
42
+ const steps = await this.extractSteps(toolExecutions);
43
+ await this.detectRetryPatterns(toolExecutions, initialState);
44
+ const verifiedSteps = await this.verifySteps(steps, initialState);
45
+
46
+ if (verifiedSteps.length > 0) {
47
+ const relatedUrls = this.extractVisitedUrls(toolExecutions, initialState.url || '');
48
+ const entry: SessionExperienceEntry = {
49
+ scenario: task.description,
50
+ result,
51
+ steps: verifiedSteps,
52
+ relatedUrls,
53
+ };
54
+ this.experienceTracker.saveSessionExperience(initialState, entry);
55
+ }
56
+
57
+ if (task instanceof Test && result !== 'failed') {
58
+ await this.reportSession(task, steps);
59
+ }
60
+
61
+ tag('substep').log(`Historian saved session for: ${task.description}`);
62
+ }
63
+
64
+ private async reportSession(test: Test, steps: SessionStep[]): Promise<void> {
65
+ if (!this.reporter) return;
66
+
67
+ const reporterSteps: ReporterStep[] = steps.map((step) => ({
68
+ title: step.message,
69
+ status: step.status === 'passed' ? 'passed' : 'failed',
70
+ code: step.code ? step.code.split('\n').filter((l) => l.trim()) : [],
71
+ discovery: step.discovery,
72
+ }));
73
+
74
+ await this.reporter.reportSteps(test, reporterSteps);
75
+ }
76
+
77
+ private async extractSteps(toolExecutions: ToolExecution[]): Promise<SessionStep[]> {
78
+ const stepsWithDiffs: Array<{ step: SessionStep; ariaDiff: string | null; urlChanged: boolean }> = [];
79
+
80
+ for (const exec of toolExecutions) {
81
+ if (!CODECEPT_TOOLS.includes(exec.toolName as any)) continue;
82
+ if (!exec.output?.code) continue;
83
+ if (!exec.wasSuccessful) continue;
84
+
85
+ const message = this.getExecutionLabel(exec, `Executed ${exec.toolName}`);
86
+ const ariaDiff = exec.output?.pageDiff?.ariaChanges || null;
87
+ const urlChanged = exec.output?.pageDiff?.urlChanged || false;
88
+
89
+ const step: SessionStep = {
90
+ message,
91
+ status: 'passed',
92
+ tool: exec.toolName,
93
+ code: this.stripComments(exec.output.code),
94
+ };
95
+
96
+ stepsWithDiffs.push({ step, ariaDiff, urlChanged });
97
+ }
98
+
99
+ await this.analyzeDiscoveries(stepsWithDiffs);
100
+
101
+ return stepsWithDiffs.map((s) => s.step);
102
+ }
103
+
104
+ private async verifySteps(steps: SessionStep[], initialState: ActionResult): Promise<SessionStep[]> {
105
+ if (steps.length === 0) return [];
106
+
107
+ const existingExperience = this.experienceTracker
108
+ .getRelevantExperience(initialState)
109
+ .map((e) => e.content)
110
+ .filter(Boolean)
111
+ .join('\n');
112
+
113
+ const existingSummary = existingExperience.length > 2000 ? existingExperience.substring(0, 2000) : existingExperience;
114
+
115
+ const stepsList = steps.map((s, i) => `${i}. ${s.message}\n Code: ${s.code || 'none'}`).join('\n');
116
+ const prompt = dedent`
117
+ Review these test steps and determine which are valuable to save as experience
118
+ for future test executions on this page.
119
+
120
+ <steps>
121
+ ${stepsList}
122
+ </steps>
123
+
124
+ ${existingSummary ? `<existing_experience>\n${existingSummary}\n</existing_experience>` : ''}
125
+
126
+ For each step, determine if it is useful:
127
+ - NOT useful if it uses auto-generated or unstable locators (ember IDs, numeric data-testid, random IDs)
128
+ - NOT useful if it is already documented in existing experience
129
+ - NOT useful if it requires an unclear precondition that would not be reproducible
130
+ - NOT useful if it is trivial navigation (I.amOnPage) without meaningful context
131
+ - USEFUL if it demonstrates how to interact with a specific UI component (expand dropdown, fill form, etc)
132
+ - USEFUL if it shows a working approach for a common task on this page
133
+ `;
134
+
135
+ const schema = z.object({
136
+ steps: z.array(
137
+ z.object({
138
+ stepIndex: z.number(),
139
+ useful: z.boolean(),
140
+ })
141
+ ),
142
+ });
143
+
144
+ try {
145
+ const response = await this.provider.generateObject(
146
+ [
147
+ { role: 'system', content: 'Evaluate test steps for experience value. Be selective — only keep steps that teach something reusable.' },
148
+ { role: 'user', content: prompt },
149
+ ],
150
+ schema,
151
+ undefined,
152
+ { telemetryFunctionId: 'historian.verifySteps' }
153
+ );
154
+
155
+ const usefulIndices = new Set((response?.object?.steps || []).filter((s) => s.useful).map((s) => s.stepIndex));
156
+
157
+ const verified = steps.filter((_, i) => usefulIndices.has(i));
158
+ debugLog('Verified %d/%d steps as useful', verified.length, steps.length);
159
+ return verified;
160
+ } catch (error: any) {
161
+ debugLog('Step verification failed, keeping all steps: %s', error.message);
162
+ return steps;
163
+ }
164
+ }
165
+
166
+ private async detectRetryPatterns(toolExecutions: ToolExecution[], initialState: ActionResult): Promise<void> {
167
+ if (!this.experienceTracker || !this.stateManager) return;
168
+
169
+ const failedByTool = new Map<string, ToolExecution[]>();
170
+ const candidates: Array<{ failed: ToolExecution[]; success: ToolExecution }> = [];
171
+
172
+ for (const exec of toolExecutions) {
173
+ if (!CODECEPT_TOOLS.includes(exec.toolName as any)) continue;
174
+ if (!exec.output?.code) continue;
175
+
176
+ if (!exec.wasSuccessful) {
177
+ const bucket = failedByTool.get(exec.toolName) || [];
178
+ bucket.push(exec);
179
+ failedByTool.set(exec.toolName, bucket);
180
+ continue;
181
+ }
182
+
183
+ const failed = failedByTool.get(exec.toolName);
184
+ if (failed?.length) {
185
+ candidates.push({ failed: [...failed], success: exec });
186
+ failedByTool.set(exec.toolName, []);
187
+ }
188
+ }
189
+
190
+ if (candidates.length === 0) return;
191
+
192
+ const prompt = dedent`
193
+ Analyze these retry patterns where a tool failed multiple times before succeeding.
194
+ For each candidate, determine which failed attempts were trying to do the same thing as the success.
195
+
196
+ ${candidates
197
+ .map(
198
+ (c, i) => dedent`
199
+ Candidate ${i}:
200
+ Failed attempts:
201
+ ${c.failed.map((f, j) => ` ${j}: ${this.getExecutionLabel(f, f.toolName)} → code: ${f.output?.code}`).join('\n')}
202
+ Succeeded:
203
+ ${this.getExecutionLabel(c.success, c.success.toolName)} → code: ${c.success.output.code}
204
+ `
205
+ )
206
+ .join('\n\n')}
207
+
208
+ For each candidate where failures share the same intent as the success:
209
+ - candidateIndex: index of the candidate
210
+ - failedIndices: which failed attempts share the same intent
211
+ - intent: business-focused description of what was being done
212
+ - explanation: actionable tip explaining which element works and what to avoid
213
+ `;
214
+
215
+ const schema = z.object({
216
+ retryPatterns: z.array(
217
+ z.object({
218
+ candidateIndex: z.number(),
219
+ failedIndices: z.array(z.number()),
220
+ intent: z.string(),
221
+ explanation: z.string(),
222
+ })
223
+ ),
224
+ });
225
+
226
+ try {
227
+ const response = await this.provider.generateObject(
228
+ [
229
+ { role: 'system', content: 'Analyze retry patterns in web testing tool executions. Identify when failed attempts share the same intent as a successful one.' },
230
+ { role: 'user', content: prompt },
231
+ ],
232
+ schema
233
+ );
234
+
235
+ for (const pattern of response?.object?.retryPatterns || []) {
236
+ const candidate = candidates[pattern.candidateIndex];
237
+ if (!candidate) continue;
238
+
239
+ const url = candidate.success.output?.pageDiff?.currentUrl;
240
+ let state: ActionResult = initialState;
241
+
242
+ if (url && url !== initialState.url) {
243
+ const transition = this.stateManager.getLastVisitToPath(url);
244
+ if (transition) {
245
+ state = ActionResult.fromState(transition.toState);
246
+ }
247
+ }
248
+
249
+ await this.experienceTracker.saveSuccessfulResolution(state, pattern.intent, candidate.success.output.code, pattern.explanation);
250
+ }
251
+
252
+ debugLog('Detected %d retry patterns', response?.object?.retryPatterns?.length || 0);
253
+ } catch (error: any) {
254
+ debugLog('Failed to detect retry patterns: %s', error.message);
255
+ }
256
+ }
257
+
258
+ private async analyzeDiscoveries(stepsWithDiffs: Array<{ step: SessionStep; ariaDiff: string | null; urlChanged: boolean }>): Promise<void> {
259
+ if (!stepsWithDiffs.some((s) => s.ariaDiff)) return;
260
+
261
+ const prompt = this.buildDiscoveryPrompt(stepsWithDiffs);
262
+
263
+ const schema = z.object({
264
+ discoveries: z.array(
265
+ z.object({
266
+ stepNumber: z.number(),
267
+ discoveries: z.array(z.string()),
268
+ })
269
+ ),
270
+ });
271
+
272
+ try {
273
+ const response = await this.provider.generateObject(
274
+ [
275
+ { role: 'system', content: 'Analyze test execution steps and identify valuable UI discoveries. Return multiple discoveries per step when multiple new elements appear. Return no discoveries for steps with no meaningful changes.' },
276
+ { role: 'user', content: prompt },
277
+ ],
278
+ schema
279
+ );
280
+
281
+ for (const { stepNumber, discoveries } of response?.object?.discoveries || []) {
282
+ const stepIndex = stepNumber - 1;
283
+ if (!stepsWithDiffs[stepIndex]) continue;
284
+ if (discoveries.length === 0) continue;
285
+ stepsWithDiffs[stepIndex].step.discovery = discoveries.join('\n');
286
+ }
287
+ } catch (error: any) {
288
+ debugLog('Failed to analyze discoveries: %s', error.message);
289
+ }
290
+ }
291
+
292
+ private buildDiscoveryPrompt(stepsWithDiffs: Array<{ step: SessionStep; ariaDiff: string | null; urlChanged: boolean }>): string {
293
+ let prompt = dedent`
294
+ Review these test steps and their ARIA diffs. Identify new UI elements that appeared
295
+ which could be valuable for:
296
+ - Deeper testing of this feature
297
+ - Related features that can be triggered from this flow
298
+
299
+ IMPORTANT:
300
+ - Return MULTIPLE discoveries per step when multiple new elements appear (e.g., if 3 buttons appeared, return an array with 3 discoveries for that step)
301
+ - Return NO discoveries (empty array) for a step if nothing new appeared or if elements were already discovered in previous steps
302
+ - Only include steps that have discoveries
303
+
304
+ Steps:
305
+ `;
306
+
307
+ for (let i = 0; i < stepsWithDiffs.length; i++) {
308
+ const { step, ariaDiff, urlChanged } = stepsWithDiffs[i];
309
+ prompt += `\n\nStep ${i + 1}: ${step.message}`;
310
+ if (ariaDiff) {
311
+ prompt += `\n${ariaDiff}`;
312
+ }
313
+ }
314
+
315
+ prompt += dedent`
316
+
317
+ Return discoveries in format:
318
+ - stepNumber: which step revealed these elements
319
+ - discoveries: array of brief descriptions like ["A new button appeared: Publish To Twitter", "A new input field appeared: Description"]
320
+
321
+ Only return elements that are actionable and could lead to new test scenarios.
322
+ Ignore generic UI changes (loading spinners, timestamps, etc).
323
+ If errors or warnings appeared in the step, include them in the discoveries array.
324
+ If multiple buttons, inputs, links, or other actionable elements appeared in the same step, include all of them in the discoveries array.
325
+ `;
326
+
327
+ return prompt;
328
+ }
329
+
330
+ private determineResult(task: Task): 'success' | 'partial' | 'failed' {
331
+ if ('isSuccessful' in task && (task as any).isSuccessful) return 'success';
332
+ if ('hasAchievedAny' in task && (task as any).hasAchievedAny()) return 'partial';
333
+
334
+ const hasPassedNotes = Object.values(task.notes).some((n) => n.status === 'passed');
335
+ if (hasPassedNotes) return 'partial';
336
+ return 'failed';
337
+ }
338
+
339
+ private extractVisitedUrls(toolExecutions: ToolExecution[], initialUrl: string): string[] {
340
+ const urls = new Set<string>();
341
+ const initialPath = extractStatePath(initialUrl);
342
+
343
+ for (const exec of toolExecutions) {
344
+ const currentUrl = exec.output?.pageDiff?.currentUrl;
345
+ if (!currentUrl) continue;
346
+
347
+ const relativePath = extractStatePath(currentUrl);
348
+ if (relativePath && relativePath !== initialPath) {
349
+ urls.add(relativePath);
350
+ }
351
+ }
352
+
353
+ return [...urls];
354
+ }
355
+
356
+ toCode(conversation: Conversation, scenario: string): string {
357
+ const toolExecutions = conversation.getToolExecutions();
358
+ const TRACKABLE_TOOLS = [...CODECEPT_TOOLS, ...ASSERTION_TOOLS];
359
+ const successfulSteps = toolExecutions.filter((exec) => exec.wasSuccessful && TRACKABLE_TOOLS.includes(exec.toolName as any) && exec.output?.code);
360
+
361
+ if (successfulSteps.length === 0) {
362
+ return '';
363
+ }
364
+
365
+ const lines: string[] = [];
366
+ lines.push(`Scenario('${this.escapeString(scenario)}', ({ I }) => {`);
367
+
368
+ for (const exec of successfulSteps) {
369
+ const explanation = this.getExecutionLabel(exec);
370
+ if (explanation) {
371
+ lines.push('');
372
+ lines.push(` Section('${this.escapeString(explanation)}');`);
373
+ }
374
+ const code = this.stripComments(exec.output.code);
375
+ const codeLines = code.includes('\n') ? code.split('\n') : code.split('; ');
376
+ for (const codeLine of codeLines) {
377
+ const trimmed = codeLine.trim();
378
+ if (trimmed) {
379
+ lines.push(` ${trimmed}`);
380
+ }
381
+ }
382
+ }
383
+
384
+ lines.push('});');
385
+ return lines.join('\n');
386
+ }
387
+
388
+ savePlanToFile(plan: Plan): string {
389
+ const lines: string[] = [];
390
+
391
+ lines.push(`import step, { Section } from 'codeceptjs/steps';`);
392
+ lines.push('');
393
+ lines.push(`Feature('${this.escapeString(plan.title)}')`);
394
+ lines.push('');
395
+
396
+ const startUrl = plan.url || plan.tests[0]?.startUrl;
397
+ if (startUrl) {
398
+ lines.push('Before(({ I }) => {');
399
+ lines.push(` I.amOnPage('${this.escapeString(startUrl)}');`);
400
+ lines.push('});');
401
+ lines.push('');
402
+ }
403
+
404
+ for (const test of plan.tests) {
405
+ if (test.generatedCode) {
406
+ if (test.isSuccessful) {
407
+ lines.push(test.generatedCode);
408
+ } else {
409
+ lines.push(`// FAILED: ${test.scenario}`);
410
+ lines.push(test.generatedCode.replace(/Scenario\(/, 'Scenario.skip('));
411
+ }
412
+ lines.push('');
413
+ continue;
414
+ }
415
+
416
+ lines.push(`Scenario.todo('${this.escapeString(test.scenario)}', ({ I }) => {`);
417
+ if (test.plannedSteps.length > 0) {
418
+ for (const step of test.plannedSteps) {
419
+ lines.push(` // ${step}`);
420
+ }
421
+ } else {
422
+ lines.push(` // ${test.scenario}`);
423
+ }
424
+ lines.push('});');
425
+ lines.push('');
426
+ }
427
+
428
+ const outputDir = ConfigParser.getInstance().getOutputDir();
429
+ const testsDir = join(outputDir, 'tests');
430
+ mkdirSync(testsDir, { recursive: true });
431
+
432
+ const filename = plan.title.replace(/[^a-zA-Z0-9]/g, '_').toLowerCase();
433
+ const filePath = join(testsDir, `${filename}.js`);
434
+ writeFileSync(filePath, lines.join('\n'));
435
+
436
+ tag('substep').log(`Saved plan tests to: ${filePath}`);
437
+ return filePath;
438
+ }
439
+
440
+ private getExecutionLabel(exec: ToolExecution, fallback?: string): string {
441
+ return exec.input?.explanation || exec.input?.assertion || exec.input?.note || fallback || '';
442
+ }
443
+
444
+ private escapeString(str: string): string {
445
+ return str.replace(/'/g, "\\'").replace(/\n/g, ' ');
446
+ }
447
+
448
+ private stripComments(code: string): string {
449
+ return code
450
+ .split('\n')
451
+ .filter((line) => {
452
+ const trimmed = line.trim();
453
+ return trimmed && !trimmed.startsWith('//') && !trimmed.startsWith('/*') && !trimmed.startsWith('*');
454
+ })
455
+ .join('\n');
456
+ }
457
+ }