@cavelang/cli 0.27.3 → 0.29.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 (321) hide show
  1. package/Authors.md +5 -0
  2. package/License.md +6 -0
  3. package/README.md +122 -24
  4. package/dist/internal/act/action.d.ts +69 -0
  5. package/dist/internal/act/action.d.ts.map +1 -0
  6. package/dist/internal/act/action.js +201 -0
  7. package/dist/internal/act/action.js.map +1 -0
  8. package/dist/internal/act/declare.d.ts +102 -0
  9. package/dist/internal/act/declare.d.ts.map +1 -0
  10. package/dist/internal/act/declare.js +270 -0
  11. package/dist/internal/act/declare.js.map +1 -0
  12. package/dist/internal/act/engine.d.ts +103 -0
  13. package/dist/internal/act/engine.d.ts.map +1 -0
  14. package/dist/internal/act/engine.js +298 -0
  15. package/dist/internal/act/engine.js.map +1 -0
  16. package/dist/internal/act/index.d.ts +27 -0
  17. package/dist/internal/act/index.d.ts.map +1 -0
  18. package/dist/internal/act/index.js +25 -0
  19. package/dist/internal/act/index.js.map +1 -0
  20. package/dist/internal/automate/automation.d.ts +78 -0
  21. package/dist/internal/automate/automation.d.ts.map +1 -0
  22. package/dist/internal/automate/automation.js +135 -0
  23. package/dist/internal/automate/automation.js.map +1 -0
  24. package/dist/internal/automate/declare.d.ts +84 -0
  25. package/dist/internal/automate/declare.d.ts.map +1 -0
  26. package/dist/internal/automate/declare.js +233 -0
  27. package/dist/internal/automate/declare.js.map +1 -0
  28. package/dist/internal/automate/engine.d.ts +125 -0
  29. package/dist/internal/automate/engine.d.ts.map +1 -0
  30. package/dist/internal/automate/engine.js +388 -0
  31. package/dist/internal/automate/engine.js.map +1 -0
  32. package/dist/internal/automate/index.d.ts +28 -0
  33. package/dist/internal/automate/index.d.ts.map +1 -0
  34. package/dist/internal/automate/index.js +26 -0
  35. package/dist/internal/automate/index.js.map +1 -0
  36. package/dist/internal/automate/main.d.ts +26 -0
  37. package/dist/internal/automate/main.d.ts.map +1 -0
  38. package/dist/internal/automate/main.js +298 -0
  39. package/dist/internal/automate/main.js.map +1 -0
  40. package/dist/internal/connect/index.d.ts +26 -0
  41. package/dist/internal/connect/index.d.ts.map +1 -0
  42. package/dist/internal/connect/index.js +24 -0
  43. package/dist/internal/connect/index.js.map +1 -0
  44. package/dist/internal/connect/main.d.ts +23 -0
  45. package/dist/internal/connect/main.d.ts.map +1 -0
  46. package/dist/internal/connect/main.js +330 -0
  47. package/dist/internal/connect/main.js.map +1 -0
  48. package/dist/internal/connect/run.d.ts +85 -0
  49. package/dist/internal/connect/run.d.ts.map +1 -0
  50. package/dist/internal/connect/run.js +242 -0
  51. package/dist/internal/connect/run.js.map +1 -0
  52. package/dist/internal/connect/source.d.ts +44 -0
  53. package/dist/internal/connect/source.d.ts.map +1 -0
  54. package/dist/internal/connect/source.js +215 -0
  55. package/dist/internal/connect/source.js.map +1 -0
  56. package/dist/internal/connect/template.d.ts +69 -0
  57. package/dist/internal/connect/template.d.ts.map +1 -0
  58. package/dist/internal/connect/template.js +221 -0
  59. package/dist/internal/connect/template.js.map +1 -0
  60. package/dist/internal/eval/index.d.ts +28 -0
  61. package/dist/internal/eval/index.d.ts.map +1 -0
  62. package/dist/internal/eval/index.js +27 -0
  63. package/dist/internal/eval/index.js.map +1 -0
  64. package/dist/internal/eval/judge.d.ts +30 -0
  65. package/dist/internal/eval/judge.d.ts.map +1 -0
  66. package/dist/internal/eval/judge.js +101 -0
  67. package/dist/internal/eval/judge.js.map +1 -0
  68. package/dist/internal/eval/loop.d.ts +64 -0
  69. package/dist/internal/eval/loop.d.ts.map +1 -0
  70. package/dist/internal/eval/loop.js +123 -0
  71. package/dist/internal/eval/loop.js.map +1 -0
  72. package/dist/internal/eval/main.d.ts +17 -0
  73. package/dist/internal/eval/main.d.ts.map +1 -0
  74. package/dist/internal/eval/main.js +236 -0
  75. package/dist/internal/eval/main.js.map +1 -0
  76. package/dist/internal/eval/queries.d.ts +74 -0
  77. package/dist/internal/eval/queries.d.ts.map +1 -0
  78. package/dist/internal/eval/queries.js +161 -0
  79. package/dist/internal/eval/queries.js.map +1 -0
  80. package/dist/internal/eval/run.d.ts +143 -0
  81. package/dist/internal/eval/run.d.ts.map +1 -0
  82. package/dist/internal/eval/run.js +376 -0
  83. package/dist/internal/eval/run.js.map +1 -0
  84. package/dist/internal/eval/score.d.ts +81 -0
  85. package/dist/internal/eval/score.d.ts.map +1 -0
  86. package/dist/internal/eval/score.js +126 -0
  87. package/dist/internal/eval/score.js.map +1 -0
  88. package/dist/internal/eval/suite.d.ts +66 -0
  89. package/dist/internal/eval/suite.d.ts.map +1 -0
  90. package/dist/internal/eval/suite.js +130 -0
  91. package/dist/internal/eval/suite.js.map +1 -0
  92. package/dist/internal/ingest/context.d.ts +20 -0
  93. package/dist/internal/ingest/context.d.ts.map +1 -0
  94. package/dist/internal/ingest/context.js +59 -0
  95. package/dist/internal/ingest/context.js.map +1 -0
  96. package/dist/internal/ingest/files.d.ts +46 -0
  97. package/dist/internal/ingest/files.d.ts.map +1 -0
  98. package/dist/internal/ingest/files.js +115 -0
  99. package/dist/internal/ingest/files.js.map +1 -0
  100. package/dist/internal/ingest/index.d.ts +31 -0
  101. package/dist/internal/ingest/index.d.ts.map +1 -0
  102. package/dist/internal/ingest/index.js +29 -0
  103. package/dist/internal/ingest/index.js.map +1 -0
  104. package/dist/internal/ingest/main.d.ts +12 -0
  105. package/dist/internal/ingest/main.d.ts.map +1 -0
  106. package/dist/internal/ingest/main.js +180 -0
  107. package/dist/internal/ingest/main.js.map +1 -0
  108. package/dist/internal/ingest/prompt.d.ts +32 -0
  109. package/dist/internal/ingest/prompt.d.ts.map +1 -0
  110. package/dist/internal/ingest/prompt.js +75 -0
  111. package/dist/internal/ingest/prompt.js.map +1 -0
  112. package/dist/internal/ingest/run.d.ts +142 -0
  113. package/dist/internal/ingest/run.d.ts.map +1 -0
  114. package/dist/internal/ingest/run.js +350 -0
  115. package/dist/internal/ingest/run.js.map +1 -0
  116. package/dist/internal/ingest/web.d.ts +48 -0
  117. package/dist/internal/ingest/web.d.ts.map +1 -0
  118. package/dist/internal/ingest/web.js +140 -0
  119. package/dist/internal/ingest/web.js.map +1 -0
  120. package/dist/internal/loop/demo.d.ts +22 -0
  121. package/dist/internal/loop/demo.d.ts.map +1 -0
  122. package/dist/internal/loop/demo.js +67 -0
  123. package/dist/internal/loop/demo.js.map +1 -0
  124. package/dist/internal/loop/index.d.ts +20 -0
  125. package/dist/internal/loop/index.d.ts.map +1 -0
  126. package/dist/internal/loop/index.js +17 -0
  127. package/dist/internal/loop/index.js.map +1 -0
  128. package/dist/internal/loop/llm.d.ts +99 -0
  129. package/dist/internal/loop/llm.d.ts.map +1 -0
  130. package/dist/internal/loop/llm.js +231 -0
  131. package/dist/internal/loop/llm.js.map +1 -0
  132. package/dist/internal/loop/reconstruct.d.ts +87 -0
  133. package/dist/internal/loop/reconstruct.d.ts.map +1 -0
  134. package/dist/internal/loop/reconstruct.js +157 -0
  135. package/dist/internal/loop/reconstruct.js.map +1 -0
  136. package/dist/internal/loop/sqlite.d.ts +13 -0
  137. package/dist/internal/loop/sqlite.d.ts.map +1 -0
  138. package/dist/internal/loop/sqlite.js +33 -0
  139. package/dist/internal/loop/sqlite.js.map +1 -0
  140. package/dist/internal/loop/store.d.ts +50 -0
  141. package/dist/internal/loop/store.d.ts.map +1 -0
  142. package/dist/internal/loop/store.js +100 -0
  143. package/dist/internal/loop/store.js.map +1 -0
  144. package/dist/internal/mcp/bin.d.ts +7 -0
  145. package/dist/internal/mcp/bin.d.ts.map +1 -0
  146. package/dist/internal/mcp/bin.js +8 -0
  147. package/dist/internal/mcp/bin.js.map +1 -0
  148. package/dist/internal/mcp/index.d.ts +25 -0
  149. package/dist/internal/mcp/index.d.ts.map +1 -0
  150. package/dist/internal/mcp/index.js +23 -0
  151. package/dist/internal/mcp/index.js.map +1 -0
  152. package/dist/internal/mcp/main.d.ts +23 -0
  153. package/dist/internal/mcp/main.d.ts.map +1 -0
  154. package/dist/internal/mcp/main.js +156 -0
  155. package/dist/internal/mcp/main.js.map +1 -0
  156. package/dist/internal/mcp/server.d.ts +92 -0
  157. package/dist/internal/mcp/server.d.ts.map +1 -0
  158. package/dist/internal/mcp/server.js +251 -0
  159. package/dist/internal/mcp/server.js.map +1 -0
  160. package/dist/internal/mcp/tools.d.ts +91 -0
  161. package/dist/internal/mcp/tools.d.ts.map +1 -0
  162. package/dist/internal/mcp/tools.js +584 -0
  163. package/dist/internal/mcp/tools.js.map +1 -0
  164. package/dist/internal/rules/declare.d.ts +58 -0
  165. package/dist/internal/rules/declare.d.ts.map +1 -0
  166. package/dist/internal/rules/declare.js +152 -0
  167. package/dist/internal/rules/declare.js.map +1 -0
  168. package/dist/internal/rules/engine.d.ts +125 -0
  169. package/dist/internal/rules/engine.d.ts.map +1 -0
  170. package/dist/internal/rules/engine.js +575 -0
  171. package/dist/internal/rules/engine.js.map +1 -0
  172. package/dist/internal/rules/index.d.ts +23 -0
  173. package/dist/internal/rules/index.d.ts.map +1 -0
  174. package/dist/internal/rules/index.js +21 -0
  175. package/dist/internal/rules/index.js.map +1 -0
  176. package/dist/internal/rules/rule.d.ts +88 -0
  177. package/dist/internal/rules/rule.d.ts.map +1 -0
  178. package/dist/internal/rules/rule.js +221 -0
  179. package/dist/internal/rules/rule.js.map +1 -0
  180. package/dist/internal/shape/check.d.ts +118 -0
  181. package/dist/internal/shape/check.d.ts.map +1 -0
  182. package/dist/internal/shape/check.js +331 -0
  183. package/dist/internal/shape/check.js.map +1 -0
  184. package/dist/internal/shape/client.d.ts +31 -0
  185. package/dist/internal/shape/client.d.ts.map +1 -0
  186. package/dist/internal/shape/client.js +170 -0
  187. package/dist/internal/shape/client.js.map +1 -0
  188. package/dist/internal/shape/gate.d.ts +33 -0
  189. package/dist/internal/shape/gate.d.ts.map +1 -0
  190. package/dist/internal/shape/gate.js +0 -0
  191. package/dist/internal/shape/gate.js.map +1 -0
  192. package/dist/internal/shape/index.d.ts +27 -0
  193. package/dist/internal/shape/index.d.ts.map +1 -0
  194. package/dist/internal/shape/index.js +23 -0
  195. package/dist/internal/shape/index.js.map +1 -0
  196. package/dist/internal/shape/suggest.d.ts +82 -0
  197. package/dist/internal/shape/suggest.d.ts.map +1 -0
  198. package/dist/internal/shape/suggest.js +374 -0
  199. package/dist/internal/shape/suggest.js.map +1 -0
  200. package/dist/internal/sync/index.d.ts +22 -0
  201. package/dist/internal/sync/index.d.ts.map +1 -0
  202. package/dist/internal/sync/index.js +21 -0
  203. package/dist/internal/sync/index.js.map +1 -0
  204. package/dist/internal/sync/sync.d.ts +95 -0
  205. package/dist/internal/sync/sync.d.ts.map +1 -0
  206. package/dist/internal/sync/sync.js +342 -0
  207. package/dist/internal/sync/sync.js.map +1 -0
  208. package/dist/internal/view/api.d.ts +196 -0
  209. package/dist/internal/view/api.d.ts.map +1 -0
  210. package/dist/internal/view/api.js +189 -0
  211. package/dist/internal/view/api.js.map +1 -0
  212. package/dist/internal/view/index.d.ts +33 -0
  213. package/dist/internal/view/index.d.ts.map +1 -0
  214. package/dist/internal/view/index.js +30 -0
  215. package/dist/internal/view/index.js.map +1 -0
  216. package/dist/internal/view/main.d.ts +11 -0
  217. package/dist/internal/view/main.d.ts.map +1 -0
  218. package/dist/internal/view/main.js +98 -0
  219. package/dist/internal/view/main.js.map +1 -0
  220. package/dist/internal/view/page.d.ts +14 -0
  221. package/dist/internal/view/page.d.ts.map +1 -0
  222. package/dist/internal/view/page.js +370 -0
  223. package/dist/internal/view/page.js.map +1 -0
  224. package/dist/internal/view/report.d.ts +52 -0
  225. package/dist/internal/view/report.d.ts.map +1 -0
  226. package/dist/internal/view/report.js +367 -0
  227. package/dist/internal/view/report.js.map +1 -0
  228. package/dist/internal/view/scope.d.ts +11 -0
  229. package/dist/internal/view/scope.d.ts.map +1 -0
  230. package/dist/internal/view/scope.js +41 -0
  231. package/dist/internal/view/scope.js.map +1 -0
  232. package/dist/internal/view/server.d.ts +35 -0
  233. package/dist/internal/view/server.d.ts.map +1 -0
  234. package/dist/internal/view/server.js +141 -0
  235. package/dist/internal/view/server.js.map +1 -0
  236. package/dist/src/act.d.ts +3 -0
  237. package/dist/src/act.d.ts.map +1 -0
  238. package/dist/src/act.js +3 -0
  239. package/dist/src/act.js.map +1 -0
  240. package/dist/src/automate.d.ts +3 -0
  241. package/dist/src/automate.d.ts.map +1 -0
  242. package/dist/src/automate.js +3 -0
  243. package/dist/src/automate.js.map +1 -0
  244. package/dist/src/cli.d.ts +24 -17
  245. package/dist/src/cli.d.ts.map +1 -1
  246. package/dist/src/cli.js +416 -109
  247. package/dist/src/cli.js.map +1 -1
  248. package/dist/src/commands.d.ts +104 -0
  249. package/dist/src/commands.d.ts.map +1 -0
  250. package/dist/src/commands.js +33 -0
  251. package/dist/src/commands.js.map +1 -0
  252. package/dist/src/connect.d.ts +3 -0
  253. package/dist/src/connect.d.ts.map +1 -0
  254. package/dist/src/connect.js +3 -0
  255. package/dist/src/connect.js.map +1 -0
  256. package/dist/src/dispatch.d.ts +14 -0
  257. package/dist/src/dispatch.d.ts.map +1 -0
  258. package/dist/src/dispatch.js +116 -0
  259. package/dist/src/dispatch.js.map +1 -0
  260. package/dist/src/doctor.d.ts +45 -0
  261. package/dist/src/doctor.d.ts.map +1 -0
  262. package/dist/src/doctor.js +284 -0
  263. package/dist/src/doctor.js.map +1 -0
  264. package/dist/src/eval.d.ts +3 -0
  265. package/dist/src/eval.d.ts.map +1 -0
  266. package/dist/src/eval.js +3 -0
  267. package/dist/src/eval.js.map +1 -0
  268. package/dist/src/index.d.ts +9 -2
  269. package/dist/src/index.d.ts.map +1 -1
  270. package/dist/src/index.js +6 -2
  271. package/dist/src/index.js.map +1 -1
  272. package/dist/src/ingest.d.ts +3 -0
  273. package/dist/src/ingest.d.ts.map +1 -0
  274. package/dist/src/ingest.js +3 -0
  275. package/dist/src/ingest.js.map +1 -0
  276. package/dist/src/loop.d.ts +3 -0
  277. package/dist/src/loop.d.ts.map +1 -0
  278. package/dist/src/loop.js +3 -0
  279. package/dist/src/loop.js.map +1 -0
  280. package/dist/src/main.d.ts +1 -1
  281. package/dist/src/main.d.ts.map +1 -1
  282. package/dist/src/main.js +3 -75
  283. package/dist/src/main.js.map +1 -1
  284. package/dist/src/mcp.d.ts +3 -0
  285. package/dist/src/mcp.d.ts.map +1 -0
  286. package/dist/src/mcp.js +3 -0
  287. package/dist/src/mcp.js.map +1 -0
  288. package/dist/src/rules.d.ts +3 -0
  289. package/dist/src/rules.d.ts.map +1 -0
  290. package/dist/src/rules.js +3 -0
  291. package/dist/src/rules.js.map +1 -0
  292. package/dist/src/shape.d.ts +3 -0
  293. package/dist/src/shape.d.ts.map +1 -0
  294. package/dist/src/shape.js +3 -0
  295. package/dist/src/shape.js.map +1 -0
  296. package/dist/src/sync.d.ts +3 -0
  297. package/dist/src/sync.d.ts.map +1 -0
  298. package/dist/src/sync.js +3 -0
  299. package/dist/src/sync.js.map +1 -0
  300. package/dist/src/view.d.ts +3 -0
  301. package/dist/src/view.d.ts.map +1 -0
  302. package/dist/src/view.js +3 -0
  303. package/dist/src/view.js.map +1 -0
  304. package/package.json +81 -21
  305. package/src/act.ts +2 -0
  306. package/src/automate.ts +2 -0
  307. package/src/cli.ts +423 -104
  308. package/src/commands.ts +48 -0
  309. package/src/connect.ts +2 -0
  310. package/src/dispatch.ts +141 -0
  311. package/src/doctor.ts +370 -0
  312. package/src/eval.ts +2 -0
  313. package/src/index.ts +9 -2
  314. package/src/ingest.ts +2 -0
  315. package/src/loop.ts +2 -0
  316. package/src/main.ts +3 -66
  317. package/src/mcp.ts +2 -0
  318. package/src/rules.ts +2 -0
  319. package/src/shape.ts +2 -0
  320. package/src/sync.ts +2 -0
  321. package/src/view.ts +2 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `cave eval` entry — argument parsing and report rendering around
