prose-qa 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +570 -0
  3. package/dist/agent/bash.d.ts +52 -0
  4. package/dist/agent/bash.d.ts.map +1 -0
  5. package/dist/agent/bash.js +186 -0
  6. package/dist/agent/bash.js.map +1 -0
  7. package/dist/agent/bash.test.d.ts +2 -0
  8. package/dist/agent/bash.test.d.ts.map +1 -0
  9. package/dist/agent/bash.test.js +70 -0
  10. package/dist/agent/bash.test.js.map +1 -0
  11. package/dist/agent/llm-model.d.ts +5 -0
  12. package/dist/agent/llm-model.d.ts.map +1 -0
  13. package/dist/agent/llm-model.js +29 -0
  14. package/dist/agent/llm-model.js.map +1 -0
  15. package/dist/agent/llm-model.test.d.ts +2 -0
  16. package/dist/agent/llm-model.test.d.ts.map +1 -0
  17. package/dist/agent/llm-model.test.js +28 -0
  18. package/dist/agent/llm-model.test.js.map +1 -0
  19. package/dist/agent/prompt.d.ts +17 -0
  20. package/dist/agent/prompt.d.ts.map +1 -0
  21. package/dist/agent/prompt.js +97 -0
  22. package/dist/agent/prompt.js.map +1 -0
  23. package/dist/agent/prompt.test.d.ts +2 -0
  24. package/dist/agent/prompt.test.d.ts.map +1 -0
  25. package/dist/agent/prompt.test.js +124 -0
  26. package/dist/agent/prompt.test.js.map +1 -0
  27. package/dist/agent/provider-options.d.ts +8 -0
  28. package/dist/agent/provider-options.d.ts.map +1 -0
  29. package/dist/agent/provider-options.js +115 -0
  30. package/dist/agent/provider-options.js.map +1 -0
  31. package/dist/agent/provider-options.test.d.ts +2 -0
  32. package/dist/agent/provider-options.test.d.ts.map +1 -0
  33. package/dist/agent/provider-options.test.js +114 -0
  34. package/dist/agent/provider-options.test.js.map +1 -0
  35. package/dist/agent/runner.d.ts +27 -0
  36. package/dist/agent/runner.d.ts.map +1 -0
  37. package/dist/agent/runner.js +291 -0
  38. package/dist/agent/runner.js.map +1 -0
  39. package/dist/agent/verdict-retry-prompt.d.ts +3 -0
  40. package/dist/agent/verdict-retry-prompt.d.ts.map +1 -0
  41. package/dist/agent/verdict-retry-prompt.js +18 -0
  42. package/dist/agent/verdict-retry-prompt.js.map +1 -0
  43. package/dist/agent/verdict-retry-prompt.test.d.ts +2 -0
  44. package/dist/agent/verdict-retry-prompt.test.d.ts.map +1 -0
  45. package/dist/agent/verdict-retry-prompt.test.js +25 -0
  46. package/dist/agent/verdict-retry-prompt.test.js.map +1 -0
  47. package/dist/agent/verdict.d.ts +31 -0
  48. package/dist/agent/verdict.d.ts.map +1 -0
  49. package/dist/agent/verdict.js +123 -0
  50. package/dist/agent/verdict.js.map +1 -0
  51. package/dist/agent/verdict.test.d.ts +2 -0
  52. package/dist/agent/verdict.test.d.ts.map +1 -0
  53. package/dist/agent/verdict.test.js +156 -0
  54. package/dist/agent/verdict.test.js.map +1 -0
  55. package/dist/analyze/build-context.d.ts +58 -0
  56. package/dist/analyze/build-context.d.ts.map +1 -0
  57. package/dist/analyze/build-context.js +141 -0
  58. package/dist/analyze/build-context.js.map +1 -0
  59. package/dist/analyze/build-context.test.d.ts +2 -0
  60. package/dist/analyze/build-context.test.d.ts.map +1 -0
  61. package/dist/analyze/build-context.test.js +118 -0
  62. package/dist/analyze/build-context.test.js.map +1 -0
  63. package/dist/analyze/compare-runs.d.ts +49 -0
  64. package/dist/analyze/compare-runs.d.ts.map +1 -0
  65. package/dist/analyze/compare-runs.js +214 -0
  66. package/dist/analyze/compare-runs.js.map +1 -0
  67. package/dist/analyze/compare-runs.test.d.ts +2 -0
  68. package/dist/analyze/compare-runs.test.d.ts.map +1 -0
  69. package/dist/analyze/compare-runs.test.js +139 -0
  70. package/dist/analyze/compare-runs.test.js.map +1 -0
  71. package/dist/analyze/diff-hunks.d.ts +16 -0
  72. package/dist/analyze/diff-hunks.d.ts.map +1 -0
  73. package/dist/analyze/diff-hunks.js +287 -0
  74. package/dist/analyze/diff-hunks.js.map +1 -0
  75. package/dist/analyze/diff-hunks.test.d.ts +2 -0
  76. package/dist/analyze/diff-hunks.test.d.ts.map +1 -0
  77. package/dist/analyze/diff-hunks.test.js +54 -0
  78. package/dist/analyze/diff-hunks.test.js.map +1 -0
  79. package/dist/analyze/hunk-editor.d.ts +8 -0
  80. package/dist/analyze/hunk-editor.d.ts.map +1 -0
  81. package/dist/analyze/hunk-editor.js +129 -0
  82. package/dist/analyze/hunk-editor.js.map +1 -0
  83. package/dist/analyze/hunk-editor.test.d.ts +2 -0
  84. package/dist/analyze/hunk-editor.test.d.ts.map +1 -0
  85. package/dist/analyze/hunk-editor.test.js +48 -0
  86. package/dist/analyze/hunk-editor.test.js.map +1 -0
  87. package/dist/analyze/index.d.ts +23 -0
  88. package/dist/analyze/index.d.ts.map +1 -0
  89. package/dist/analyze/index.js +122 -0
  90. package/dist/analyze/index.js.map +1 -0
  91. package/dist/analyze/llm-fix.d.ts +11 -0
  92. package/dist/analyze/llm-fix.d.ts.map +1 -0
  93. package/dist/analyze/llm-fix.js +76 -0
  94. package/dist/analyze/llm-fix.js.map +1 -0
  95. package/dist/analyze/parse-proposal.d.ts +41 -0
  96. package/dist/analyze/parse-proposal.d.ts.map +1 -0
  97. package/dist/analyze/parse-proposal.js +53 -0
  98. package/dist/analyze/parse-proposal.js.map +1 -0
  99. package/dist/analyze/parse-proposal.test.d.ts +2 -0
  100. package/dist/analyze/parse-proposal.test.d.ts.map +1 -0
  101. package/dist/analyze/parse-proposal.test.js +40 -0
  102. package/dist/analyze/parse-proposal.test.js.map +1 -0
  103. package/dist/analyze/repl.d.ts +28 -0
  104. package/dist/analyze/repl.d.ts.map +1 -0
  105. package/dist/analyze/repl.js +284 -0
  106. package/dist/analyze/repl.js.map +1 -0
  107. package/dist/analyze/repl.test.d.ts +2 -0
  108. package/dist/analyze/repl.test.d.ts.map +1 -0
  109. package/dist/analyze/repl.test.js +101 -0
  110. package/dist/analyze/repl.test.js.map +1 -0
  111. package/dist/analyze/suggest.d.ts +5 -0
  112. package/dist/analyze/suggest.d.ts.map +1 -0
  113. package/dist/analyze/suggest.js +75 -0
  114. package/dist/analyze/suggest.js.map +1 -0
  115. package/dist/analyze/suggest.test.d.ts +2 -0
  116. package/dist/analyze/suggest.test.d.ts.map +1 -0
  117. package/dist/analyze/suggest.test.js +53 -0
  118. package/dist/analyze/suggest.test.js.map +1 -0
  119. package/dist/analyze/validate-markdown.d.ts +3 -0
  120. package/dist/analyze/validate-markdown.d.ts.map +1 -0
  121. package/dist/analyze/validate-markdown.js +25 -0
  122. package/dist/analyze/validate-markdown.js.map +1 -0
  123. package/dist/artifacts/policy.d.ts +9 -0
  124. package/dist/artifacts/policy.d.ts.map +1 -0
  125. package/dist/artifacts/policy.js +46 -0
  126. package/dist/artifacts/policy.js.map +1 -0
  127. package/dist/artifacts/policy.test.d.ts +2 -0
  128. package/dist/artifacts/policy.test.d.ts.map +1 -0
  129. package/dist/artifacts/policy.test.js +73 -0
  130. package/dist/artifacts/policy.test.js.map +1 -0
  131. package/dist/auth/resolve.d.ts +22 -0
  132. package/dist/auth/resolve.d.ts.map +1 -0
  133. package/dist/auth/resolve.js +148 -0
  134. package/dist/auth/resolve.js.map +1 -0
  135. package/dist/auth/store.d.ts +23 -0
  136. package/dist/auth/store.d.ts.map +1 -0
  137. package/dist/auth/store.js +103 -0
  138. package/dist/auth/store.js.map +1 -0
  139. package/dist/cache/generate.d.ts +8 -0
  140. package/dist/cache/generate.d.ts.map +1 -0
  141. package/dist/cache/generate.js +61 -0
  142. package/dist/cache/generate.js.map +1 -0
  143. package/dist/cache/hash.d.ts +5 -0
  144. package/dist/cache/hash.d.ts.map +1 -0
  145. package/dist/cache/hash.js +21 -0
  146. package/dist/cache/hash.js.map +1 -0
  147. package/dist/cache/hash.test.d.ts +2 -0
  148. package/dist/cache/hash.test.d.ts.map +1 -0
  149. package/dist/cache/hash.test.js +42 -0
  150. package/dist/cache/hash.test.js.map +1 -0
  151. package/dist/cache/resolve.d.ts +5 -0
  152. package/dist/cache/resolve.d.ts.map +1 -0
  153. package/dist/cache/resolve.js +8 -0
  154. package/dist/cache/resolve.js.map +1 -0
  155. package/dist/cache/store.d.ts +20 -0
  156. package/dist/cache/store.d.ts.map +1 -0
  157. package/dist/cache/store.js +90 -0
  158. package/dist/cache/store.js.map +1 -0
  159. package/dist/cache/store.test.d.ts +2 -0
  160. package/dist/cache/store.test.d.ts.map +1 -0
  161. package/dist/cache/store.test.js +101 -0
  162. package/dist/cache/store.test.js.map +1 -0
  163. package/dist/cli/analyze.d.ts +21 -0
  164. package/dist/cli/analyze.d.ts.map +1 -0
  165. package/dist/cli/analyze.js +148 -0
  166. package/dist/cli/analyze.js.map +1 -0
  167. package/dist/cli/concurrency.d.ts +17 -0
  168. package/dist/cli/concurrency.d.ts.map +1 -0
  169. package/dist/cli/concurrency.js +56 -0
  170. package/dist/cli/concurrency.js.map +1 -0
  171. package/dist/cli/concurrency.test.d.ts +2 -0
  172. package/dist/cli/concurrency.test.d.ts.map +1 -0
  173. package/dist/cli/concurrency.test.js +74 -0
  174. package/dist/cli/concurrency.test.js.map +1 -0
  175. package/dist/cli/config.d.ts +2 -0
  176. package/dist/cli/config.d.ts.map +1 -0
  177. package/dist/cli/config.js +14 -0
  178. package/dist/cli/config.js.map +1 -0
  179. package/dist/cli/help.d.ts +23 -0
  180. package/dist/cli/help.d.ts.map +1 -0
  181. package/dist/cli/help.js +458 -0
  182. package/dist/cli/help.js.map +1 -0
  183. package/dist/cli/help.test.d.ts +2 -0
  184. package/dist/cli/help.test.d.ts.map +1 -0
  185. package/dist/cli/help.test.js +41 -0
  186. package/dist/cli/help.test.js.map +1 -0
  187. package/dist/cli/index.d.ts +3 -0
  188. package/dist/cli/index.d.ts.map +1 -0
  189. package/dist/cli/index.js +300 -0
  190. package/dist/cli/index.js.map +1 -0
  191. package/dist/cli/mcp.d.ts +6 -0
  192. package/dist/cli/mcp.d.ts.map +1 -0
  193. package/dist/cli/mcp.js +17 -0
  194. package/dist/cli/mcp.js.map +1 -0
  195. package/dist/cli/record.d.ts +27 -0
  196. package/dist/cli/record.d.ts.map +1 -0
  197. package/dist/cli/record.js +244 -0
  198. package/dist/cli/record.js.map +1 -0
  199. package/dist/cli/run.d.ts +11 -0
  200. package/dist/cli/run.d.ts.map +1 -0
  201. package/dist/cli/run.js +676 -0
  202. package/dist/cli/run.js.map +1 -0
  203. package/dist/cli/subprocess.d.ts +19 -0
  204. package/dist/cli/subprocess.d.ts.map +1 -0
  205. package/dist/cli/subprocess.js +142 -0
  206. package/dist/cli/subprocess.js.map +1 -0
  207. package/dist/cli/subprocess.test.d.ts +2 -0
  208. package/dist/cli/subprocess.test.d.ts.map +1 -0
  209. package/dist/cli/subprocess.test.js +76 -0
  210. package/dist/cli/subprocess.test.js.map +1 -0
  211. package/dist/cli/tags.d.ts +5 -0
  212. package/dist/cli/tags.d.ts.map +1 -0
  213. package/dist/cli/tags.js +33 -0
  214. package/dist/cli/tags.js.map +1 -0
  215. package/dist/cli/tags.test.d.ts +2 -0
  216. package/dist/cli/tags.test.d.ts.map +1 -0
  217. package/dist/cli/tags.test.js +31 -0
  218. package/dist/cli/tags.test.js.map +1 -0
  219. package/dist/config/env-vars.d.ts +2 -0
  220. package/dist/config/env-vars.d.ts.map +1 -0
  221. package/dist/config/env-vars.js +14 -0
  222. package/dist/config/env-vars.js.map +1 -0
  223. package/dist/config/env.d.ts +2 -0
  224. package/dist/config/env.d.ts.map +1 -0
  225. package/dist/config/env.js +9 -0
  226. package/dist/config/env.js.map +1 -0
  227. package/dist/config/lightpanda.d.ts +6 -0
  228. package/dist/config/lightpanda.d.ts.map +1 -0
  229. package/dist/config/lightpanda.js +38 -0
  230. package/dist/config/lightpanda.js.map +1 -0
  231. package/dist/config/lightpanda.test.d.ts +2 -0
  232. package/dist/config/lightpanda.test.d.ts.map +1 -0
  233. package/dist/config/lightpanda.test.js +46 -0
  234. package/dist/config/lightpanda.test.js.map +1 -0
  235. package/dist/config/load.d.ts +22 -0
  236. package/dist/config/load.d.ts.map +1 -0
  237. package/dist/config/load.js +242 -0
  238. package/dist/config/load.js.map +1 -0
  239. package/dist/config/load.test.d.ts +2 -0
  240. package/dist/config/load.test.d.ts.map +1 -0
  241. package/dist/config/load.test.js +86 -0
  242. package/dist/config/load.test.js.map +1 -0
  243. package/dist/config/set.d.ts +8 -0
  244. package/dist/config/set.d.ts.map +1 -0
  245. package/dist/config/set.js +93 -0
  246. package/dist/config/set.js.map +1 -0
  247. package/dist/config/set.test.d.ts +2 -0
  248. package/dist/config/set.test.d.ts.map +1 -0
  249. package/dist/config/set.test.js +98 -0
  250. package/dist/config/set.test.js.map +1 -0
  251. package/dist/healing/classify.d.ts +15 -0
  252. package/dist/healing/classify.d.ts.map +1 -0
  253. package/dist/healing/classify.js +209 -0
  254. package/dist/healing/classify.js.map +1 -0
  255. package/dist/healing/classify.test.d.ts +2 -0
  256. package/dist/healing/classify.test.d.ts.map +1 -0
  257. package/dist/healing/classify.test.js +167 -0
  258. package/dist/healing/classify.test.js.map +1 -0
  259. package/dist/healing/recovery-prompt.d.ts +3 -0
  260. package/dist/healing/recovery-prompt.d.ts.map +1 -0
  261. package/dist/healing/recovery-prompt.js +22 -0
  262. package/dist/healing/recovery-prompt.js.map +1 -0
  263. package/dist/mcp/inline-scenario.d.ts +13 -0
  264. package/dist/mcp/inline-scenario.d.ts.map +1 -0
  265. package/dist/mcp/inline-scenario.js +23 -0
  266. package/dist/mcp/inline-scenario.js.map +1 -0
  267. package/dist/mcp/server.d.ts +4 -0
  268. package/dist/mcp/server.d.ts.map +1 -0
  269. package/dist/mcp/server.js +186 -0
  270. package/dist/mcp/server.js.map +1 -0
  271. package/dist/mcp/skill.d.ts +5 -0
  272. package/dist/mcp/skill.d.ts.map +1 -0
  273. package/dist/mcp/skill.js +38 -0
  274. package/dist/mcp/skill.js.map +1 -0
  275. package/dist/mcp/skill.test.d.ts +2 -0
  276. package/dist/mcp/skill.test.d.ts.map +1 -0
  277. package/dist/mcp/skill.test.js +18 -0
  278. package/dist/mcp/skill.test.js.map +1 -0
  279. package/dist/paths.d.ts +12 -0
  280. package/dist/paths.d.ts.map +1 -0
  281. package/dist/paths.js +61 -0
  282. package/dist/paths.js.map +1 -0
  283. package/dist/prompt/load.d.ts +4 -0
  284. package/dist/prompt/load.d.ts.map +1 -0
  285. package/dist/prompt/load.js +19 -0
  286. package/dist/prompt/load.js.map +1 -0
  287. package/dist/recorder/bridge-process.d.ts +14 -0
  288. package/dist/recorder/bridge-process.d.ts.map +1 -0
  289. package/dist/recorder/bridge-process.js +133 -0
  290. package/dist/recorder/bridge-process.js.map +1 -0
  291. package/dist/recorder/bridge-process.test.d.ts +2 -0
  292. package/dist/recorder/bridge-process.test.d.ts.map +1 -0
  293. package/dist/recorder/bridge-process.test.js +36 -0
  294. package/dist/recorder/bridge-process.test.js.map +1 -0
  295. package/dist/recorder/bridge-worker.d.ts +2 -0
  296. package/dist/recorder/bridge-worker.d.ts.map +1 -0
  297. package/dist/recorder/bridge-worker.js +76 -0
  298. package/dist/recorder/bridge-worker.js.map +1 -0
  299. package/dist/recorder/bridge.d.ts +12 -0
  300. package/dist/recorder/bridge.d.ts.map +1 -0
  301. package/dist/recorder/bridge.js +61 -0
  302. package/dist/recorder/bridge.js.map +1 -0
  303. package/dist/recorder/bridge.test.d.ts +2 -0
  304. package/dist/recorder/bridge.test.d.ts.map +1 -0
  305. package/dist/recorder/bridge.test.js +21 -0
  306. package/dist/recorder/bridge.test.js.map +1 -0
  307. package/dist/recorder/enrich-event.d.ts +31 -0
  308. package/dist/recorder/enrich-event.d.ts.map +1 -0
  309. package/dist/recorder/enrich-event.js +91 -0
  310. package/dist/recorder/enrich-event.js.map +1 -0
  311. package/dist/recorder/events.d.ts +11 -0
  312. package/dist/recorder/events.d.ts.map +1 -0
  313. package/dist/recorder/events.js +42 -0
  314. package/dist/recorder/events.js.map +1 -0
  315. package/dist/recorder/events.test.d.ts +2 -0
  316. package/dist/recorder/events.test.d.ts.map +1 -0
  317. package/dist/recorder/events.test.js +40 -0
  318. package/dist/recorder/events.test.js.map +1 -0
  319. package/dist/recorder/generate-scenario.d.ts +16 -0
  320. package/dist/recorder/generate-scenario.d.ts.map +1 -0
  321. package/dist/recorder/generate-scenario.js +78 -0
  322. package/dist/recorder/generate-scenario.js.map +1 -0
  323. package/dist/recorder/in-page-helpers.d.ts +6 -0
  324. package/dist/recorder/in-page-helpers.d.ts.map +1 -0
  325. package/dist/recorder/in-page-helpers.js +238 -0
  326. package/dist/recorder/in-page-helpers.js.map +1 -0
  327. package/dist/recorder/in-page-helpers.test.d.ts +2 -0
  328. package/dist/recorder/in-page-helpers.test.d.ts.map +1 -0
  329. package/dist/recorder/in-page-helpers.test.js +186 -0
  330. package/dist/recorder/in-page-helpers.test.js.map +1 -0
  331. package/dist/recorder/page-script.d.ts +7 -0
  332. package/dist/recorder/page-script.d.ts.map +1 -0
  333. package/dist/recorder/page-script.js +132 -0
  334. package/dist/recorder/page-script.js.map +1 -0
  335. package/dist/recorder/redact.d.ts +8 -0
  336. package/dist/recorder/redact.d.ts.map +1 -0
  337. package/dist/recorder/redact.js +26 -0
  338. package/dist/recorder/redact.js.map +1 -0
  339. package/dist/recorder/redact.test.d.ts +2 -0
  340. package/dist/recorder/redact.test.d.ts.map +1 -0
  341. package/dist/recorder/redact.test.js +27 -0
  342. package/dist/recorder/redact.test.js.map +1 -0
  343. package/dist/recorder/session.d.ts +8 -0
  344. package/dist/recorder/session.d.ts.map +1 -0
  345. package/dist/recorder/session.js +28 -0
  346. package/dist/recorder/session.js.map +1 -0
  347. package/dist/recorder/snapshot-match.d.ts +22 -0
  348. package/dist/recorder/snapshot-match.d.ts.map +1 -0
  349. package/dist/recorder/snapshot-match.js +102 -0
  350. package/dist/recorder/snapshot-match.js.map +1 -0
  351. package/dist/recorder/snapshot-match.test.d.ts +2 -0
  352. package/dist/recorder/snapshot-match.test.d.ts.map +1 -0
  353. package/dist/recorder/snapshot-match.test.js +34 -0
  354. package/dist/recorder/snapshot-match.test.js.map +1 -0
  355. package/dist/redact/env-secrets.d.ts +14 -0
  356. package/dist/redact/env-secrets.d.ts.map +1 -0
  357. package/dist/redact/env-secrets.js +86 -0
  358. package/dist/redact/env-secrets.js.map +1 -0
  359. package/dist/redact/env-secrets.test.d.ts +2 -0
  360. package/dist/redact/env-secrets.test.d.ts.map +1 -0
  361. package/dist/redact/env-secrets.test.js +103 -0
  362. package/dist/redact/env-secrets.test.js.map +1 -0
  363. package/dist/reporter/export.d.ts +14 -0
  364. package/dist/reporter/export.d.ts.map +1 -0
  365. package/dist/reporter/export.js +53 -0
  366. package/dist/reporter/export.js.map +1 -0
  367. package/dist/reporter/export.test.d.ts +2 -0
  368. package/dist/reporter/export.test.d.ts.map +1 -0
  369. package/dist/reporter/export.test.js +100 -0
  370. package/dist/reporter/export.test.js.map +1 -0
  371. package/dist/reporter/index.d.ts +11 -0
  372. package/dist/reporter/index.d.ts.map +1 -0
  373. package/dist/reporter/index.js +161 -0
  374. package/dist/reporter/index.js.map +1 -0
  375. package/dist/reporter/index.test.d.ts +2 -0
  376. package/dist/reporter/index.test.d.ts.map +1 -0
  377. package/dist/reporter/index.test.js +61 -0
  378. package/dist/reporter/index.test.js.map +1 -0
  379. package/dist/scenarios/globs.d.ts +15 -0
  380. package/dist/scenarios/globs.d.ts.map +1 -0
  381. package/dist/scenarios/globs.js +48 -0
  382. package/dist/scenarios/globs.js.map +1 -0
  383. package/dist/scenarios/globs.test.d.ts +2 -0
  384. package/dist/scenarios/globs.test.d.ts.map +1 -0
  385. package/dist/scenarios/globs.test.js +53 -0
  386. package/dist/scenarios/globs.test.js.map +1 -0
  387. package/dist/scenarios/parser.d.ts +15 -0
  388. package/dist/scenarios/parser.d.ts.map +1 -0
  389. package/dist/scenarios/parser.js +278 -0
  390. package/dist/scenarios/parser.js.map +1 -0
  391. package/dist/scenarios/parser.test.d.ts +2 -0
  392. package/dist/scenarios/parser.test.d.ts.map +1 -0
  393. package/dist/scenarios/parser.test.js +373 -0
  394. package/dist/scenarios/parser.test.js.map +1 -0
  395. package/dist/skills/loader.d.ts +10 -0
  396. package/dist/skills/loader.d.ts.map +1 -0
  397. package/dist/skills/loader.js +98 -0
  398. package/dist/skills/loader.js.map +1 -0
  399. package/dist/types/config.d.ts +131 -0
  400. package/dist/types/config.d.ts.map +1 -0
  401. package/dist/types/config.js +2 -0
  402. package/dist/types/config.js.map +1 -0
  403. package/dist/types/recorder.d.ts +71 -0
  404. package/dist/types/recorder.d.ts.map +1 -0
  405. package/dist/types/recorder.js +2 -0
  406. package/dist/types/recorder.js.map +1 -0
  407. package/dist/types/scenario.d.ts +41 -0
  408. package/dist/types/scenario.d.ts.map +1 -0
  409. package/dist/types/scenario.js +2 -0
  410. package/dist/types/scenario.js.map +1 -0
  411. package/dist/types/skill.d.ts +20 -0
  412. package/dist/types/skill.d.ts.map +1 -0
  413. package/dist/types/skill.js +13 -0
  414. package/dist/types/skill.js.map +1 -0
  415. package/dist/types/verdict.d.ts +82 -0
  416. package/dist/types/verdict.d.ts.map +1 -0
  417. package/dist/types/verdict.js +13 -0
  418. package/dist/types/verdict.js.map +1 -0
  419. package/package.json +75 -0
  420. package/pqa.config.ts +82 -0
  421. package/prompt/ANALYZE-FLAKY.md +62 -0
  422. package/prompt/ANALYZE.md +110 -0
  423. package/prompt/CACHE-HINTS.md +49 -0
  424. package/prompt/RECORD.md +114 -0
  425. package/prompt/SYSTEM.md +118 -0
  426. package/skills/agent-browser/SKILL.md +2438 -0
  427. package/skills/create-pqa-scenario/SKILL.md +273 -0
