flakelab 0.1.0 → 0.1.2

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 (322) hide show
  1. package/README.md +225 -38
  2. package/dist/analysis/blob-report.d.ts +15 -0
  3. package/dist/analysis/blob-report.js +137 -0
  4. package/dist/analysis/blob-report.js.map +1 -0
  5. package/dist/analysis/cli.d.ts +7 -0
  6. package/dist/analysis/cli.js +28 -0
  7. package/dist/analysis/cli.js.map +1 -0
  8. package/dist/analysis/schema.d.ts +175 -0
  9. package/dist/analysis/schema.js +34 -0
  10. package/dist/analysis/schema.js.map +1 -0
  11. package/dist/analysis/zip-archive.d.ts +6 -0
  12. package/dist/analysis/zip-archive.js +193 -0
  13. package/dist/analysis/zip-archive.js.map +1 -0
  14. package/dist/artifacts/paths.d.ts +3 -0
  15. package/dist/artifacts/paths.js +34 -0
  16. package/dist/artifacts/paths.js.map +1 -0
  17. package/dist/artifacts/retention.d.ts +1 -0
  18. package/dist/artifacts/retention.js +80 -0
  19. package/dist/artifacts/retention.js.map +1 -0
  20. package/dist/bisect/engine.js +0 -1
  21. package/dist/bisect/engine.js.map +1 -1
  22. package/dist/bisect/schema.d.ts +5 -6
  23. package/dist/bisect/schema.js +1 -2
  24. package/dist/bisect/schema.js.map +1 -1
  25. package/dist/bisect/solari-evaluator.js +9 -1
  26. package/dist/bisect/solari-evaluator.js.map +1 -1
  27. package/dist/ci/job-summary.d.ts +2 -0
  28. package/dist/ci/job-summary.js +120 -2
  29. package/dist/ci/job-summary.js.map +1 -1
  30. package/dist/ci/select-command.js +1 -1
  31. package/dist/ci/select-command.js.map +1 -1
  32. package/dist/ci/summary-command.js +12 -7
  33. package/dist/ci/summary-command.js.map +1 -1
  34. package/dist/cli-arguments.d.ts +44 -0
  35. package/dist/cli-arguments.js +356 -0
  36. package/dist/cli-arguments.js.map +1 -0
  37. package/dist/cli-command-help.d.ts +11 -0
  38. package/dist/cli-command-help.js +211 -0
  39. package/dist/cli-command-help.js.map +1 -0
  40. package/dist/cli-help.d.ts +5 -2
  41. package/dist/cli-help.js +122 -45
  42. package/dist/cli-help.js.map +1 -1
  43. package/dist/cli-option-definitions.d.ts +202 -0
  44. package/dist/cli-option-definitions.js +59 -0
  45. package/dist/cli-option-definitions.js.map +1 -0
  46. package/dist/cli.js +100 -100
  47. package/dist/cli.js.map +1 -1
  48. package/dist/commands/analyze-summary.d.ts +5 -0
  49. package/dist/commands/analyze-summary.js +89 -0
  50. package/dist/commands/analyze-summary.js.map +1 -0
  51. package/dist/commands/analyze.d.ts +6 -0
  52. package/dist/commands/analyze.js +128 -0
  53. package/dist/commands/analyze.js.map +1 -0
  54. package/dist/commands/bisect.d.ts +2 -2
  55. package/dist/commands/bisect.js +32 -3
  56. package/dist/commands/bisect.js.map +1 -1
  57. package/dist/commands/diagnose.d.ts +3 -2
  58. package/dist/commands/diagnose.js +355 -23
  59. package/dist/commands/diagnose.js.map +1 -1
  60. package/dist/commands/discover.d.ts +18 -2
  61. package/dist/commands/discover.js +215 -25
  62. package/dist/commands/discover.js.map +1 -1
  63. package/dist/commands/doctor.d.ts +2 -0
  64. package/dist/commands/doctor.js +66 -25
  65. package/dist/commands/doctor.js.map +1 -1
  66. package/dist/commands/investigate.d.ts +3 -2
  67. package/dist/commands/investigate.js +22 -3
  68. package/dist/commands/investigate.js.map +1 -1
  69. package/dist/commands/options.d.ts +123 -16
  70. package/dist/commands/options.js +24 -2
  71. package/dist/commands/options.js.map +1 -1
  72. package/dist/commands/prove.d.ts +2 -2
  73. package/dist/commands/prove.js +38 -1
  74. package/dist/commands/prove.js.map +1 -1
  75. package/dist/commands/repair.d.ts +8 -2
  76. package/dist/commands/repair.js +32 -9
  77. package/dist/commands/repair.js.map +1 -1
  78. package/dist/commands/replay.d.ts +2 -2
  79. package/dist/commands/replay.js +15 -2
  80. package/dist/commands/replay.js.map +1 -1
  81. package/dist/commands/report.d.ts +2 -2
  82. package/dist/commands/report.js +35 -10
  83. package/dist/commands/report.js.map +1 -1
  84. package/dist/commands/scan-summary.d.ts +7 -0
  85. package/dist/commands/scan-summary.js +175 -0
  86. package/dist/commands/scan-summary.js.map +1 -0
  87. package/dist/commands/scan.d.ts +9 -12
  88. package/dist/commands/scan.js +66 -62
  89. package/dist/commands/scan.js.map +1 -1
  90. package/dist/core/plan.js +1 -1
  91. package/dist/core/plan.js.map +1 -1
  92. package/dist/diagnosis/checkpoint.d.ts +6 -0
  93. package/dist/diagnosis/checkpoint.js +46 -0
  94. package/dist/diagnosis/checkpoint.js.map +1 -0
  95. package/dist/diagnosis/cli.d.ts +7 -0
  96. package/dist/diagnosis/cli.js +84 -0
  97. package/dist/diagnosis/cli.js.map +1 -0
  98. package/dist/diagnosis/recommendation.d.ts +13 -0
  99. package/dist/diagnosis/recommendation.js +95 -0
  100. package/dist/diagnosis/recommendation.js.map +1 -0
  101. package/dist/diagnosis/run-state.d.ts +52 -0
  102. package/dist/diagnosis/run-state.js +173 -0
  103. package/dist/diagnosis/run-state.js.map +1 -0
  104. package/dist/diagnosis/schema.d.ts +207 -0
  105. package/dist/diagnosis/schema.js +108 -0
  106. package/dist/diagnosis/schema.js.map +1 -0
  107. package/dist/diagnosis/solari-handoff.d.ts +9 -0
  108. package/dist/diagnosis/solari-handoff.js +40 -0
  109. package/dist/diagnosis/solari-handoff.js.map +1 -0
  110. package/dist/diagnosis/summary.d.ts +3 -0
  111. package/dist/diagnosis/summary.js +115 -0
  112. package/dist/diagnosis/summary.js.map +1 -0
  113. package/dist/discovery/auth-cookie.d.ts +19 -0
  114. package/dist/discovery/auth-cookie.js +26 -0
  115. package/dist/discovery/auth-cookie.js.map +1 -0
  116. package/dist/discovery/evaluate.d.ts +35 -2
  117. package/dist/discovery/evaluate.js +136 -30
  118. package/dist/discovery/evaluate.js.map +1 -1
  119. package/dist/discovery/event-loop.d.ts +25 -0
  120. package/dist/discovery/event-loop.js +84 -0
  121. package/dist/discovery/event-loop.js.map +1 -0
  122. package/dist/discovery/minimize.d.ts +61 -1
  123. package/dist/discovery/minimize.js +179 -7
  124. package/dist/discovery/minimize.js.map +1 -1
  125. package/dist/discovery/resource-loading.d.ts +25 -0
  126. package/dist/discovery/resource-loading.js +84 -0
  127. package/dist/discovery/resource-loading.js.map +1 -0
  128. package/dist/discovery/runner-environment.d.ts +26 -0
  129. package/dist/discovery/runner-environment.js +68 -0
  130. package/dist/discovery/runner-environment.js.map +1 -0
  131. package/dist/discovery/startup-event.d.ts +25 -0
  132. package/dist/discovery/startup-event.js +84 -0
  133. package/dist/discovery/startup-event.js.map +1 -0
  134. package/dist/discovery/storage-state.d.ts +26 -0
  135. package/dist/discovery/storage-state.js +86 -0
  136. package/dist/discovery/storage-state.js.map +1 -0
  137. package/dist/discovery/temporal-environment.d.ts +31 -0
  138. package/dist/discovery/temporal-environment.js +43 -0
  139. package/dist/discovery/temporal-environment.js.map +1 -0
  140. package/dist/discovery/visual-environment.d.ts +28 -0
  141. package/dist/discovery/visual-environment.js +42 -0
  142. package/dist/discovery/visual-environment.js.map +1 -0
  143. package/dist/domain/schema.d.ts +840 -20
  144. package/dist/domain/schema.js +216 -6
  145. package/dist/domain/schema.js.map +1 -1
  146. package/dist/faults/browser-context.d.ts +16 -0
  147. package/dist/faults/browser-context.js +60 -0
  148. package/dist/faults/browser-context.js.map +1 -0
  149. package/dist/faults/cookie-header.d.ts +5 -0
  150. package/dist/faults/cookie-header.js +25 -0
  151. package/dist/faults/cookie-header.js.map +1 -0
  152. package/dist/faults/document-bootstrap.d.ts +5 -0
  153. package/dist/faults/document-bootstrap.js +141 -0
  154. package/dist/faults/document-bootstrap.js.map +1 -0
  155. package/dist/faults/install.d.ts +1 -1
  156. package/dist/faults/install.js +199 -6
  157. package/dist/faults/install.js.map +1 -1
  158. package/dist/faults/pattern.d.ts +1 -0
  159. package/dist/faults/pattern.js +24 -0
  160. package/dist/faults/pattern.js.map +1 -0
  161. package/dist/investigator/agent.js +39 -17
  162. package/dist/investigator/agent.js.map +1 -1
  163. package/dist/investigator/ledger.d.ts +1 -1
  164. package/dist/investigator/ledger.js +2 -2
  165. package/dist/investigator/ledger.js.map +1 -1
  166. package/dist/investigator/safe-source.d.ts +1 -0
  167. package/dist/investigator/safe-source.js +12 -3
  168. package/dist/investigator/safe-source.js.map +1 -1
  169. package/dist/investigator/schema.d.ts +293 -2
  170. package/dist/investigator/schema.js +100 -2
  171. package/dist/investigator/schema.js.map +1 -1
  172. package/dist/proof/cli.d.ts +7 -0
  173. package/dist/proof/cli.js +108 -0
  174. package/dist/proof/cli.js.map +1 -0
  175. package/dist/proof/preflight.d.ts +4 -0
  176. package/dist/proof/preflight.js +9 -0
  177. package/dist/proof/preflight.js.map +1 -0
  178. package/dist/repair/generator.d.ts +12 -1
  179. package/dist/repair/generator.js +30 -6
  180. package/dist/repair/generator.js.map +1 -1
  181. package/dist/repair/remote-proof-runner.js +6 -10
  182. package/dist/repair/remote-proof-runner.js.map +1 -1
  183. package/dist/repair/schema.d.ts +77 -2
  184. package/dist/repair/schema.js +23 -2
  185. package/dist/repair/schema.js.map +1 -1
  186. package/dist/repair/solari-validator.d.ts +2 -0
  187. package/dist/repair/solari-validator.js +4 -6
  188. package/dist/repair/solari-validator.js.map +1 -1
  189. package/dist/repair/summary.d.ts +10 -0
  190. package/dist/repair/summary.js +58 -0
  191. package/dist/repair/summary.js.map +1 -0
  192. package/dist/repair/validator.d.ts +1 -0
  193. package/dist/repair/validator.js +53 -12
  194. package/dist/repair/validator.js.map +1 -1
  195. package/dist/report/bundle.js +16 -37
  196. package/dist/report/bundle.js.map +1 -1
  197. package/dist/report/model.js +131 -12
  198. package/dist/report/model.js.map +1 -1
  199. package/dist/report/open.d.ts +9 -0
  200. package/dist/report/open.js +23 -0
  201. package/dist/report/open.js.map +1 -1
  202. package/dist/report/report-client.css +2 -0
  203. package/dist/report/report-client.js +58 -0
  204. package/dist/report/schema.d.ts +115 -5
  205. package/dist/report/schema.js +24 -5
  206. package/dist/report/schema.js.map +1 -1
  207. package/dist/reproducer/schema.d.ts +89 -4
  208. package/dist/reproducer/schema.js +3 -4
  209. package/dist/reproducer/schema.js.map +1 -1
  210. package/dist/runner/execution-fault.d.ts +10 -0
  211. package/dist/runner/execution-fault.js +24 -0
  212. package/dist/runner/execution-fault.js.map +1 -0
  213. package/dist/runner/fault-proxy.d.ts +7 -0
  214. package/dist/runner/fault-proxy.js +366 -0
  215. package/dist/runner/fault-proxy.js.map +1 -0
  216. package/dist/runner/local.js +2 -2
  217. package/dist/runner/local.js.map +1 -1
  218. package/dist/runner/native-scan.d.ts +25 -0
  219. package/dist/runner/native-scan.js +306 -0
  220. package/dist/runner/native-scan.js.map +1 -0
  221. package/dist/runner/playwright-executor.d.ts +3 -0
  222. package/dist/runner/playwright-executor.js +125 -66
  223. package/dist/runner/playwright-executor.js.map +1 -1
  224. package/dist/runner/process-tree.d.ts +7 -0
  225. package/dist/runner/process-tree.js +62 -0
  226. package/dist/runner/process-tree.js.map +1 -0
  227. package/dist/runner/project-bridge.d.ts +7 -0
  228. package/dist/runner/project-bridge.js +83 -0
  229. package/dist/runner/project-bridge.js.map +1 -0
  230. package/dist/runner/trial-reporter.d.ts +7 -0
  231. package/dist/runner/trial-reporter.js +47 -0
  232. package/dist/runner/trial-reporter.js.map +1 -0
  233. package/dist/scan/failure-clusters.d.ts +24 -0
  234. package/dist/scan/failure-clusters.js +74 -0
  235. package/dist/scan/failure-clusters.js.map +1 -0
  236. package/dist/scan/schema.d.ts +170 -0
  237. package/dist/scan/schema.js +71 -0
  238. package/dist/scan/schema.js.map +1 -0
  239. package/dist/solari/executor.d.ts +5 -1
  240. package/dist/solari/executor.js +25 -17
  241. package/dist/solari/executor.js.map +1 -1
  242. package/dist/solari/run-demo.d.ts +13 -1
  243. package/dist/solari/run-demo.js +35 -16
  244. package/dist/solari/run-demo.js.map +1 -1
  245. package/dist/solari/usage.d.ts +8 -2
  246. package/dist/solari/usage.js +14 -4
  247. package/dist/solari/usage.js.map +1 -1
  248. package/dist/ui/boundary.d.ts +17 -0
  249. package/dist/ui/boundary.js +18 -0
  250. package/dist/ui/boundary.js.map +1 -0
  251. package/dist/ui/console.d.ts +4 -0
  252. package/dist/ui/console.js +11 -0
  253. package/dist/ui/console.js.map +1 -0
  254. package/dist/ui/document.d.ts +40 -0
  255. package/dist/ui/document.js +120 -0
  256. package/dist/ui/document.js.map +1 -0
  257. package/dist/ui/format.d.ts +8 -0
  258. package/dist/ui/format.js +32 -0
  259. package/dist/ui/format.js.map +1 -0
  260. package/dist/ui/progress.d.ts +17 -1
  261. package/dist/ui/progress.js +51 -8
  262. package/dist/ui/progress.js.map +1 -1
  263. package/dist/ui/status.d.ts +7 -0
  264. package/dist/ui/status.js +36 -0
  265. package/dist/ui/status.js.map +1 -0
  266. package/dist/ui/style.d.ts +8 -0
  267. package/dist/ui/style.js +22 -0
  268. package/dist/ui/style.js.map +1 -0
  269. package/dist/ui/text.d.ts +17 -0
  270. package/dist/ui/text.js +123 -0
  271. package/dist/ui/text.js.map +1 -0
  272. package/dist/ui/theme.d.ts +23 -0
  273. package/dist/ui/theme.js +77 -0
  274. package/dist/ui/theme.js.map +1 -0
  275. package/dist/ui/trial-progress.d.ts +13 -0
  276. package/dist/ui/trial-progress.js +42 -0
  277. package/dist/ui/trial-progress.js.map +1 -0
  278. package/package.json +14 -19
  279. package/dist/faults/network-delay.d.ts +0 -5
  280. package/dist/faults/network-delay.js +0 -34
  281. package/dist/faults/network-delay.js.map +0 -1
  282. package/dist/faults/request-failure.d.ts +0 -5
  283. package/dist/faults/request-failure.js +0 -24
  284. package/dist/faults/request-failure.js.map +0 -1
  285. package/dist/playwright.d.ts +0 -3
  286. package/dist/playwright.js +0 -21
  287. package/dist/playwright.js.map +0 -1
  288. package/dist/report/browser-entry.d.ts +0 -2
  289. package/dist/report/browser-entry.js +0 -15
  290. package/dist/report/browser-entry.js.map +0 -1
  291. package/dist/report/components/artifacts.d.ts +0 -4
  292. package/dist/report/components/artifacts.js +0 -6
  293. package/dist/report/components/artifacts.js.map +0 -1
  294. package/dist/report/components/experiments.d.ts +0 -4
  295. package/dist/report/components/experiments.js +0 -7
  296. package/dist/report/components/experiments.js.map +0 -1
  297. package/dist/report/components/hypotheses.d.ts +0 -4
  298. package/dist/report/components/hypotheses.js +0 -26
  299. package/dist/report/components/hypotheses.js.map +0 -1
  300. package/dist/report/components/indicators.d.ts +0 -32
  301. package/dist/report/components/indicators.js +0 -42
  302. package/dist/report/components/indicators.js.map +0 -1
  303. package/dist/report/components/layout.d.ts +0 -29
  304. package/dist/report/components/layout.js +0 -20
  305. package/dist/report/components/layout.js.map +0 -1
  306. package/dist/report/components/proof.d.ts +0 -4
  307. package/dist/report/components/proof.js +0 -34
  308. package/dist/report/components/proof.js.map +0 -1
  309. package/dist/report/components/reproduction.d.ts +0 -4
  310. package/dist/report/components/reproduction.js +0 -19
  311. package/dist/report/components/reproduction.js.map +0 -1
  312. package/dist/report/components/summary.d.ts +0 -4
  313. package/dist/report/components/summary.js +0 -12
  314. package/dist/report/components/summary.js.map +0 -1
  315. package/dist/report/components/verdict.d.ts +0 -4
  316. package/dist/report/components/verdict.js +0 -27
  317. package/dist/report/components/verdict.js.map +0 -1
  318. package/dist/report/report-app.d.ts +0 -6
  319. package/dist/report/report-app.js +0 -16
  320. package/dist/report/report-app.js.map +0 -1
  321. package/dist/report/report-details.css +0 -182
  322. package/dist/report/report.css +0 -404