3
+ * `run.ts`. See the package README for the fixture layout and agent
4
+ * recipes.
5
+ */
6
+ import type { Report } from './run.ts';
7
+ /** Text rendering of the report. */
8
+ export declare const render: (report: Report) => string;
9
+ /** @returns whether the report clears the `--min` gate. */
10
+ export declare const meetsMin: (report: Report, min: number) => boolean;
11
+ export type RunContext = {
12
+ readonly stdout?: NodeJS.WritableStream;
13
+ readonly stderr?: NodeJS.WritableStream;
14
+ readonly signal?: AbortSignal;
15
+ };
16
+ export declare const runEval: (argv: readonly string[], context?: RunContext) => Promise<number>;
17
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAQ,MAAM,EAAa,MAAM,UAAU,CAAA;AAwHvD,oCAAoC;AACpC,eAAO,MAAM,MAAM,GAAI,QAAQ,MAAM,KAAG,MA+BvC,CAAA;AAED,2DAA2D;AAC3D,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,OAMtD,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,OAAO,GAAU,MAAM,SAAS,MAAM,EAAE,EAAE,UAAS,UAAe,KAAG,OAAO,CAAC,MAAM,CA+E/F,CAAA"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * `cave eval` entry — argument parsing and report rendering around
3
+ * `run.ts`. See the package README for the fixture layout and agent
4
+ * recipes.
5
+ */
6
+ import { parseArgs } from 'node:util';
7
+ import { fixtureCount, run } from "./run.js";
8
+ import { formatSolution } from "./queries.js";
9
+ const usage = `cave eval — golden-fixture extraction, query and reconstruction evals
10
+
11
+ Usage:
12
+ cave eval <suite-dir|golden-file...> --agent '<command>' [options]
13
+
14
+ A case is a golden file plus its source: for family-history.golden.cave
15
+ the source is the single sibling family-history.<ext>; an optional
16
+ family-history.queries.cave holds CAVE-Q patterns with expected bindings,
17
+ and instructions resolve from family-history.instructions.md, the case
18
+ directory's instructions.md, then the suite root's. The agent extracts
19
+ each source into a fresh throwaway store; the result is scored against
20
+ the golden by claim key (actor stamps ignored, spec §9.5) and value, and
21
+ the store must answer the query expectations.
22
+
23
+ A <stem>.loop.cave sibling makes the case a reconstruction (spec §18)
24
+ eval instead: the source is the knowledge, the loop file declares seeds
25
+ ('loop SEEDS <entity>') and optional 'loop HAS query|steps|claims: …',
26
+ and the golden is what the loop should collect. Without --agent the
27
+ deterministic heuristic policy runs — the baseline; with --agent the LLM
28
+ policy asks the agent to pick each expansion (prompt on stdin, reply on
29
+ stdout), and the queries are answered by the reconstruction alone.
30
+
31
+ Options:
32
+ --agent <template> shell command run once per case run (extraction; the
33
+ prompt is piped to stdin and {prompt-file},
34
+ {mcp-config}, {db} are substituted shell-quoted — the
35
+ cave ingest contract) or once per loop step
36
+ (reconstruction); optional when every case is a
37
+ reconstruction
38
+ --judge <template> LLM judge pairing semantically equivalent leftovers
39
+ after strict scoring; prompt on stdin/{prompt-file},
40
+ replies a JSON array of [golden, produced] pairs
41
+ --runs <n> agent runs per case (default 1) — measures variance
42
+ --stdout agent prints CAVE text instead of using MCP tools
43
+ --instructions <md> instructions markdown overriding the suite's own
44
+ --no-embed do not inline source contents into prompts
45
+ --tolerance <t> relative numeric value tolerance, 0..1 or N% (default 0)
46
+ --aliases query expectations resolve through ALIAS closure
47
+ --timeout <seconds> per-run agent timeout (default 600)
48
+ --min <p> exit 1 unless mean F1 (judged when --judge) and the
49
+ query pass rate reach p (0..1 or N%)
50
+ --keep keep the per-run databases and print their directory
51
+ --json emit the full report as JSON
52
+ --no-prelude open throwaway stores without the standard §5.5 registry
53
+
54
+ Exit status: 1 on fixture problems, failed agent runs, or an unmet --min.
55
+
56
+ Examples:
57
+ cave eval suite/ --agent 'claude -p --mcp-config {mcp-config} --allowedTools "mcp__cave__*"'
58
+ cave eval suite/ --stdout --agent 'llm -m your-model' --runs 3
59
+ cave eval suite/family-history.golden.cave --stdout --agent 'cat {prompt-file} | your-agent'
60
+ cave eval suite/ --stdout --agent your-agent --judge 'claude -p' --min 80%
61
+ cave eval loop-suite/ # reconstruction baseline (heuristic)
62
+ cave eval loop-suite/ --agent 'claude -p' --runs 3 # the LLM policy vs that baseline`;
63
+ const percent = (value) => `${Math.round(value * 100)}%`;
64
+ /** Parses `0.85` or `85%` into a ratio in [0, 1]. */
65
+ const parseRatio = (text) => {
66
+ const value = text.endsWith('%') ? Number(text.slice(0, -1)) / 100 : Number(text);
67
+ return Number.isFinite(value) && value >= 0 && value <= 1 ? value : undefined;
68
+ };
69
+ const listCap = 10;
70
+ const renderList = (label, lines) => [
71
+ ...lines.slice(0, listCap).map(line => ` ${label}: ${line}`),
72
+ ...lines.length > listCap ? [` ${label}: … and ${lines.length - listCap} more`] : []
73
+ ];
74
+ const renderQuery = (outcome) => {
75
+ if (outcome.pass) {
76
+ return [];
77
+ }
78
+ const head = outcome.pattern.split('\n')[0];
79
+ if (outcome.error !== undefined) {
80
+ return [` query failed: ${head} — ${outcome.error}`];
81
+ }
82
+ return [
83
+ ` query failed: ${head}`,
84
+ ...outcome.missing.map(solution => ` missing ${formatSolution(solution)}`),
85
+ ...outcome.unexpected.map(record => ` unexpected ${formatSolution(record)}`)
86
+ ];
87
+ };
88
+ const renderScore = (run_) => {
89
+ const judged = run_.judgedF1 === undefined ? '' : `, judged F1 ${percent(run_.judgedF1)}`;
90
+ return `P ${percent(run_.precision)} R ${percent(run_.recall)} F1 ${percent(run_.f1)}${judged}`;
91
+ };
92
+ const renderRun = (run_, runNo, total, queryCount) => {
93
+ const head = ` run ${runNo}/${total}: `;
94
+ if (!run_.ok) {
95
+ return [`${head}FAILED${run_.note === undefined ? '' : ` — ${run_.note}`}`];
96
+ }
97
+ const counts = `${run_.produced} claim(s) — ${run_.matched} matched` +
98
+ (run_.judged > 0 ? ` (+${run_.judged} judged)` : '') +
99
+ (run_.valueOff > 0 ? `, ${run_.valueOff} value-off` : '');
100
+ const queries = queryCount === 0 ? '' : `; queries ${run_.queriesPassed}/${queryCount}`;
101
+ return [
102
+ `${head}${counts}; ${renderScore(run_)}${queries}`,
103
+ ...run_.problems.map(problem => ` problem: ${problem}`),
104
+ ...run_.judgeError === undefined ? [] : [` judge: ${run_.judgeError}`],
105
+ ...renderList('miss', run_.misses),
106
+ ...renderList('extra', run_.extras),
107
+ ...run_.queries.flatMap(renderQuery)
108
+ ];
109
+ };
110
+ const renderMean = (mean) => {
111
+ const judged = mean.judgedF1 === undefined ? '' : `, judged F1 ${percent(mean.judgedF1)}`;
112
+ const queries = mean.queryRate === undefined ? '' : `; queries ${percent(mean.queryRate)}`;
113
+ return `P ${percent(mean.precision)} R ${percent(mean.recall)} F1 ${percent(mean.f1)}${judged}${queries}`;
114
+ };
115
+ /** Text rendering of the report. */
116
+ export const render = (report) => {
117
+ const lines = [
118
+ `eval: ${report.cases.length} case(s), ${report.runs} run(s) each`,
119
+ ...report.fixture.map(problem => `fixture: ${problem}`)
120
+ ];
121
+ for (const kase of report.cases) {
122
+ if (kase.fixture.length > 0) {
123
+ lines.push(`${kase.name}: fixture problem(s) — skipped`);
124
+ lines.push(...kase.fixture.map(problem => ` ${problem}`));
125
+ continue;
126
+ }
127
+ const queries = kase.queryCount === 0 ? '' : `, ${kase.queryCount} query(ies)`;
128
+ const source = kase.kind === 'loop' ? `reconstruction over ${kase.source}` : `source ${kase.source}`;
129
+ lines.push(`${kase.name}: ${kase.golden} golden claim(s)${queries}, ${source}`);
130
+ kase.runs.forEach((run_, index) => {
131
+ lines.push(...renderRun(run_, index + 1, kase.runs.length, kase.queryCount));
132
+ });
133
+ if (kase.mean !== undefined && kase.runs.length > 1) {
134
+ lines.push(` case mean (${kase.runs.filter(run_ => run_.ok).length} ok run(s)): ${renderMean(kase.mean)}`);
135
+ }
136
+ }
137
+ const failed = report.failedRuns > 0 ? `; ${report.failedRuns} failed run(s)` : '';
138
+ const problems = fixtureCount(report);
139
+ const fixture = problems > 0 ? `; ${problems} fixture problem(s)` : '';
140
+ lines.push(report.mean === undefined ?
141
+ `suite: no scored runs${failed}${fixture}` :
142
+ `suite: ${renderMean(report.mean)}${failed}${fixture}`);
143
+ if (report.root !== undefined) {
144
+ lines.push(`kept run databases: ${report.root}`);
145
+ }
146
+ return `${lines.join('\n')}\n`;
147
+ };
148
+ /** @returns whether the report clears the `--min` gate. */
149
+ export const meetsMin = (report, min) => {
150
+ if (report.mean === undefined) {
151
+ return false;
152
+ }
153
+ const f1 = report.mean.judgedF1 ?? report.mean.f1;
154
+ return f1 >= min && (report.mean.queryRate === undefined || report.mean.queryRate >= min);
155
+ };
156
+ export const runEval = async (argv, context = {}) => {
157
+ const stdout = context.stdout ?? process.stdout;
158
+ const stderr = context.stderr ?? process.stderr;
159
+ context.signal?.throwIfAborted();
160
+ const { values, positionals } = parseArgs({
161
+ args: [...argv],
162
+ options: {
163
+ agent: { type: 'string' },
164
+ judge: { type: 'string' },
165
+ runs: { type: 'string' },
166
+ stdout: { type: 'boolean' },
167
+ instructions: { type: 'string' },
168
+ 'no-embed': { type: 'boolean' },
169
+ tolerance: { type: 'string' },
170
+ aliases: { type: 'boolean' },
171
+ timeout: { type: 'string' },
172
+ min: { type: 'string' },
173
+ keep: { type: 'boolean' },
174
+ json: { type: 'boolean' },
175
+ 'no-prelude': { type: 'boolean' },
176
+ help: { type: 'boolean', short: 'h' }
177
+ },
178
+ allowPositionals: true
179
+ });
180
+ if (values.help === true) {
181
+ stdout.write(`${usage}\n`);
182
+ return 0;
183
+ }
184
+ if (positionals.length === 0) {
185
+ stderr.write(`cave eval: suite directories (or golden files) are required\n\n${usage}\n`);
186
+ return 1;
187
+ }
188
+ const runs = values.runs === undefined ? undefined : Number(values.runs);
189
+ if (runs !== undefined && (!Number.isInteger(runs) || runs < 1)) {
190
+ stderr.write(`cave eval: --runs must be a positive integer, got '${values.runs}'\n`);
191
+ return 1;
192
+ }
193
+ const tolerance = values.tolerance === undefined ? undefined : parseRatio(values.tolerance);
194
+ if (values.tolerance !== undefined && tolerance === undefined) {
195
+ stderr.write(`cave eval: --tolerance expects 0..1 or N%, got '${values.tolerance}'\n`);
196
+ return 1;
197
+ }
198
+ const min = values.min === undefined ? undefined : parseRatio(values.min);
199
+ if (values.min !== undefined && min === undefined) {
200
+ stderr.write(`cave eval: --min expects 0..1 or N%, got '${values.min}'\n`);
201
+ return 1;
202
+ }
203
+ const timeoutSeconds = values.timeout === undefined ? undefined : Number(values.timeout);
204
+ if (timeoutSeconds !== undefined && (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0)) {
205
+ stderr.write(`cave eval: --timeout must be a positive number of seconds, got '${values.timeout}'\n`);
206
+ return 1;
207
+ }
208
+ const mode = values.stdout === true ? 'stdout' : 'mcp';
209
+ const report = await run({
210
+ suites: positionals,
211
+ ...values.agent === undefined ? {} : { agent: values.agent },
212
+ mode,
213
+ embed: values['no-embed'] !== true,
214
+ aliases: values.aliases === true,
215
+ noPrelude: values['no-prelude'] === true,
216
+ keep: values.keep === true,
217
+ ...values.judge === undefined ? {} : { judge: values.judge },
218
+ ...runs === undefined ? {} : { runs },
219
+ ...values.instructions === undefined ? {} : { instructions: values.instructions },
220
+ ...tolerance === undefined ? {} : { tolerance },
221
+ ...timeoutSeconds === undefined ? {} : { timeoutSeconds }
222
+ });
223
+ context.signal?.throwIfAborted();
224
+ stdout.write(values.json === true ? `${JSON.stringify(report, undefined, 2)}\n` : render(report));
225
+ if (fixtureCount(report) > 0 || report.failedRuns > 0) {
226
+ return 1;
227
+ }
228
+ if (min !== undefined && !meetsMin(report, min)) {
229
+ if (values.json !== true) {
230
+ stderr.write(`cave eval: below --min ${values.min}\n`);
231
+ }
232
+ return 1;
233
+ }
234
+ return 0;
235
+ };
236
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Query expectations — behavioral checks over the extracted store
3
+ * used by extraction and reconstruction evals.
4
+ *
5
+ * A queries file holds CAVE-Q patterns, each followed by indented
6
+ * expectation lines written exactly as `cave query` prints solutions:
7
+ *
8
+ * ```cave
9
+ * ; ancestors nobody wrote down — the extraction must support the hops
10
+ * ?a PARENT-OF+ me
11
+ * ?a = anna
12
+ * ?a = maria
13
+ * jan HAS birth-year: ?y
14
+ * WHERE conf >= 0.6
15
+ * ?y = 1932
16
+ * jan HAS birthplace: Kraków ; no expectations = the pattern must hold
17
+ * me PARENT-OF ?child
18
+ * none ; the pattern must have no matches
19
+ * ```
20
+ *
21
+ * - `WHERE …` lines extend the pattern (spec §12.2).
22
+ * - `?var = value` lines are the expected solutions — compared as a set
23
+ * of distinct binding records, order-insensitive, and *exact*: missing
24
+ * solutions fail, unexpected ones fail too (an invented ancestor is as
25
+ * wrong as a lost one).
26
+ * - `none` expects zero matches; no expectation lines expect at least one.
27
+ *
28
+ * Blank lines and full-line `;` comments are skipped; inline comments are
29
+ * accepted on patterns and expectations. Because claim-key scoring is exact
30
+ * about naming, these checks are where an eval asserts
31
+ * *usefulness* — that multi-hop questions the source only implies come
32
+ * back right — independent of how the golden spelled each claim.
33
+ */
34
+ import type { Store } from '@cavelang/store';
35
+ export type Expect = {
36
+ readonly kind: 'some';
37
+ } | {
38
+ readonly kind: 'none';
39
+ } | {
40
+ readonly kind: 'solutions';
41
+ readonly solutions: readonly Readonly<Record<string, string>>[];
42
+ };
43
+ export type Query = {
44
+ /** Pattern text, `WHERE` filter lines included. */
45
+ readonly pattern: string;
46
+ readonly expect: Expect;
47
+ /** 1-based line of the pattern in the queries file. */
48
+ readonly line: number;
49
+ };
50
+ export type Parsed = {
51
+ readonly queries: readonly Query[];
52
+ readonly problems: readonly string[];
53
+ };
54
+ /** Parses a queries file. */
55
+ export declare const parseQueries: (text: string) => Parsed;
56
+ export type Outcome = {
57
+ readonly pattern: string;
58
+ readonly pass: boolean;
59
+ /** Distinct solutions the store answered. */
60
+ readonly matches: number;
61
+ /** Expected solutions the store did not answer. */
62
+ readonly missing: readonly Readonly<Record<string, string>>[];
63
+ /** Answered solutions the expectations exclude (`solutions` and `none` kinds). */
64
+ readonly unexpected: readonly Readonly<Record<string, string>>[];
65
+ /** Pattern compilation error, when the query could not run. */
66
+ readonly error?: string;
67
+ };
68
+ /** Runs one query against the store and checks its expectation. */
69
+ export declare const checkQuery: (store: Store, q: Query, options?: {
70
+ aliases?: boolean;
71
+ }) => Outcome;
72
+ /** @returns one solution rendered the way `cave query` prints it. */
73
+ export declare const formatSolution: (record: Readonly<Record<string, string>>) => string;
74
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAA;CAAE,CAAA;AAEnG,MAAM,MAAM,KAAK,GAAG;IAClB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC,CAAA;AAsBD,6BAA6B;AAC7B,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MA8D3C,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAA;IAC7D,kFAAkF;IAClF,QAAQ,CAAC,UAAU,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAA;IAChE,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAKD,mEAAmE;AACnE,eAAO,MAAM,UAAU,GACrB,OAAO,KAAK,EACZ,GAAG,KAAK,EACR,UAAS;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,KAClC,OAqCF,CAAA;AAED,qEAAqE;AACrE,eAAO,MAAM,cAAc,GAAI,QAAQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAG,MAGzE,CAAA"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Query expectations — behavioral checks over the extracted store
3
+ * used by extraction and reconstruction evals.
4
+ *
5
+ * A queries file holds CAVE-Q patterns, each followed by indented
6
+ * expectation lines written exactly as `cave query` prints solutions:
7
+ *
8
+ * ```cave
9
+ * ; ancestors nobody wrote down — the extraction must support the hops
10
+ * ?a PARENT-OF+ me
11
+ * ?a = anna
12
+ * ?a = maria
13
+ * jan HAS birth-year: ?y
14
+ * WHERE conf >= 0.6
15
+ * ?y = 1932
16
+ * jan HAS birthplace: Kraków ; no expectations = the pattern must hold
17
+ * me PARENT-OF ?child
18
+ * none ; the pattern must have no matches
19
+ * ```
20
+ *
21
+ * - `WHERE …` lines extend the pattern (spec §12.2).
22
+ * - `?var = value` lines are the expected solutions — compared as a set
23
+ * of distinct binding records, order-insensitive, and *exact*: missing
24
+ * solutions fail, unexpected ones fail too (an invented ancestor is as
25
+ * wrong as a lost one).
26
+ * - `none` expects zero matches; no expectation lines expect at least one.
27
+ *
28
+ * Blank lines and full-line `;` comments are skipped; inline comments are
29
+ * accepted on patterns and expectations. Because claim-key scoring is exact
30
+ * about naming, these checks are where an eval asserts
31
+ * *usefulness* — that multi-hop questions the source only implies come
32
+ * back right — independent of how the golden spelled each claim.
33
+ */
34
+ import { Token } from '@cavelang/parser';
35
+ import { query } from '@cavelang/query';
36
+ const bindingRe = /\?([^\s=]+)\s*=\s*/g;
37
+ /** @returns the solution record of one `?var = value` line, or `undefined`. */
38
+ const parseSolution = (text) => {
39
+ const found = [...text.matchAll(bindingRe)];
40
+ if (found.length === 0 || found[0].index !== 0) {
41
+ return undefined;
42
+ }
43
+ const solution = {};
44
+ for (const [at, match] of found.entries()) {
45
+ const next = found[at + 1];
46
+ const value = text.slice(match.index + match[0].length, next?.index).trim();
47
+ if (value === '') {
48
+ return undefined;
49
+ }
50
+ solution[match[1]] = value;
51
+ }
52
+ return solution;
53
+ };
54
+ /** Parses a queries file. */
55
+ export const parseQueries = (text) => {
56
+ const queries = [];
57
+ const problems = [];
58
+ let current;
59
+ const flush = () => {
60
+ if (current === undefined) {
61
+ return;
62
+ }
63
+ const expect = current.none ? { kind: 'none' } :
64
+ current.solutions.length > 0 ? { kind: 'solutions', solutions: current.solutions } :
65
+ { kind: 'some' };
66
+ queries.push({ pattern: current.pattern.join('\n'), expect, line: current.line });
67
+ current = undefined;
68
+ };
69
+ text.split('\n').forEach((raw, index) => {
70
+ const line = index + 1;
71
+ const trimmed = raw.trim();
72
+ if (trimmed === '' || trimmed.startsWith(';')) {
73
+ return;
74
+ }
75
+ if (trimmed.startsWith('WHERE ')) {
76
+ if (current === undefined) {
77
+ problems.push(`queries line ${line}: WHERE without a pattern`);
78
+ return;
79
+ }
80
+ current.pattern.push(trimmed);
81
+ return;
82
+ }
83
+ if (!/^\s/.test(raw)) {
84
+ flush();
85
+ current = { pattern: [trimmed], line, none: false, solutions: [] };
86
+ return;
87
+ }
88
+ if (current === undefined) {
89
+ problems.push(`queries line ${line}: expectation without a pattern`);
90
+ return;
91
+ }
92
+ const expectation = Token.splitComment(trimmed).head.trim();
93
+ if (expectation === 'none') {
94
+ if (current.none || current.solutions.length > 0) {
95
+ problems.push(`queries line ${line}: 'none' conflicts with other expectations`);
96
+ return;
97
+ }
98
+ current.none = true;
99
+ return;
100
+ }
101
+ const solution = parseSolution(expectation);
102
+ if (solution === undefined) {
103
+ problems.push(`queries line ${line}: expected '?var = value' bindings or 'none', got ${JSON.stringify(trimmed)}`);
104
+ return;
105
+ }
106
+ if (current.none) {
107
+ problems.push(`queries line ${line}: 'none' conflicts with other expectations`);
108
+ return;
109
+ }
110
+ current.solutions.push(solution);
111
+ });
112
+ flush();
113
+ return { queries, problems };
114
+ };
115
+ const recordKey = (record) => JSON.stringify(Object.entries(record).sort(([a], [b]) => a.localeCompare(b)));
116
+ /** Runs one query against the store and checks its expectation. */
117
+ export const checkQuery = (store, q, options = {}) => {
118
+ let records;
119
+ try {
120
+ const seen = new Map();
121
+ for (const match of query(store, q.pattern, { aliases: options.aliases === true })) {
122
+ seen.set(recordKey(match.bindings), match.bindings);
123
+ }
124
+ records = [...seen.values()];
125
+ }
126
+ catch (error) {
127
+ return {
128
+ pattern: q.pattern,
129
+ pass: false,
130
+ matches: 0,
131
+ missing: [],
132
+ unexpected: [],
133
+ error: error instanceof Error ? error.message : String(error)
134
+ };
135
+ }
136
+ switch (q.expect.kind) {
137
+ case 'some':
138
+ return { pattern: q.pattern, pass: records.length > 0, matches: records.length, missing: [], unexpected: [] };
139
+ case 'none':
140
+ return { pattern: q.pattern, pass: records.length === 0, matches: records.length, missing: [], unexpected: records };
141
+ case 'solutions': {
142
+ const expected = new Map(q.expect.solutions.map(solution => [recordKey(solution), solution]));
143
+ const actual = new Map(records.map(record => [recordKey(record), record]));
144
+ const missing = [...expected].filter(([key]) => !actual.has(key)).map(([, solution]) => solution);
145
+ const unexpected = [...actual].filter(([key]) => !expected.has(key)).map(([, record]) => record);
146
+ return {
147
+ pattern: q.pattern,
148
+ pass: missing.length === 0 && unexpected.length === 0,
149
+ matches: records.length,
150
+ missing,
151
+ unexpected
152
+ };
153
+ }
154
+ }
155
+ };
156
+ /** @returns one solution rendered the way `cave query` prints it. */
157
+ export const formatSolution = (record) => {
158
+ const entries = Object.entries(record);
159
+ return entries.length === 0 ? '(match)' : entries.map(([name, value]) => `?${name} = ${value}`).join(' ');
160
+ };
161
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAqBvC,MAAM,SAAS,GAAG,qBAAqB,CAAA;AAEvC,+EAA+E;AAC/E,MAAM,aAAa,GAAG,CAAC,IAAY,EAAsC,EAAE;IACzE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,QAAQ,GAA2B,EAAE,CAAA;IAC3C,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3E,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACjB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAA;IAC7B,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,6BAA6B;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IACnD,MAAM,OAAO,GAAY,EAAE,CAAA;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,OAA4G,CAAA;IAEhH,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAM;QACR,CAAC;QACD,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;gBACpF,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QAClB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QACjF,OAAO,GAAG,SAAS,CAAA;IACrB,CAAC,CAAA;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAA;QACtB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QAC1B,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,2BAA2B,CAAC,CAAA;gBAC9D,OAAM;YACR,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC7B,OAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,EAAE,CAAA;YACP,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;YAClE,OAAM;QACR,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,iCAAiC,CAAC,CAAA;YACpE,OAAM;QACR,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3D,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,4CAA4C,CAAC,CAAA;gBAC/E,OAAM;YACR,CAAC;YACD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;YACnB,OAAM;QACR,CAAC;QACD,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,qDAAqD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACjH,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,4CAA4C,CAAC,CAAA;YAC/E,OAAM;QACR,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IACF,KAAK,EAAE,CAAA;IACP,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AAC9B,CAAC,CAAA;AAeD,MAAM,SAAS,GAAG,CAAC,MAAwC,EAAU,EAAE,CACrE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE/E,mEAAmE;AACnE,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,KAAY,EACZ,CAAQ,EACR,UAAiC,EAAE,EAC1B,EAAE;IACX,IAAI,OAA2C,CAAA;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4C,CAAA;QAChE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YACnF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;QACrD,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAA;IACH,CAAC;IACD,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;QAC/G,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;QACtH,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC7F,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;YAC1E,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;YACjG,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;YAChG,OAAO;gBACL,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBACrD,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,OAAO;gBACP,UAAU;aACX,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAwC,EAAU,EAAE;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC5G,CAAC,CAAA"}