flakelab 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 (245) hide show
  1. package/README.md +341 -0
  2. package/bin/flakelab.mjs +3 -0
  3. package/dist/artifacts/ndjson.d.ts +3 -0
  4. package/dist/artifacts/ndjson.js +16 -0
  5. package/dist/artifacts/ndjson.js.map +1 -0
  6. package/dist/bisect/archive.d.ts +1 -0
  7. package/dist/bisect/archive.js +14 -0
  8. package/dist/bisect/archive.js.map +1 -0
  9. package/dist/bisect/confidence.d.ts +7 -0
  10. package/dist/bisect/confidence.js +27 -0
  11. package/dist/bisect/confidence.js.map +1 -0
  12. package/dist/bisect/engine.d.ts +10 -0
  13. package/dist/bisect/engine.js +110 -0
  14. package/dist/bisect/engine.js.map +1 -0
  15. package/dist/bisect/git.d.ts +7 -0
  16. package/dist/bisect/git.js +56 -0
  17. package/dist/bisect/git.js.map +1 -0
  18. package/dist/bisect/schema.d.ts +82 -0
  19. package/dist/bisect/schema.js +33 -0
  20. package/dist/bisect/schema.js.map +1 -0
  21. package/dist/bisect/solari-command.d.ts +7 -0
  22. package/dist/bisect/solari-command.js +95 -0
  23. package/dist/bisect/solari-command.js.map +1 -0
  24. package/dist/bisect/solari-evaluator.d.ts +20 -0
  25. package/dist/bisect/solari-evaluator.js +310 -0
  26. package/dist/bisect/solari-evaluator.js.map +1 -0
  27. package/dist/ci/changed-tests.d.ts +7 -0
  28. package/dist/ci/changed-tests.js +104 -0
  29. package/dist/ci/changed-tests.js.map +1 -0
  30. package/dist/ci/job-summary.d.ts +11 -0
  31. package/dist/ci/job-summary.js +45 -0
  32. package/dist/ci/job-summary.js.map +1 -0
  33. package/dist/ci/select-command.d.ts +1 -0
  34. package/dist/ci/select-command.js +49 -0
  35. package/dist/ci/select-command.js.map +1 -0
  36. package/dist/ci/summary-command.d.ts +1 -0
  37. package/dist/ci/summary-command.js +46 -0
  38. package/dist/ci/summary-command.js.map +1 -0
  39. package/dist/cli-help.d.ts +2 -0
  40. package/dist/cli-help.js +47 -0
  41. package/dist/cli-help.js.map +1 -0
  42. package/dist/cli.d.ts +1 -0
  43. package/dist/cli.js +121 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/commands/bisect.d.ts +2 -0
  46. package/dist/commands/bisect.js +63 -0
  47. package/dist/commands/bisect.js.map +1 -0
  48. package/dist/commands/diagnose.d.ts +2 -0
  49. package/dist/commands/diagnose.js +27 -0
  50. package/dist/commands/diagnose.js.map +1 -0
  51. package/dist/commands/discover.d.ts +2 -0
  52. package/dist/commands/discover.js +46 -0
  53. package/dist/commands/discover.js.map +1 -0
  54. package/dist/commands/doctor.d.ts +8 -0
  55. package/dist/commands/doctor.js +78 -0
  56. package/dist/commands/doctor.js.map +1 -0
  57. package/dist/commands/investigate.d.ts +2 -0
  58. package/dist/commands/investigate.js +43 -0
  59. package/dist/commands/investigate.js.map +1 -0
  60. package/dist/commands/options.d.ts +38 -0
  61. package/dist/commands/options.js +35 -0
  62. package/dist/commands/options.js.map +1 -0
  63. package/dist/commands/prove.d.ts +2 -0
  64. package/dist/commands/prove.js +21 -0
  65. package/dist/commands/prove.js.map +1 -0
  66. package/dist/commands/repair.d.ts +2 -0
  67. package/dist/commands/repair.js +55 -0
  68. package/dist/commands/repair.js.map +1 -0
  69. package/dist/commands/replay.d.ts +2 -0
  70. package/dist/commands/replay.js +26 -0
  71. package/dist/commands/replay.js.map +1 -0
  72. package/dist/commands/report.d.ts +2 -0
  73. package/dist/commands/report.js +79 -0
  74. package/dist/commands/report.js.map +1 -0
  75. package/dist/commands/scan.d.ts +12 -0
  76. package/dist/commands/scan.js +86 -0
  77. package/dist/commands/scan.js.map +1 -0
  78. package/dist/core/plan.d.ts +3 -0
  79. package/dist/core/plan.js +17 -0
  80. package/dist/core/plan.js.map +1 -0
  81. package/dist/discovery/evaluate.d.ts +22 -0
  82. package/dist/discovery/evaluate.js +81 -0
  83. package/dist/discovery/evaluate.js.map +1 -0
  84. package/dist/discovery/minimize.d.ts +24 -0
  85. package/dist/discovery/minimize.js +73 -0
  86. package/dist/discovery/minimize.js.map +1 -0
  87. package/dist/domain/schema.d.ts +155 -0
  88. package/dist/domain/schema.js +67 -0
  89. package/dist/domain/schema.js.map +1 -0
  90. package/dist/faults/install.d.ts +4 -0
  91. package/dist/faults/install.js +9 -0
  92. package/dist/faults/install.js.map +1 -0
  93. package/dist/faults/network-delay.d.ts +5 -0
  94. package/dist/faults/network-delay.js +34 -0
  95. package/dist/faults/network-delay.js.map +1 -0
  96. package/dist/faults/request-failure.d.ts +5 -0
  97. package/dist/faults/request-failure.js +24 -0
  98. package/dist/faults/request-failure.js.map +1 -0
  99. package/dist/investigator/agent.d.ts +26 -0
  100. package/dist/investigator/agent.js +197 -0
  101. package/dist/investigator/agent.js.map +1 -0
  102. package/dist/investigator/budget.d.ts +14 -0
  103. package/dist/investigator/budget.js +39 -0
  104. package/dist/investigator/budget.js.map +1 -0
  105. package/dist/investigator/file.d.ts +2 -0
  106. package/dist/investigator/file.js +7 -0
  107. package/dist/investigator/file.js.map +1 -0
  108. package/dist/investigator/groq.d.ts +5 -0
  109. package/dist/investigator/groq.js +26 -0
  110. package/dist/investigator/groq.js.map +1 -0
  111. package/dist/investigator/ledger.d.ts +17 -0
  112. package/dist/investigator/ledger.js +121 -0
  113. package/dist/investigator/ledger.js.map +1 -0
  114. package/dist/investigator/safe-source.d.ts +6 -0
  115. package/dist/investigator/safe-source.js +79 -0
  116. package/dist/investigator/safe-source.js.map +1 -0
  117. package/dist/investigator/schema.d.ts +110 -0
  118. package/dist/investigator/schema.js +53 -0
  119. package/dist/investigator/schema.js.map +1 -0
  120. package/dist/playwright.d.ts +3 -0
  121. package/dist/playwright.js +21 -0
  122. package/dist/playwright.js.map +1 -0
  123. package/dist/providers/errors.d.ts +21 -0
  124. package/dist/providers/errors.js +159 -0
  125. package/dist/providers/errors.js.map +1 -0
  126. package/dist/repair/file.d.ts +2 -0
  127. package/dist/repair/file.js +6 -0
  128. package/dist/repair/file.js.map +1 -0
  129. package/dist/repair/generator.d.ts +12 -0
  130. package/dist/repair/generator.js +74 -0
  131. package/dist/repair/generator.js.map +1 -0
  132. package/dist/repair/policy.d.ts +2 -0
  133. package/dist/repair/policy.js +70 -0
  134. package/dist/repair/policy.js.map +1 -0
  135. package/dist/repair/remote-proof-runner.d.ts +1 -0
  136. package/dist/repair/remote-proof-runner.js +53 -0
  137. package/dist/repair/remote-proof-runner.js.map +1 -0
  138. package/dist/repair/schema.d.ts +78 -0
  139. package/dist/repair/schema.js +44 -0
  140. package/dist/repair/schema.js.map +1 -0
  141. package/dist/repair/solari-validator.d.ts +25 -0
  142. package/dist/repair/solari-validator.js +231 -0
  143. package/dist/repair/solari-validator.js.map +1 -0
  144. package/dist/repair/validator.d.ts +16 -0
  145. package/dist/repair/validator.js +81 -0
  146. package/dist/repair/validator.js.map +1 -0
  147. package/dist/repair/workspace.d.ts +7 -0
  148. package/dist/repair/workspace.js +40 -0
  149. package/dist/repair/workspace.js.map +1 -0
  150. package/dist/report/browser-entry.d.ts +2 -0
  151. package/dist/report/browser-entry.js +15 -0
  152. package/dist/report/browser-entry.js.map +1 -0
  153. package/dist/report/bundle.d.ts +2 -0
  154. package/dist/report/bundle.js +77 -0
  155. package/dist/report/bundle.js.map +1 -0
  156. package/dist/report/classification.d.ts +9 -0
  157. package/dist/report/classification.js +55 -0
  158. package/dist/report/classification.js.map +1 -0
  159. package/dist/report/components/artifacts.d.ts +4 -0
  160. package/dist/report/components/artifacts.js +6 -0
  161. package/dist/report/components/artifacts.js.map +1 -0
  162. package/dist/report/components/experiments.d.ts +4 -0
  163. package/dist/report/components/experiments.js +7 -0
  164. package/dist/report/components/experiments.js.map +1 -0
  165. package/dist/report/components/hypotheses.d.ts +4 -0
  166. package/dist/report/components/hypotheses.js +26 -0
  167. package/dist/report/components/hypotheses.js.map +1 -0
  168. package/dist/report/components/indicators.d.ts +32 -0
  169. package/dist/report/components/indicators.js +42 -0
  170. package/dist/report/components/indicators.js.map +1 -0
  171. package/dist/report/components/layout.d.ts +29 -0
  172. package/dist/report/components/layout.js +20 -0
  173. package/dist/report/components/layout.js.map +1 -0
  174. package/dist/report/components/proof.d.ts +4 -0
  175. package/dist/report/components/proof.js +34 -0
  176. package/dist/report/components/proof.js.map +1 -0
  177. package/dist/report/components/reproduction.d.ts +4 -0
  178. package/dist/report/components/reproduction.js +19 -0
  179. package/dist/report/components/reproduction.js.map +1 -0
  180. package/dist/report/components/summary.d.ts +4 -0
  181. package/dist/report/components/summary.js +12 -0
  182. package/dist/report/components/summary.js.map +1 -0
  183. package/dist/report/components/verdict.d.ts +4 -0
  184. package/dist/report/components/verdict.js +27 -0
  185. package/dist/report/components/verdict.js.map +1 -0
  186. package/dist/report/model.d.ts +19 -0
  187. package/dist/report/model.js +82 -0
  188. package/dist/report/model.js.map +1 -0
  189. package/dist/report/open.d.ts +1 -0
  190. package/dist/report/open.js +24 -0
  191. package/dist/report/open.js.map +1 -0
  192. package/dist/report/publish.d.ts +12 -0
  193. package/dist/report/publish.js +67 -0
  194. package/dist/report/publish.js.map +1 -0
  195. package/dist/report/redaction.d.ts +1 -0
  196. package/dist/report/redaction.js +58 -0
  197. package/dist/report/redaction.js.map +1 -0
  198. package/dist/report/report-app.d.ts +6 -0
  199. package/dist/report/report-app.js +16 -0
  200. package/dist/report/report-app.js.map +1 -0
  201. package/dist/report/report-details.css +182 -0
  202. package/dist/report/report.css +404 -0
  203. package/dist/report/schema.d.ts +101 -0
  204. package/dist/report/schema.js +71 -0
  205. package/dist/report/schema.js.map +1 -0
  206. package/dist/reproducer/file.d.ts +3 -0
  207. package/dist/reproducer/file.js +14 -0
  208. package/dist/reproducer/file.js.map +1 -0
  209. package/dist/reproducer/schema.d.ts +17 -0
  210. package/dist/reproducer/schema.js +14 -0
  211. package/dist/reproducer/schema.js.map +1 -0
  212. package/dist/runner/local.d.ts +12 -0
  213. package/dist/runner/local.js +72 -0
  214. package/dist/runner/local.js.map +1 -0
  215. package/dist/runner/playwright-executor.d.ts +10 -0
  216. package/dist/runner/playwright-executor.js +148 -0
  217. package/dist/runner/playwright-executor.js.map +1 -0
  218. package/dist/security/credentials.d.ts +23 -0
  219. package/dist/security/credentials.js +105 -0
  220. package/dist/security/credentials.js.map +1 -0
  221. package/dist/solari/checkout-fixture.d.ts +3 -0
  222. package/dist/solari/checkout-fixture.js +54 -0
  223. package/dist/solari/checkout-fixture.js.map +1 -0
  224. package/dist/solari/executor.d.ts +17 -0
  225. package/dist/solari/executor.js +280 -0
  226. package/dist/solari/executor.js.map +1 -0
  227. package/dist/solari/retry.d.ts +7 -0
  228. package/dist/solari/retry.js +50 -0
  229. package/dist/solari/retry.js.map +1 -0
  230. package/dist/solari/run-demo.d.ts +21 -0
  231. package/dist/solari/run-demo.js +64 -0
  232. package/dist/solari/run-demo.js.map +1 -0
  233. package/dist/solari/transport.d.ts +1 -0
  234. package/dist/solari/transport.js +21 -0
  235. package/dist/solari/transport.js.map +1 -0
  236. package/dist/solari/usage.d.ts +23 -0
  237. package/dist/solari/usage.js +53 -0
  238. package/dist/solari/usage.js.map +1 -0
  239. package/dist/solari/websocket-proxy.d.ts +7 -0
  240. package/dist/solari/websocket-proxy.js +131 -0
  241. package/dist/solari/websocket-proxy.js.map +1 -0
  242. package/dist/ui/progress.d.ts +5 -0
  243. package/dist/ui/progress.js +16 -0
  244. package/dist/ui/progress.js.map +1 -0
  245. package/package.json +79 -0
