explorbot 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/LICENSE +94 -0
  2. package/README.md +267 -0
  3. package/assets/sample-files/sample.docx +0 -0
  4. package/assets/sample-files/sample.mp3 +0 -0
  5. package/assets/sample-files/sample.mp4 +0 -0
  6. package/assets/sample-files/sample.pdf +21 -0
  7. package/assets/sample-files/sample.png +0 -0
  8. package/assets/sample-files/sample.xlsx +0 -0
  9. package/assets/sample-files/sample.zip +0 -0
  10. package/dist/assets/sample-files/sample.docx +0 -0
  11. package/dist/assets/sample-files/sample.mp3 +0 -0
  12. package/dist/assets/sample-files/sample.mp4 +0 -0
  13. package/dist/assets/sample-files/sample.pdf +21 -0
  14. package/dist/assets/sample-files/sample.png +0 -0
  15. package/dist/assets/sample-files/sample.xlsx +0 -0
  16. package/dist/assets/sample-files/sample.zip +0 -0
  17. package/dist/bin/explorbot-cli.js +683 -0
  18. package/dist/bin/explorbot-cli.js.map +1 -0
  19. package/dist/boat/api-tester/bin/apibot-cli.js +5 -0
  20. package/dist/boat/api-tester/bin/apibot-cli.js.map +1 -0
  21. package/dist/boat/api-tester/example/apibot.config.js +31 -0
  22. package/dist/boat/api-tester/example/apibot.config.js.map +1 -0
  23. package/dist/boat/api-tester/src/ai/chief/styles.js +13 -0
  24. package/dist/boat/api-tester/src/ai/chief/styles.js.map +1 -0
  25. package/dist/boat/api-tester/src/ai/chief.js +301 -0
  26. package/dist/boat/api-tester/src/ai/chief.js.map +1 -0
  27. package/dist/boat/api-tester/src/ai/curler-tools.js +263 -0
  28. package/dist/boat/api-tester/src/ai/curler-tools.js.map +1 -0
  29. package/dist/boat/api-tester/src/ai/curler.js +271 -0
  30. package/dist/boat/api-tester/src/ai/curler.js.map +1 -0
  31. package/dist/boat/api-tester/src/api-client.js +26 -0
  32. package/dist/boat/api-tester/src/api-client.js.map +1 -0
  33. package/dist/boat/api-tester/src/apibot.js +166 -0
  34. package/dist/boat/api-tester/src/apibot.js.map +1 -0
  35. package/dist/boat/api-tester/src/cli.js +262 -0
  36. package/dist/boat/api-tester/src/cli.js.map +1 -0
  37. package/dist/boat/api-tester/src/config.js +159 -0
  38. package/dist/boat/api-tester/src/config.js.map +1 -0
  39. package/dist/prompts/audit-rules.md +124 -0
  40. package/dist/rules/chief/general.md +11 -0
  41. package/dist/rules/chief/styles/curious.md +12 -0
  42. package/dist/rules/chief/styles/hacker.md +19 -0
  43. package/dist/rules/chief/styles/normal.md +11 -0
  44. package/dist/rules/chief/styles/psycho.md +17 -0
  45. package/dist/rules/navigator/multiple-locator.md +47 -0
  46. package/dist/rules/navigator/output.md +69 -0
  47. package/dist/rules/navigator/verification-actions.md +122 -0
  48. package/dist/rules/navigator/verification-output.md +53 -0
  49. package/dist/rules/planner/styles/curious.md +39 -0
  50. package/dist/rules/planner/styles/normal.md +21 -0
  51. package/dist/rules/planner/styles/psycho.md +14 -0
  52. package/dist/rules/researcher/list-element.md +11 -0
  53. package/dist/rules/researcher/screenshot-ui-map.md +30 -0
  54. package/dist/rules/researcher/section-ui-map.md +18 -0
  55. package/dist/rules/researcher/ui-map-table.md +18 -0
  56. package/dist/src/action-result.js +574 -0
  57. package/dist/src/action-result.js.map +1 -0
  58. package/dist/src/action.js +388 -0
  59. package/dist/src/action.js.map +1 -0
  60. package/dist/src/activity.js +86 -0
  61. package/dist/src/activity.js.map +1 -0
  62. package/dist/src/ai/agent.js +2 -0
  63. package/dist/src/ai/agent.js.map +1 -0
  64. package/dist/src/ai/bosun.js +443 -0
  65. package/dist/src/ai/bosun.js.map +1 -0
  66. package/dist/src/ai/captain/idle-mode.js +102 -0
  67. package/dist/src/ai/captain/idle-mode.js.map +1 -0
  68. package/dist/src/ai/captain/mixin.js +11 -0
  69. package/dist/src/ai/captain/mixin.js.map +1 -0
  70. package/dist/src/ai/captain/test-mode.js +251 -0
  71. package/dist/src/ai/captain/test-mode.js.map +1 -0
  72. package/dist/src/ai/captain/web-mode.js +124 -0
  73. package/dist/src/ai/captain/web-mode.js.map +1 -0
  74. package/dist/src/ai/captain.js +442 -0
  75. package/dist/src/ai/captain.js.map +1 -0
  76. package/dist/src/ai/conversation.js +176 -0
  77. package/dist/src/ai/conversation.js.map +1 -0
  78. package/dist/src/ai/experience-compactor.js +232 -0
  79. package/dist/src/ai/experience-compactor.js.map +1 -0
  80. package/dist/src/ai/fisherman-tools.js +154 -0
  81. package/dist/src/ai/fisherman-tools.js.map +1 -0
  82. package/dist/src/ai/fisherman.js +184 -0
  83. package/dist/src/ai/fisherman.js.map +1 -0
  84. package/dist/src/ai/historian.js +384 -0
  85. package/dist/src/ai/historian.js.map +1 -0
  86. package/dist/src/ai/navigator.js +493 -0
  87. package/dist/src/ai/navigator.js.map +1 -0
  88. package/dist/src/ai/pilot.js +684 -0
  89. package/dist/src/ai/pilot.js.map +1 -0
  90. package/dist/src/ai/planner/session-dedup.js +28 -0
  91. package/dist/src/ai/planner/session-dedup.js.map +1 -0
  92. package/dist/src/ai/planner/styles.js +15 -0
  93. package/dist/src/ai/planner/styles.js.map +1 -0
  94. package/dist/src/ai/planner/subpages.js +118 -0
  95. package/dist/src/ai/planner/subpages.js.map +1 -0
  96. package/dist/src/ai/planner.js +486 -0
  97. package/dist/src/ai/planner.js.map +1 -0
  98. package/dist/src/ai/provider.js +540 -0
  99. package/dist/src/ai/provider.js.map +1 -0
  100. package/dist/src/ai/quartermaster.js +210 -0
  101. package/dist/src/ai/quartermaster.js.map +1 -0
  102. package/dist/src/ai/researcher/cache.js +95 -0
  103. package/dist/src/ai/researcher/cache.js.map +1 -0
  104. package/dist/src/ai/researcher/coordinates.js +210 -0
  105. package/dist/src/ai/researcher/coordinates.js.map +1 -0
  106. package/dist/src/ai/researcher/deep-analysis.js +364 -0
  107. package/dist/src/ai/researcher/deep-analysis.js.map +1 -0
  108. package/dist/src/ai/researcher/fingerprint-worker.js +46 -0
  109. package/dist/src/ai/researcher/fingerprint-worker.js.map +1 -0
  110. package/dist/src/ai/researcher/focus.js +37 -0
  111. package/dist/src/ai/researcher/focus.js.map +1 -0
  112. package/dist/src/ai/researcher/locators.js +242 -0
  113. package/dist/src/ai/researcher/locators.js.map +1 -0
  114. package/dist/src/ai/researcher/mixin.js +3 -0
  115. package/dist/src/ai/researcher/mixin.js.map +1 -0
  116. package/dist/src/ai/researcher/parser.js +160 -0
  117. package/dist/src/ai/researcher/parser.js.map +1 -0
  118. package/dist/src/ai/researcher/research-result.js +110 -0
  119. package/dist/src/ai/researcher/research-result.js.map +1 -0
  120. package/dist/src/ai/researcher.js +776 -0
  121. package/dist/src/ai/researcher.js.map +1 -0
  122. package/dist/src/ai/rules.js +368 -0
  123. package/dist/src/ai/rules.js.map +1 -0
  124. package/dist/src/ai/task-agent.js +110 -0
  125. package/dist/src/ai/task-agent.js.map +1 -0
  126. package/dist/src/ai/tester.js +840 -0
  127. package/dist/src/ai/tester.js.map +1 -0
  128. package/dist/src/ai/tools.js +980 -0
  129. package/dist/src/ai/tools.js.map +1 -0
  130. package/dist/src/api/api-client.js +91 -0
  131. package/dist/src/api/api-client.js.map +1 -0
  132. package/dist/src/api/request-result.js +177 -0
  133. package/dist/src/api/request-result.js.map +1 -0
  134. package/dist/src/api/request-store.js +109 -0
  135. package/dist/src/api/request-store.js.map +1 -0
  136. package/dist/src/api/spec-reader.js +148 -0
  137. package/dist/src/api/spec-reader.js.map +1 -0
  138. package/dist/src/api/xhr-capture.js +91 -0
  139. package/dist/src/api/xhr-capture.js.map +1 -0
  140. package/dist/src/browser-server.js +67 -0
  141. package/dist/src/browser-server.js.map +1 -0
  142. package/dist/src/command-handler.js +363 -0
  143. package/dist/src/command-handler.js.map +1 -0
  144. package/dist/src/commands/add-rule-command.js +52 -0
  145. package/dist/src/commands/add-rule-command.js.map +1 -0
  146. package/dist/src/commands/base-command.js +14 -0
  147. package/dist/src/commands/base-command.js.map +1 -0
  148. package/dist/src/commands/clean-command.js +67 -0
  149. package/dist/src/commands/clean-command.js.map +1 -0
  150. package/dist/src/commands/context-aria-command.js +18 -0
  151. package/dist/src/commands/context-aria-command.js.map +1 -0
  152. package/dist/src/commands/context-command.js +57 -0
  153. package/dist/src/commands/context-command.js.map +1 -0
  154. package/dist/src/commands/context-data-command.js +25 -0
  155. package/dist/src/commands/context-data-command.js.map +1 -0
  156. package/dist/src/commands/context-experience-command.js +41 -0
  157. package/dist/src/commands/context-experience-command.js.map +1 -0
  158. package/dist/src/commands/context-html-command.js +26 -0
  159. package/dist/src/commands/context-html-command.js.map +1 -0
  160. package/dist/src/commands/context-knowledge-command.js +36 -0
  161. package/dist/src/commands/context-knowledge-command.js.map +1 -0
  162. package/dist/src/commands/debug-command.js +12 -0
  163. package/dist/src/commands/debug-command.js.map +1 -0
  164. package/dist/src/commands/drill-command.js +29 -0
  165. package/dist/src/commands/drill-command.js.map +1 -0
  166. package/dist/src/commands/exit-command.js +26 -0
  167. package/dist/src/commands/exit-command.js.map +1 -0
  168. package/dist/src/commands/explore-command.js +124 -0
  169. package/dist/src/commands/explore-command.js.map +1 -0
  170. package/dist/src/commands/freesail-command.js +84 -0
  171. package/dist/src/commands/freesail-command.js.map +1 -0
  172. package/dist/src/commands/help-command.js +7 -0
  173. package/dist/src/commands/help-command.js.map +1 -0
  174. package/dist/src/commands/index.js +63 -0
  175. package/dist/src/commands/index.js.map +1 -0
  176. package/dist/src/commands/knows-command.js +54 -0
  177. package/dist/src/commands/knows-command.js.map +1 -0
  178. package/dist/src/commands/learn-command.js +35 -0
  179. package/dist/src/commands/learn-command.js.map +1 -0
  180. package/dist/src/commands/navigate-command.js +16 -0
  181. package/dist/src/commands/navigate-command.js.map +1 -0
  182. package/dist/src/commands/path-command.js +70 -0
  183. package/dist/src/commands/path-command.js.map +1 -0
  184. package/dist/src/commands/plan-clear-command.js +13 -0
  185. package/dist/src/commands/plan-clear-command.js.map +1 -0
  186. package/dist/src/commands/plan-command.js +36 -0
  187. package/dist/src/commands/plan-command.js.map +1 -0
  188. package/dist/src/commands/plan-edit-command.js +8 -0
  189. package/dist/src/commands/plan-edit-command.js.map +1 -0
  190. package/dist/src/commands/plan-load-command.js +16 -0
  191. package/dist/src/commands/plan-load-command.js.map +1 -0
  192. package/dist/src/commands/plan-reload-command.js +23 -0
  193. package/dist/src/commands/plan-reload-command.js.map +1 -0
  194. package/dist/src/commands/plan-save-command.js +22 -0
  195. package/dist/src/commands/plan-save-command.js.map +1 -0
  196. package/dist/src/commands/research-command.js +38 -0
  197. package/dist/src/commands/research-command.js.map +1 -0
  198. package/dist/src/commands/start-command.js +12 -0
  199. package/dist/src/commands/start-command.js.map +1 -0
  200. package/dist/src/commands/status-command.js +19 -0
  201. package/dist/src/commands/status-command.js.map +1 -0
  202. package/dist/src/commands/test-command.js +85 -0
  203. package/dist/src/commands/test-command.js.map +1 -0
  204. package/dist/src/components/ActivityPane.js +55 -0
  205. package/dist/src/components/ActivityPane.js.map +1 -0
  206. package/dist/src/components/AddKnowledge.js +122 -0
  207. package/dist/src/components/AddKnowledge.js.map +1 -0
  208. package/dist/src/components/AddRule.js +117 -0
  209. package/dist/src/components/AddRule.js.map +1 -0
  210. package/dist/src/components/App.js +313 -0
  211. package/dist/src/components/App.js.map +1 -0
  212. package/dist/src/components/Autocomplete.js +43 -0
  213. package/dist/src/components/Autocomplete.js.map +1 -0
  214. package/dist/src/components/InputPane.js +207 -0
  215. package/dist/src/components/InputPane.js.map +1 -0
  216. package/dist/src/components/InputReadline.js +598 -0
  217. package/dist/src/components/InputReadline.js.map +1 -0
  218. package/dist/src/components/LogPane.js +123 -0
  219. package/dist/src/components/LogPane.js.map +1 -0
  220. package/dist/src/components/PlanEditor.js +126 -0
  221. package/dist/src/components/PlanEditor.js.map +1 -0
  222. package/dist/src/components/PlanPane.js +51 -0
  223. package/dist/src/components/PlanPane.js.map +1 -0
  224. package/dist/src/components/SessionTimer.js +26 -0
  225. package/dist/src/components/SessionTimer.js.map +1 -0
  226. package/dist/src/components/StateTransitionPane.js +107 -0
  227. package/dist/src/components/StateTransitionPane.js.map +1 -0
  228. package/dist/src/components/StatusPane.js +37 -0
  229. package/dist/src/components/StatusPane.js.map +1 -0
  230. package/dist/src/components/TaskPane.js +96 -0
  231. package/dist/src/components/TaskPane.js.map +1 -0
  232. package/dist/src/components/Welcome.js +52 -0
  233. package/dist/src/components/Welcome.js.map +1 -0
  234. package/dist/src/components/WelcomeChecklist.js +96 -0
  235. package/dist/src/components/WelcomeChecklist.js.map +1 -0
  236. package/dist/src/components/WelcomeCommands.js +61 -0
  237. package/dist/src/components/WelcomeCommands.js.map +1 -0
  238. package/dist/src/components/autocomplete-store.js +22 -0
  239. package/dist/src/components/autocomplete-store.js.map +1 -0
  240. package/dist/src/components/parse-keypress.js +174 -0
  241. package/dist/src/components/parse-keypress.js.map +1 -0
  242. package/dist/src/config.js +249 -0
  243. package/dist/src/config.js.map +1 -0
  244. package/dist/src/execution-controller.js +92 -0
  245. package/dist/src/execution-controller.js.map +1 -0
  246. package/dist/src/experience-tracker.js +294 -0
  247. package/dist/src/experience-tracker.js.map +1 -0
  248. package/dist/src/explorbot.js +348 -0
  249. package/dist/src/explorbot.js.map +1 -0
  250. package/dist/src/explorer.js +611 -0
  251. package/dist/src/explorer.js.map +1 -0
  252. package/dist/src/index.js +56 -0
  253. package/dist/src/index.js.map +1 -0
  254. package/dist/src/knowledge-tracker.js +184 -0
  255. package/dist/src/knowledge-tracker.js.map +1 -0
  256. package/dist/src/observability.js +126 -0
  257. package/dist/src/observability.js.map +1 -0
  258. package/dist/src/reporter.js +185 -0
  259. package/dist/src/reporter.js.map +1 -0
  260. package/dist/src/state-manager.js +427 -0
  261. package/dist/src/state-manager.js.map +1 -0
  262. package/dist/src/stats.js +44 -0
  263. package/dist/src/stats.js.map +1 -0
  264. package/dist/src/test-plan.js +343 -0
  265. package/dist/src/test-plan.js.map +1 -0
  266. package/dist/src/utils/aria.js +588 -0
  267. package/dist/src/utils/aria.js.map +1 -0
  268. package/dist/src/utils/code-extractor.js +21 -0
  269. package/dist/src/utils/code-extractor.js.map +1 -0
  270. package/dist/src/utils/context-formatter.js +205 -0
  271. package/dist/src/utils/context-formatter.js.map +1 -0
  272. package/dist/src/utils/error-page.js +19 -0
  273. package/dist/src/utils/error-page.js.map +1 -0
  274. package/dist/src/utils/expandable.js +35 -0
  275. package/dist/src/utils/expandable.js.map +1 -0
  276. package/dist/src/utils/hooks-runner.js +77 -0
  277. package/dist/src/utils/hooks-runner.js.map +1 -0
  278. package/dist/src/utils/html-diff.js +734 -0
  279. package/dist/src/utils/html-diff.js.map +1 -0
  280. package/dist/src/utils/html.js +1163 -0
  281. package/dist/src/utils/html.js.map +1 -0
  282. package/dist/src/utils/logger.js +465 -0
  283. package/dist/src/utils/logger.js.map +1 -0
  284. package/dist/src/utils/loop.js +126 -0
  285. package/dist/src/utils/loop.js.map +1 -0
  286. package/dist/src/utils/markdown-parser.js +117 -0
  287. package/dist/src/utils/markdown-parser.js.map +1 -0
  288. package/dist/src/utils/markdown-query.js +393 -0
  289. package/dist/src/utils/markdown-query.js.map +1 -0
  290. package/dist/src/utils/markdown-terminal.js +40 -0
  291. package/dist/src/utils/markdown-terminal.js.map +1 -0
  292. package/dist/src/utils/research-parser.js +2 -0
  293. package/dist/src/utils/research-parser.js.map +1 -0
  294. package/dist/src/utils/retry.js +55 -0
  295. package/dist/src/utils/retry.js.map +1 -0
  296. package/dist/src/utils/rules-loader.js +104 -0
  297. package/dist/src/utils/rules-loader.js.map +1 -0
  298. package/dist/src/utils/strings.js +14 -0
  299. package/dist/src/utils/strings.js.map +1 -0
  300. package/dist/src/utils/test-plan-markdown.js +301 -0
  301. package/dist/src/utils/test-plan-markdown.js.map +1 -0
  302. package/dist/src/utils/throttle.js +16 -0
  303. package/dist/src/utils/throttle.js.map +1 -0
  304. package/dist/src/utils/unique-names.js +13 -0
  305. package/dist/src/utils/unique-names.js.map +1 -0
  306. package/dist/src/utils/url-matcher.js +48 -0
  307. package/dist/src/utils/url-matcher.js.map +1 -0
  308. package/dist/src/utils/web-element.js +131 -0
  309. package/dist/src/utils/web-element.js.map +1 -0
  310. package/dist/src/utils/xpath.js +110 -0
  311. package/dist/src/utils/xpath.js.map +1 -0
  312. package/package.json +119 -0
  313. package/prompts/audit-rules.md +124 -0
  314. package/rules/chief/general.md +11 -0
  315. package/rules/chief/styles/curious.md +12 -0
  316. package/rules/chief/styles/hacker.md +19 -0
  317. package/rules/chief/styles/normal.md +11 -0
  318. package/rules/chief/styles/psycho.md +17 -0
  319. package/rules/navigator/multiple-locator.md +47 -0
  320. package/rules/navigator/output.md +69 -0
  321. package/rules/navigator/verification-actions.md +122 -0
  322. package/rules/navigator/verification-output.md +53 -0
  323. package/rules/planner/styles/curious.md +39 -0
  324. package/rules/planner/styles/normal.md +21 -0
  325. package/rules/planner/styles/psycho.md +14 -0
  326. package/rules/researcher/list-element.md +11 -0
  327. package/rules/researcher/screenshot-ui-map.md +30 -0
  328. package/rules/researcher/section-ui-map.md +18 -0
  329. package/rules/researcher/ui-map-table.md +18 -0