@@ -0,0 +1,9 @@
1
+ type AskQuestion = (question: string) => Promise<string>;
2
+ interface SolariHandoffOptions {
3
+ ask?: AskQuestion;
4
+ environment?: NodeJS.ProcessEnv;
5
+ inputIsTTY?: boolean;
6
+ outputIsTTY?: boolean;
7
+ }
8
+ export declare function requestSolariProof(target: string, approvedSources: string[], options?: SolariHandoffOptions): Promise<string[] | null>;
9
+ export {};
@@ -0,0 +1,40 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { sanitizeLine } from "../ui/text.js";
3
+ function interactive(options) {
4
+ const environment = options.environment ?? process.env;
5
+ return (options.inputIsTTY ?? Boolean(process.stdin.isTTY))
6
+ && (options.outputIsTTY ?? Boolean(process.stderr.isTTY))
7
+ && !environment.CI;
8
+ }
9
+ async function askInTerminal(question) {
10
+ const prompt = createInterface({ input: process.stdin, output: process.stderr });
11
+ try {
12
+ return await prompt.question(question);
13
+ }
14
+ finally {
15
+ prompt.close();
16
+ }
17
+ }
18
+ function accepted(answer) {
19
+ const normalized = answer.trim().toLowerCase();
20
+ return normalized === "y" || normalized === "yes";
21
+ }
22
+ export async function requestSolariProof(target, approvedSources, options = {}) {
23
+ if (!interactive(options)) {
24
+ return null;
25
+ }
26
+ const ask = options.ask ?? askInTerminal;
27
+ if (!accepted(await ask("Use Solari to prove a candidate fix? [y/N] "))) {
28
+ return null;
29
+ }
30
+ if (!accepted(await ask("Use AI to investigate and generate the candidate? [y/N] "))) {
31
+ return null;
32
+ }
33
+ if (approvedSources.length > 0) {
34
+ return approvedSources;
35
+ }
36
+ const safeTarget = sanitizeLine(target);
37
+ const source = (await ask(`Source file to approve for candidate changes [${safeTarget}]: `)).trim();
38
+ return [source || target];
39
+ }
40
+ //# sourceMappingURL=solari-handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solari-handoff.js","sourceRoot":"","sources":["../../src/diagnosis/solari-handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAW5C,SAAS,WAAW,CAAC,OAA6B;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAA;IACtD,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;WACtD,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;WACtD,CAAC,WAAW,CAAC,EAAE,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAChF,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC9C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAA;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,eAAyB,EACzB,UAAgC,EAAE;IAElC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,aAAa,CAAA;IACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,6CAA6C,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,0DAA0D,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAA;IACxB,CAAC;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CACvB,iDAAiD,UAAU,KAAK,CACjE,CAAC,CAAC,IAAI,EAAE,CAAA;IACT,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TerminalTheme } from "../ui/theme.js";
2
+ import type { DiagnosisArtifact } from "./schema.js";
3
+ export declare function formatDiagnosisSummary(artifact: DiagnosisArtifact, path: string, theme?: TerminalTheme): string;
@@ -0,0 +1,115 @@
1
+ import { TerminalDocument } from "../ui/document.js";
2
+ import { formatDuration, formatUsd } from "../ui/format.js";
3
+ import { PLAIN_THEME } from "../ui/theme.js";
4
+ const STATUS_TONES = {
5
+ complete: "success",
6
+ failed: "failure",
7
+ interrupted: "warning",
8
+ running: "running",
9
+ };
10
+ const STAGE_TONES = {
11
+ investigated: "success",
12
+ observed: "success",
13
+ "repair-proven": "success",
14
+ "repair-rejected": "failure",
15
+ "reproducer-created": "success",
16
+ };
17
+ function verdictTone(artifact) {
18
+ if (artifact.status !== "complete") {
19
+ return STATUS_TONES[artifact.status];
20
+ }
21
+ return STAGE_TONES[artifact.stage];
22
+ }
23
+ function solariEstimate(value) {
24
+ return value === null ? "not available" : formatUsd(value);
25
+ }
26
+ function plannedRows(artifact) {
27
+ const recommendation = artifact.recommendation;
28
+ const rows = [
29
+ { label: "Runs", value: `${recommendation.plannedTrials}` },
30
+ { label: "Time", value: recommendation.expectedDuration },
31
+ { label: "Solari cost", value: solariEstimate(recommendation.solariCostEstimateUsd) },
32
+ ];
33
+ if (recommendation.aiCostLimitUsd !== null) {
34
+ rows.push({ label: "AI cost cap", value: formatUsd(recommendation.aiCostLimitUsd) });
35
+ }
36
+ rows.push({
37
+ label: "Credentials",
38
+ value: recommendation.credentials.length > 0
39
+ ? recommendation.credentials.join(" · ")
40
+ : "none",
41
+ });
42
+ return rows;
43
+ }
44
+ function consumedRows(artifact) {
45
+ const actual = artifact.usage.actual;
46
+ return [
47
+ { label: "Runs", value: `${actual.executions}` },
48
+ { label: "Wall time", value: formatDuration(actual.elapsedMilliseconds) },
49
+ {
50
+ label: "AI tokens",
51
+ value: `${actual.aiInputTokens} input · ${actual.aiOutputTokens} output`,
52
+ },
53
+ { label: "AI cost est.", value: formatUsd(actual.aiEstimatedCostUsd, 4) },
54
+ {
55
+ label: "Solari",
56
+ value: `${actual.solariSandboxesCreated} created`
57
+ + ` · ${actual.solariSandboxesKilled} released`,
58
+ },
59
+ {
60
+ label: "Solari cost",
61
+ value: actual.solariCostUsd === null
62
+ ? "not available from provider"
63
+ : formatUsd(actual.solariCostUsd),
64
+ },
65
+ ];
66
+ }
67
+ function appendEvidence(document, artifact, path) {
68
+ const rows = [{ label: "Diagnosis", value: path }];
69
+ const artifacts = [
70
+ ["Analysis", artifact.artifacts.analysis],
71
+ ["Scan", artifact.artifacts.scan],
72
+ ["Reproducer", artifact.artifacts.reproducer],
73
+ ["Investigation", artifact.artifacts.evidence],
74
+ ["Patch", artifact.artifacts.patch],
75
+ ["Proof", artifact.artifacts.proof],
76
+ ["Report", artifact.artifacts.html],
77
+ ];
78
+ for (const [label, value] of artifacts) {
79
+ if (value) {
80
+ rows.push({ label, value });
81
+ }
82
+ }
83
+ document.section("Evidence").rows(rows);
84
+ }
85
+ export function formatDiagnosisSummary(artifact, path, theme = PLAIN_THEME) {
86
+ const recommendation = artifact.recommendation;
87
+ const document = new TerminalDocument(theme);
88
+ document.heading("adaptive diagnosis");
89
+ document.verdict(verdictTone(artifact), `${artifact.stage} · ${artifact.status}`, recommendation.rationale);
90
+ if (artifact.lastError) {
91
+ document.detail(artifact.lastError, "failure");
92
+ }
93
+ document.blank().rows([
94
+ { label: "Observed", value: artifact.observation.status },
95
+ {
96
+ label: "Measured",
97
+ value: `${artifact.observation.tests} test(s)`
98
+ + ` · ${artifact.observation.failures} failure(s)`
99
+ + ` · ${artifact.observation.executions} execution(s)`,
100
+ },
101
+ ]);
102
+ document.section("Planned").rows(plannedRows(artifact));
103
+ document.note(recommendation.solariCostNote);
104
+ document.section("Consumed").rows(consumedRows(artifact));
105
+ document.section("Resources").rows([
106
+ { label: "Cache", value: `${artifact.cache.status} · ${artifact.cache.reason}` },
107
+ { label: "Cleanup", value: artifact.cleanup.status },
108
+ ]);
109
+ appendEvidence(document, artifact, path);
110
+ if (recommendation.command) {
111
+ document.section("Next").command(recommendation.command);
112
+ }
113
+ return document.render();
114
+ }
115
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/diagnosis/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AuthCookieExpiryFault } from "../domain/schema.js";
2
+ import type { TrialExecutor } from "../runner/playwright-executor.js";
3
+ import type { ExperimentResult } from "./evaluate.js";
4
+ export interface AuthCookieDiscoveryOptions {
5
+ concurrency: number;
6
+ cookieName: string;
7
+ minimumFailureRate: number;
8
+ pattern: string;
9
+ seed: number;
10
+ signal?: AbortSignal;
11
+ trials: number;
12
+ }
13
+ export interface AuthCookieDiscoveryResult {
14
+ baseline: ExperimentResult;
15
+ experiments: ExperimentResult[];
16
+ trigger: AuthCookieExpiryFault;
17
+ triggerResult: ExperimentResult;
18
+ }
19
+ export declare function discoverAuthCookieExpiry(execute: TrialExecutor, options: AuthCookieDiscoveryOptions): Promise<AuthCookieDiscoveryResult>;
@@ -0,0 +1,26 @@
1
+ import { createCausalEvaluator } from "./evaluate.js";
2
+ const MINIMUM_CONFIRMATION_TRIALS = 12;
3
+ export async function discoverAuthCookieExpiry(execute, options) {
4
+ const common = {
5
+ concurrency: options.concurrency,
6
+ minimumFailureRate: options.minimumFailureRate,
7
+ seed: options.seed,
8
+ signal: options.signal,
9
+ };
10
+ const evaluator = createCausalEvaluator(execute, { ...common, trials: options.trials });
11
+ const trigger = {
12
+ kind: "auth-cookie-expiry",
13
+ cookieName: options.cookieName,
14
+ pattern: options.pattern,
15
+ };
16
+ const first = await evaluator.evaluate([trigger]);
17
+ if (!first.confirmed) {
18
+ throw new Error("Auth cookie expiry did not reproduce the failure confidently");
19
+ }
20
+ const triggerResult = await evaluator.evaluate([trigger], Math.max(options.trials, MINIMUM_CONFIRMATION_TRIALS));
21
+ if (!triggerResult.confirmed) {
22
+ throw new Error("Auth cookie expiry did not reproduce in an independent confirmation batch");
23
+ }
24
+ return { baseline: evaluator.baseline(), experiments: [first, triggerResult], trigger, triggerResult };
25
+ }
26
+ //# sourceMappingURL=auth-cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-cookie.js","sourceRoot":"","sources":["../../src/discovery/auth-cookie.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,MAAM,2BAA2B,GAAG,EAAE,CAAA;AAmBtC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAsB,EACtB,OAAmC;IAEnC,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAA;IACD,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACvF,MAAM,OAAO,GAA0B;QACrC,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAA;IACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,QAAQ,CAC5C,CAAC,OAAO,CAAC,EACT,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CACtD,CAAA;IACD,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;IAC9F,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;AACxG,CAAC"}
@@ -1,22 +1,55 @@
1
- import type { Fault } from "../domain/schema.js";
1
+ import type { Fault, TrialOutcome } from "../domain/schema.js";
2
2
  import type { TrialExecutor } from "../runner/playwright-executor.js";