@@ -0,0 +1,131 @@
1
+ import { createServer } from "node:http";
2
+ import { connect as connectNet } from "node:net";
3
+ import { connect as connectTls } from "node:tls";
4
+ const CONNECT_TIMEOUT_MS = 10_000;
5
+ function openTlsSocket(url) {
6
+ return new Promise((resolve, reject) => {
7
+ const port = Number(url.port || "443");
8
+ const tcpSocket = connectNet({ host: url.hostname, port, family: 4 });
9
+ const timeout = setTimeout(() => {
10
+ tcpSocket.destroy();
11
+ reject(new Error("Solari WebSocket TLS connection timed out"));
12
+ }, CONNECT_TIMEOUT_MS);
13
+ tcpSocket.once("error", (error) => {
14
+ clearTimeout(timeout);
15
+ reject(error instanceof Error ? error : new Error("Solari TCP connection failed"));
16
+ });
17
+ tcpSocket.once("connect", () => {
18
+ const socket = connectTls({
19
+ socket: tcpSocket,
20
+ servername: url.hostname,
21
+ maxVersion: "TLSv1.2",
22
+ ALPNProtocols: ["http/1.1"],
23
+ });
24
+ socket.once("secureConnect", () => {
25
+ clearTimeout(timeout);
26
+ resolve(socket);
27
+ });
28
+ socket.once("error", (error) => {
29
+ clearTimeout(timeout);
30
+ reject(error instanceof Error ? error : new Error("Solari TLS connection failed"));
31
+ });
32
+ });
33
+ });
34
+ }
35
+ function upstreamRequest(request, url) {
36
+ const port = url.port || "443";
37
+ const lines = [`GET ${url.pathname}${url.search} HTTP/1.1`, `Host: ${url.hostname}:${port}`];
38
+ for (const [name, value] of Object.entries(request.headers)) {
39
+ if (name.toLowerCase() === "host" || value === undefined) {
40
+ continue;
41
+ }
42
+ const values = Array.isArray(value) ? value : [value];
43
+ for (const item of values) {
44
+ lines.push(`${name}: ${item}`);
45
+ }
46
+ }
47
+ return `${lines.join("\r\n")}\r\n\r\n`;
48
+ }
49
+ export class SecureWebSocketProxy {
50
+ #sockets = new Set();
51
+ #upstream;
52
+ #server;
53
+ constructor(upstream) {
54
+ this.#upstream = upstream;
55
+ }
56
+ static async create(upstreamEndpoint) {
57
+ const upstream = new URL(upstreamEndpoint);
58
+ if (upstream.protocol !== "wss:") {
59
+ throw new Error("Solari browser endpoint must use secure WebSockets");
60
+ }
61
+ const proxy = new SecureWebSocketProxy(upstream);
62
+ await proxy.#listen();
63
+ return proxy;
64
+ }
65
+ endpoint() {
66
+ const address = this.#server?.address();
67
+ if (!address || typeof address === "string") {
68
+ throw new Error("Solari WebSocket proxy is not listening");
69
+ }
70
+ return `ws://127.0.0.1:${address.port}/session`;
71
+ }
72
+ async close() {
73
+ for (const socket of this.#sockets) {
74
+ socket.destroy();
75
+ }
76
+ this.#sockets.clear();
77
+ const server = this.#server;
78
+ this.#server = undefined;
79
+ if (!server) {
80
+ return;
81
+ }
82
+ await new Promise((resolve, reject) => {
83
+ server.close((error) => {
84
+ if (error) {
85
+ reject(error);
86
+ return;
87
+ }
88
+ resolve();
89
+ });
90
+ });
91
+ }
92
+ async #listen() {
93
+ const server = createServer();
94
+ server.on("upgrade", (request, client, head) => {
95
+ void this.#connect(request, client, head).catch(() => {
96
+ client.destroy();
97
+ });
98
+ });
99
+ await new Promise((resolve, reject) => {
100
+ server.once("error", reject);
101
+ server.listen(0, "127.0.0.1", resolve);
102
+ });
103
+ this.#server = server;
104
+ }
105
+ async #connect(request, client, head) {
106
+ if (request.url !== "/session") {
107
+ client.destroy();
108
+ return;
109
+ }
110
+ const upstream = await openTlsSocket(this.#upstream);
111
+ this.#sockets.add(client);
112
+ this.#sockets.add(upstream);
113
+ const cleanup = () => {
114
+ this.#sockets.delete(client);
115
+ this.#sockets.delete(upstream);
116
+ client.destroy();
117
+ upstream.destroy();
118
+ };
119
+ client.once("error", cleanup);
120
+ client.once("close", cleanup);
121
+ upstream.once("error", cleanup);
122
+ upstream.once("close", cleanup);
123
+ upstream.write(upstreamRequest(request, this.#upstream));
124
+ if (head.length > 0) {
125
+ upstream.write(head);
126
+ }
127
+ upstream.pipe(client);
128
+ client.pipe(upstream);
129
+ }
130
+ }
131
+ //# sourceMappingURL=websocket-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-proxy.js","sourceRoot":"","sources":["../../src/solari/websocket-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare class ProgressReporter {
2
+ #private;
3
+ start(label: string): void;
4
+ done(detail?: string): void;
5
+ }
@@ -0,0 +1,16 @@
1
+ export class ProgressReporter {
2
+ #lastLabel;
3
+ start(label) {
4
+ this.#lastLabel = label;
5
+ process.stderr.write(`FlakeLab · ${label}...\n`);
6
+ }
7
+ done(detail) {
8
+ if (!this.#lastLabel) {
9
+ return;
10
+ }
11
+ const detailSuffix = detail ? ` · ${detail}` : "";
12
+ process.stderr.write(`✓ ${this.#lastLabel}${detailSuffix}\n`);
13
+ this.#lastLabel = undefined;
14
+ }
15
+ }
16
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/ui/progress.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAgB;IAC3B,UAAU,CAAoB;IAE9B,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,OAAO,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,CAAC,MAAe;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,UAAU,GAAG,YAAY,IAAI,CAAC,CAAA;QAC7D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;IAC7B,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "flakelab",
3
+ "version": "0.1.0",
4
+ "description": "Find, reproduce, and prove fixes for flaky Playwright tests.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/Astraque-Softwares/solari-cookbook.git",
10
+ "directory": "projects/flakelab"
11
+ },
12
+ "homepage": "https://github.com/Astraque-Softwares/solari-cookbook/tree/main/projects/flakelab",
13
+ "engines": {
14
+ "node": ">=20"
15
+ },
16
+ "bin": {
17
+ "flakelab": "./bin/flakelab.mjs"
18
+ },
19
+ "exports": {
20
+ "./playwright": {
21
+ "types": "./dist/playwright.d.ts",
22
+ "import": "./dist/playwright.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "bin",
28
+ "README.md"
29
+ ],
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "dependencies": {
34
+ "@ai-sdk/groq": "^4.0.35",
35
+ "@fontsource-variable/geist-mono": "^5.3.0",
36
+ "@solarisdk/browser": "^0.1.2",
37
+ "@solarisdk/sandbox": "^0.1.2",
38
+ "ai": "^7.0.87",
39
+ "diff": "^9.0.0",
40
+ "dotenv": "^17.2.2",
41
+ "react": "^19.2.8",
42
+ "react-dom": "^19.2.8",
43
+ "recharts": "^3.10.1",
44
+ "undici": "^7.29.0",
45
+ "vite": "^8.2.2",
46
+ "yaml": "^2.9.0",
47
+ "zod": "^4.5.4"
48
+ },
49
+ "peerDependencies": {
50
+ "@playwright/test": ">=1.50.0 <2"
51
+ },
52
+ "devDependencies": {
53
+ "@hono/eslint-config": "^2.1.1",
54
+ "@playwright/test": "^1.62.1",
55
+ "@types/node": "^22.18.1",
56
+ "@types/react": "^19.2.18",
57
+ "@types/react-dom": "^19.2.5",
58
+ "eslint": "^10.9.1",
59
+ "eslint-plugin-sonarjs": "^4.2.0",
60
+ "tsx": "^4.20.5",
61
+ "typescript": "^5.9.2",
62
+ "typescript-eslint": "^8.69.0"
63
+ },
64
+ "scripts": {
65
+ "build": "node scripts/clean-build.mjs && tsc -p tsconfig.build.json && node scripts/copy-assets.mjs",
66
+ "ci:select": "tsx src/ci/select-command.ts",
67
+ "ci:summary": "tsx src/ci/summary-command.ts",
68
+ "flakelab": "tsx src/cli.ts",
69
+ "lint": "eslint . --max-warnings=0",
70
+ "lint:fix": "eslint . --fix --max-warnings=0",
71
+ "test": "playwright test --pass-with-no-tests",
72
+ "test:headed": "playwright test --headed",
73
+ "typecheck": "tsc --noEmit",
74
+ "quality": "pnpm typecheck && pnpm lint && pnpm test",
75
+ "verify:solari-parallel": "tsx src/verify-solari-parallel.ts",
76
+ "verify:solari": "tsx src/verify-solari.ts",
77
+ "verify:bisect": "tsx src/verify-bisect.ts"
78
+ }
79
+ }