@@ -0,0 +1,486 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { ActionResult } from "../action-result.js";
4
+ import { setActivity } from "../activity.js";
5
+ import { ConfigParser } from "../config.js";
6
+ import { ExperienceTracker } from "../experience-tracker.js";
7
+ import { Observability } from "../observability.js";
8
+ import { Stats } from "../stats.js";
9
+ import { Plan, Test } from "../test-plan.js";
10
+ import { planToCompactAiContext } from "../utils/test-plan-markdown.js";
11
+ import { createDebug, tag } from '../utils/logger.js';
12
+ import { jsonToTable } from "../utils/markdown-parser.js";
13
+ import { mdq } from '../utils/markdown-query.js';
14
+ import { Conversation } from "./conversation.js";
15
+ import { getActiveStyle, getStyles } from "./planner/styles.js";
16
+ import { WithSessionDedup } from "./planner/session-dedup.js";
17
+ import { WithSubPages, getRegisteredPlan, registerPlan } from "./planner/subpages.js";
18
+ import { hasFocusedSection } from "./researcher/focus.js";
19
+ import { POSSIBLE_SECTIONS, Researcher } from "./researcher.js";
20
+ import { fileUploadRule, protectionRule } from "./rules.js";
21
+ const debugLog = createDebug('explorbot:planner');
22
+ const TasksSchema = z.object({
23
+ planName: z.string().describe('Short descriptive name for the test plan (e.g., "User Authentication Testing", "Product Catalog Navigation", "Form Validation Tests")'),
24
+ scenarios: z
25
+ .array(z.object({
26
+ scenario: z.string().describe('A single sentence describing what to test'),
27
+ priority: z.enum(['critical', 'important', 'high', 'normal', 'low']).describe('Priority of the task based on business importance'),
28
+ startUrl: z.string().nullable().describe('Start URL for the test if different from plan URL (only for tests on visited subpages)'),
29
+ steps: z.array(z.string()).describe('List of steps to perform for this scenario. Each step should be a specific action (e.g., "Click on Login button", "Enter username in email field", "Submit the form"). Keep steps atomic and actionable.'),
30
+ expectedOutcomes: z
31
+ .array(z.string())
32
+ .describe('List of expected outcomes that can be verified. Each outcome should be simple, specific, and easy to check (e.g., "Success message appears", "URL changes to /dashboard", "Form field shows error"). Keep outcomes atomic - do not combine multiple checks into one.'),
33
+ }))
34
+ .describe('List of testing scenarios'),
35
+ });
36
+ const PlannerBase = WithSessionDedup(WithSubPages(Object));
37
+ export class Planner extends PlannerBase {
38
+ emoji = '📋';
39
+ explorer;
40
+ provider;
41
+ stateManager;
42
+ experienceTracker;
43
+ MIN_TASKS = 3;
44
+ MAX_TASKS = 12;
45
+ currentPlan = null;
46
+ freshStart = false;
47
+ lastStyleName = '';
48
+ researcher;
49
+ fisherman = null;
50
+ constructor(explorer, provider) {
51
+ super();
52
+ this.explorer = explorer;
53
+ this.provider = provider;
54
+ this.researcher = new Researcher(explorer, provider);
55
+ this.stateManager = explorer.getStateManager();
56
+ this.experienceTracker = new ExperienceTracker();
57
+ }
58
+ setFisherman(fisherman) {
59
+ this.fisherman = fisherman;
60
+ }
61
+ get sectionOrder() {
62
+ return ConfigParser.getInstance().getConfig().ai?.agents?.researcher?.sections || Object.keys(POSSIBLE_SECTIONS);
63
+ }
64
+ getSystemMessage(feature) {
65
+ const currentUrl = this.stateManager.getCurrentState()?.url;
66
+ const customPrompt = this.provider.getSystemPromptForAgent('planner', currentUrl);
67
+ const featureDirective = feature
68
+ ? `\n IMPORTANT: The user requested to focus specifically on: "${feature}"\n ALL scenarios MUST be directly related to this feature. Do not propose generic page tests unrelated to it.\n Use the user's exact wording to guide scenario names — do not substitute different entities (e.g., do not plan "suite" actions when user said "test").`
69
+ : '';
70
+ return dedent `
71
+ <role>
72
+ You are ISTQB certified senior manual QA planning exploratory testing session of a web application.
73
+ Each test scenario must complete a meaningful user workflow — not just open a UI element and verify it exists.
74
+ Bad: "Open the Help panel" — just opens something.
75
+ Good: "Create a new suite and verify it appears in the list" — completes a business action.
76
+ </role>
77
+ <task>
78
+ List possible testing scenarios for the web page.
79
+ For each scenario provide:
80
+ - Steps: specific actions forming a complete workflow
81
+ - Expected outcomes: observable business results to verify
82
+
83
+ Focus on completing meaningful actions, not just verifying UI elements exist.
84
+ Start with positive scenarios and then move to negative scenarios
85
+ Tests must be atomic and independent of each other
86
+ Tests must be relevant to the page
87
+ Tests must be achievable from UI
88
+ Tests must be verifiable from UI
89
+ NEVER split one workflow into multiple tests. Each test must be a complete end-to-end flow.
90
+ Bad: "Open delete dropdown" + "Confirm deletion" — these are ONE test, not two.
91
+ Bad: "Search for X" + "Verify search results" — searching and verifying is ONE test.
92
+ Bad: "Leave field empty" + "Click submit" — that's one negative test, not two.
93
+ If two scenarios cannot run independently (one requires the other to run first), merge them into one.${featureDirective}
94
+ </task>
95
+
96
+ ${customPrompt || ''}
97
+ `;
98
+ }
99
+ setPlan(plan) {
100
+ this.currentPlan = plan;
101
+ }
102
+ static getCachedPlan(url) {
103
+ return getRegisteredPlan(url)?.plan || null;
104
+ }
105
+ async plan(feature, style, parentPlan, completedPlans) {
106
+ Stats.plans++;
107
+ const state = this.stateManager.getCurrentState();
108
+ debugLog('Planning:', state?.url);
109
+ if (!state)
110
+ throw new Error('No state found');
111
+ if (!this.freshStart && !feature && !this.currentPlan && state.url) {
112
+ const similar = this.findSimilarPlan(state.url);
113
+ if (similar) {
114
+ tag('info').log(`Similar page already planned: ${similar.url} (${similar.plan.tests.length} tests)`);
115
+ this.registerPlanInSession(similar.plan);
116
+ return similar.plan;
117
+ }
118
+ }
119
+ if (!this.freshStart && !this.currentPlan && state.url) {
120
+ this.currentPlan = Planner.getCachedPlan(state.url);
121
+ if (this.currentPlan) {
122
+ tag('step').log(`Loaded cached plan: "${this.currentPlan.title}"`);
123
+ }
124
+ }
125
+ this.freshStart = false;
126
+ setActivity(`${this.emoji} Planning...`, 'action');
127
+ tag('info').log(`Planning test scenarios for ${state.url}`);
128
+ if (style)
129
+ tag('info').log(`Planning style: ${style}`);
130
+ const tags = ['planner'];
131
+ if (style)
132
+ tags.push(style);
133
+ const result = await Observability.run(`planner: ${state.url}`, { tags, sessionId: state.url }, async () => {
134
+ const actionResult = ActionResult.fromState(state);
135
+ const conversation = await this.buildConversation(actionResult, style, parentPlan, feature);
136
+ if (feature) {
137
+ tag('step').log(`Focusing on ${feature}`);
138
+ conversation.addUserText(`CRITICAL: Every scenario must focus on: "${feature}". Use the user's exact wording — do not substitute different entities. Skip unrelated page elements.`);
139
+ }
140
+ else {
141
+ tag('step').log('Focusing on main content of this page');
142
+ }
143
+ debugLog('Sending planning prompt to AI provider with structured output');
144
+ const aiResult = await this.provider.generateObject(conversation.messages, TasksSchema, conversation.model);
145
+ if (!aiResult?.object?.scenarios) {
146
+ throw new Error('No tasks were created successfully');
147
+ }
148
+ if (aiResult.object.scenarios.length === 0 && !this.currentPlan) {
149
+ throw new Error('No tasks were created successfully');
150
+ }
151
+ const fromPlanning = aiResult.object.scenarios.map((s) => new Test(s.scenario, s.priority, s.expectedOutcomes, s.startUrl || state.url, s.steps || []));
152
+ return { tests: fromPlanning, planName: aiResult.object.planName };
153
+ });
154
+ const tests = result.tests;
155
+ debugLog('Created tests:', tests);
156
+ if (!this.currentPlan) {
157
+ const cached = state.url ? getRegisteredPlan(state.url) : null;
158
+ const planName = feature || cached?.plan.title || result.planName || state.url;
159
+ this.currentPlan = new Plan(planName);
160
+ this.currentPlan.url = state.url;
161
+ if (parentPlan)
162
+ this.currentPlan.parentPlan = parentPlan;
163
+ const allPreviousScenarios = this.getPreviousSessionScenarios();
164
+ for (const t of tests) {
165
+ if (allPreviousScenarios.has(t.scenario.toLowerCase()))
166
+ continue;
167
+ t.style = this.lastStyleName;
168
+ t.startUrl = state.url;
169
+ this.currentPlan.addTest(t);
170
+ }
171
+ const summary = `Scenarios:\n${this.currentPlan.tests.map((t) => `- [${t.priority}] ${t.scenario}`).join('\n')}`;
172
+ tag('multiline').log(summary);
173
+ }
174
+ else {
175
+ tag('step').log(`Expanding plan: "${this.currentPlan.title}"`);
176
+ this.currentPlan.nextIteration();
177
+ const newTests = this.addNewTests(tests, state.url);
178
+ if (newTests.length > 0) {
179
+ const summary = `New scenarios:\n${newTests.map((t) => `+ [${t.priority}] ${t.scenario}`).join('\n')}`;
180
+ tag('multiline').log(summary);
181
+ }
182
+ }
183
+ this.moveExecutedTestsToEnd();
184
+ const availableStyles = Object.keys(getStyles()).join(', ');
185
+ tag('success').log(`Planning complete! ${this.currentPlan.tests.length} tests in plan: ${this.currentPlan.title}`);
186
+ tag('info').log(`Planning style: ${this.lastStyleName} (available: ${availableStyles})`);
187
+ if (state.url)
188
+ registerPlan(state.url, this.currentPlan, feature);
189
+ this.registerPlanInSession(this.currentPlan);
190
+ return this.currentPlan;
191
+ }
192
+ moveExecutedTestsToEnd() {
193
+ if (!this.currentPlan)
194
+ return;
195
+ const pending = this.currentPlan.tests.filter((t) => t.result === null);
196
+ const executed = this.currentPlan.tests.filter((t) => t.result !== null);
197
+ this.currentPlan.tests = [...pending, ...executed];
198
+ this.currentPlan.notifyChange();
199
+ }
200
+ addNewTests(tests, defaultStartUrl) {
201
+ if (!this.currentPlan)
202
+ return [];
203
+ const existingScenarios = new Set(this.currentPlan.getAllTests().map((t) => t.scenario.toLowerCase()));
204
+ const added = [];
205
+ const allPreviousScenarios = this.getPreviousSessionScenariosExcluding(this.currentPlan);
206
+ for (const test of tests) {
207
+ if (existingScenarios.has(test.scenario.toLowerCase()))
208
+ continue;
209
+ if (allPreviousScenarios.has(test.scenario.toLowerCase()))
210
+ continue;
211
+ test.style = this.lastStyleName;
212
+ test.startUrl = test.startUrl || defaultStartUrl;
213
+ test.plan = this.currentPlan;
214
+ this.currentPlan.addTest(test);
215
+ existingScenarios.add(test.scenario.toLowerCase());
216
+ added.push(test);
217
+ }
218
+ return added;
219
+ }
220
+ cleanExperienceFlows(text) {
221
+ const seenTitles = new Set();
222
+ let result = text;
223
+ for (const section of [...mdq(text).query('section2').each(), ...mdq(text).query('section3').each()]) {
224
+ const heading = section.query('heading').text().trim();
225
+ const body = mdq(section.text())
226
+ .query('heading')
227
+ .replace('')
228
+ .replace(/^---\s*$/gm, '')
229
+ .trim();
230
+ if (!body || seenTitles.has(heading)) {
231
+ result = result.replace(section.text(), '');
232
+ continue;
233
+ }
234
+ seenTitles.add(heading);
235
+ const blockquotes = section.query('blockquote').each();
236
+ if (blockquotes.length <= 10)
237
+ continue;
238
+ for (const bq of blockquotes.slice(10)) {
239
+ result = result.replace(bq.text(), '');
240
+ }
241
+ result = result.replace(section.text().trim(), `${section.text().trim()}\n> ... and ${blockquotes.length - 10} more discoveries`);
242
+ }
243
+ return result.trim() || null;
244
+ }
245
+ buildApproach(style) {
246
+ const { name, approach } = getActiveStyle(this.currentPlan?.iteration || 0, style);
247
+ this.lastStyleName = name;
248
+ return `Your approach is ${name} testing:\n<approach>\n${approach}\n</approach>`;
249
+ }
250
+ async buildConversation(state, style, parentPlan, feature) {
251
+ const model = this.provider.getAgenticModel('planner');
252
+ const conversation = new Conversation([], model);
253
+ conversation.autoTrimTag('page_research', 20000);
254
+ conversation.autoTrimTag('tested_scenarios', 10000);
255
+ conversation.addUserText(this.getSystemMessage(feature));
256
+ const planningPrompt = dedent `
257
+ <task>
258
+ Based on the page research, create ${this.MIN_TASKS}-${this.MAX_TASKS} exploratory testing scenarios.
259
+ For each scenario provide specific steps and expected outcomes.
260
+ </task>
261
+
262
+ <rules>
263
+ Scenarios must involve interaction with the web page (clicking, scrolling or typing).
264
+ Scenarios must focus on business logic and functionality of the page.
265
+ Focus on interactive elements of the page. Skip navigation links that lead away from current page.
266
+ Each dropdown menu, modal, or panel discovered in Extended Research is a separate feature.
267
+ You can suggest scenarios that can be tested only through web interface.
268
+ You can't test emails, database, SMS, or any external services.
269
+ Suggest scenarios that can be potentially verified by UI.
270
+ Focus on error or success messages as outcome.
271
+ Focus on URL page change or data persistency after page reload.
272
+ If there are subpages (pages with same URL path) plan testing of those subpages as well
273
+ If you plan to test CRUD operations, plan them in correct order: create, read, update.
274
+ DO NOT propose "verification-only" tests that merely open a UI element (modal, dropdown, panel) and check it exists.
275
+ Every test must complete a meaningful action that changes application state or produces a business outcome.
276
+ Opening a modal is NOT a test — performing an action INSIDE the modal IS a test.
277
+ Clicking a dropdown is NOT a test — selecting an option and verifying the result IS a test.
278
+ <priority_order>
279
+ Tests that change application data are MORE valuable than tests that only change the UI display.
280
+ Prioritize interactions that create, update, or delete data — these test real application behavior.
281
+ Tests that only switch views, toggle filters, or paginate are LESS valuable — propose them only after data-changing tests are covered.
282
+ If multiple ways to create or modify data exist (different types, different forms), propose a separate test for each.
283
+ </priority_order>
284
+ ${protectionRule}
285
+ ${fileUploadRule}
286
+ </rules>
287
+
288
+ ${this.buildApproach(style)}
289
+
290
+ <context>
291
+ URL: ${state.url || 'Unknown'}
292
+ Title: ${state.title || 'Unknown'}
293
+ </context>
294
+ `;
295
+ conversation.addUserText(planningPrompt);
296
+ const currentState = this.stateManager.getCurrentState();
297
+ const research = await this.researcher.research(currentState || state, {
298
+ deep: true,
299
+ });
300
+ let plannerResearch = mdq(research).query('code').replace('');
301
+ for (const table of mdq(plannerResearch).query('table').each()) {
302
+ const rawTable = table.text();
303
+ const rows = table.toJson();
304
+ if (rows.length === 0 || !rows[0].Element)
305
+ continue;
306
+ const elementWithType = rows.map((r) => ({
307
+ Element: r.Element,
308
+ Type: r.Type || '',
309
+ }));
310
+ plannerResearch = plannerResearch.replace(rawTable, jsonToTable(elementWithType, ['Element', 'Type']));
311
+ }
312
+ const hasFocusedOverlay = hasFocusedSection(plannerResearch);
313
+ const focusNote = hasFocusedOverlay ? "IMPORTANT: One section is marked as **Focused** — this is the user's current focus area. Concentrate testing on the Focused section FIRST — test all interactions inside it before planning tests for the rest of the page." : '';
314
+ const featureFilter = feature ? `FOCUS FILTER: Only propose scenarios using elements relevant to "${feature}". Ignore all other elements.` : '';
315
+ conversation.addUserText(dedent `
316
+ <page_research>
317
+ The following research describes ALL interactive elements on the page, organized by sections.
318
+ Each numbered section and each Extended Research subsection represents a testable feature area.
319
+ Skip the Menu/Navigation section — we test THIS page, not navigation away from it.
320
+ ${featureFilter}
321
+ ${focusNote}
322
+
323
+ ${plannerResearch}
324
+ </page_research>
325
+ `);
326
+ if (this.fisherman) {
327
+ await this.fisherman.ensureReady(state.url);
328
+ if (this.fisherman.isAvailable()) {
329
+ const endpointList = this.fisherman.getEndpointList(state.url);
330
+ if (endpointList) {
331
+ conversation.addUserText(dedent `
332
+ <api_data_preparation>
333
+ An API is available to create test data before tests run (preconditions).
334
+ The following write endpoints were observed or configured:
335
+
336
+ ${endpointList}
337
+
338
+ Use this knowledge to understand the data model beyond what the UI shows.
339
+ When planning scenarios that need specific data (edit, delete, filter, sort), note that
340
+ preconditions can create that data via API before the test starts.
341
+ For example: "Edit a post" test can have a precondition "1 post to edit" created via API.
342
+ </api_data_preparation>
343
+ `);
344
+ }
345
+ }
346
+ }
347
+ if (!feature) {
348
+ const rawFlows = this.experienceTracker.getSuccessfulExperience(state, { includeDescendants: true, stripCode: true });
349
+ const flows = rawFlows.map((f) => this.cleanExperienceFlows(f)).filter(Boolean);
350
+ if (flows.length > 0) {
351
+ conversation.addUserText(dedent `
352
+ <previously_tested_flows>
353
+ You are provided with previously tested scenarios.
354
+ This information is used to increase the testing coverage and discover untested paths.
355
+
356
+ These flows have been tested before on this URL:
357
+
358
+ ${flows.join('\n\n')}
359
+
360
+ Blockquote items are discoveries made during those flows (buttons, fields, options that appeared).
361
+ They show new elements that appeared during the flow.
362
+ Use them in your tests if needed, depending on the <approach>.
363
+ </previously_tested_flows>
364
+ `);
365
+ }
366
+ }
367
+ if (this.currentPlan) {
368
+ tag('step').log('Analyzing current plan to expand testing');
369
+ const allTests = this.currentPlan.getAllTests();
370
+ const titleListing = allTests.map((t) => `- "${t.scenario}" [${t.result || 'pending'}]`).join('\n');
371
+ const compactContext = planToCompactAiContext(this.currentPlan);
372
+ conversation.addUserText(dedent `
373
+ CRITICAL: This plan already has tests.
374
+
375
+ <absolute_rules>
376
+ 1. DO NOT re-propose tests with the same scenario name or identical steps
377
+ 2. You CAN propose tests for the same feature if they test a genuinely different operation (create vs edit vs delete)
378
+ 3. A group of identical elements counts as ONE feature — one tab test covers tabs, one suite link covers suite navigation
379
+ 4. Do NOT propose tests that only differ by trivial input data (e.g., "Search X" and "Search Y"), except when the <approach> requires systematic valid combinatorial coverage per control — then separate scenarios for distinct select options, meaningful checkbox combinations, or alternate valid field values are allowed
380
+ 5. Do NOT split one workflow into sequential tests (e.g., "Open modal" + "Fill form in modal" = ONE test)
381
+ 6. If no genuinely new operations or features remain, return EMPTY scenarios array
382
+ </absolute_rules>
383
+
384
+ All tested scenario titles (DO NOT duplicate any of these):
385
+ ${titleListing}
386
+
387
+ <tested_scenarios>
388
+ ${compactContext}
389
+ </tested_scenarios>
390
+
391
+ <planning_strategy>
392
+ Find a feature area in the research that has NO or minimal test coverage.
393
+ Pick that ONE feature and propose ${this.MIN_TASKS}-${this.MAX_TASKS} tests for it.
394
+ ${mdq(plannerResearch).query('section("Extended Research")').count() > 0 ? 'IMPORTANT: The research contains "Extended Research" sections with dropdowns, modals, and panels. Prioritize testing features from Extended Research that have no coverage yet.' : ''}
395
+
396
+ Follow the <approach> described above when proposing tests for this feature.
397
+
398
+ If ALL features across ALL research sections are covered, return empty scenarios array.
399
+ </planning_strategy>
400
+
401
+ <context_from_previous_tests>
402
+ During testing, the following pages were visited:
403
+ ${this.currentPlan
404
+ .getVisitedPages()
405
+ .map((s) => `- ${s.url} (${s.title || 'untitled'})`)
406
+ .join('\n')}
407
+
408
+ You MAY propose tests starting from these pages if they are relevant to the plan "${this.currentPlan.title}".
409
+ Set startUrl for such tests. Ignore pages that belong to a different feature area.
410
+ </context_from_previous_tests>
411
+
412
+ Propose ONLY new scenarios that are NOT in the existing tests list.
413
+ `);
414
+ }
415
+ const sessionTests = this.getSessionTestsSummary();
416
+ if (sessionTests) {
417
+ conversation.addUserText(dedent `
418
+ Tests already planned in this session across all pages. DO NOT duplicate any of these:
419
+
420
+ <session_tests>
421
+ ${sessionTests}
422
+ </session_tests>
423
+ `);
424
+ }
425
+ if (parentPlan && !this.currentPlan) {
426
+ const parentTests = parentPlan.tests.map((t) => `- "${t.scenario}"`).join('\n');
427
+ conversation.addUserText(dedent `
428
+ <parent_page_context>
429
+ This is a SUBPAGE of a page that already has these tests planned:
430
+ ${parentTests}
431
+
432
+ DO NOT propose tests that overlap with parent page tests even if the wording differs.
433
+ Focus ONLY on features and interactions UNIQUE to this subpage.
434
+ </parent_page_context>
435
+ `);
436
+ }
437
+ const hasCurrentPlan = !!this.currentPlan;
438
+ const tasksMessage = dedent `
439
+ <task>
440
+ Provide testing scenarios as structured data with the following requirements:
441
+ 1. Create a short, descriptive plan name that summarizes what will be tested (e.g., "User Authentication Testing", "Product Catalog Navigation", "Form Validation Tests")
442
+ 2. Assign priorities based on business importance:
443
+ - CRITICAL: Core business functionality that defines the page purpose
444
+ - IMPORTANT: Key user flows, primary features, CRUD operations
445
+ - HIGH: Secondary features, edge cases for critical flows
446
+ - NORMAL: Supporting actions, settings, configuration
447
+ - LOW: Cosmetic checks, boundary testing, minor interactions
448
+ 3. Propose tests following research section order: ${this.sectionOrder.join(', ')}
449
+ Cover sections in this order — first propose tests for elements from earlier sections, then later ones.
450
+ Extended Research sections come after the main sections.
451
+ 4. Focus on interactive elements of the page. Skip navigation links that lead away from current page.
452
+ 5. Focus on tests you are 100% sure relevant to this page and can be achived from UI.
453
+ 6. For each task, provide BOTH steps and expected outcomes as separate arrays:
454
+
455
+ STEPS - actionable commands:
456
+ - Each step should be a specific action to perform
457
+ - Good: "Click Create Suite button", "Enter 'My New Suite' as suite name", "Click Save button"
458
+ - Good: "Click Star icon on 'Template API Testing' suite"
459
+ - Bad: "Open the dropdown menu" (opening is not a goal, it's a means)
460
+ - Bad: "Verify modal appears" (verification belongs in expected outcomes, not steps)
461
+ - Steps should form a complete workflow, not stop at opening a UI element
462
+ - NEVER split a workflow across two tests. One test = one complete action + its verification
463
+
464
+ EXPECTED OUTCOMES - verifiable results:
465
+ - Good: "New suite 'My New Suite' appears in the suite list"
466
+ - Good: "Suite appears under Starred filter tab"
467
+ - Good: "Success message 'Suite created' is displayed"
468
+ - Bad: "Modal is displayed" (just verifying existence, no business value)
469
+ - Bad: "Dropdown menu is visible" (just verifying existence)
470
+ - Each outcome should be independently verifiable
471
+ - Avoid combining multiple checks into one outcome
472
+ - Expected outcomes describe WHAT TO VERIFY
473
+
474
+ FORMATTING RULES:
475
+ - Do not add extra prefixes like: TITLE:, TEST:, Scenario:, Step:, Expected: etc.
476
+ - Do not wrap text in ** or * quotes, ( or ) brackets.
477
+ - Avoid using emojis or special characters.
478
+ 7. Only tests that can be tested from web UI should be proposed.
479
+ ${hasCurrentPlan ? '8. CRITICAL: Return ONLY NEW scenarios not in the existing tests list. Return empty array if no new tests needed.' : `8. At least ${this.MIN_TASKS} tests should be proposed.`}
480
+ </task>
481
+ `;
482
+ conversation.addUserText(tasksMessage);
483
+ return conversation;
484
+ }
485
+ }
486
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/ai/planner.ts"],"names":[],"mappings":"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"}