@cavelang/cli 0.27.14 → 0.29.1

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,221 @@
1
+ /**
2
+ * Mapping templates (spec §23.1) — an ordinary CAVE document whose `?field`
3
+ * variables stand for record fields.
4
+ *
5
+ * Top-level blocks (a line plus its indented children) split by whether they
6
+ * contain a variable: variable-free blocks form the **prelude** (verb
7
+ * declarations, static claims — appended once per run), blocks with
8
+ * variables are **record templates**, instantiated once per record.
9
+ *
10
+ * A variable is a whole whitespace-delimited token beginning with `?`;
11
+ * tokens inside `"…"` and `` `…` `` literals are never substituted. A claim
12
+ * line whose record lacks a referenced field is dropped together with its
13
+ * indented children — optional fields simply yield fewer claims.
14
+ */
15
+ import { Value, Verb } from '@cavelang/core';
16
+ import { parseDocument, Token } from '@cavelang/parser';
17
+ const isVariable = (token) => token.kind === 'word' && token.text.startsWith('?') && token.text.length > 1;
18
+ const indentOf = (line) => line.length - line.trimStart().length;
19
+ const isStructural = (line) => {
20
+ const body = line.trim();
21
+ return body !== '' && !body.startsWith(';');
22
+ };
23
+ const lineVariables = (line) => Token.tokenize(Token.splitComment(line).head)
24
+ .filter(isVariable)
25
+ .map(token => token.text.slice(1));
26
+ /**
27
+ * Parses a mapping document: lints it (variables parse as ordinary terms, so
28
+ * diagnostics are real syntax problems), rejects variables in attribute
29
+ * position (`?attr: …` would silently name an attribute `?attr`), and splits
30
+ * top-level blocks into prelude and record templates.
31
+ */
32
+ export const parse = (text) => {
33
+ const problems = [];
34
+ const document = parseDocument(text);
35
+ for (const diagnostic of document.diagnostics) {
36
+ problems.push(`mapping line ${diagnostic.line}: ${diagnostic.message}`);
37
+ }
38
+ const rawLines = text.split(/\r?\n/);
39
+ rawLines.forEach((line, at) => {
40
+ for (const token of Token.tokenize(Token.splitComment(line).head)) {
41
+ if (token.kind === 'word' && /^\?.+:$/.test(token.text)) {
42
+ problems.push(`mapping line ${at + 1}: variables cannot name attributes (${token.text})`);
43
+ }
44
+ }
45
+ });
46
+ if (problems.length > 0) {
47
+ return { problems };
48
+ }
49
+ const blocks = [];
50
+ const preamble = [];
51
+ for (const line of rawLines) {
52
+ if (isStructural(line) && indentOf(line) === 0) {
53
+ blocks.push([line]);
54
+ }
55
+ else if (blocks.length === 0) {
56
+ preamble.push(line);
57
+ }
58
+ else {
59
+ blocks[blocks.length - 1].push(line);
60
+ }
61
+ }
62
+ const preludeParts = [...preamble];
63
+ const templates = [];
64
+ const variables = new Set();
65
+ for (const block of blocks) {
66
+ const names = block.flatMap(lineVariables);
67
+ if (names.length === 0) {
68
+ preludeParts.push(...block);
69
+ }
70
+ else {
71
+ names.forEach(name => variables.add(name));
72
+ templates.push(block);
73
+ }
74
+ }
75
+ return {
76
+ mapping: {
77
+ prelude: preludeParts.join('\n').trim() === '' ? '' : `${preludeParts.join('\n').trimEnd()}\n`,
78
+ templates,
79
+ variables: [...variables].sort()
80
+ },
81
+ problems
82
+ };
83
+ };
84
+ const safeAtomRe = /^[A-Za-z0-9][A-Za-z0-9._/+-]*$/;
85
+ /**
86
+ * Formats one field value for one template slot (spec §23.1). Deterministic
87
+ * and exact — values insert verbatim when already token-safe, or as quoted
88
+ * literals; formatting never invents names (no slugification).
89
+ */
90
+ export const formatValue = (value, position) => {
91
+ if (value === undefined || value === null) {
92
+ return { kind: 'missing' };
93
+ }
94
+ if (typeof value === 'number') {
95
+ // Plain decimal, never String's exponent notation — `1e-7` is not a
96
+ // CAVE number (spec §16) and would round-trip as an atom.
97
+ return Number.isFinite(value) ?
98
+ { kind: 'ok', text: Value.formatNumber(value) } :
99
+ { kind: 'problem', message: 'non-finite number' };
100
+ }
101
+ if (typeof value === 'boolean') {
102
+ return { kind: 'ok', text: value ? 'true' : 'false' };
103
+ }
104
+ if (typeof value !== 'string') {
105
+ return { kind: 'problem', message: `unsupported field type (${Array.isArray(value) ? 'array' : typeof value})` };
106
+ }
107
+ const text = value.replace(/[\r\n]+/g, ' ').trim();
108
+ if (text === '') {
109
+ return { kind: 'missing' };
110
+ }
111
+ if (safeAtomRe.test(text) && !Verb.isVerbToken(text)) {
112
+ return { kind: 'ok', text };
113
+ }
114
+ if (position === 'payload') {
115
+ const parsed = Value.parse(text);
116
+ if (parsed.kind === 'number' || parsed.kind === 'date' || parsed.kind === 'trajectory') {
117
+ return { kind: 'ok', text };
118
+ }
119
+ }
120
+ if (!text.includes('"')) {
121
+ return { kind: 'ok', text: `"${text}"` };
122
+ }
123
+ if (!text.includes('`')) {
124
+ return { kind: 'ok', text: `\`${text}\`` };
125
+ }
126
+ return { kind: 'problem', message: 'value contains both " and ` — cannot quote' };
127
+ };
128
+ /**
129
+ * Resolves a field by name: exact key first, then a dot path into nested
130
+ * JSON (`address.city`, `items.0.sku`).
131
+ */
132
+ export const fieldOf = (record, name) => {
133
+ if (record !== null && typeof record === 'object' && name in record) {
134
+ return record[name];
135
+ }
136
+ let current = record;
137
+ for (const part of name.split('.')) {
138
+ if (current === null || typeof current !== 'object') {
139
+ return undefined;
140
+ }
141
+ current = current[part];
142
+ }
143
+ return current;
144
+ };
145
+ const formatToken = (token) => {
146
+ switch (token.kind) {
147
+ case 'text':
148
+ return `"${token.text}"`;
149
+ case 'code':
150
+ return `\`${token.text}\``;
151
+ default:
152
+ return token.text;
153
+ }
154
+ };
155
+ const substituteLine = (line, lookup) => {
156
+ const indent = line.slice(0, indentOf(line));
157
+ const { head, comment } = Token.splitComment(line);
158
+ const tokens = Token.tokenize(head);
159
+ const parts = [];
160
+ for (const [at, token] of tokens.entries()) {
161
+ if (!isVariable(token)) {
162
+ parts.push(formatToken(token));
163
+ continue;
164
+ }
165
+ const name = token.text.slice(1);
166
+ const formatted = formatValue(lookup(name), at === 0 ? 'subject' : 'payload');
167
+ switch (formatted.kind) {
168
+ case 'missing':
169
+ return { kind: 'dropped' };
170
+ case 'problem':
171
+ return { kind: 'problem', message: `?${name}: ${formatted.message}` };
172
+ default:
173
+ parts.push(formatted.text);
174
+ }
175
+ }
176
+ return { kind: 'ok', line: `${indent}${parts.join(' ')}${comment === undefined ? '' : ` ; ${comment}`}` };
177
+ };
178
+ /**
179
+ * Instantiates every template block for one record. Lines without variables
180
+ * pass through verbatim; a dropped line takes its indented children with it.
181
+ */
182
+ export const instantiate = (templates, lookup) => {
183
+ const out = [];
184
+ const problems = [];
185
+ let dropped = 0;
186
+ for (const block of templates) {
187
+ let skipDeeperThan;
188
+ for (const line of block) {
189
+ if (!isStructural(line)) {
190
+ out.push(line);
191
+ continue;
192
+ }
193
+ const indent = indentOf(line);
194
+ if (skipDeeperThan !== undefined && indent > skipDeeperThan) {
195
+ dropped += 1;
196
+ continue;
197
+ }
198
+ skipDeeperThan = undefined;
199
+ if (lineVariables(line).length === 0) {
200
+ out.push(line);
201
+ continue;
202
+ }
203
+ const substituted = substituteLine(line, lookup);
204
+ switch (substituted.kind) {
205
+ case 'dropped':
206
+ dropped += 1;
207
+ skipDeeperThan = indent;
208
+ break;
209
+ case 'problem':
210
+ problems.push(substituted.message);
211
+ skipDeeperThan = indent;
212
+ break;
213
+ default:
214
+ out.push(substituted.line);
215
+ }
216
+ }
217
+ }
218
+ const body = out.join('\n').trim();
219
+ return { text: body === '' ? '' : `${out.join('\n').trimEnd()}\n`, dropped, problems };
220
+ };
221
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `@cavelang/cli/eval` — golden-fixture extraction and query evals
3
+ * and reconstruction policy evaluation.
4
+ *
5
+ * ```sh
6
+ * cave eval suite/ --agent 'claude -p --mcp-config {mcp-config} --allowedTools "mcp__cave__*"'
7
+ * ```
8
+ *
9
+ * Library API for SDK scripts (agents and judges may be functions):
10
+ *
11
+ * ```ts
12
+ * import { run } from '@cavelang/cli/eval'
13
+ *
14
+ * const report = await run({
15
+ * suites: ['suite/'], mode: 'stdout', runs: 3,
16
+ * agent: async prompt => callYourSdk(prompt) // returns CAVE text
17
+ * })
18
+ * ```
19
+ */
20
+ export * as Suite from './suite.ts';
21
+ export * as Score from './score.ts';
22
+ export * as Queries from './queries.ts';
23
+ export * as Loop from './loop.ts';
24
+ export { judgePrompt, parsePairs } from './judge.ts';
25
+ export { fixtureCount, run } from './run.ts';
26
+ export type { Agent, CaseReport, Judge, Mean, Options, Report, RunReport } from './run.ts';
27
+ export { meetsMin, render, runEval } from './main.ts';
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC5C,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `@cavelang/cli/eval` — golden-fixture extraction and query evals
3
+ * and reconstruction policy evaluation.
4
+ *
5
+ * ```sh
6
+ * cave eval suite/ --agent 'claude -p --mcp-config {mcp-config} --allowedTools "mcp__cave__*"'
7
+ * ```
8
+ *
9
+ * Library API for SDK scripts (agents and judges may be functions):
10
+ *
11
+ * ```ts
12
+ * import { run } from '@cavelang/cli/eval'
13
+ *
14
+ * const report = await run({
15
+ * suites: ['suite/'], mode: 'stdout', runs: 3,
16
+ * agent: async prompt => callYourSdk(prompt) // returns CAVE text
17
+ * })
18
+ * ```
19
+ */
20
+ export * as Suite from "./suite.js";
21
+ export * as Score from "./score.js";
22
+ export * as Queries from "./queries.js";
23
+ export * as Loop from "./loop.js";
24
+ export { judgePrompt, parsePairs } from "./judge.js";
25
+ export { fixtureCount, run } from "./run.js";
26
+ export { meetsMin, render, runEval } from "./main.js";
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The optional LLM judge — semantic-equivalence pairing
3
+ * of what claim-key scoring could not match.
4
+ *
5
+ * Exact keys are deliberately strict: `grandma-maria` and `maria` are
6
+ * different entities to the scorer even when a human sees one person.
7
+ * The judge closes that gap without loosening the metric — after strict
8
+ * matching, the unmatched golden claims and unmatched produced claims go
9
+ * to a judge agent that pairs the ones stating the same fact. Judged
10
+ * pairs never overwrite the strict scores; they produce a second,
11
+ * *judged* precision/recall/F1 reported alongside.
12
+ *
13
+ * The protocol is the same as extraction agents (`@cavelang/cli/ingest`): a
14
+ * shell template (prompt on stdin and `{prompt-file}`) or an injected
15
+ * function. The judge replies with one JSON array of `[G, P]` 1-based
16
+ * index pairs — anything around it (prose, a code fence) is tolerated,
17
+ * only the last well-formed array counts, out-of-range or duplicate
18
+ * indices are dropped.
19
+ */
20
+ import type { Fact } from './score.ts';
21
+ /** @returns the judge prompt for unmatched golden/produced claims. */
22
+ export declare const judgePrompt: (misses: readonly Fact[], extras: readonly Fact[]) => string;
23
+ /**
24
+ * Parses the judge's reply into validated 0-based `[miss, extra]` pairs.
25
+ * The *last* well-formed JSON array wins (agents often think aloud before
26
+ * answering); malformed entries, out-of-range indices and reused indices
27
+ * are dropped rather than failing the run.
28
+ */
29
+ export declare const parsePairs: (output: string, misses: number, extras: number) => [number, number][];
30
+ //# sourceMappingURL=judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,sEAAsE;AACtE,eAAO,MAAM,WAAW,GAAI,QAAQ,SAAS,IAAI,EAAE,EAAE,QAAQ,SAAS,IAAI,EAAE,KAAG,MAmBnE,CAAA;AAEZ;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAkD3F,CAAA"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The optional LLM judge — semantic-equivalence pairing
3
+ * of what claim-key scoring could not match.
4
+ *
5
+ * Exact keys are deliberately strict: `grandma-maria` and `maria` are
6
+ * different entities to the scorer even when a human sees one person.
7
+ * The judge closes that gap without loosening the metric — after strict
8
+ * matching, the unmatched golden claims and unmatched produced claims go
9
+ * to a judge agent that pairs the ones stating the same fact. Judged
10
+ * pairs never overwrite the strict scores; they produce a second,
11
+ * *judged* precision/recall/F1 reported alongside.
12
+ *
13
+ * The protocol is the same as extraction agents (`@cavelang/cli/ingest`): a
14
+ * shell template (prompt on stdin and `{prompt-file}`) or an injected
15
+ * function. The judge replies with one JSON array of `[G, P]` 1-based
16
+ * index pairs — anything around it (prose, a code fence) is tolerated,
17
+ * only the last well-formed array counts, out-of-range or duplicate
18
+ * indices are dropped.
19
+ */
20
+ import { lineOf } from "./score.js";
21
+ /** @returns the judge prompt for unmatched golden/produced claims. */
22
+ export const judgePrompt = (misses, extras) => [
23
+ 'You are judging a knowledge-extraction eval written in CAVE — one atomic claim per line:',
24
+ 'subject VERB object, or subject HAS attribute: value, with optional @context, #tag and @ N% confidence.',
25
+ '',
26
+ 'The golden claims below were expected but not produced verbatim; the produced claims were',
27
+ 'extracted but match no golden claim. Pair every golden claim with a produced claim ONLY when',
28
+ 'both state the same fact about the same real-world entity — tolerate naming, spelling and',
29
+ 'phrasing variation (grandma-maria vs maria), but never pair claims that disagree in meaning,',
30
+ 'direction or value. Judge conservatively: when unsure, do not pair. Each index may appear in',
31
+ 'at most one pair.',
32
+ '',
33
+ 'Golden claims not produced:',
34
+ ...misses.map((fact, index) => `G${index + 1}: ${lineOf(fact)}`),
35
+ '',
36
+ 'Produced claims matching no golden claim:',
37
+ ...extras.map((fact, index) => `P${index + 1}: ${lineOf(fact)}`),
38
+ '',
39
+ 'Reply with ONLY a JSON array of [golden, produced] index pairs, e.g. [[1, 2], [3, 1]].',
40
+ 'Reply [] when nothing is equivalent.'
41
+ ].join('\n');
42
+ /**
43
+ * Parses the judge's reply into validated 0-based `[miss, extra]` pairs.
44
+ * The *last* well-formed JSON array wins (agents often think aloud before
45
+ * answering); malformed entries, out-of-range indices and reused indices
46
+ * are dropped rather than failing the run.
47
+ */
48
+ export const parsePairs = (output, misses, extras) => {
49
+ // Balanced-bracket scan: each candidate runs from a `[` to its matching
50
+ // `]`; a span that parses is consumed whole (inner arrays are not
51
+ // re-considered), one that does not is re-entered at the next `[` — so
52
+ // prose brackets before the answer cannot swallow it.
53
+ let parsed;
54
+ let at = output.indexOf('[');
55
+ while (at !== -1) {
56
+ let depth = 0;
57
+ let end = -1;
58
+ for (let scan = at; scan < output.length; scan += 1) {
59
+ if (output[scan] === '[') {
60
+ depth += 1;
61
+ }
62
+ else if (output[scan] === ']' && --depth === 0) {
63
+ end = scan;
64
+ break;
65
+ }
66
+ }
67
+ if (end === -1) {
68
+ break;
69
+ }
70
+ try {
71
+ parsed = JSON.parse(output.slice(at, end + 1));
72
+ at = output.indexOf('[', end + 1);
73
+ }
74
+ catch {
75
+ at = output.indexOf('[', at + 1);
76
+ }
77
+ }
78
+ if (!Array.isArray(parsed)) {
79
+ return [];
80
+ }
81
+ const pairs = [];
82
+ const usedMisses = new Set();
83
+ const usedExtras = new Set();
84
+ for (const entry of parsed) {
85
+ if (!Array.isArray(entry) || entry.length !== 2) {
86
+ continue;
87
+ }
88
+ const [golden, produced] = entry;
89
+ if (typeof golden !== 'number' || typeof produced !== 'number' ||
90
+ !Number.isInteger(golden) || !Number.isInteger(produced) ||
91
+ golden < 1 || golden > misses || produced < 1 || produced > extras ||
92
+ usedMisses.has(golden) || usedExtras.has(produced)) {
93
+ continue;
94
+ }
95
+ usedMisses.add(golden);
96
+ usedExtras.add(produced);
97
+ pairs.push([golden - 1, produced - 1]);
98
+ }
99
+ return pairs;
100
+ };
101
+ //# sourceMappingURL=judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGnC,sEAAsE;AACtE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAE,MAAuB,EAAU,EAAE,CAAC;IACvF,0FAA0F;IAC1F,yGAAyG;IACzG,EAAE;IACF,2FAA2F;IAC3F,8FAA8F;IAC9F,2FAA2F;IAC3F,8FAA8F;IAC9F,8FAA8F;IAC9F,mBAAmB;IACnB,EAAE;IACF,6BAA6B;IAC7B,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAChE,EAAE;IACF,2CAA2C;IAC3C,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAChE,EAAE;IACF,wFAAwF;IACxF,sCAAsC;CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,EAAsB,EAAE;IAC/F,wEAAwE;IACxE,kEAAkE;IAClE,uEAAuE;IACvE,sDAAsD;IACtD,IAAI,MAAe,CAAA;IACnB,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC5B,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,IAAI,GAAG,GAAG,CAAC,CAAC,CAAA;QACZ,KAAK,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;YACpD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzB,KAAK,IAAI,CAAC,CAAA;YACZ,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;gBACjD,GAAG,GAAG,IAAI,CAAA;gBACV,MAAK;YACP,CAAC;QACH,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAK;QACP,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YAC9C,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,KAAK,GAAuB,EAAE,CAAA;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,SAAQ;QACV,CAAC;QACD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAkB,CAAA;QAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAC1D,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;YACxD,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,MAAM,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,MAAM;YAClE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,SAAQ;QACV,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACtB,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACxB,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Reconstruction (loop) cases — spec §18 evaluation.
3
+ *
4
+ * A case whose golden has a `<stem>.loop.cave` sibling evals the
5
+ * §18 reconstruction loop instead of extraction: the source is the
6
+ * *knowledge* (CAVE text), the loop file declares the seeds and budgets,
7
+ * and the golden is the claims a good reconstruction collects. Without an
8
+ * agent the deterministic heuristic policy runs — the baseline every LLM
9
+ * policy is measured against; with `--agent` the same seeds drive
10
+ * `llmPolicy` over the shell-agent template (one completion per step).
11
+ *
12
+ * The loop file is ordinary CAVE text about the entity `loop` — the
13
+ * existing parser, no new grammar:
14
+ *
15
+ * ```cave
16
+ * loop SEEDS reject-valid-tokens
17
+ * loop HAS query: `why are valid tokens rejected?`
18
+ * loop HAS steps: 12
19
+ * loop HAS claims: 40
20
+ * ```
21
+ *
22
+ * `SEEDS` claims keep file order (the initial frontier); `query`, `steps`
23
+ * and `claims` are attributes — several claims on one attribute follow
24
+ * belief semantics, the last wins. Anything else in the file is a fixture
25
+ * problem: a misspelled knob must scream, not silently default.
26
+ */
27
+ import type { Registry } from '@cavelang/canonical';
28
+ import type { Reconstruction } from '@cavelang/cli/loop';
29
+ export type Spec = {
30
+ /** Seed entities, in file order — the initial frontier. */
31
+ readonly seeds: readonly string[];
32
+ /** Shown to the LLM policy each step; the heuristic ignores it. */
33
+ readonly query?: string;
34
+ /** Step budget for both policies (their shared default when absent). */
35
+ readonly maxSteps?: number;
36
+ /** Claim budget for both policies. */
37
+ readonly maxClaims?: number;
38
+ };
39
+ /**
40
+ * Parses and strictly validates a loop file. Problems are fixture
41
+ * problems — an unknown verb, subject or attribute fails the case
42
+ * instead of being skipped.
43
+ */
44
+ export declare const parseSpec: (text: string, registry: Registry.t) => {
45
+ spec: Spec;
46
+ problems: readonly string[];
47
+ };
48
+ /** The agent contract of one reconstruction run: prompt in, reply out. */
49
+ export type Complete = (prompt: string) => Promise<string>;
50
+ export type RunOptions = {
51
+ /** Shell-agent template or completion function; absent = the heuristic baseline. */
52
+ readonly agent?: string | Complete;
53
+ readonly timeoutSeconds?: number;
54
+ readonly cwd?: string;
55
+ };
56
+ /**
57
+ * Runs one reconstruction over the knowledge: the heuristic baseline
58
+ * without an agent, `llmPolicy` over the agent otherwise. Both policies
59
+ * get the same budgets, so their scores compare like for like.
60
+ */
61
+ export declare const runSpec: (knowledge: string, spec: Spec, registry: Registry.t, options?: RunOptions) => Promise<Reconstruction>;
62
+ /** One-line expansion summary for run notes: `a → b → c`. */
63
+ export declare const traceNote: (reconstruction: Reconstruction) => string;
64
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAInD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,MAAM,IAAI,GAAG;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAMD;;;;GAIG;AACH,eAAO,MAAM,SAAS,GACpB,MAAM,MAAM,EACZ,UAAU,QAAQ,CAAC,CAAC,KACnB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAsD3C,CAAA;AAED,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAE1D,MAAM,MAAM,UAAU,GAAG;IACvB,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAClB,WAAW,MAAM,EACjB,MAAM,IAAI,EACV,UAAU,QAAQ,CAAC,CAAC,EACpB,UAAS,UAAe,KACvB,OAAO,CAAC,cAAc,CAoBxB,CAAA;AAED,6DAA6D;AAC7D,eAAO,MAAM,SAAS,GAAI,gBAAgB,cAAc,KAAG,MAEmB,CAAA"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Reconstruction (loop) cases — spec §18 evaluation.
3
+ *
4
+ * A case whose golden has a `<stem>.loop.cave` sibling evals the
5
+ * §18 reconstruction loop instead of extraction: the source is the
6
+ * *knowledge* (CAVE text), the loop file declares the seeds and budgets,
7
+ * and the golden is the claims a good reconstruction collects. Without an
8
+ * agent the deterministic heuristic policy runs — the baseline every LLM
9
+ * policy is measured against; with `--agent` the same seeds drive
10
+ * `llmPolicy` over the shell-agent template (one completion per step).
11
+ *
12
+ * The loop file is ordinary CAVE text about the entity `loop` — the
13
+ * existing parser, no new grammar:
14
+ *
15
+ * ```cave
16
+ * loop SEEDS reject-valid-tokens
17
+ * loop HAS query: `why are valid tokens rejected?`
18
+ * loop HAS steps: 12
19
+ * loop HAS claims: 40
20
+ * ```
21
+ *
22
+ * `SEEDS` claims keep file order (the initial frontier); `query`, `steps`
23
+ * and `claims` are attributes — several claims on one attribute follow
24
+ * belief semantics, the last wins. Anything else in the file is a fixture
25
+ * problem: a misspelled knob must scream, not silently default.
26
+ */
27
+ import { Claim } from '@cavelang/core';
28
+ import { canonicalizeText } from '@cavelang/canonical';
29
+ import { heuristicPolicy, llmPolicy, memoryStoreOfText, reconstruct, reconstructAsync, shellComplete } from '@cavelang/cli/loop';
30
+ const subject = 'loop';
31
+ const seedVerb = 'SEEDS';
32
+ const budgetAttributes = ['steps', 'claims'];
33
+ /**
34
+ * Parses and strictly validates a loop file. Problems are fixture
35
+ * problems — an unknown verb, subject or attribute fails the case
36
+ * instead of being skipped.
37
+ */
38
+ export const parseSpec = (text, registry) => {
39
+ const result = canonicalizeText(text, registry);
40
+ const problems = result.problems.map(problem => `loop line ${problem.line}: ${problem.message}`);
41
+ const seeds = [];
42
+ let query;
43
+ const budgets = new Map();
44
+ for (const { claim, line } of result.claims) {
45
+ const problem = (message) => {
46
+ problems.push(`loop line ${line}: ${message}`);
47
+ };
48
+ if (Claim.formatTerm(claim.subject) !== subject) {
49
+ problem(`expected subject '${subject}', got '${Claim.formatTerm(claim.subject)}'`);
50
+ continue;
51
+ }
52
+ if (claim.verb === seedVerb && claim.payload.kind === 'relation') {
53
+ const seed = Claim.formatTerm(claim.payload.object);
54
+ if (!seeds.includes(seed)) {
55
+ seeds.push(seed);
56
+ }
57
+ continue;
58
+ }
59
+ if (claim.verb === 'HAS' && claim.payload.kind === 'attribute') {
60
+ const { attribute, value } = claim.payload;
61
+ if (attribute === 'query') {
62
+ query = value.raw;
63
+ continue;
64
+ }
65
+ if (budgetAttributes.includes(attribute)) {
66
+ if (value.num === undefined || !Number.isInteger(value.num) || value.num < 1) {
67
+ problem(`${attribute} must be a positive integer, got '${value.raw}'`);
68
+ }
69
+ else {
70
+ budgets.set(attribute, value.num);
71
+ }
72
+ continue;
73
+ }
74
+ problem(`unknown attribute '${attribute}' — expected query, steps or claims`);
75
+ continue;
76
+ }
77
+ problem(`expected '${subject} ${seedVerb} <entity>' or '${subject} HAS query|steps|claims: …'`);
78
+ }
79
+ if (seeds.length === 0) {
80
+ problems.push(`loop file declares no seeds — at least one '${subject} ${seedVerb} <entity>' line is required`);
81
+ }
82
+ const steps = budgets.get('steps');
83
+ const claims = budgets.get('claims');
84
+ return {
85
+ spec: {
86
+ seeds,
87
+ ...query === undefined ? {} : { query },
88
+ ...steps === undefined ? {} : { maxSteps: steps },
89
+ ...claims === undefined ? {} : { maxClaims: claims }
90
+ },
91
+ problems
92
+ };
93
+ };
94
+ /**
95
+ * Runs one reconstruction over the knowledge: the heuristic baseline
96
+ * without an agent, `llmPolicy` over the agent otherwise. Both policies
97
+ * get the same budgets, so their scores compare like for like.
98
+ */
99
+ export const runSpec = (knowledge, spec, registry, options = {}) => {
100
+ const store = memoryStoreOfText(knowledge, registry);
101
+ const budgets = {
102
+ ...spec.maxSteps === undefined ? {} : { maxSteps: spec.maxSteps },
103
+ ...spec.maxClaims === undefined ? {} : { maxClaims: spec.maxClaims }
104
+ };
105
+ if (options.agent === undefined) {
106
+ return Promise.resolve(reconstruct(store, heuristicPolicy(budgets), spec.seeds));
107
+ }
108
+ const complete = typeof options.agent === 'function' ?
109
+ options.agent :
110
+ shellComplete(options.agent, {
111
+ ...options.timeoutSeconds === undefined ? {} : { timeoutSeconds: options.timeoutSeconds },
112
+ ...options.cwd === undefined ? {} : { cwd: options.cwd }
113
+ });
114
+ const policy = llmPolicy(complete, {
115
+ ...spec.query === undefined ? {} : { query: spec.query },
116
+ ...budgets
117
+ });
118
+ return reconstructAsync(store, policy, spec.seeds);
119
+ };
120
+ /** One-line expansion summary for run notes: `a → b → c`. */
121
+ export const traceNote = (reconstruction) => `expanded ${reconstruction.trace.length} cue(s): ` +
122
+ `${reconstruction.trace.map(step => step.cue.entity).join(' → ') || 'none'}`;
123
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/loop.ts"],"names":[],"mappings":"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"}