@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.
- package/Authors.md +5 -0
- package/License.md +6 -0
- package/README.md +122 -24
- package/dist/internal/act/action.d.ts +69 -0
- package/dist/internal/act/action.d.ts.map +1 -0
- package/dist/internal/act/action.js +201 -0
- package/dist/internal/act/action.js.map +1 -0
- package/dist/internal/act/declare.d.ts +102 -0
- package/dist/internal/act/declare.d.ts.map +1 -0
- package/dist/internal/act/declare.js +270 -0
- package/dist/internal/act/declare.js.map +1 -0
- package/dist/internal/act/engine.d.ts +103 -0
- package/dist/internal/act/engine.d.ts.map +1 -0
- package/dist/internal/act/engine.js +298 -0
- package/dist/internal/act/engine.js.map +1 -0
- package/dist/internal/act/index.d.ts +27 -0
- package/dist/internal/act/index.d.ts.map +1 -0
- package/dist/internal/act/index.js +25 -0
- package/dist/internal/act/index.js.map +1 -0
- package/dist/internal/automate/automation.d.ts +78 -0
- package/dist/internal/automate/automation.d.ts.map +1 -0
- package/dist/internal/automate/automation.js +135 -0
- package/dist/internal/automate/automation.js.map +1 -0
- package/dist/internal/automate/declare.d.ts +84 -0
- package/dist/internal/automate/declare.d.ts.map +1 -0
- package/dist/internal/automate/declare.js +233 -0
- package/dist/internal/automate/declare.js.map +1 -0
- package/dist/internal/automate/engine.d.ts +125 -0
- package/dist/internal/automate/engine.d.ts.map +1 -0
- package/dist/internal/automate/engine.js +388 -0
- package/dist/internal/automate/engine.js.map +1 -0
- package/dist/internal/automate/index.d.ts +28 -0
- package/dist/internal/automate/index.d.ts.map +1 -0
- package/dist/internal/automate/index.js +26 -0
- package/dist/internal/automate/index.js.map +1 -0
- package/dist/internal/automate/main.d.ts +26 -0
- package/dist/internal/automate/main.d.ts.map +1 -0
- package/dist/internal/automate/main.js +298 -0
- package/dist/internal/automate/main.js.map +1 -0
- package/dist/internal/connect/index.d.ts +26 -0
- package/dist/internal/connect/index.d.ts.map +1 -0
- package/dist/internal/connect/index.js +24 -0
- package/dist/internal/connect/index.js.map +1 -0
- package/dist/internal/connect/main.d.ts +23 -0
- package/dist/internal/connect/main.d.ts.map +1 -0
- package/dist/internal/connect/main.js +330 -0
- package/dist/internal/connect/main.js.map +1 -0
- package/dist/internal/connect/run.d.ts +85 -0
- package/dist/internal/connect/run.d.ts.map +1 -0
- package/dist/internal/connect/run.js +242 -0
- package/dist/internal/connect/run.js.map +1 -0
- package/dist/internal/connect/source.d.ts +44 -0
- package/dist/internal/connect/source.d.ts.map +1 -0
- package/dist/internal/connect/source.js +215 -0
- package/dist/internal/connect/source.js.map +1 -0
- package/dist/internal/connect/template.d.ts +69 -0
- package/dist/internal/connect/template.d.ts.map +1 -0
- package/dist/internal/connect/template.js +221 -0
- package/dist/internal/connect/template.js.map +1 -0
- package/dist/internal/eval/index.d.ts +28 -0
- package/dist/internal/eval/index.d.ts.map +1 -0
- package/dist/internal/eval/index.js +27 -0
- package/dist/internal/eval/index.js.map +1 -0
- package/dist/internal/eval/judge.d.ts +30 -0
- package/dist/internal/eval/judge.d.ts.map +1 -0
- package/dist/internal/eval/judge.js +101 -0
- package/dist/internal/eval/judge.js.map +1 -0
- package/dist/internal/eval/loop.d.ts +64 -0
- package/dist/internal/eval/loop.d.ts.map +1 -0
- package/dist/internal/eval/loop.js +123 -0
- package/dist/internal/eval/loop.js.map +1 -0
- package/dist/internal/eval/main.d.ts +17 -0
- package/dist/internal/eval/main.d.ts.map +1 -0
- package/dist/internal/eval/main.js +236 -0
- package/dist/internal/eval/main.js.map +1 -0
- package/dist/internal/eval/queries.d.ts +74 -0
- package/dist/internal/eval/queries.d.ts.map +1 -0
- package/dist/internal/eval/queries.js +161 -0
- package/dist/internal/eval/queries.js.map +1 -0
- package/dist/internal/eval/run.d.ts +143 -0
- package/dist/internal/eval/run.d.ts.map +1 -0
- package/dist/internal/eval/run.js +376 -0
- package/dist/internal/eval/run.js.map +1 -0
- package/dist/internal/eval/score.d.ts +81 -0
- package/dist/internal/eval/score.d.ts.map +1 -0
- package/dist/internal/eval/score.js +126 -0
- package/dist/internal/eval/score.js.map +1 -0
- package/dist/internal/eval/suite.d.ts +66 -0
- package/dist/internal/eval/suite.d.ts.map +1 -0
- package/dist/internal/eval/suite.js +130 -0
- package/dist/internal/eval/suite.js.map +1 -0
- package/dist/internal/ingest/context.d.ts +20 -0
- package/dist/internal/ingest/context.d.ts.map +1 -0
- package/dist/internal/ingest/context.js +59 -0
- package/dist/internal/ingest/context.js.map +1 -0
- package/dist/internal/ingest/files.d.ts +46 -0
- package/dist/internal/ingest/files.d.ts.map +1 -0
- package/dist/internal/ingest/files.js +115 -0
- package/dist/internal/ingest/files.js.map +1 -0
- package/dist/internal/ingest/index.d.ts +31 -0
- package/dist/internal/ingest/index.d.ts.map +1 -0
- package/dist/internal/ingest/index.js +29 -0
- package/dist/internal/ingest/index.js.map +1 -0
- package/dist/internal/ingest/main.d.ts +12 -0
- package/dist/internal/ingest/main.d.ts.map +1 -0
- package/dist/internal/ingest/main.js +180 -0
- package/dist/internal/ingest/main.js.map +1 -0
- package/dist/internal/ingest/prompt.d.ts +32 -0
- package/dist/internal/ingest/prompt.d.ts.map +1 -0
- package/dist/internal/ingest/prompt.js +75 -0
- package/dist/internal/ingest/prompt.js.map +1 -0
- package/dist/internal/ingest/run.d.ts +142 -0
- package/dist/internal/ingest/run.d.ts.map +1 -0
- package/dist/internal/ingest/run.js +350 -0
- package/dist/internal/ingest/run.js.map +1 -0
- package/dist/internal/ingest/web.d.ts +48 -0
- package/dist/internal/ingest/web.d.ts.map +1 -0
- package/dist/internal/ingest/web.js +140 -0
- package/dist/internal/ingest/web.js.map +1 -0
- package/dist/internal/loop/demo.d.ts +22 -0
- package/dist/internal/loop/demo.d.ts.map +1 -0
- package/dist/internal/loop/demo.js +67 -0
- package/dist/internal/loop/demo.js.map +1 -0
- package/dist/internal/loop/index.d.ts +20 -0
- package/dist/internal/loop/index.d.ts.map +1 -0
- package/dist/internal/loop/index.js +17 -0
- package/dist/internal/loop/index.js.map +1 -0
- package/dist/internal/loop/llm.d.ts +99 -0
- package/dist/internal/loop/llm.d.ts.map +1 -0
- package/dist/internal/loop/llm.js +231 -0
- package/dist/internal/loop/llm.js.map +1 -0
- package/dist/internal/loop/reconstruct.d.ts +87 -0
- package/dist/internal/loop/reconstruct.d.ts.map +1 -0
- package/dist/internal/loop/reconstruct.js +157 -0
- package/dist/internal/loop/reconstruct.js.map +1 -0
- package/dist/internal/loop/sqlite.d.ts +13 -0
- package/dist/internal/loop/sqlite.d.ts.map +1 -0
- package/dist/internal/loop/sqlite.js +33 -0
- package/dist/internal/loop/sqlite.js.map +1 -0
- package/dist/internal/loop/store.d.ts +50 -0
- package/dist/internal/loop/store.d.ts.map +1 -0
- package/dist/internal/loop/store.js +100 -0
- package/dist/internal/loop/store.js.map +1 -0
- package/dist/internal/mcp/bin.d.ts +7 -0
- package/dist/internal/mcp/bin.d.ts.map +1 -0
- package/dist/internal/mcp/bin.js +8 -0
- package/dist/internal/mcp/bin.js.map +1 -0
- package/dist/internal/mcp/index.d.ts +25 -0
- package/dist/internal/mcp/index.d.ts.map +1 -0
- package/dist/internal/mcp/index.js +23 -0
- package/dist/internal/mcp/index.js.map +1 -0
- package/dist/internal/mcp/main.d.ts +23 -0
- package/dist/internal/mcp/main.d.ts.map +1 -0
- package/dist/internal/mcp/main.js +156 -0
- package/dist/internal/mcp/main.js.map +1 -0
- package/dist/internal/mcp/server.d.ts +92 -0
- package/dist/internal/mcp/server.d.ts.map +1 -0
- package/dist/internal/mcp/server.js +251 -0
- package/dist/internal/mcp/server.js.map +1 -0
- package/dist/internal/mcp/tools.d.ts +91 -0
- package/dist/internal/mcp/tools.d.ts.map +1 -0
- package/dist/internal/mcp/tools.js +584 -0
- package/dist/internal/mcp/tools.js.map +1 -0
- package/dist/internal/rules/declare.d.ts +58 -0
- package/dist/internal/rules/declare.d.ts.map +1 -0
- package/dist/internal/rules/declare.js +152 -0
- package/dist/internal/rules/declare.js.map +1 -0
- package/dist/internal/rules/engine.d.ts +125 -0
- package/dist/internal/rules/engine.d.ts.map +1 -0
- package/dist/internal/rules/engine.js +575 -0
- package/dist/internal/rules/engine.js.map +1 -0
- package/dist/internal/rules/index.d.ts +23 -0
- package/dist/internal/rules/index.d.ts.map +1 -0
- package/dist/internal/rules/index.js +21 -0
- package/dist/internal/rules/index.js.map +1 -0
- package/dist/internal/rules/rule.d.ts +88 -0
- package/dist/internal/rules/rule.d.ts.map +1 -0
- package/dist/internal/rules/rule.js +221 -0
- package/dist/internal/rules/rule.js.map +1 -0
- package/dist/internal/shape/check.d.ts +118 -0
- package/dist/internal/shape/check.d.ts.map +1 -0
- package/dist/internal/shape/check.js +331 -0
- package/dist/internal/shape/check.js.map +1 -0
- package/dist/internal/shape/client.d.ts +31 -0
- package/dist/internal/shape/client.d.ts.map +1 -0
- package/dist/internal/shape/client.js +170 -0
- package/dist/internal/shape/client.js.map +1 -0
- package/dist/internal/shape/gate.d.ts +33 -0
- package/dist/internal/shape/gate.d.ts.map +1 -0
- package/dist/internal/shape/gate.js +0 -0
- package/dist/internal/shape/gate.js.map +1 -0
- package/dist/internal/shape/index.d.ts +27 -0
- package/dist/internal/shape/index.d.ts.map +1 -0
- package/dist/internal/shape/index.js +23 -0
- package/dist/internal/shape/index.js.map +1 -0
- package/dist/internal/shape/suggest.d.ts +82 -0
- package/dist/internal/shape/suggest.d.ts.map +1 -0
- package/dist/internal/shape/suggest.js +374 -0
- package/dist/internal/shape/suggest.js.map +1 -0
- package/dist/internal/sync/index.d.ts +22 -0
- package/dist/internal/sync/index.d.ts.map +1 -0
- package/dist/internal/sync/index.js +21 -0
- package/dist/internal/sync/index.js.map +1 -0
- package/dist/internal/sync/sync.d.ts +95 -0
- package/dist/internal/sync/sync.d.ts.map +1 -0
- package/dist/internal/sync/sync.js +342 -0
- package/dist/internal/sync/sync.js.map +1 -0
- package/dist/internal/view/api.d.ts +196 -0
- package/dist/internal/view/api.d.ts.map +1 -0
- package/dist/internal/view/api.js +189 -0
- package/dist/internal/view/api.js.map +1 -0
- package/dist/internal/view/index.d.ts +33 -0
- package/dist/internal/view/index.d.ts.map +1 -0
- package/dist/internal/view/index.js +30 -0
- package/dist/internal/view/index.js.map +1 -0
- package/dist/internal/view/main.d.ts +11 -0
- package/dist/internal/view/main.d.ts.map +1 -0
- package/dist/internal/view/main.js +98 -0
- package/dist/internal/view/main.js.map +1 -0
- package/dist/internal/view/page.d.ts +14 -0
- package/dist/internal/view/page.d.ts.map +1 -0
- package/dist/internal/view/page.js +370 -0
- package/dist/internal/view/page.js.map +1 -0
- package/dist/internal/view/report.d.ts +52 -0
- package/dist/internal/view/report.d.ts.map +1 -0
- package/dist/internal/view/report.js +367 -0
- package/dist/internal/view/report.js.map +1 -0
- package/dist/internal/view/scope.d.ts +11 -0
- package/dist/internal/view/scope.d.ts.map +1 -0
- package/dist/internal/view/scope.js +41 -0
- package/dist/internal/view/scope.js.map +1 -0
- package/dist/internal/view/server.d.ts +35 -0
- package/dist/internal/view/server.d.ts.map +1 -0
- package/dist/internal/view/server.js +141 -0
- package/dist/internal/view/server.js.map +1 -0
- package/dist/src/act.d.ts +3 -0
- package/dist/src/act.d.ts.map +1 -0
- package/dist/src/act.js +3 -0
- package/dist/src/act.js.map +1 -0
- package/dist/src/automate.d.ts +3 -0
- package/dist/src/automate.d.ts.map +1 -0
- package/dist/src/automate.js +3 -0
- package/dist/src/automate.js.map +1 -0
- package/dist/src/cli.d.ts +24 -17
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +416 -109
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands.d.ts +104 -0
- package/dist/src/commands.d.ts.map +1 -0
- package/dist/src/commands.js +33 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/connect.d.ts +3 -0
- package/dist/src/connect.d.ts.map +1 -0
- package/dist/src/connect.js +3 -0
- package/dist/src/connect.js.map +1 -0
- package/dist/src/dispatch.d.ts +14 -0
- package/dist/src/dispatch.d.ts.map +1 -0
- package/dist/src/dispatch.js +116 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +45 -0
- package/dist/src/doctor.d.ts.map +1 -0
- package/dist/src/doctor.js +284 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/eval.d.ts +3 -0
- package/dist/src/eval.d.ts.map +1 -0
- package/dist/src/eval.js +3 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/ingest.d.ts +3 -0
- package/dist/src/ingest.d.ts.map +1 -0
- package/dist/src/ingest.js +3 -0
- package/dist/src/ingest.js.map +1 -0
- package/dist/src/loop.d.ts +3 -0
- package/dist/src/loop.d.ts.map +1 -0
- package/dist/src/loop.js +3 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/main.d.ts +1 -1
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +3 -75
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp.d.ts +3 -0
- package/dist/src/mcp.d.ts.map +1 -0
- package/dist/src/mcp.js +3 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/rules.d.ts +3 -0
- package/dist/src/rules.d.ts.map +1 -0
- package/dist/src/rules.js +3 -0
- package/dist/src/rules.js.map +1 -0
- package/dist/src/shape.d.ts +3 -0
- package/dist/src/shape.d.ts.map +1 -0
- package/dist/src/shape.js +3 -0
- package/dist/src/shape.js.map +1 -0
- package/dist/src/sync.d.ts +3 -0
- package/dist/src/sync.d.ts.map +1 -0
- package/dist/src/sync.js +3 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/view.d.ts +3 -0
- package/dist/src/view.d.ts.map +1 -0
- package/dist/src/view.js +3 -0
- package/dist/src/view.js.map +1 -0
- package/package.json +81 -21
- package/src/act.ts +2 -0
- package/src/automate.ts +2 -0
- package/src/cli.ts +423 -104
- package/src/commands.ts +48 -0
- package/src/connect.ts +2 -0
- package/src/dispatch.ts +141 -0
- package/src/doctor.ts +370 -0
- package/src/eval.ts +2 -0
- package/src/index.ts +9 -2
- package/src/ingest.ts +2 -0
- package/src/loop.ts +2 -0
- package/src/main.ts +3 -66
- package/src/mcp.ts +2 -0
- package/src/rules.ts +2 -0
- package/src/shape.ts +2 -0
- package/src/sync.ts +2 -0
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAG7C,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yFAqD2E,CAAA;AAEzF,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE,CACxC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAA;AAE/B,qDAAqD;AACrD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAsB,EAAE;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACjF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAC/E,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,EAAE,CAAA;AAElB,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,KAAwB,EAAY,EAAE,CAAC;IACxE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;IAC/D,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,KAAK,CAAC,MAAM,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;CACxF,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAY,EAAE;IACjD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,qBAAqB,IAAI,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,OAAO;QACL,qBAAqB,IAAI,EAAE;QAC3B,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,iBAAiB,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/E,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,oBAAoB,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;KAClF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,IAAe,EAAU,EAAE;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;IACzF,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAA;AACjG,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,IAAe,EAAE,KAAa,EAAE,KAAa,EAAE,UAAkB,EAAY,EAAE;IAChG,MAAM,IAAI,GAAG,SAAS,KAAK,IAAI,KAAK,IAAI,CAAA;IACxC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,IAAI,SAAS,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,eAAe,IAAI,CAAC,OAAO,UAAU;QAClE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC3D,MAAM,OAAO,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,aAAa,IAAI,UAAU,EAAE,CAAA;IACvF,OAAO;QACL,GAAG,IAAI,GAAG,MAAM,KAAK,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE;QAClD,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,OAAO,EAAE,CAAC;QAC1D,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,UAAU,EAAE,CAAC;QACzE,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QAClC,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QACnC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;KACrC,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,IAAU,EAAU,EAAE;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;IACzF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAA;IAC1F,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAA;AAC3G,CAAC,CAAA;AAED,oCAAoC;AACpC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAAc,EAAU,EAAE;IAC/C,MAAM,KAAK,GAAa;QACtB,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM,CAAC,IAAI,cAAc;QAClE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,OAAO,EAAE,CAAC;KACxD,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,gCAAgC,CAAC,CAAA;YACxD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,SAAQ;QACV,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,aAAa,CAAA;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAA;QACpG,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,mBAAmB,OAAO,KAAK,MAAM,EAAE,CAAC,CAAA;QAC/E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAChC,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAA;QACF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,gBAAgB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7G,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,UAAU,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;IAClF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAA;IACtE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACpC,wBAAwB,MAAM,GAAG,OAAO,EAAE,CAAC,CAAC;QAC5C,UAAU,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC,CAAA;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC,CAAA;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,GAAW,EAAW,EAAE;IAC/D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;IACjD,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAA;AAC3F,CAAC,CAAA;AAQD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAAuB,EAAE,UAAsB,EAAE,EAAmB,EAAE;IAClG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;IAC/C,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;IAChC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QACf,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC3B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACjC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAA;QAC1B,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,kEAAkE,KAAK,IAAI,CAAC,CAAA;QACzF,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,sDAAsD,MAAM,CAAC,IAAI,KAAK,CAAC,CAAA;QACpF,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC3F,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,mDAAmD,MAAM,CAAC,SAAS,KAAK,CAAC,CAAA;QACtF,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACzE,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,6CAA6C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAA;QAC1E,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxF,IAAI,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,mEAAmE,MAAM,CAAC,OAAO,KAAK,CAAC,CAAA;QACpG,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,IAAI,GAAS,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAA;IAC5D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC;QACvB,MAAM,EAAE,WAAW;QACnB,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QAC5D,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI;QAClC,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI;QAChC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,IAAI;QACxC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI;QAC1B,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QAC5D,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QACrC,GAAG,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;QACjF,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE;QAC/C,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE;KAC1D,CAAC,CAAA;IACF,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;IAChC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACjG,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC,CAAA"}
|
|
@@ -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":"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"}
|