3
3
  export interface ExperimentOptions {
4
4
  concurrency: number;
5
- fault?: Fault;
5
+ faults: Fault[];
6
6
  minimumFailureRate: number;
7
7
  seed: number;
8
8
  signal?: AbortSignal;
9
9
  trials: number;
10
10
  }
11
+ export interface FailureSignatureResult {
12
+ failures: number;
13
+ failureRate: number;
14
+ lowerBound80: number;
15
+ signature: string;
16
+ upperBound80: number;
17
+ }
18
+ export interface CausalEffect {
19
+ controlFailures: number;
20
+ controlRate: number;
21
+ controlUpperBound80: number;
22
+ failureRateIncrease: number;
23
+ signature: string;
24
+ treatmentFailures: number;
25
+ treatmentLowerBound80: number;
26
+ treatmentRate: number;
27
+ }
11
28
  export interface ExperimentResult {
29
+ causalEffect?: CausalEffect;
12
30
  confirmed: boolean;
13
31
  dominantFailureSignature?: string;
14
32
  dominantFailureReason?: string;
15
33
  errors: number;
16
34
  failed: number;
17
35
  failureRate: number;
36
+ failureSignatures: FailureSignatureResult[];
18
37
  lowerBound80: number;
19
38
  passed: number;
39
+ representativeRuns: Array<{
40
+ artifacts: NonNullable<TrialOutcome["artifacts"]>;
41
+ durationMs: number;
42
+ status: "failed" | "passed";
43
+ trialId: string;
44
+ }>;
20
45
  trials: number;
46
+ upperBound80: number;
47
+ }
48
+ interface CausalEvaluator {
49
+ baseline: () => ExperimentResult;
50
+ evaluate: (faults: Fault[], trials?: number) => Promise<ExperimentResult>;
21
51
  }
