@cavelang/cli 0.27.14 → 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 +408 -107
  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 +416 -102
  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,143 @@
1
+ /**
2
+ * The extraction, query, and reconstruction eval orchestrator.
3
+ *
4
+ * For every case, N times: open a fresh throwaway store, drive the agent
5
+ * over the case's source through `@cavelang/cli/ingest` (same prompts, same
6
+ * mcp/stdout protocols, same shell/function agent contract as
7
+ * `cave ingest`), then score what landed against the golden and run the
8
+ * case's query expectations. Fresh stores keep runs independent — no
9
+ * digest skipping, no cross-case naming leakage — and make N runs measure
10
+ * extraction *variance*, not accumulation.
11
+ *
12
+ * Reconstruction cases (a `<stem>.loop.cave` sibling, spec §18)
13
+ * run the §18 loop instead: build an in-memory graph from the source
14
+ * knowledge, reconstruct from the declared seeds — the deterministic
15
+ * heuristic without an agent (the baseline), `llmPolicy` over the agent
16
+ * template otherwise — then score the collected claims against the golden
17
+ * and run the queries against *the reconstruction*, not the knowledge.
18
+ *
19
+ * Before any agent money is spent, each fixture is self-checked: the
20
+ * golden must parse cleanly, contain claims, and satisfy its own queries
21
+ * in a scratch store; loop fixtures additionally need seeds that appear
22
+ * in the knowledge and a golden the knowledge can actually yield. A
23
+ * fixture that fails is reported and skipped — a broken ruler measures
24
+ * nothing.
25
+ *
26
+ * Agent runs that fail (non-zero exit, timeout, thrown function) score
27
+ * nothing and are excluded from means; they surface in `failed` instead.
28
+ */
29
+ import * as Ingest from '@cavelang/cli/ingest';
30
+ import type { Store } from '@cavelang/store';
31
+ import * as Queries from './queries.ts';
32
+ /**
33
+ * Extraction agent: a shell template (the `cave ingest` contract —
34
+ * prompt on stdin, `{prompt-file}`/`{mcp-config}`/`{db}` substituted) or
35
+ * a function. Functions additionally receive the run's throwaway store,
36
+ * so SDK scripts can write to it directly in `mcp` mode. Reconstruction
37
+ * cases reuse the same agent as the loop policy's completion function —
38
+ * prompt on stdin (and `{prompt-file}`), the reply on stdout.
39
+ */
40
+ export type Agent = string | ((prompt: string, files: readonly string[], context: {
41
+ db: string;
42
+ store: Store;
43
+ }) => Promise<string>);
44
+ /** Judge agent: shell template (prompt on stdin, `{prompt-file}`) or function. */
45
+ export type Judge = string | ((prompt: string) => Promise<string>);
46
+ export type Options = {
47
+ /** Suite directories (searched for `*.golden.cave`) or single golden files. */
48
+ readonly suites: readonly string[];
49
+ /**
50
+ * Optional only for suites of reconstruction cases, which fall back to
51
+ * the heuristic baseline; extraction cases without an agent fail.
52
+ */
53
+ readonly agent?: Agent;
54
+ /** Optional judge upgrading strict misses to semantic matches. */
55
+ readonly judge?: Judge;
56
+ /** Agent runs per case (default 1). */
57
+ readonly runs?: number;
58
+ /** Agent protocol, as in `cave ingest` (default `mcp`). */
59
+ readonly mode?: Ingest.Mode;
60
+ /** Inline source contents into prompts (default `true` — fixtures are self-contained). */
61
+ readonly embed?: boolean;
62
+ /** Instructions markdown overriding the per-case/per-suite resolution. */
63
+ readonly instructions?: string;
64
+ /** Relative numeric value tolerance in [0, 1] (default 0 — exact). */
65
+ readonly tolerance?: number;
66
+ /** Resolve query expectations through the alias closure (spec §13.6). */
67
+ readonly aliases?: boolean;
68
+ readonly timeoutSeconds?: number;
69
+ /** Open throwaway stores without the standard §5.5 registry. */
70
+ readonly noPrelude?: boolean;
71
+ /** Keep the per-run databases (reported as `root`) instead of deleting them. */
72
+ readonly keep?: boolean;
73
+ readonly cwd?: string;
74
+ };
75
+ /** One agent run of one case. */
76
+ export type RunReport = {
77
+ readonly ok: boolean;
78
+ /** Failure note or the agent's final line. */
79
+ readonly note?: string;
80
+ /** Ingest problems (stdout-mode lint) — the run still scores. */
81
+ readonly problems: readonly string[];
82
+ readonly golden: number;
83
+ readonly produced: number;
84
+ readonly matched: number;
85
+ readonly valueOff: number;
86
+ /** Judge-paired misses (0 without a judge). */
87
+ readonly judged: number;
88
+ readonly judgeError?: string;
89
+ /** Canonical lines of unmatched golden claims (judged pairs excluded). */
90
+ readonly misses: readonly string[];
91
+ /** Canonical lines of unmatched produced claims (judged pairs excluded). */
92
+ readonly extras: readonly string[];
93
+ readonly precision: number;
94
+ readonly recall: number;
95
+ readonly f1: number;
96
+ readonly judgedPrecision?: number;
97
+ readonly judgedRecall?: number;
98
+ readonly judgedF1?: number;
99
+ readonly queries: readonly Queries.Outcome[];
100
+ readonly queriesPassed: number;
101
+ /** The run's database, when `keep` is set. */
102
+ readonly db?: string;
103
+ };
104
+ export type Mean = {
105
+ readonly precision: number;
106
+ readonly recall: number;
107
+ readonly f1: number;
108
+ readonly judgedF1?: number;
109
+ /** Query expectations passed / checked, over ok runs — absent without queries. */
110
+ readonly queryRate?: number;
111
+ };
112
+ export type CaseReport = {
113
+ readonly name: string;
114
+ /** What the case evals: agent extraction, or §18 reconstruction (item 10). */
115
+ readonly kind: 'extraction' | 'loop';
116
+ /** Source file name, for the report. */
117
+ readonly source: string;
118
+ /** Fixture problems; a non-empty list means the case ran nothing. */
119
+ readonly fixture: readonly string[];
120
+ readonly golden: number;
121
+ readonly queryCount: number;
122
+ readonly runs: readonly RunReport[];
123
+ /** Means over this case's ok runs — absent when none succeeded. */
124
+ readonly mean?: Mean;
125
+ };
126
+ export type Report = {
127
+ readonly cases: readonly CaseReport[];
128
+ /** Requested runs per case. */
129
+ readonly runs: number;
130
+ readonly okRuns: number;
131
+ readonly failedRuns: number;
132
+ /** Suite-level discovery problems — goldens that never became cases; per-case problems live on their `CaseReport`. */
133
+ readonly fixture: readonly string[];
134
+ /** Means over all ok runs of all cases — absent when none succeeded. */
135
+ readonly mean?: Mean;
136
+ /** Directory holding the per-run databases, when `keep` is set. */
137
+ readonly root?: string;
138
+ };
139
+ /** Runs the full eval. */
140
+ export declare const run: (options: Options) => Promise<Report>;
141
+ /** @returns the total fixture problems — suite discovery plus per-case. */
142
+ export declare const fixtureCount: (report: Report) => number;
143
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,376 @@
1
+ /**
2
+ * The extraction, query, and reconstruction eval orchestrator.
3
+ *
4
+ * For every case, N times: open a fresh throwaway store, drive the agent
5
+ * over the case's source through `@cavelang/cli/ingest` (same prompts, same
6
+ * mcp/stdout protocols, same shell/function agent contract as
7
+ * `cave ingest`), then score what landed against the golden and run the
8
+ * case's query expectations. Fresh stores keep runs independent — no
9
+ * digest skipping, no cross-case naming leakage — and make N runs measure
10
+ * extraction *variance*, not accumulation.
11
+ *
12
+ * Reconstruction cases (a `<stem>.loop.cave` sibling, spec §18)
13
+ * run the §18 loop instead: build an in-memory graph from the source
14
+ * knowledge, reconstruct from the declared seeds — the deterministic
15
+ * heuristic without an agent (the baseline), `llmPolicy` over the agent
16
+ * template otherwise — then score the collected claims against the golden
17
+ * and run the queries against *the reconstruction*, not the knowledge.
18
+ *
19
+ * Before any agent money is spent, each fixture is self-checked: the
20
+ * golden must parse cleanly, contain claims, and satisfy its own queries
21
+ * in a scratch store; loop fixtures additionally need seeds that appear
22
+ * in the knowledge and a golden the knowledge can actually yield. A
23
+ * fixture that fails is reported and skipped — a broken ruler measures
24
+ * nothing.
25
+ *
26
+ * Agent runs that fail (non-zero exit, timeout, thrown function) score
27
+ * nothing and are excluded from means; they surface in `failed` instead.
28
+ */
29
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
30
+ import { tmpdir } from 'node:os';
31
+ import { basename, dirname, join } from 'node:path';
32
+ import { Registry, canonicalizeText, emitClaim, standardRegistry } from '@cavelang/canonical';
33
+ import * as Ingest from '@cavelang/cli/ingest';
34
+ import { memoryStoreOfText } from '@cavelang/cli/loop';
35
+ import { open } from '@cavelang/store';
36
+ import * as Suite from "./suite.js";
37
+ import * as Score from "./score.js";
38
+ import * as Queries from "./queries.js";
39
+ import * as Loop from "./loop.js";
40
+ import { judgePrompt, parsePairs } from "./judge.js";
41
+ const readText = (path) => readFileSync(path, 'utf8');
42
+ const mean = (values) => values.length === 0 ? 0 : values.reduce((sum, value) => sum + value, 0) / values.length;
43
+ const meanOf = (runs, judged) => {
44
+ const ok = runs.filter(run => run.ok);
45
+ if (ok.length === 0) {
46
+ return undefined;
47
+ }
48
+ const checked = ok.reduce((sum, run) => sum + run.queries.length, 0);
49
+ return {
50
+ precision: mean(ok.map(run => run.precision)),
51
+ recall: mean(ok.map(run => run.recall)),
52
+ f1: mean(ok.map(run => run.f1)),
53
+ ...judged ? { judgedF1: mean(ok.map(run => run.judgedF1 ?? run.f1)) } : {},
54
+ ...checked > 0 ? { queryRate: ok.reduce((sum, run) => sum + run.queriesPassed, 0) / checked } : {}
55
+ };
56
+ };
57
+ /**
58
+ * Loop-fixture checks beyond the golden's own: the knowledge must parse
59
+ * and have claims, the spec must validate, every seed must appear in the
60
+ * knowledge, and every golden claim must exist in the knowledge — the
61
+ * loop selects claims, it cannot invent them, so an unreachable golden
62
+ * measures the fixture, not the policy.
63
+ */
64
+ const loopFixtureOf = (kase, facts, registry) => {
65
+ const problems = [];
66
+ const knowledge = readText(kase.source);
67
+ const parsed = canonicalizeText(knowledge, registry);
68
+ problems.push(...parsed.problems.map(problem => `knowledge line ${problem.line}: ${problem.message}`));
69
+ if (parsed.claims.length === 0) {
70
+ problems.push('knowledge has no claims');
71
+ }
72
+ const { spec, problems: specProblems } = Loop.parseSpec(readText(kase.loop), registry);
73
+ problems.push(...specProblems);
74
+ if (problems.length === 0) {
75
+ const graph = memoryStoreOfText(knowledge, registry);
76
+ for (const seed of spec.seeds) {
77
+ if (graph.claimsAbout(seed).length === 0) {
78
+ problems.push(`seed '${seed}' does not appear in the knowledge`);
79
+ }
80
+ }
81
+ const known = Score.factsOf(parsed.claims.map(entry => entry.claim));
82
+ const unreachable = Score.compare(facts, known);
83
+ problems.push(...unreachable.misses.map(fact => `golden claim not in the knowledge: ${Score.lineOf(fact)}`));
84
+ }
85
+ return { problems, loop: { spec, knowledge } };
86
+ };
87
+ /** Self-checks one fixture; returns its problems and parsed pieces. */
88
+ const fixtureOf = (kase, registry, aliases) => {
89
+ const problems = [];
90
+ const goldenText = readText(kase.golden);
91
+ const { facts, problems: goldenProblems } = Score.goldenFacts(goldenText, registry);
92
+ problems.push(...goldenProblems);
93
+ if (facts.length === 0) {
94
+ problems.push('golden has no claims');
95
+ }
96
+ let loop;
97
+ if (kase.loop !== undefined) {
98
+ const checked = loopFixtureOf({ ...kase, loop: kase.loop }, facts, registry);
99
+ problems.push(...checked.problems);
100
+ loop = checked.loop;
101
+ }
102
+ let queries = [];
103
+ if (kase.queries !== undefined) {
104
+ const parsed = Queries.parseQueries(readText(kase.queries));
105
+ problems.push(...parsed.problems);
106
+ queries = parsed.queries;
107
+ }
108
+ if (problems.length === 0 && queries.length > 0) {
109
+ // The golden itself must satisfy the queries — otherwise the
110
+ // expectations measure the fixture, not the agent.
111
+ const scratch = open(':memory:', { registry });
112
+ try {
113
+ scratch.ingest(goldenText);
114
+ for (const q of queries) {
115
+ const outcome = Queries.checkQuery(scratch, q, { aliases });
116
+ if (!outcome.pass) {
117
+ const detail = outcome.error ??
118
+ [
119
+ ...outcome.missing.map(solution => `missing ${Queries.formatSolution(solution)}`),
120
+ ...outcome.unexpected.map(record => `unexpected ${Queries.formatSolution(record)}`)
121
+ ].join(', ');
122
+ problems.push(`queries line ${q.line}: the golden does not satisfy '${q.pattern.split('\n')[0]}' (${detail})`);
123
+ }
124
+ }
125
+ }
126
+ finally {
127
+ scratch.close();
128
+ }
129
+ }
130
+ return { problems, facts, queries, ...loop === undefined ? {} : { loop } };
131
+ };
132
+ const runJudge = async (judge, comparison, timeoutSeconds, cwd) => {
133
+ if (comparison.misses.length === 0 || comparison.extras.length === 0) {
134
+ return { pairs: [] };
135
+ }
136
+ const prompt = judgePrompt(comparison.misses, comparison.extras);
137
+ let output;
138
+ if (typeof judge === 'function') {
139
+ try {
140
+ output = await judge(prompt);
141
+ }
142
+ catch (error) {
143
+ return { pairs: [], error: error instanceof Error ? error.message : String(error) };
144
+ }
145
+ }
146
+ else {
147
+ const promptDir = mkdtempSync(join(tmpdir(), 'cave-judge-'));
148
+ try {
149
+ const promptFile = join(promptDir, 'judge.md');
150
+ writeFileSync(promptFile, prompt);
151
+ const result = await Ingest.runShellAgent(judge, prompt, { 'prompt-file': promptFile }, timeoutSeconds, cwd);
152
+ if (result.code !== 0) {
153
+ return { pairs: [], error: result.error ?? `judge exited with ${result.code}` };
154
+ }
155
+ output = result.stdout;
156
+ }
157
+ finally {
158
+ rmSync(promptDir, { recursive: true, force: true });
159
+ }
160
+ }
161
+ return { pairs: parsePairs(output, comparison.misses.length, comparison.extras.length) };
162
+ };
163
+ /** Runs the full eval. */
164
+ export const run = async (options) => {
165
+ const cwd = options.cwd ?? process.cwd();
166
+ const runs = options.runs ?? 1;
167
+ const mode = options.mode ?? 'mcp';
168
+ const timeoutSeconds = options.timeoutSeconds ?? 600;
169
+ const registry = options.noPrelude === true ? Registry.empty : standardRegistry;
170
+ const suite = Suite.discover(options.suites, {
171
+ cwd,
172
+ ...options.instructions === undefined ? {} : { instructions: options.instructions }
173
+ });
174
+ const root = mkdtempSync(join(tmpdir(), 'cave-eval-'));
175
+ const cases = [];
176
+ try {
177
+ for (const [caseIndex, kase] of suite.cases.entries()) {
178
+ const kind = kase.loop === undefined ? 'extraction' : 'loop';
179
+ const fixture = fixtureOf(kase, registry, options.aliases === true);
180
+ if (fixture.problems.length > 0) {
181
+ cases.push({
182
+ name: kase.name,
183
+ kind,
184
+ source: basename(kase.source),
185
+ fixture: fixture.problems,
186
+ golden: fixture.facts.length,
187
+ queryCount: fixture.queries.length,
188
+ runs: []
189
+ });
190
+ continue;
191
+ }
192
+ const caseRuns = [];
193
+ for (let runNo = 1; runNo <= runs; runNo += 1) {
194
+ const runOptions = { ...options, mode, timeoutSeconds, cwd };
195
+ caseRuns.push(fixture.loop === undefined ?
196
+ await runOnce(kase, fixture, caseIndex, runNo, root, registry, runOptions) :
197
+ await runLoopOnce(kase, fixture.loop, fixture, caseIndex, runNo, root, registry, runOptions));
198
+ }
199
+ const caseMean = meanOf(caseRuns, options.judge !== undefined);
200
+ cases.push({
201
+ name: kase.name,
202
+ kind,
203
+ source: basename(kase.source),
204
+ fixture: [],
205
+ golden: fixture.facts.length,
206
+ queryCount: fixture.queries.length,
207
+ runs: caseRuns,
208
+ ...caseMean === undefined ? {} : { mean: caseMean }
209
+ });
210
+ }
211
+ }
212
+ finally {
213
+ if (options.keep !== true) {
214
+ rmSync(root, { recursive: true, force: true });
215
+ }
216
+ }
217
+ const allRuns = cases.flatMap(kase => kase.runs);
218
+ const overall = meanOf(allRuns, options.judge !== undefined);
219
+ return {
220
+ cases,
221
+ runs,
222
+ okRuns: allRuns.filter(run => run.ok).length,
223
+ failedRuns: allRuns.filter(run => !run.ok).length,
224
+ fixture: suite.problems,
225
+ ...overall === undefined ? {} : { mean: overall },
226
+ ...options.keep === true ? { root } : {}
227
+ };
228
+ };
229
+ /** @returns the total fixture problems — suite discovery plus per-case. */
230
+ export const fixtureCount = (report) => report.fixture.length + report.cases.reduce((sum, kase) => sum + kase.fixture.length, 0);
231
+ const failedRun = (golden, note) => ({
232
+ ok: false,
233
+ note,
234
+ problems: [],
235
+ golden,
236
+ produced: 0,
237
+ matched: 0,
238
+ valueOff: 0,
239
+ judged: 0,
240
+ misses: [],
241
+ extras: [],
242
+ precision: 0,
243
+ recall: 0,
244
+ f1: 0,
245
+ queries: [],
246
+ queriesPassed: 0
247
+ });
248
+ /**
249
+ * The scoring tail every case kind shares: compare the store's produced
250
+ * facts against the golden, optionally judge the leftovers, run the query
251
+ * expectations, assemble the report.
252
+ */
253
+ const scoreRun = async (store, db, kase, fixture, head, options) => {
254
+ const produced = Score.producedFacts(store);
255
+ const comparison = Score.compare(fixture.facts, produced, {
256
+ ...options.tolerance === undefined ? {} : { tolerance: options.tolerance }
257
+ });
258
+ let judged = 0;
259
+ let judgeError;
260
+ let misses = comparison.misses;
261
+ let extras = comparison.extras;
262
+ if (options.judge !== undefined) {
263
+ const outcome = await runJudge(options.judge, comparison, options.timeoutSeconds, dirname(kase.source));
264
+ judged = outcome.pairs.length;
265
+ judgeError = outcome.error;
266
+ const judgedMisses = new Set(outcome.pairs.map(([miss]) => miss));
267
+ const judgedExtras = new Set(outcome.pairs.map(([, extra]) => extra));
268
+ misses = comparison.misses.filter((_, index) => !judgedMisses.has(index));
269
+ extras = comparison.extras.filter((_, index) => !judgedExtras.has(index));
270
+ }
271
+ const outcomes = fixture.queries.map(q => Queries.checkQuery(store, q, { aliases: options.aliases === true }));
272
+ const judgedPrecision = comparison.produced === 0 ? 0 : (comparison.matched + judged) / comparison.produced;
273
+ const judgedRecall = comparison.golden === 0 ? 0 : (comparison.matched + judged) / comparison.golden;
274
+ return {
275
+ ok: true,
276
+ ...head.note === undefined ? {} : { note: head.note },
277
+ problems: head.problems,
278
+ golden: comparison.golden,
279
+ produced: comparison.produced,
280
+ matched: comparison.matched,
281
+ valueOff: comparison.valueOff,
282
+ judged,
283
+ ...judgeError === undefined ? {} : { judgeError },
284
+ misses: misses.map(Score.lineOf),
285
+ extras: extras.map(Score.lineOf),
286
+ precision: comparison.precision,
287
+ recall: comparison.recall,
288
+ f1: comparison.f1,
289
+ ...options.judge === undefined ? {} : {
290
+ judgedPrecision,
291
+ judgedRecall,
292
+ judgedF1: Score.f1Of(judgedPrecision, judgedRecall)
293
+ },
294
+ queries: outcomes,
295
+ queriesPassed: outcomes.filter(outcome => outcome.pass).length,
296
+ ...options.keep === true ? { db } : {}
297
+ };
298
+ };
299
+ const runOnce = async (kase, fixture, caseIndex, runNo, root, registry, options) => {
300
+ const db = join(root, `case-${caseIndex + 1}-run-${runNo}.db`);
301
+ const store = open(db, { registry });
302
+ try {
303
+ const evalAgent = options.agent;
304
+ const agent = typeof evalAgent === 'function' ?
305
+ (prompt, files) => evalAgent(prompt, files, { db, store }) :
306
+ evalAgent;
307
+ const report = await Ingest.run({
308
+ db,
309
+ store,
310
+ patterns: [],
311
+ // A literal path, not a pattern — discovered names may contain
312
+ // glob metacharacters (BUGS.md eval-glob-escape).
313
+ files: [basename(kase.source)],
314
+ cwd: dirname(kase.source),
315
+ mode: options.mode,
316
+ // Eval must score valid lines from imperfect model output and report
317
+ // lint problems, not discard the run under ingest's strict default.
318
+ // Every eval database is already an isolated throwaway store.
319
+ policy: 'lenient',
320
+ ...agent === undefined ? {} : { agent },
321
+ embed: options.embed !== false,
322
+ timeoutSeconds: options.timeoutSeconds,
323
+ noPrelude: options.noPrelude === true,
324
+ ...kase.instructions === undefined ? {} : { instructions: kase.instructions }
325
+ });
326
+ const batch = report.batches[0];
327
+ const scoreablePartial = batch !== undefined && batch.added > 0 && batch.problems.length > 0;
328
+ if (batch === undefined || (!batch.ok && !scoreablePartial)) {
329
+ return failedRun(fixture.facts.length, batch?.note ?? 'agent produced no batch');
330
+ }
331
+ return await scoreRun(store, db, kase, fixture, {
332
+ ...batch.note === undefined ? {} : { note: batch.note },
333
+ problems: batch.problems
334
+ }, options);
335
+ }
336
+ catch (error) {
337
+ return failedRun(fixture.facts.length, error instanceof Error ? error.message : String(error));
338
+ }
339
+ finally {
340
+ store.close();
341
+ }
342
+ };
343
+ /**
344
+ * One reconstruction run (item 10): the loop selects claims from the
345
+ * knowledge graph in memory; what it collected lands in the throwaway
346
+ * store — un-stamped, like `cave import`, so claim keys survive — and the
347
+ * shared tail scores it and asks the queries *of the reconstruction*.
348
+ * The run note records the expansion path.
349
+ */
350
+ const runLoopOnce = async (kase, loop, fixture, caseIndex, runNo, root, registry, options) => {
351
+ const db = join(root, `case-${caseIndex + 1}-run-${runNo}.db`);
352
+ const store = open(db, { registry });
353
+ try {
354
+ const evalAgent = options.agent;
355
+ const agent = typeof evalAgent === 'function' ?
356
+ prompt => evalAgent(prompt, [], { db, store }) :
357
+ evalAgent;
358
+ const reconstruction = await Loop.runSpec(loop.knowledge, loop.spec, registry, {
359
+ ...agent === undefined ? {} : { agent },
360
+ timeoutSeconds: options.timeoutSeconds,
361
+ cwd: dirname(kase.source)
362
+ });
363
+ const ingested = store.ingest(reconstruction.claims.map(claim => emitClaim(claim)).join('\n'));
364
+ return await scoreRun(store, db, kase, fixture, {
365
+ note: Loop.traceNote(reconstruction),
366
+ problems: ingested.problems.map(problem => `line ${problem.line}: ${problem.message}`)
367
+ }, options);
368
+ }
369
+ catch (error) {
370
+ return failedRun(fixture.facts.length, error instanceof Error ? error.message : String(error));
371
+ }
372
+ finally {
373
+ store.close();
374
+ }
375
+ };
376
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Claim scoring — the produced extraction against the golden (roadmap
3
+ * item 9).
4
+ *
5
+ * Both sides run through the same pipeline: parse → canonicalize → strip
6
+ * actor stamps → re-key → keep the last claim per key. Actor stamps are
7
+ * the `@src:` contexts appended by the engine itself under spec §9.5
8
+ * (`@src:cli`, `@src:agent/<name>`, `@src:ingest`) — which actor
9
+ * happened to write a claim must not shift its key away from the golden's,
10
+ * while *content* sources the fixture author wrote (`@src:maria`,
11
+ * `@src:notes.md`) stay part of claim identity: the golden decides which
12
+ * contexts extraction is expected to produce.
13
+ *
14
+ * A golden claim *matches* a produced claim when their normalized keys are
15
+ * equal and their values agree — numerically within a relative tolerance
16
+ * (units must agree; `~` approximation is metadata), textually otherwise.
17
+ * Relation and existence claims carry their object in the key, so the key
18
+ * alone decides. Confidence, tags, `+/-` uncertainty, importance and
19
+ * comments are metadata and never scored; a key that matches with a
20
+ * disagreeing value is counted separately (`valueOff`) — the right fact,
21
+ * the wrong value.
22
+ */
23
+ import { Claim } from '@cavelang/core';
24
+ import type { Registry } from '@cavelang/canonical';
25
+ import type { Store } from '@cavelang/store';
26
+ /** @returns the claim without engine-appended actor stamps. */
27
+ export declare const normalize: (claim: Claim.t) => Claim.t;
28
+ /** @returns the claim key of the normalized claim. */
29
+ export declare const keyOf: (claim: Claim.t) => string;
30
+ /** One fact under a normalized key — the unit of comparison. */
31
+ export type Fact = {
32
+ readonly key: string;
33
+ readonly claim: Claim.t;
34
+ };
35
+ /**
36
+ * @returns one fact per normalized key, the last claim winning — the same
37
+ * latest-wins semantics the store gives a belief series (spec §9.1).
38
+ */
39
+ export declare const factsOf: (claims: readonly Claim.t[]) => Fact[];
40
+ /** Parses a golden document into facts; parse problems are fixture problems. */
41
+ export declare const goldenFacts: (text: string, registry?: Registry.t) => {
42
+ facts: readonly Fact[];
43
+ problems: readonly string[];
44
+ };
45
+ /**
46
+ * @returns the facts an extraction run produced — the store's current
47
+ * beliefs minus the orchestrator's own `ingest-digest` provenance claims
48
+ * (`@cavelang/cli/ingest` bookkeeping, not extracted knowledge).
49
+ */
50
+ export declare const producedFacts: (store: Store) => Fact[];
51
+ /**
52
+ * @returns whether the produced value agrees with the golden's: equal
53
+ * numbers (within `tolerance`, relative to the golden) under equal units,
54
+ * or the exact same canonical text. Claims without a value (relations,
55
+ * existence) always agree — their key already carries the object.
56
+ */
57
+ export declare const valueAgrees: (golden: Claim.t, produced: Claim.t, tolerance?: number) => boolean;
58
+ export type Comparison = {
59
+ readonly golden: number;
60
+ readonly produced: number;
61
+ /** Facts whose key and value both agree. */
62
+ readonly matched: number;
63
+ /** Keys present on both sides with disagreeing values — right fact, wrong value. */
64
+ readonly valueOff: number;
65
+ /** Golden facts with no match. */
66
+ readonly misses: readonly Fact[];
67
+ /** Produced facts with no match. */
68
+ readonly extras: readonly Fact[];
69
+ readonly precision: number;
70
+ readonly recall: number;
71
+ readonly f1: number;
72
+ };
73
+ /** @returns the F1 of a precision/recall pair, 0 when both are 0. */
74
+ export declare const f1Of: (precision: number, recall: number) => number;
75
+ /** Compares produced facts against golden facts. */
76
+ export declare const compare: (golden: readonly Fact[], produced: readonly Fact[], options?: {
77
+ tolerance?: number;
78
+ }) => Comparison;
79
+ /** @returns the canonical line of a fact, for reports and judge prompts. */
80
+ export declare const lineOf: (fact: Fact) => string;
81
+ //# sourceMappingURL=score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/score.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,EAAc,MAAM,gBAAgB,CAAA;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAK5C,+DAA+D;AAC/D,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,KAAK,CAAC,CAGhD,CAAA;AAED,sDAAsD;AACtD,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,MACb,CAAA;AAE1B,gEAAgE;AAChE,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;CACxB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,SAAS,KAAK,CAAC,CAAC,EAAE,KAAG,IAAI,EAMxD,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,EACZ,WAAU,QAAQ,CAAC,CAAoB,KACtC;IAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAMvD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,IAAI,EAK9C,CAAA;AAOH;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,UAAU,KAAK,CAAC,CAAC,EAAE,kBAAa,KAAG,OAc/E,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAA;IAChC,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB,CAAA;AAKD,qEAAqE;AACrE,eAAO,MAAM,IAAI,GAAI,WAAW,MAAM,EAAE,QAAQ,MAAM,KAAG,MACuB,CAAA;AAEhF,oDAAoD;AACpD,eAAO,MAAM,OAAO,GAClB,QAAQ,SAAS,IAAI,EAAE,EACvB,UAAU,SAAS,IAAI,EAAE,EACzB,UAAS;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,KACnC,UAgCF,CAAA;AAED,4EAA4E;AAC5E,eAAO,MAAM,MAAM,GAAI,MAAM,IAAI,KAAG,MACF,CAAA"}