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,127 @@
1
+ import { marked } from 'marked';
2
+
3
+ export interface MarkdownSection {
4
+ name: string;
5
+ depth: number;
6
+ rawMarkdown: string;
7
+ }
8
+
9
+ export function parseSections(markdown: string, opts?: { minDepth?: number; maxDepth?: number }): MarkdownSection[] {
10
+ const { minDepth = 2, maxDepth = 3 } = opts || {};
11
+ const tokens = marked.lexer(markdown);
12
+ const sections: MarkdownSection[] = [];
13
+ let current: MarkdownSection | null = null;
14
+
15
+ for (const token of tokens) {
16
+ const depth = (token as any).depth;
17
+ if (token.type === 'heading' && depth >= minDepth && depth <= maxDepth) {
18
+ current = { name: (token as any).text, depth, rawMarkdown: (token as any).raw };
19
+ sections.push(current);
20
+ continue;
21
+ }
22
+ if (current) {
23
+ current.rawMarkdown += (token as any).raw || '';
24
+ }
25
+ }
26
+
27
+ return sections;
28
+ }
29
+
30
+ export function extractLabeledCode(markdown: string, labelPattern: RegExp): string | null {
31
+ const tokens = marked.lexer(markdown);
32
+ let expectValueInNext = false;
33
+
34
+ for (const token of tokens) {
35
+ if (token.type === 'heading' && labelPattern.test((token as any).text || '')) {
36
+ expectValueInNext = true;
37
+ continue;
38
+ }
39
+
40
+ if (expectValueInNext) {
41
+ if (token.type === 'code') {
42
+ const val = ((token as any).text as string).trim();
43
+ if (val && !val.includes('\n')) return val;
44
+ expectValueInNext = false;
45
+ continue;
46
+ }
47
+ if (token.type === 'paragraph') {
48
+ const codespan = ((token as any).tokens || []).find((t: any) => t.type === 'codespan');
49
+ if (codespan) return codespan.text;
50
+ expectValueInNext = false;
51
+ }
52
+ if (token.type !== 'space') expectValueInNext = false;
53
+ }
54
+
55
+ if (token.type === 'paragraph' || token.type === 'blockquote') {
56
+ const raw = (token as any).raw || '';
57
+ if (!labelPattern.test(raw)) continue;
58
+
59
+ const codespans = ((token as any).tokens || []).filter((t: any) => t.type === 'codespan');
60
+ if (codespans.length > 0) return codespans[codespans.length - 1].text;
61
+
62
+ const match = raw.match(labelPattern);
63
+ if (match) {
64
+ const afterLabel = raw.substring(match.index! + match[0].length);
65
+ const quotedMatch = afterLabel.match(/['"`]([^'"`]+)['"`]/);
66
+ if (quotedMatch) return quotedMatch[1];
67
+ }
68
+
69
+ expectValueInNext = true;
70
+ }
71
+ }
72
+
73
+ return null;
74
+ }
75
+
76
+ export function tableToJson(markdown: string): Record<string, string>[] {
77
+ const tokens = marked.lexer(markdown);
78
+ for (const token of tokens) {
79
+ if (token.type !== 'table') continue;
80
+ const tableToken = token as any;
81
+ const headers: string[] = tableToken.header.map((h: any) => h.text);
82
+ return tableToken.rows.map((row: any) => {
83
+ const obj: Record<string, string> = {};
84
+ for (let i = 0; i < headers.length; i++) {
85
+ obj[headers[i]] = row[i]?.text ?? '';
86
+ }
87
+ return obj;
88
+ });
89
+ }
90
+ return [];
91
+ }
92
+
93
+ export function jsonToTable(rows: Record<string, string>[], columns?: string[]): string {
94
+ if (rows.length === 0) return '';
95
+ const headers = columns || Object.keys(rows[0]);
96
+ let md = `| ${headers.join(' | ')} |\n`;
97
+ md += `|${headers.map(() => '------|').join('')}\n`;
98
+ for (const row of rows) {
99
+ md += `| ${headers.map((h) => row[h] ?? '-').join(' | ')} |\n`;
100
+ }
101
+ return md;
102
+ }
103
+
104
+ export function findTableRaw(markdown: string): string | null {
105
+ const tokens = marked.lexer(markdown);
106
+ for (const token of tokens) {
107
+ if (token.type === 'table') return (token as any).raw;
108
+ }
109
+ return null;
110
+ }
111
+
112
+ export function findTableLineRange(markdown: string): { start: number; end: number } | null {
113
+ const lines = markdown.split('\n');
114
+ let start = -1;
115
+
116
+ for (let i = 0; i < lines.length; i++) {
117
+ const trimmed = lines[i].trim();
118
+ if (trimmed.startsWith('|') && trimmed.endsWith('|')) {
119
+ if (start === -1) start = i;
120
+ } else if (start !== -1) {
121
+ return { start, end: i };
122
+ }
123
+ }
124
+
125
+ if (start !== -1) return { start, end: lines.length };
126
+ return null;
127
+ }
@@ -0,0 +1,466 @@
1
+ import { type Token, type Tokens, marked } from 'marked';
2
+
3
+ export type SelectorType = 'section' | 'section1' | 'section2' | 'section3' | 'section4' | 'section5' | 'section6' | 'table' | 'heading' | 'paragraph' | 'list' | 'item' | 'code' | 'blockquote' | 'hr' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
4
+
5
+ export interface TextMatcher {
6
+ mode: 'exact' | 'contains' | 'regex';
7
+ value: string;
8
+ negated: boolean;
9
+ }
10
+
11
+ export interface QuerySegment {
12
+ selector: SelectorType;
13
+ textMatch?: TextMatcher;
14
+ index: number | null;
15
+ slice: { from?: number; to?: number } | null;
16
+ }
17
+
18
+ export interface MatchedRange {
19
+ token: Token;
20
+ start: number;
21
+ length: number;
22
+ innerTokens?: MatchedRange[];
23
+ }
24
+
25
+ export function parseQuery(input: string): QuerySegment[] {
26
+ const segments: QuerySegment[] = [];
27
+ let pos = 0;
28
+
29
+ function peek(): string {
30
+ return pos < input.length ? input[pos] : '';
31
+ }
32
+
33
+ function advance(): string {
34
+ return input[pos++] || '';
35
+ }
36
+
37
+ function skipWhitespace() {
38
+ while (pos < input.length && /\s/.test(input[pos])) pos++;
39
+ }
40
+
41
+ function readIdentifier(): string {
42
+ const start = pos;
43
+ while (pos < input.length && /[a-zA-Z_\d]/.test(input[pos])) pos++;
44
+ return input.slice(start, pos);
45
+ }
46
+
47
+ function readQuotedString(): string {
48
+ const quote = advance();
49
+ let result = '';
50
+ while (pos < input.length && input[pos] !== quote) {
51
+ if (input[pos] === '\\') {
52
+ pos++;
53
+ result += input[pos] || '';
54
+ } else {
55
+ result += input[pos];
56
+ }
57
+ pos++;
58
+ }
59
+ if (pos < input.length) pos++;
60
+ return result;
61
+ }
62
+
63
+ function readUntilAny(chars: string): string {
64
+ const start = pos;
65
+ while (pos < input.length && !chars.includes(input[pos])) pos++;
66
+ return input.slice(start, pos);
67
+ }
68
+
69
+ function parseTextMatcher(): TextMatcher {
70
+ let negated = false;
71
+ if (peek() === '!') {
72
+ negated = true;
73
+ advance();
74
+ }
75
+
76
+ if (peek() === '~') {
77
+ advance();
78
+ const value = readQuotedString();
79
+ return { mode: 'contains', value, negated };
80
+ }
81
+
82
+ if (peek() === '/') {
83
+ advance();
84
+ let value = '';
85
+ while (pos < input.length && input[pos] !== '/') {
86
+ value += input[pos];
87
+ pos++;
88
+ }
89
+ if (pos < input.length) pos++;
90
+ while (pos < input.length && /[gimsuy]/.test(input[pos])) pos++;
91
+ return { mode: 'regex', value, negated };
92
+ }
93
+
94
+ const value = readQuotedString();
95
+ return { mode: 'exact', value, negated };
96
+ }
97
+
98
+ while (pos < input.length) {
99
+ skipWhitespace();
100
+ if (pos >= input.length) break;
101
+
102
+ const selector = readIdentifier();
103
+ if (!selector) {
104
+ pos++;
105
+ continue;
106
+ }
107
+
108
+ const segment: QuerySegment = {
109
+ selector: selector as SelectorType,
110
+ index: null,
111
+ slice: null,
112
+ };
113
+
114
+ if (peek() === '(') {
115
+ advance();
116
+ segment.textMatch = parseTextMatcher();
117
+ if (peek() === ')') advance();
118
+ }
119
+
120
+ while (peek() === '[') {
121
+ advance();
122
+ const content = readUntilAny(']');
123
+ if (/^-?\d*(:-?\d*)?$/.test(content) && content !== '') {
124
+ if (content.includes(':')) {
125
+ const colonIdx = content.indexOf(':');
126
+ const fromStr = content.slice(0, colonIdx);
127
+ const toStr = content.slice(colonIdx + 1);
128
+ segment.slice = {
129
+ from: fromStr ? Number.parseInt(fromStr, 10) : undefined,
130
+ to: toStr ? Number.parseInt(toStr, 10) : undefined,
131
+ };
132
+ } else {
133
+ segment.index = Number.parseInt(content, 10);
134
+ }
135
+ }
136
+ if (peek() === ']') advance();
137
+ }
138
+
139
+ segments.push(segment);
140
+ }
141
+
142
+ return segments;
143
+ }
144
+
145
+ function matchText(text: string, matcher: TextMatcher): boolean {
146
+ let result: boolean;
147
+
148
+ switch (matcher.mode) {
149
+ case 'exact':
150
+ result = text === matcher.value;
151
+ break;
152
+ case 'contains':
153
+ result = text.includes(matcher.value);
154
+ break;
155
+ case 'regex':
156
+ result = new RegExp(matcher.value, 'i').test(text);
157
+ break;
158
+ default:
159
+ result = false;
160
+ }
161
+
162
+ return matcher.negated ? !result : result;
163
+ }
164
+
165
+ function getTokenText(token: Token): string {
166
+ const t = token as any;
167
+ switch (token.type) {
168
+ case 'heading':
169
+ case 'paragraph':
170
+ case 'code':
171
+ case 'blockquote':
172
+ case 'list_item':
173
+ return t.text || '';
174
+ case 'table':
175
+ return (t.header || []).map((h: any) => h.text).join(', ');
176
+ default:
177
+ return '';
178
+ }
179
+ }
180
+
181
+ function getHeadingDepth(selector: string): number | null {
182
+ const match = selector.match(/^h([1-6])$/);
183
+ return match ? Number.parseInt(match[1], 10) : null;
184
+ }
185
+
186
+ function isSectionSelector(selector: string): boolean {
187
+ return /^section\d?$/.test(selector);
188
+ }
189
+
190
+ function getSectionDepth(selector: string): number | null {
191
+ const match = selector.match(/^section([1-6])$/);
192
+ return match ? Number.parseInt(match[1], 10) : null;
193
+ }
194
+
195
+ function selectorToTokenType(selector: string): string | null {
196
+ if (/^h[1-6]$/.test(selector)) return 'heading';
197
+ const map: Record<string, string> = {
198
+ heading: 'heading',
199
+ paragraph: 'paragraph',
200
+ table: 'table',
201
+ code: 'code',
202
+ list: 'list',
203
+ blockquote: 'blockquote',
204
+ hr: 'hr',
205
+ item: 'list_item',
206
+ };
207
+ return map[selector] || null;
208
+ }
209
+
210
+ function buildTokenIndex(source: string): MatchedRange[] {
211
+ const tokens = marked.lexer(source);
212
+ const ranges: MatchedRange[] = [];
213
+ let offset = 0;
214
+
215
+ for (const token of tokens) {
216
+ const raw = (token as any).raw || '';
217
+ ranges.push({ token, start: offset, length: raw.length });
218
+ offset += raw.length;
219
+ }
220
+
221
+ return ranges;
222
+ }
223
+
224
+ function computeSections(candidates: MatchedRange[], segment: QuerySegment): MatchedRange[] {
225
+ const sectionDepth = getSectionDepth(segment.selector as string);
226
+ const sections: MatchedRange[] = [];
227
+
228
+ for (let i = 0; i < candidates.length; i++) {
229
+ const range = candidates[i];
230
+ if (range.token.type !== 'heading') continue;
231
+
232
+ const heading = range.token as Tokens.Heading;
233
+ if (sectionDepth !== null && heading.depth !== sectionDepth) continue;
234
+ if (segment.textMatch && !matchText(heading.text, segment.textMatch)) continue;
235
+
236
+ const depth = heading.depth;
237
+ const innerTokens: MatchedRange[] = [];
238
+ let endOffset = range.start + range.length;
239
+
240
+ for (let j = i + 1; j < candidates.length; j++) {
241
+ const nextRange = candidates[j];
242
+ if (nextRange.token.type === 'heading' && (nextRange.token as Tokens.Heading).depth <= depth) break;
243
+ innerTokens.push(nextRange);
244
+ endOffset = nextRange.start + nextRange.length;
245
+ }
246
+
247
+ sections.push({
248
+ token: range.token,
249
+ start: range.start,
250
+ length: endOffset - range.start,
251
+ innerTokens,
252
+ });
253
+ }
254
+
255
+ return sections;
256
+ }
257
+
258
+ function extractListItems(candidates: MatchedRange[]): MatchedRange[] {
259
+ const items: MatchedRange[] = [];
260
+
261
+ for (const range of candidates) {
262
+ if (range.token.type !== 'list') continue;
263
+
264
+ const list = range.token as Tokens.List;
265
+ const listRaw = (range.token as any).raw as string;
266
+ let searchFrom = 0;
267
+
268
+ for (const item of list.items) {
269
+ const itemRaw = (item as any).raw as string;
270
+ const idx = listRaw.indexOf(itemRaw, searchFrom);
271
+ if (idx === -1) continue;
272
+
273
+ items.push({
274
+ token: item as unknown as Token,
275
+ start: range.start + idx,
276
+ length: itemRaw.length,
277
+ });
278
+
279
+ searchFrom = idx + itemRaw.length;
280
+ }
281
+ }
282
+
283
+ return items;
284
+ }
285
+
286
+ function applyIndexSlice(matches: MatchedRange[], segment: QuerySegment): MatchedRange[] {
287
+ if (segment.index !== null) {
288
+ const idx = segment.index < 0 ? matches.length + segment.index : segment.index;
289
+ return idx >= 0 && idx < matches.length ? [matches[idx]] : [];
290
+ }
291
+
292
+ if (segment.slice) {
293
+ const { from, to } = segment.slice;
294
+ return matches.slice(from, to);
295
+ }
296
+
297
+ return matches;
298
+ }
299
+
300
+ function expandSectionRanges(matches: MatchedRange[]): MatchedRange[] {
301
+ let hasSection = false;
302
+ for (const m of matches) {
303
+ if (m.innerTokens) {
304
+ hasSection = true;
305
+ break;
306
+ }
307
+ }
308
+ if (!hasSection) return matches;
309
+
310
+ const expanded: MatchedRange[] = [];
311
+ for (const m of matches) {
312
+ if (m.innerTokens) {
313
+ expanded.push({ token: m.token, start: m.start, length: ((m.token as any).raw || '').length });
314
+ expanded.push(...m.innerTokens);
315
+ } else {
316
+ expanded.push(m);
317
+ }
318
+ }
319
+ return expanded;
320
+ }
321
+
322
+ function executeSegments(candidates: MatchedRange[], segments: QuerySegment[]): MatchedRange[] {
323
+ if (segments.length === 0) return candidates;
324
+
325
+ const segment = segments[0];
326
+ const remaining = segments.slice(1);
327
+
328
+ if (isSectionSelector(segment.selector as string)) {
329
+ const sections = computeSections(candidates, segment);
330
+ const indexed = applyIndexSlice(sections, segment);
331
+
332
+ if (remaining.length === 0) return indexed;
333
+
334
+ const results: MatchedRange[] = [];
335
+ for (const section of indexed) {
336
+ results.push(...executeSegments(section.innerTokens || [], remaining));
337
+ }
338
+ return results;
339
+ }
340
+
341
+ if (segment.selector === 'item') {
342
+ let items = extractListItems(candidates);
343
+ if (segment.textMatch) {
344
+ items = items.filter((r) => matchText(getTokenText(r.token), segment.textMatch!));
345
+ }
346
+ return executeSegments(applyIndexSlice(items, segment), remaining);
347
+ }
348
+
349
+ const tokenType = selectorToTokenType(segment.selector as string);
350
+ if (!tokenType) return [];
351
+
352
+ let matches = candidates.filter((r) => r.token.type === tokenType);
353
+
354
+ const depth = getHeadingDepth(segment.selector as string);
355
+ if (depth !== null) {
356
+ matches = matches.filter((r) => (r.token as any).depth === depth);
357
+ }
358
+
359
+ if (segment.textMatch) {
360
+ matches = matches.filter((r) => matchText(getTokenText(r.token), segment.textMatch!));
361
+ }
362
+
363
+ return executeSegments(applyIndexSlice(matches, segment), remaining);
364
+ }
365
+
366
+ export class MarkdownQuery {
367
+ private source: string;
368
+ private matches: MatchedRange[];
369
+
370
+ constructor(source: string, matches?: MatchedRange[]) {
371
+ this.source = source;
372
+ this.matches = matches || buildTokenIndex(source);
373
+ }
374
+
375
+ query(selector: string): MarkdownQuery {
376
+ const segments = parseQuery(selector);
377
+ const candidates = expandSectionRanges(this.matches);
378
+ const results = executeSegments(candidates, segments);
379
+ return new MarkdownQuery(this.source, results);
380
+ }
381
+
382
+ text(): string {
383
+ return this.matches.map((r) => this.source.slice(r.start, r.start + r.length)).join('');
384
+ }
385
+
386
+ get(): string {
387
+ return this.text();
388
+ }
389
+
390
+ toJson(): Record<string, string>[] {
391
+ const results: Record<string, string>[] = [];
392
+
393
+ for (const range of this.matches) {
394
+ if (range.token.type !== 'table') continue;
395
+
396
+ const table = range.token as Tokens.Table;
397
+ const headers = table.header.map((h) => h.text);
398
+ for (const row of table.rows) {
399
+ const obj: Record<string, string> = {};
400
+ for (let i = 0; i < headers.length; i++) {
401
+ obj[headers[i]] = row[i]?.text ?? '';
402
+ }
403
+ results.push(obj);
404
+ }
405
+ }
406
+
407
+ return results;
408
+ }
409
+
410
+ replace(content: string): string {
411
+ const sorted = [...this.matches].sort((a, b) => a.start - b.start);
412
+
413
+ const kept: MatchedRange[] = [];
414
+ let lastEnd = -1;
415
+ for (const range of sorted) {
416
+ if (range.start < lastEnd) continue;
417
+ kept.push(range);
418
+ lastEnd = range.start + range.length;
419
+ }
420
+
421
+ let result = this.source;
422
+ for (let i = kept.length - 1; i >= 0; i--) {
423
+ const range = kept[i];
424
+ result = result.slice(0, range.start) + content + result.slice(range.start + range.length);
425
+ }
426
+
427
+ return result;
428
+ }
429
+
430
+ count(): number {
431
+ return this.matches.length;
432
+ }
433
+
434
+ first(): MarkdownQuery {
435
+ return new MarkdownQuery(this.source, this.matches.slice(0, 1));
436
+ }
437
+
438
+ last(): MarkdownQuery {
439
+ return new MarkdownQuery(this.source, this.matches.slice(-1));
440
+ }
441
+
442
+ before(): MarkdownQuery {
443
+ if (this.matches.length === 0) return new MarkdownQuery(this.source, []);
444
+ const cutoff = this.matches[0].start;
445
+ const allTokens = buildTokenIndex(this.source);
446
+ const beforeTokens = allTokens.filter((r) => r.start + r.length <= cutoff);
447
+ return new MarkdownQuery(this.source, beforeTokens);
448
+ }
449
+
450
+ after(): MarkdownQuery {
451
+ if (this.matches.length === 0) return new MarkdownQuery(this.source, []);
452
+ const lastMatch = this.matches[this.matches.length - 1];
453
+ const cutoff = lastMatch.start + lastMatch.length;
454
+ const allTokens = buildTokenIndex(this.source);
455
+ const afterTokens = allTokens.filter((r) => r.start >= cutoff);
456
+ return new MarkdownQuery(this.source, afterTokens);
457
+ }
458
+
459
+ each(): MarkdownQuery[] {
460
+ return this.matches.map((m) => new MarkdownQuery(this.source, [m]));
461
+ }
462
+ }
463
+
464
+ export function mdq(source: string): MarkdownQuery {
465
+ return new MarkdownQuery(source);
466
+ }
@@ -0,0 +1,43 @@
1
+ import dedent from 'dedent';
2
+ import { marked } from 'marked';
3
+ import { markedTerminal } from 'marked-terminal';
4
+
5
+ if (!process.env.FORCE_COLOR) {
6
+ process.env.FORCE_COLOR = '1';
7
+ }
8
+
9
+ marked.use(markedTerminal());
10
+ marked.setOptions({ breaks: true });
11
+
12
+ const renderer = (marked as any).defaults.renderer;
13
+ if (renderer) {
14
+ if (renderer.text) {
15
+ const originalText = renderer.text;
16
+ renderer.text = function (text: any) {
17
+ if (typeof text === 'object') {
18
+ text = text.tokens ? this.parser.parseInline(text.tokens) : text.text;
19
+ }
20
+ return originalText.call(this, text);
21
+ };
22
+ }
23
+ if (renderer.listitem) {
24
+ const originalListitem = renderer.listitem;
25
+ renderer.listitem = function (text: any) {
26
+ if (typeof text === 'object') {
27
+ const item = text;
28
+ const parser = this.parser;
29
+ const originalParse = parser.parse.bind(parser);
30
+ parser.parse = (tokens: any, loose?: boolean) => parser.parseInline(tokens);
31
+ const result = originalListitem.call(this, text);
32
+ parser.parse = originalParse;
33
+ return result;
34
+ }
35
+ return originalListitem.call(this, text);
36
+ };
37
+ }
38
+ }
39
+
40
+ export function parseMarkdownToTerminal(markdown: string): string {
41
+ const result = marked.parse(dedent(markdown)) as string;
42
+ return result.replace(/^ {4}\*/gm, '*');
43
+ }
@@ -0,0 +1,11 @@
1
+ export {
2
+ RESEARCH_COLUMN_ORDER,
3
+ type ResearchElement,
4
+ type ResearchSection,
5
+ extractContainerFromBlockquote,
6
+ extractValidContainers,
7
+ formatResearchSummary,
8
+ mapRowToElement,
9
+ parseResearchSections,
10
+ rebuildSectionMarkdown,
11
+ } from '../ai/researcher/parser.ts';