52
+ type CausalEvaluatorOptions = Omit<ExperimentOptions, "faults">;
22
53
  export declare function evaluateExperiment(execute: TrialExecutor, options: ExperimentOptions): Promise<ExperimentResult>;
54
+ export declare function createCausalEvaluator(execute: TrialExecutor, options: CausalEvaluatorOptions): CausalEvaluator;
55
+ export {};
@@ -1,24 +1,34 @@
1
1
  import { deriveTrialSeed } from "../core/plan.js";
2
2
  const WILSON_Z_80 = 1.281_551_565_545;
3
- function lowerWilsonBound(failures, trials) {
3
+ function wilsonInterval(failures, trials) {
4
4
  if (trials === 0) {
5
- return 0;
5
+ return { lowerBound80: 0, upperBound80: 0 };
6
6
  }
7
7
  const probability = failures / trials;
8
8
  const squaredZ = WILSON_Z_80 ** 2;
9
9
  const denominator = 1 + squaredZ / trials;
10
10
  const center = probability + squaredZ / (2 * trials);
11
11
  const margin = WILSON_Z_80 * Math.sqrt((probability * (1 - probability) + squaredZ / (4 * trials)) / trials);
12
- return Math.max(0, (center - margin) / denominator);
12
+ return {
13
+ lowerBound80: Math.max(0, (center - margin) / denominator),
14
+ upperBound80: Math.min(1, (center + margin) / denominator),
15
+ };
13
16
  }
14
- function dominantSignature(outcomes) {
17
+ function signatureResults(outcomes, trials) {
15
18
  const counts = new Map();
16
19
  for (const outcome of outcomes) {
17
20
  if (outcome.status === "failed" && outcome.failureSignature) {
18
21
  counts.set(outcome.failureSignature, (counts.get(outcome.failureSignature) ?? 0) + 1);
19
22
  }
20
23
  }
21
- return [...counts.entries()].sort((left, right) => right[1] - left[1])[0]?.[0];
24
+ return [...counts.entries()]
25
+ .map(([signature, failures]) => ({
26
+ failures,
27
+ failureRate: trials === 0 ? 0 : failures / trials,
28
+ ...wilsonInterval(failures, trials),
29
+ signature,
30
+ }))
31
+ .sort((left, right) => right.failures - left.failures || left.signature.localeCompare(right.signature));
22
32
  }
23
33
  function dominantReason(outcomes, signature) {
24
34
  return outcomes.find((outcome) => outcome.failureSignature === signature && outcome.failureReason)?.failureReason;
@@ -34,48 +44,144 @@ function validateOptions(options) {
34
44
  throw new Error("minimum failure rate must be greater than 0 and at most 1");
35
45
  }
36
46
  }
37
- export async function evaluateExperiment(execute, options) {
38
- validateOptions(options);
39
- const plans = Array.from({ length: options.trials }, (_, index) => ({
40
- trialId: `experiment-${index + 1}`,
41
- index,
42
- seed: deriveTrialSeed(options.seed, index),
43
- fault: options.fault,
44
- }));
45
- const outcomes = new Map();
47
+ async function executePlans(execute, plans, concurrency, signal) {
48
+ const completed = new Map();
46
49
  let nextIndex = 0;
47
50
  const worker = async () => {
48
- while (!options.signal?.aborted) {
51
+ while (!signal?.aborted) {
49
52
  const index = nextIndex;
50
53
  nextIndex += 1;
51
- if (index >= plans.length) {
54
+ const plan = plans[index];
55
+ if (!plan) {
52
56
  return;
53
57
  }
54
- outcomes.set(index, await execute(plans[index]));
58
+ completed.set(index, { outcome: await execute(plan), plan });
55
59
  }
56
60
  };
57
- await Promise.all(Array.from({ length: Math.min(options.concurrency, plans.length) }, worker));
58
- const completed = [...outcomes.entries()]
61
+ await Promise.all(Array.from({ length: Math.min(concurrency, plans.length) }, worker));
62
+ return [...completed.entries()]
59
63
  .sort((left, right) => left[0] - right[0])
60
64
  .map((entry) => entry[1]);
61
- const failed = completed.filter((outcome) => outcome.status === "failed").length;
62
- const errors = completed.filter((outcome) => outcome.status === "error").length;
63
- const passed = completed.filter((outcome) => outcome.status === "passed").length;
64
- const failureRate = completed.length === 0 ? 0 : failed / completed.length;
65
- const lowerBound80 = lowerWilsonBound(failed, completed.length);
66
- const dominantFailureSignature = dominantSignature(completed);
65
+ }
66
+ function summarize(completed, minimumFailureRate) {
67
+ const outcomes = completed.map((entry) => entry.outcome);
68
+ const failed = outcomes.filter((outcome) => outcome.status === "failed").length;
69
+ const errors = outcomes.filter((outcome) => outcome.status === "error").length;
70
+ const passed = outcomes.filter((outcome) => outcome.status === "passed").length;
71
+ const failureRate = outcomes.length === 0 ? 0 : failed / outcomes.length;
72
+ const confidence = wilsonInterval(failed, outcomes.length);
73
+ const failureSignatures = signatureResults(outcomes, outcomes.length);
74
+ const dominantFailureSignature = failureSignatures[0]?.signature;
75
+ const representativeRuns = ["passed", "failed"].flatMap((status) => {
76
+ const entry = completed.find((trial) => trial.outcome.status === status);
77
+ if (!entry) {
78
+ return [];
79
+ }
80
+ return [{
81
+ artifacts: entry.outcome.artifacts ?? [],
82
+ durationMs: entry.outcome.durationMs,
83
+ status,
84
+ trialId: entry.plan.trialId,
85
+ }];
86
+ });
67
87
  return {
68
88
  confirmed: errors === 0
69
- && failureRate >= options.minimumFailureRate
70
- && lowerBound80 >= options.minimumFailureRate,
89
+ && failureRate >= minimumFailureRate
90
+ && confidence.lowerBound80 >= minimumFailureRate,
71
91
  dominantFailureSignature,
72
- dominantFailureReason: dominantReason(completed, dominantFailureSignature),
92
+ dominantFailureReason: dominantReason(outcomes, dominantFailureSignature),
73
93
  errors,
74
94
  failed,
75
95
  failureRate,
76
- lowerBound80,
96
+ failureSignatures,
97
+ ...confidence,
77
98
  passed,
78
- trials: completed.length,
99
+ representativeRuns,
100
+ trials: outcomes.length,
101
+ };
102
+ }
103
+ function causalTreatment(control, treatment, minimumFailureRate) {
104
+ const treatedSignature = treatment.failureSignatures[0];
105
+ if (!treatedSignature) {
106
+ return { ...treatment, confirmed: false };
107
+ }
108
+ const controlSignature = control.failureSignatures.find((entry) => entry.signature === treatedSignature.signature);
109
+ const controlConfidence = controlSignature ?? {
110
+ failures: 0,
111
+ failureRate: 0,
112
+ ...wilsonInterval(0, control.trials),
113
+ signature: treatedSignature.signature,
114
+ };
115
+ const causalEffect = {
116
+ controlFailures: controlConfidence.failures,
117
+ controlRate: controlConfidence.failureRate,
118
+ controlUpperBound80: controlConfidence.upperBound80,
119
+ failureRateIncrease: treatedSignature.failureRate - controlConfidence.failureRate,
120
+ signature: treatedSignature.signature,
121
+ treatmentFailures: treatedSignature.failures,
122
+ treatmentLowerBound80: treatedSignature.lowerBound80,
123
+ treatmentRate: treatedSignature.failureRate,
124
+ };
125
+ return {
126
+ ...treatment,
127
+ causalEffect,
128
+ confirmed: control.errors === 0
129
+ && treatment.errors === 0
130
+ && treatedSignature.failureRate >= minimumFailureRate
131
+ && treatedSignature.lowerBound80 >= minimumFailureRate
132
+ && treatedSignature.lowerBound80 > controlConfidence.upperBound80,
133
+ };
134
+ }
135
+ export async function evaluateExperiment(execute, options) {
136
+ validateOptions(options);
137
+ const plans = Array.from({ length: options.trials }, (_, index) => ({
138
+ faults: [...options.faults],
139
+ index,
140
+ seed: deriveTrialSeed(options.seed, index),
141
+ trialId: `experiment-${index + 1}`,
142
+ }));
143
+ return summarize(await executePlans(execute, plans, options.concurrency, options.signal), options.minimumFailureRate);
144
+ }
145
+ async function evaluateCausalExperiment(execute, options, batch) {
146
+ validateOptions(options);
147
+ const scheduled = Array.from({ length: options.trials }, (_, index) => {
148
+ const seed = deriveTrialSeed(options.seed, index);
149
+ const planIndex = batch * 1_000 + index * 2;
150
+ const control = {
151
+ faults: [],
152
+ index: planIndex,
153
+ seed,
154
+ trialId: `batch-${batch}-control-${index + 1}`,
155
+ };
156
+ const treatment = {
157
+ faults: [...options.faults],
158
+ index: planIndex + 1,
159
+ seed,
160
+ trialId: `batch-${batch}-intervention-${index + 1}`,
161
+ };
162
+ return index % 2 === 0 ? [control, treatment] : [treatment, control];
163
+ }).flat();
164
+ const completed = await executePlans(execute, scheduled, options.concurrency, options.signal);
165
+ const control = summarize(completed.filter((entry) => entry.plan.faults.length === 0), options.minimumFailureRate);
166
+ const treatment = summarize(completed.filter((entry) => entry.plan.faults.length > 0), options.minimumFailureRate);
167
+ return { control, treatment: causalTreatment(control, treatment, options.minimumFailureRate) };
168
+ }
169
+ export function createCausalEvaluator(execute, options) {
170
+ let firstControl;
171
+ let batch = 0;
172
+ return {
173
+ baseline: () => {
174
+ if (!firstControl) {
175
+ throw new Error("A causal intervention must run before its baseline is available");
176
+ }
177
+ return firstControl;
178
+ },
179
+ evaluate: async (faults, trials = options.trials) => {
180
+ batch += 1;
181
+ const result = await evaluateCausalExperiment(execute, { ...options, faults, trials }, batch);
182
+ firstControl ??= result.control;
183
+ return result.treatment;
184
+ },
79
185
  };
80
186
  }
81
187
  //# sourceMappingURL=evaluate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/discovery/evaluate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/discovery/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { EventLoopStallFault } from "../domain/schema.js";
2
+ import type { TrialExecutor } from "../runner/playwright-executor.js";
3
+ import type { ExperimentResult } from "./evaluate.js";
4
+ export interface EventLoopDiscoveryOptions {
5
+ concurrency: number;
6
+ maximumDurationMs: number;
7
+ minimumFailureRate: number;
8
+ pattern: string;
9
+ seed: number;
10
+ signal?: AbortSignal;
11
+ startAfterMs: number;
12
+ trials: number;
13
+ }
14
+ export interface EventLoopExperiment {
15
+ durationMs: number;
16
+ result: ExperimentResult;
17
+ }
18
+ export interface EventLoopDiscoveryResult {
19
+ baseline: ExperimentResult;
20
+ experiments: EventLoopExperiment[];
21
+ minimumDurationMs: number;
22
+ trigger: EventLoopStallFault;
23
+ triggerResult: ExperimentResult;
24
+ }
25
+ export declare function discoverEventLoopStall(execute: TrialExecutor, options: EventLoopDiscoveryOptions): Promise<EventLoopDiscoveryResult>;