@@ -0,0 +1,25 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { buildVerdictRetryPrompt } from "./verdict-retry-prompt.js";
4
+ const baseScenario = {
5
+ filePath: "scenarios/test.md",
6
+ frontmatter: { name: "test" },
7
+ skills: [],
8
+ goal: "Test goal",
9
+ steps: "1. Do thing",
10
+ then: ['url contains "/home"', 'page shows "Welcome"'],
11
+ rawCheckpoints: [],
12
+ checkpoints: [],
13
+ };
14
+ describe("buildVerdictRetryPrompt", () => {
15
+ it("lists every Then checkpoint and requires JSON verdict", () => {
16
+ const prompt = buildVerdictRetryPrompt(baseScenario);
17
+ assert.match(prompt, /## Verdict required/);
18
+ assert.match(prompt, /2 total/);
19
+ assert.match(prompt, /\*\*url contains "\/home"\*\*/);
20
+ assert.match(prompt, /\*\*page shows "Welcome"\*\*/);
21
+ assert.match(prompt, /fenced ```json block/i);
22
+ assert.match(prompt, /Do \*\*not\*\* use bash or read tools/);
23
+ });
24
+ });
25
+ //# sourceMappingURL=verdict-retry-prompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-retry-prompt.test.js","sourceRoot":"","sources":["../../src/agent/verdict-retry-prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,YAAY,GAAa;IAC7B,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7B,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,aAAa;IACpB,IAAI,EAAE,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IACtD,cAAc,EAAE,EAAE;IAClB,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAErD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { ModelMessage } from "ai";
2
+ import { type AgentTranscript, type BashEntry, type TranscriptBashEntry, type TranscriptMessageEntry, type Verdict } from "../types/verdict.js";
3
+ /** Drop the last assistant turn (and trailing tool results) so the model can redo that completion. */
4
+ export declare function stripLastAssistantTurn(messages: ModelMessage[]): ModelMessage[];
5
+ export declare function extractVerdict(text: string): Verdict | null;
6
+ export declare function getTranscriptMessages(transcript: AgentTranscript): TranscriptMessageEntry[];
7
+ export declare function getTranscriptBashEntries(transcript: AgentTranscript): TranscriptBashEntry[];
8
+ export interface TranscriptEntryTiming {
9
+ at?: Date;
10
+ durationMs?: number;
11
+ }
12
+ export declare function appendTranscriptMessage(transcript: AgentTranscript, role: string, content: string, thinking?: string, timing?: TranscriptEntryTiming): void;
13
+ export declare function appendTranscriptBash(transcript: AgentTranscript, entry: BashEntry, timing?: Pick<TranscriptEntryTiming, "at">): void;
14
+ /** Append final model text when it is not already the last assistant message. */
15
+ export declare function appendFinalTextToTranscript(transcript: AgentTranscript, finalText: string, timing?: TranscriptEntryTiming): void;
16
+ export interface StepTranscriptInput {
17
+ text: string;
18
+ reasoningText?: string;
19
+ toolCalls: Array<{
20
+ toolName: string;
21
+ input: unknown;
22
+ }>;
23
+ }
24
+ export interface StepTranscriptFormatted {
25
+ content: string | null;
26
+ thinking?: string;
27
+ }
28
+ /** Format one LLM step for the transcript (content, thinking, and tool calls). */
29
+ export declare function formatStepForTranscript(step: StepTranscriptInput): StepTranscriptFormatted;
30
+ export declare function appendStepToTranscript(transcript: AgentTranscript, step: StepTranscriptInput, bashEntries?: BashEntry[], formattedOverride?: StepTranscriptFormatted, timing?: TranscriptEntryTiming): boolean;
31
+ //# sourceMappingURL=verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../src/agent/verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAE7B,sGAAsG;AACtG,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAS/E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAmC3D;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,eAAe,GAC1B,sBAAsB,EAAE,CAI1B;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,eAAe,GAC1B,mBAAmB,EAAE,CAIvB;AAaD,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,IAAI,CAUN;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,GACzC,IAAI,CAMN;AAED,iFAAiF;AACjF,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,IAAI,CAKN;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,mBAAmB,GACxB,uBAAuB,CAgBzB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,mBAAmB,EACzB,WAAW,GAAE,SAAS,EAAO,EAC7B,iBAAiB,CAAC,EAAE,uBAAuB,EAC3C,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAmBT"}
@@ -0,0 +1,123 @@
1
+ import { VerdictSchema, } from "../types/verdict.js";
2
+ /** Drop the last assistant turn (and trailing tool results) so the model can redo that completion. */
3
+ export function stripLastAssistantTurn(messages) {
4
+ let end = messages.length;
5
+ while (end > 0 && messages[end - 1]?.role === "tool") {
6
+ end -= 1;
7
+ }
8
+ if (end > 0 && messages[end - 1]?.role === "assistant") {
9
+ return messages.slice(0, end - 1);
10
+ }
11
+ return messages;
12
+ }
13
+ export function extractVerdict(text) {
14
+ const jsonBlock = /```(?:json)?\s*([\s\S]*?)```/g;
15
+ let match;
16
+ const candidates = [];
17
+ while ((match = jsonBlock.exec(text)) !== null) {
18
+ candidates.push(match[1].trim());
19
+ }
20
+ // Also try parsing the whole text as JSON
21
+ candidates.push(text.trim());
22
+ for (const candidate of candidates.reverse()) {
23
+ try {
24
+ const parsed = JSON.parse(candidate);
25
+ const result = VerdictSchema.safeParse(parsed);
26
+ if (result.success)
27
+ return result.data;
28
+ }
29
+ catch {
30
+ // continue
31
+ }
32
+ }
33
+ // Try to find inline JSON object with status field
34
+ const inline = /\{[\s\S]*"status"\s*:\s*"(?:pass|fail)"[\s\S]*\}/.exec(text);
35
+ if (inline) {
36
+ try {
37
+ const parsed = JSON.parse(inline[0]);
38
+ const result = VerdictSchema.safeParse(parsed);
39
+ if (result.success)
40
+ return result.data;
41
+ }
42
+ catch {
43
+ // continue
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ export function getTranscriptMessages(transcript) {
49
+ return transcript.entries.filter((entry) => entry.type === "message");
50
+ }
51
+ export function getTranscriptBashEntries(transcript) {
52
+ return transcript.entries.filter((entry) => entry.type === "bash");
53
+ }
54
+ function getLastAssistantMessageEntry(transcript) {
55
+ for (let i = transcript.entries.length - 1; i >= 0; i -= 1) {
56
+ const entry = transcript.entries[i];
57
+ if (entry.type === "message" && entry.role === "assistant")
58
+ return entry;
59
+ if (entry.type === "message" && entry.role === "user")
60
+ break;
61
+ }
62
+ return undefined;
63
+ }
64
+ export function appendTranscriptMessage(transcript, role, content, thinking, timing) {
65
+ const entry = {
66
+ type: "message",
67
+ role,
68
+ thinking,
69
+ content,
70
+ at: (timing?.at ?? new Date()).toISOString(),
71
+ ...(timing?.durationMs !== undefined ? { durationMs: timing.durationMs } : {}),
72
+ };
73
+ transcript.entries.push(entry);
74
+ }
75
+ export function appendTranscriptBash(transcript, entry, timing) {
76
+ transcript.entries.push({
77
+ type: "bash",
78
+ ...entry,
79
+ at: (timing?.at ?? new Date()).toISOString(),
80
+ });
81
+ }
82
+ /** Append final model text when it is not already the last assistant message. */
83
+ export function appendFinalTextToTranscript(transcript, finalText, timing) {
84
+ if (!finalText)
85
+ return;
86
+ const last = getLastAssistantMessageEntry(transcript);
87
+ if (last?.content === finalText)
88
+ return;
89
+ appendTranscriptMessage(transcript, "assistant", finalText, undefined, timing);
90
+ }
91
+ /** Format one LLM step for the transcript (content, thinking, and tool calls). */
92
+ export function formatStepForTranscript(step) {
93
+ const contentParts = [];
94
+ if (step.text)
95
+ contentParts.push(step.text);
96
+ for (const call of step.toolCalls) {
97
+ const input = typeof call.input === "string"
98
+ ? call.input
99
+ : JSON.stringify(call.input);
100
+ contentParts.push(`[tool ${call.toolName}] ${input}`);
101
+ }
102
+ const content = contentParts.length > 0 ? contentParts.join("\n\n") : null;
103
+ const result = { content };
104
+ const thinking = step.reasoningText?.trim();
105
+ if (thinking)
106
+ result.thinking = thinking;
107
+ return result;
108
+ }
109
+ export function appendStepToTranscript(transcript, step, bashEntries = [], formattedOverride, timing) {
110
+ let changed = false;
111
+ const formatted = formattedOverride ?? formatStepForTranscript(step);
112
+ const recordedAt = timing?.at ?? new Date();
113
+ if (formatted.content || formatted.thinking) {
114
+ appendTranscriptMessage(transcript, "assistant", formatted.content ?? "", formatted.thinking, { at: recordedAt, durationMs: timing?.durationMs });
115
+ changed = true;
116
+ }
117
+ for (const entry of bashEntries) {
118
+ appendTranscriptBash(transcript, entry, { at: recordedAt });
119
+ changed = true;
120
+ }
121
+ return changed;
122
+ }
123
+ //# sourceMappingURL=verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/agent/verdict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verdict.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict.test.d.ts","sourceRoot":"","sources":["../../src/agent/verdict.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { appendFinalTextToTranscript, appendStepToTranscript, formatStepForTranscript, stripLastAssistantTurn, } from "./verdict.js";
4
+ describe("stripLastAssistantTurn", () => {
5
+ it("removes the last assistant message", () => {
6
+ const messages = [
7
+ { role: "user", content: "go" },
8
+ { role: "assistant", content: "no verdict yet" },
9
+ ];
10
+ assert.deepEqual(stripLastAssistantTurn(messages), [
11
+ { role: "user", content: "go" },
12
+ ]);
13
+ });
14
+ it("removes trailing tool results with the assistant turn", () => {
15
+ const messages = [
16
+ { role: "user", content: "go" },
17
+ {
18
+ role: "assistant",
19
+ content: [
20
+ {
21
+ type: "tool-call",
22
+ toolCallId: "1",
23
+ toolName: "bash",
24
+ input: { command: "true" },
25
+ },
26
+ ],
27
+ },
28
+ {
29
+ role: "tool",
30
+ content: [
31
+ {
32
+ type: "tool-result",
33
+ toolCallId: "1",
34
+ toolName: "bash",
35
+ output: { type: "json", value: { exitCode: 0 } },
36
+ },
37
+ ],
38
+ },
39
+ ];
40
+ assert.deepEqual(stripLastAssistantTurn(messages), [
41
+ { role: "user", content: "go" },
42
+ ]);
43
+ });
44
+ });
45
+ describe("formatStepForTranscript", () => {
46
+ it("returns empty content when the step has no text, reasoning, or tool calls", () => {
47
+ assert.deepEqual(formatStepForTranscript({ text: "", toolCalls: [] }), {
48
+ content: null,
49
+ });
50
+ });
51
+ it("includes assistant text in content", () => {
52
+ assert.deepEqual(formatStepForTranscript({
53
+ text: "Opening the app.",
54
+ toolCalls: [],
55
+ }), { content: "Opening the app." });
56
+ });
57
+ it("includes tool calls in content when the step has no assistant text", () => {
58
+ assert.deepEqual(formatStepForTranscript({
59
+ text: "",
60
+ toolCalls: [{ toolName: "bash", input: { command: "agent-browser open /" } }],
61
+ }), {
62
+ content: '[tool bash] {"command":"agent-browser open /"}',
63
+ });
64
+ });
65
+ it("keeps text and tool calls in content and reasoning in thinking", () => {
66
+ assert.deepEqual(formatStepForTranscript({
67
+ text: "Checking the page.",
68
+ reasoningText: "Need a snapshot first.",
69
+ toolCalls: [{ toolName: "bash", input: { command: "agent-browser snapshot -i" } }],
70
+ }), {
71
+ content: [
72
+ "Checking the page.",
73
+ '[tool bash] {"command":"agent-browser snapshot -i"}',
74
+ ].join("\n\n"),
75
+ thinking: "Need a snapshot first.",
76
+ });
77
+ });
78
+ });
79
+ describe("appendFinalTextToTranscript", () => {
80
+ it("skips append only when the last assistant message exactly matches finalText", () => {
81
+ const transcript = {
82
+ entries: [
83
+ { type: "message", role: "assistant", content: "The test passed successfully", at: "2026-01-01T00:00:00.000Z" },
84
+ ],
85
+ };
86
+ appendFinalTextToTranscript(transcript, "passed");
87
+ assert.equal(transcript.entries.length, 2);
88
+ assert.equal(transcript.entries[1].type === "message" ? transcript.entries[1].content : "", "passed");
89
+ });
90
+ it("does not append duplicate when finalText equals the last assistant message", () => {
91
+ const transcript = {
92
+ entries: [{ type: "message", role: "assistant", content: "Done.", at: "2026-01-01T00:00:00.000Z" }],
93
+ };
94
+ appendFinalTextToTranscript(transcript, "Done.");
95
+ assert.equal(transcript.entries.length, 1);
96
+ });
97
+ });
98
+ describe("appendStepToTranscript", () => {
99
+ it("appends one assistant message per step", () => {
100
+ const transcript = { entries: [] };
101
+ assert.equal(appendStepToTranscript(transcript, {
102
+ text: "",
103
+ toolCalls: [{ toolName: "bash", input: { command: "agent-browser open /" } }],
104
+ }), true);
105
+ assert.equal(appendStepToTranscript(transcript, {
106
+ text: "Done.",
107
+ toolCalls: [],
108
+ }), true);
109
+ assert.equal(transcript.entries.length, 2);
110
+ const first = transcript.entries[0];
111
+ const second = transcript.entries[1];
112
+ assert.equal(first.type, "message");
113
+ assert.equal(first.role, "assistant");
114
+ assert.match(first.content, /agent-browser open/);
115
+ assert.ok(first.at);
116
+ assert.equal(second.type, "message");
117
+ assert.equal(second.content, "Done.");
118
+ assert.ok(second.at);
119
+ });
120
+ it("records timestamps and LLM step duration on assistant messages", () => {
121
+ const transcript = { entries: [] };
122
+ const at = new Date("2026-01-01T00:00:05.000Z");
123
+ appendStepToTranscript(transcript, { text: "Checking.", toolCalls: [] }, [], undefined, { at, durationMs: 4200 });
124
+ assert.equal(transcript.entries.length, 1);
125
+ const message = transcript.entries[0];
126
+ assert.equal(message.type, "message");
127
+ assert.equal(message.at, "2026-01-01T00:00:05.000Z");
128
+ assert.equal(message.durationMs, 4200);
129
+ });
130
+ it("writes the assistant message before bash results for a step", () => {
131
+ const transcript = { entries: [] };
132
+ appendStepToTranscript(transcript, {
133
+ text: "Opening the app.",
134
+ reasoningText: "Need to load the page first.",
135
+ toolCalls: [{ toolName: "bash", input: { command: "agent-browser open /" } }],
136
+ }, [
137
+ {
138
+ command: "agent-browser open /",
139
+ stdout: "ok",
140
+ stderr: "",
141
+ exitCode: 0,
142
+ durationMs: 10,
143
+ },
144
+ ]);
145
+ assert.equal(transcript.entries.length, 2);
146
+ const message = transcript.entries[0];
147
+ const bash = transcript.entries[1];
148
+ assert.equal(message.type, "message");
149
+ assert.equal(bash.type, "bash");
150
+ assert.match(message.content, /Opening the app/);
151
+ assert.equal(message.thinking, "Need to load the page first.");
152
+ assert.equal(message.at, bash.at);
153
+ assert.equal(bash.command, "agent-browser open /");
154
+ });
155
+ });
156
+ //# sourceMappingURL=verdict.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict.test.js","sourceRoot":"","sources":["../../src/agent/verdict.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { AnalyzeFinding } from "./index.js";
2
+ import type { FlakyScenarioFinding, RunOccurrence } from "./compare-runs.js";
3
+ import type { ScenarioResult, TranscriptEntry } from "../types/verdict.js";
4
+ export interface ScenarioIntentContext {
5
+ name: string;
6
+ url?: string;
7
+ auth?: string;
8
+ tags?: string[];
9
+ goal: string;
10
+ steps: string;
11
+ then: string[];
12
+ }
13
+ export interface TruncatedScenarioResult {
14
+ scenario: string;
15
+ filePath: string;
16
+ status: string;
17
+ error?: string;
18
+ durationMs?: number;
19
+ verdict: ScenarioResult["verdict"];
20
+ transcript: {
21
+ entries: TranscriptEntry[];
22
+ };
23
+ healing?: ScenarioResult["healing"];
24
+ }
25
+ export interface LlmAnalyzeContext {
26
+ heuristicFinding: AnalyzeFinding;
27
+ scenarioIntent: ScenarioIntentContext | null;
28
+ scenarioResult: TruncatedScenarioResult;
29
+ scenarioMarkdown: string;
30
+ }
31
+ export interface FlakyLlmAnalyzeContext extends LlmAnalyzeContext {
32
+ runComparison: {
33
+ runIds: string[];
34
+ stats: {
35
+ pass: number;
36
+ fail: number;
37
+ error: number;
38
+ };
39
+ inconsistentCheckpoints: FlakyScenarioFinding["inconsistentCheckpoints"];
40
+ filePathWarnings: string[];
41
+ representativeRuns: {
42
+ pass?: TruncatedScenarioResult;
43
+ fail?: TruncatedScenarioResult;
44
+ };
45
+ otherRuns: Array<{
46
+ runId: string;
47
+ status: RunOccurrence["status"];
48
+ verdictSummary?: string;
49
+ failedCheckpoints: string[];
50
+ }>;
51
+ };
52
+ }
53
+ export declare function buildScenarioIntent(filePath: string): ScenarioIntentContext | null;
54
+ export declare function truncateScenarioResult(result: ScenarioResult): TruncatedScenarioResult;
55
+ export declare function buildLlmAnalyzeContext(finding: AnalyzeFinding, result: ScenarioResult, cwd: string): LlmAnalyzeContext;
56
+ export declare function buildFlakyAnalyzeContext(finding: FlakyScenarioFinding, runDirs: string[], cwd: string): FlakyLlmAnalyzeContext;
57
+ export declare function flakyFindingToAnalyzeFinding(finding: FlakyScenarioFinding): AnalyzeFinding;
58
+ //# sourceMappingURL=build-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-context.d.ts","sourceRoot":"","sources":["../../src/analyze/build-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAW3E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,UAAU,EAAE;QACV,OAAO,EAAE,eAAe,EAAE,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,cAAc,CAAC;IACjC,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,cAAc,EAAE,uBAAuB,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,aAAa,EAAE;QACb,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD,uBAAuB,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;QACzE,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,kBAAkB,EAAE;YAClB,IAAI,CAAC,EAAE,uBAAuB,CAAC;YAC/B,IAAI,CAAC,EAAE,uBAAuB,CAAC;SAChC,CAAC;QACF,SAAS,EAAE,KAAK,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChC,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7B,CAAC,CAAC;KACJ,CAAC;CACH;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GACf,qBAAqB,GAAG,IAAI,CAe9B;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,GACrB,uBAAuB,CAqCzB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,MAAM,GACV,iBAAiB,CAcnB;AAiBD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,MAAM,GACV,sBAAsB,CA0DxB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAEhB"}
@@ -0,0 +1,141 @@
1
+ import { readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { parseScenarioFile } from "../scenarios/parser.js";
4
+ import { selectRepresentativeRuns } from "./compare-runs.js";
5
+ import { loadRunReport } from "./index.js";
6
+ const MAX_TRANSCRIPT_ENTRIES = 28;
7
+ const MAX_STDOUT_CHARS = 1500;
8
+ const MAX_MESSAGE_CHARS = 2000;
9
+ function truncate(text, max) {
10
+ if (text.length <= max)
11
+ return text;
12
+ return `${text.slice(0, max)}…`;
13
+ }
14
+ export function buildScenarioIntent(filePath) {
15
+ try {
16
+ const scenario = parseScenarioFile(filePath);
17
+ return {
18
+ name: scenario.frontmatter.name,
19
+ url: scenario.frontmatter.url,
20
+ auth: scenario.frontmatter.auth,
21
+ tags: scenario.frontmatter.tags,
22
+ goal: scenario.goal,
23
+ steps: scenario.steps,
24
+ then: scenario.then,
25
+ };
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ export function truncateScenarioResult(result) {
32
+ const entries = result.transcript.entries
33
+ .slice(-MAX_TRANSCRIPT_ENTRIES)
34
+ .map((entry) => {
35
+ if (entry.type === "message") {
36
+ return {
37
+ type: "message",
38
+ role: entry.role,
39
+ content: truncate(entry.content, MAX_MESSAGE_CHARS),
40
+ at: entry.at,
41
+ ...(entry.thinking
42
+ ? { thinking: truncate(entry.thinking, MAX_MESSAGE_CHARS) }
43
+ : {}),
44
+ ...(entry.durationMs !== undefined ? { durationMs: entry.durationMs } : {}),
45
+ };
46
+ }
47
+ return {
48
+ type: "bash",
49
+ command: entry.command,
50
+ exitCode: entry.exitCode,
51
+ stdout: truncate(entry.stdout, MAX_STDOUT_CHARS),
52
+ stderr: truncate(entry.stderr, 500),
53
+ durationMs: entry.durationMs,
54
+ at: entry.at,
55
+ };
56
+ });
57
+ return {
58
+ scenario: result.scenario,
59
+ filePath: result.filePath,
60
+ status: result.status,
61
+ error: result.error,
62
+ durationMs: result.durationMs,
63
+ verdict: result.verdict,
64
+ transcript: { entries },
65
+ healing: result.healing,
66
+ };
67
+ }
68
+ export function buildLlmAnalyzeContext(finding, result, cwd) {
69
+ const scenarioPath = path.isAbsolute(result.filePath)
70
+ ? result.filePath
71
+ : path.resolve(cwd, result.filePath);
72
+ const scenarioMarkdown = readFileSync(scenarioPath, "utf-8");
73
+ const scenarioIntent = buildScenarioIntent(scenarioPath);
74
+ return {
75
+ heuristicFinding: finding,
76
+ scenarioIntent,
77
+ scenarioResult: truncateScenarioResult(result),
78
+ scenarioMarkdown,
79
+ };
80
+ }
81
+ function syntheticFindingFromFlaky(finding) {
82
+ const assessment = finding.heuristicAssessment;
83
+ return {
84
+ scenario: finding.scenario,
85
+ filePath: finding.filePath,
86
+ status: finding.failCount > 0 ? "fail" : "error",
87
+ failureKind: assessment.dominantKind,
88
+ confidence: assessment.likelyFalseNegative ? "high" : "medium",
89
+ suggestions: assessment.suggestions,
90
+ signals: finding.runs.flatMap((r) => r.signals ?? []).slice(0, 6),
91
+ };
92
+ }
93
+ export function buildFlakyAnalyzeContext(finding, runDirs, cwd) {
94
+ const reports = runDirs.map((runDir) => ({
95
+ runDir,
96
+ report: loadRunReport(runDir),
97
+ }));
98
+ const entries = reports.flatMap(({ report }) => report.results
99
+ .filter((r) => (r.scenario || r.filePath) === finding.scenario)
100
+ .map((result) => ({ runId: report.runId, result })));
101
+ const { pass: passEntry, fail: failEntry } = selectRepresentativeRuns(entries);
102
+ const representativeRunIds = new Set([passEntry?.runId, failEntry?.runId].filter(Boolean));
103
+ const otherRuns = entries
104
+ .filter(({ runId }) => !representativeRunIds.has(runId))
105
+ .map(({ runId, result }) => ({
106
+ runId,
107
+ status: result.status,
108
+ verdictSummary: result.verdict?.summary,
109
+ failedCheckpoints: result.verdict?.checkpoints
110
+ .filter((c) => !c.pass)
111
+ .map((c) => c.assertion) ?? [],
112
+ }));
113
+ const baseResult = failEntry?.result ?? passEntry?.result ?? entries[0].result;
114
+ const base = buildLlmAnalyzeContext(syntheticFindingFromFlaky(finding), baseResult, cwd);
115
+ return {
116
+ ...base,
117
+ runComparison: {
118
+ runIds: finding.runs.map((r) => r.runId),
119
+ stats: {
120
+ pass: finding.passCount,
121
+ fail: finding.failCount,
122
+ error: finding.errorCount,
123
+ },
124
+ inconsistentCheckpoints: finding.inconsistentCheckpoints,
125
+ filePathWarnings: finding.filePathWarnings,
126
+ representativeRuns: {
127
+ ...(passEntry
128
+ ? { pass: truncateScenarioResult(passEntry.result) }
129
+ : {}),
130
+ ...(failEntry
131
+ ? { fail: truncateScenarioResult(failEntry.result) }
132
+ : {}),
133
+ },
134
+ otherRuns,
135
+ },
136
+ };
137
+ }
138
+ export function flakyFindingToAnalyzeFinding(finding) {
139
+ return syntheticFindingFromFlaky(finding);
140
+ }
141
+ //# sourceMappingURL=build-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-context.js","sourceRoot":"","sources":["../../src/analyze/build-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-context.test.d.ts","sourceRoot":"","sources":["../../src/analyze/build-context.test.ts"],"names":[],"mappings":""}