@cavelang/cli 0.27.14 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +408 -107
- 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 +416 -102
- 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,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cave report` (spec §31) — templated markdown rendered from CAVE-Q
|
|
3
|
+
* results, claim keys as citations.
|
|
4
|
+
*
|
|
5
|
+
* A template is an ordinary markdown document with two live constructs:
|
|
6
|
+
*
|
|
7
|
+
* - a fenced ```cave-q block — first line a CAVE-Q pattern (§12.1),
|
|
8
|
+
* following `WHERE` lines its filters (§12.2), the rest a markdown
|
|
9
|
+
* fragment rendered once per solution with `?var` bindings
|
|
10
|
+
* substituted (no fragment: the solution as `cave query` prints it,
|
|
11
|
+
* as a cited bullet);
|
|
12
|
+
* - an inline `` `cave-q: <pattern>` `` splice — a code span of any
|
|
13
|
+
* delimiter length (```` ``cave-q: …`` ```` when the pattern carries a
|
|
14
|
+
* backtick code literal), exactly one variable, exactly one solution,
|
|
15
|
+
* replaced by the bound value; anything else is a problem (§25.2's
|
|
16
|
+
* determinism, and `--resolve` is the knob when sources contest the
|
|
17
|
+
* fact, §26).
|
|
18
|
+
*
|
|
19
|
+
* Every solution that matched a stored row cites it: `[^cN]` footnote
|
|
20
|
+
* markers land at the fragment's `[^?]` placeholder (appended when
|
|
21
|
+
* absent), and the definitions — the row's canonical line, tx date and
|
|
22
|
+
* claim key (§9.2) — collect at the end of the document, one per row.
|
|
23
|
+
* Everything else in the template passes through verbatim, other fenced
|
|
24
|
+
* blocks included.
|
|
25
|
+
*/
|
|
26
|
+
import { SourceSpan, Uuidv7 } from '@cavelang/core';
|
|
27
|
+
import { emitClaim } from '@cavelang/canonical';
|
|
28
|
+
import { Pattern, query } from '@cavelang/query';
|
|
29
|
+
import { Row } from '@cavelang/store';
|
|
30
|
+
import { Sensitivity } from '@cavelang/store';
|
|
31
|
+
import { withScopedStore } from "./scope.js";
|
|
32
|
+
/** The fragment's citation placeholder — replaced by the `[^cN]` marker. */
|
|
33
|
+
const placeholder = '[^?]';
|
|
34
|
+
/**
|
|
35
|
+
* The in-document marker for a block or splice whose query never ran —
|
|
36
|
+
* §31.3's contract: the document still emits, problems marked in place.
|
|
37
|
+
*/
|
|
38
|
+
const invalidQuery = '*(invalid query)*';
|
|
39
|
+
const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
40
|
+
/**
|
|
41
|
+
* Wraps store text as a Markdown code span that survives its own
|
|
42
|
+
* backticks: the delimiter outruns the longest run inside by one, and a
|
|
43
|
+
* space pads content that begins or ends with a backtick (CommonMark
|
|
44
|
+
* strips the pair back out).
|
|
45
|
+
*/
|
|
46
|
+
const toCodeSpan = (text) => {
|
|
47
|
+
const longest = Math.max(0, ...[...text.matchAll(/`+/g)].map(run => run[0].length));
|
|
48
|
+
const delimiter = '`'.repeat(longest + 1);
|
|
49
|
+
const pad = text.startsWith('`') || text.endsWith('`') ? ' ' : '';
|
|
50
|
+
return `${delimiter}${pad}${text}${pad}${delimiter}`;
|
|
51
|
+
};
|
|
52
|
+
const sourceLink = (reference) => reference.href === undefined ?
|
|
53
|
+
toCodeSpan(reference.location) :
|
|
54
|
+
`[${reference.location.replaceAll('[', '\\[').replaceAll(']', '\\]')}](<${reference.href.replaceAll('>', '%3E')}>)`;
|
|
55
|
+
/**
|
|
56
|
+
* Substitutes `?var` occurrences with bindings, longest names first so
|
|
57
|
+
* `?who` never clips `?who2`; a token no binding matches passes through
|
|
58
|
+
* untouched (fragments are prose — the §29.3 convention).
|
|
59
|
+
*/
|
|
60
|
+
const substitute = (fragment, bindings) => {
|
|
61
|
+
let text = fragment;
|
|
62
|
+
for (const name of Object.keys(bindings).sort((a, b) => b.length - a.length)) {
|
|
63
|
+
text = text.replace(new RegExp(`\\?${escapeRegExp(name)}(?![A-Za-z0-9_-])`, 'g'), () => bindings[name]);
|
|
64
|
+
}
|
|
65
|
+
return text;
|
|
66
|
+
};
|
|
67
|
+
/** Distinct `?var` names of a parsed pattern, in slot order. */
|
|
68
|
+
const variablesOf = (pattern) => {
|
|
69
|
+
const names = [];
|
|
70
|
+
const add = (slot) => {
|
|
71
|
+
if (slot.kind === 'var' && slot.name !== undefined && !names.includes(slot.name)) {
|
|
72
|
+
names.push(slot.name);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
add(pattern.subject);
|
|
76
|
+
add(pattern.verb);
|
|
77
|
+
if (pattern.payload.kind === 'object') {
|
|
78
|
+
add(pattern.payload.object);
|
|
79
|
+
}
|
|
80
|
+
else if (pattern.payload.kind === 'attribute') {
|
|
81
|
+
add(pattern.payload.value);
|
|
82
|
+
}
|
|
83
|
+
return names;
|
|
84
|
+
};
|
|
85
|
+
/** Fence line: ``` or ~~~ (3+, up to 3 leading spaces) plus an info string. */
|
|
86
|
+
const fenceRe = /^ {0,3}(`{3,}|~{3,})(.*)$/;
|
|
87
|
+
const closesFence = (line, fence) => {
|
|
88
|
+
const match = fenceRe.exec(line);
|
|
89
|
+
return match !== null &&
|
|
90
|
+
match[1][0] === fence[0] && match[1].length >= fence.length && match[2].trim() === '';
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* One query block (spec §31.1): pattern, `WHERE` filters, fragment.
|
|
94
|
+
* Renders one fragment instance per solution — the default fragment is
|
|
95
|
+
* the solution as `cave query` prints it, as a cited bullet.
|
|
96
|
+
*/
|
|
97
|
+
const renderBlock = (blockLines, startLine, renderer) => {
|
|
98
|
+
const lines = [...blockLines];
|
|
99
|
+
while (lines.length > 0 && lines[0].trim() === '') {
|
|
100
|
+
lines.shift();
|
|
101
|
+
startLine += 1;
|
|
102
|
+
}
|
|
103
|
+
if (lines.length === 0) {
|
|
104
|
+
renderer.problem(startLine, 'empty cave-q block — a CAVE-Q pattern is required (spec §31.1)');
|
|
105
|
+
return [invalidQuery];
|
|
106
|
+
}
|
|
107
|
+
const queryLines = [lines[0]];
|
|
108
|
+
let at = 1;
|
|
109
|
+
while (at < lines.length && lines[at].trim().startsWith('WHERE ')) {
|
|
110
|
+
queryLines.push(lines[at]);
|
|
111
|
+
at += 1;
|
|
112
|
+
}
|
|
113
|
+
const fragmentLines = lines.slice(at);
|
|
114
|
+
while (fragmentLines.length > 0 && fragmentLines[0].trim() === '') {
|
|
115
|
+
fragmentLines.shift();
|
|
116
|
+
}
|
|
117
|
+
const fragment = fragmentLines.some(line => line.trim() !== '') ? fragmentLines.join('\n') : undefined;
|
|
118
|
+
const matches = renderer.run(queryLines.join('\n'), startLine);
|
|
119
|
+
if (matches === undefined) {
|
|
120
|
+
return [invalidQuery];
|
|
121
|
+
}
|
|
122
|
+
const out = [];
|
|
123
|
+
for (const match of matches) {
|
|
124
|
+
let instance;
|
|
125
|
+
if (fragment === undefined) {
|
|
126
|
+
const bindings = Object.entries(match.bindings)
|
|
127
|
+
.map(([name, value]) => `?${name} = ${value}`)
|
|
128
|
+
.join(' ');
|
|
129
|
+
// A fully bound pattern has nothing to bind — the claim itself is
|
|
130
|
+
// the point (mirroring `cave query`'s rendering).
|
|
131
|
+
instance = `- ${bindings !== '' ? bindings : toCodeSpan(match.row?.raw_line ?? queryLines[0].trim())} ${placeholder}`;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
instance = substitute(fragment, match.bindings);
|
|
135
|
+
}
|
|
136
|
+
if (match.row !== undefined) {
|
|
137
|
+
const marker = renderer.cite(match.row);
|
|
138
|
+
if (instance.includes(placeholder)) {
|
|
139
|
+
instance = instance.replaceAll(placeholder, marker);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Append to the last non-blank line, so a paragraph fragment's
|
|
143
|
+
// trailing blank separator stays a separator.
|
|
144
|
+
const instanceLines = instance.split('\n');
|
|
145
|
+
for (let i = instanceLines.length - 1; i >= 0; i--) {
|
|
146
|
+
if (instanceLines[i].trim() !== '') {
|
|
147
|
+
instanceLines[i] = `${instanceLines[i]} ${marker}`;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
instance = instanceLines.join('\n');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Transitive solutions carry no row (§24.2's rule) — nothing to cite.
|
|
156
|
+
instance = instance.replace(/[ \t]*\[\^\?\]/g, '');
|
|
157
|
+
}
|
|
158
|
+
out.push(...instance.split('\n'));
|
|
159
|
+
}
|
|
160
|
+
return out;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Scans one line for Markdown code spans (CommonMark 6.1): a span opens
|
|
164
|
+
* with a backtick run and closes at the next run of exactly the same
|
|
165
|
+
* length — longer and shorter runs in between are content, an opener
|
|
166
|
+
* with no closer is literal text. Content that both begins and ends
|
|
167
|
+
* with a space (and isn't all spaces) loses one from each end, the
|
|
168
|
+
* escape hatch that lets content begin or end with a backtick.
|
|
169
|
+
*/
|
|
170
|
+
const codeSpans = (line) => {
|
|
171
|
+
const spans = [];
|
|
172
|
+
let at = 0;
|
|
173
|
+
while (at < line.length) {
|
|
174
|
+
const start = line.indexOf('`', at);
|
|
175
|
+
if (start === -1) {
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
let opened = start + 1;
|
|
179
|
+
while (opened < line.length && line[opened] === '`') {
|
|
180
|
+
opened += 1;
|
|
181
|
+
}
|
|
182
|
+
const length = opened - start;
|
|
183
|
+
let close = -1;
|
|
184
|
+
for (let search = opened; search < line.length;) {
|
|
185
|
+
const candidate = line.indexOf('`', search);
|
|
186
|
+
if (candidate === -1) {
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
let candidateEnd = candidate + 1;
|
|
190
|
+
while (candidateEnd < line.length && line[candidateEnd] === '`') {
|
|
191
|
+
candidateEnd += 1;
|
|
192
|
+
}
|
|
193
|
+
if (candidateEnd - candidate === length) {
|
|
194
|
+
close = candidate;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
search = candidateEnd;
|
|
198
|
+
}
|
|
199
|
+
if (close === -1) {
|
|
200
|
+
at = opened;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
let content = line.slice(opened, close);
|
|
204
|
+
if (content.startsWith(' ') && content.endsWith(' ') && /[^ ]/.test(content)) {
|
|
205
|
+
content = content.slice(1, -1);
|
|
206
|
+
}
|
|
207
|
+
spans.push({ start, end: close + length, content });
|
|
208
|
+
at = close + length;
|
|
209
|
+
}
|
|
210
|
+
return spans;
|
|
211
|
+
};
|
|
212
|
+
const splicePrefix = 'cave-q:';
|
|
213
|
+
/**
|
|
214
|
+
* One inline splice (spec §31.1): exactly one variable, exactly one
|
|
215
|
+
* solution — deterministic or nothing.
|
|
216
|
+
*/
|
|
217
|
+
const renderSplice = (patternText, lineNo, renderer) => {
|
|
218
|
+
let names;
|
|
219
|
+
try {
|
|
220
|
+
names = variablesOf(Pattern.parse(patternText));
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
renderer.problem(lineNo, error instanceof Error ? error.message : String(error));
|
|
224
|
+
return invalidQuery;
|
|
225
|
+
}
|
|
226
|
+
if (names.length !== 1) {
|
|
227
|
+
renderer.problem(lineNo, `an inline splice needs exactly one ?variable, got ${names.length} (spec §31.1)`);
|
|
228
|
+
return invalidQuery;
|
|
229
|
+
}
|
|
230
|
+
const matches = renderer.run(patternText, lineNo);
|
|
231
|
+
if (matches === undefined) {
|
|
232
|
+
return invalidQuery;
|
|
233
|
+
}
|
|
234
|
+
if (matches.length === 0) {
|
|
235
|
+
renderer.problem(lineNo, `no match for inline splice ${JSON.stringify(patternText.trim())}`);
|
|
236
|
+
return '*(no match)*';
|
|
237
|
+
}
|
|
238
|
+
if (matches.length > 1) {
|
|
239
|
+
renderer.problem(lineNo, `ambiguous inline splice ${JSON.stringify(patternText.trim())}: ${matches.length} matches — ` +
|
|
240
|
+
'several series contest the fact; --resolve picks the §26 winner');
|
|
241
|
+
return `*(ambiguous: ${matches.length} matches)*`;
|
|
242
|
+
}
|
|
243
|
+
const match = matches[0];
|
|
244
|
+
const value = match.bindings[names[0]];
|
|
245
|
+
return match.row === undefined ? value : `${value}${renderer.cite(match.row)}`;
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* Splices on one prose line: each code span whose content starts with
|
|
249
|
+
* `cave-q:` — whatever its delimiter length, so patterns may carry
|
|
250
|
+
* backtick code literals — is replaced by its splice rendering; other
|
|
251
|
+
* spans and the text between pass through untouched.
|
|
252
|
+
*/
|
|
253
|
+
const renderInline = (line, lineNo, renderer) => {
|
|
254
|
+
let out = '';
|
|
255
|
+
let at = 0;
|
|
256
|
+
for (const span of codeSpans(line)) {
|
|
257
|
+
out += line.slice(at, span.start);
|
|
258
|
+
out += span.content.startsWith(splicePrefix)
|
|
259
|
+
? renderSplice(span.content.slice(splicePrefix.length), lineNo, renderer)
|
|
260
|
+
: line.slice(span.start, span.end);
|
|
261
|
+
at = span.end;
|
|
262
|
+
}
|
|
263
|
+
return out + line.slice(at);
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* Renders a report template against a store (spec §31): markdown in,
|
|
267
|
+
* markdown out — query blocks and inline splices resolved, citations
|
|
268
|
+
* appended as footnote definitions. Problems don't stop the render;
|
|
269
|
+
* they mark the text and are returned with template line numbers.
|
|
270
|
+
*/
|
|
271
|
+
const renderReport = (store, template, options) => {
|
|
272
|
+
const problems = [];
|
|
273
|
+
/** Footnote number per cited row id — repeats share a marker. */
|
|
274
|
+
const numbers = new Map();
|
|
275
|
+
const definitions = [];
|
|
276
|
+
const cite = (row) => {
|
|
277
|
+
const existing = numbers.get(row.id);
|
|
278
|
+
if (existing !== undefined) {
|
|
279
|
+
return `[^c${existing}]`;
|
|
280
|
+
}
|
|
281
|
+
const number = numbers.size + 1;
|
|
282
|
+
numbers.set(row.id, number);
|
|
283
|
+
const contexts = store.db.prepare('SELECT context FROM cave_context WHERE claim_id = ?').all(row.id).map(entry => entry.context);
|
|
284
|
+
const tags = store.db.prepare('SELECT key, value FROM cave_tag WHERE claim_id = ?').all(row.id);
|
|
285
|
+
// The canonical line (§16's emitter over the stored row) rather than
|
|
286
|
+
// raw_line: §9.5 stamps live in the context table, and a citation
|
|
287
|
+
// must show provenance the authored abbreviation would hide.
|
|
288
|
+
const canonical = emitClaim(Row.toClaim(row, contexts, tags));
|
|
289
|
+
const date = new Date(Uuidv7.msOf(row.tx)).toISOString().slice(0, 10);
|
|
290
|
+
const spans = SourceSpan.ofContexts(contexts).filter(reference => reference.span !== undefined);
|
|
291
|
+
const provenance = spans.length === 0 ? '' : `, source ${spans.map(sourceLink).join(', ')}`;
|
|
292
|
+
definitions.push(`[^c${number}]: ${toCodeSpan(canonical)} — ${date}, claim key ${toCodeSpan(row.claim_key)}${provenance}`);
|
|
293
|
+
return `[^c${number}]`;
|
|
294
|
+
};
|
|
295
|
+
const renderer = {
|
|
296
|
+
cite,
|
|
297
|
+
problem: (line, message) => problems.push({ line, message }),
|
|
298
|
+
run: (queryText, line) => {
|
|
299
|
+
try {
|
|
300
|
+
return query(store, queryText, {
|
|
301
|
+
...options.aliases === true ? { aliases: true } : {},
|
|
302
|
+
...options.resolve === true ? { resolve: true } : {},
|
|
303
|
+
...options.asOf === undefined ? {} : { asOf: options.asOf },
|
|
304
|
+
...options.at === undefined ? {} : { at: options.at }
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
problems.push({ line, message: error instanceof Error ? error.message : String(error) });
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
const lines = template.split(/\r?\n/);
|
|
314
|
+
const out = [];
|
|
315
|
+
let at = 0;
|
|
316
|
+
while (at < lines.length) {
|
|
317
|
+
const line = lines[at];
|
|
318
|
+
const fence = fenceRe.exec(line);
|
|
319
|
+
if (fence !== null && fence[2].trim() !== '' && fence[2].trim().split(/\s+/)[0] === 'cave-q') {
|
|
320
|
+
const blockStart = at + 1;
|
|
321
|
+
const blockLines = [];
|
|
322
|
+
at += 1;
|
|
323
|
+
while (at < lines.length && !closesFence(lines[at], fence[1])) {
|
|
324
|
+
blockLines.push(lines[at]);
|
|
325
|
+
at += 1;
|
|
326
|
+
}
|
|
327
|
+
if (at >= lines.length) {
|
|
328
|
+
problems.push({ line: blockStart, message: 'unclosed cave-q block' });
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
at += 1; // the closing fence
|
|
332
|
+
}
|
|
333
|
+
out.push(...renderBlock(blockLines, blockStart + 1, renderer));
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (fence !== null) {
|
|
337
|
+
// Any other fenced block passes through verbatim — its content is
|
|
338
|
+
// code, so inline splices inside it never fire.
|
|
339
|
+
out.push(line);
|
|
340
|
+
at += 1;
|
|
341
|
+
while (at < lines.length) {
|
|
342
|
+
out.push(lines[at]);
|
|
343
|
+
if (closesFence(lines[at], fence[1])) {
|
|
344
|
+
at += 1;
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
at += 1;
|
|
348
|
+
}
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
out.push(renderInline(line, at + 1, renderer));
|
|
352
|
+
at += 1;
|
|
353
|
+
}
|
|
354
|
+
// One newline ends the document — the template's own EOF blank lines
|
|
355
|
+
// (and the split's trailing empty element) normalize away.
|
|
356
|
+
while (out.length > 0 && out[out.length - 1].trim() === '') {
|
|
357
|
+
out.pop();
|
|
358
|
+
}
|
|
359
|
+
if (definitions.length > 0) {
|
|
360
|
+
out.push('', ...definitions);
|
|
361
|
+
}
|
|
362
|
+
const body = out.join('\n');
|
|
363
|
+
const markdown = body === '' ? '' : `${body}\n`;
|
|
364
|
+
return { markdown, citations: definitions.length, problems };
|
|
365
|
+
};
|
|
366
|
+
export const report = (store, template, options = {}) => withScopedStore(store, options.maxSensitivity ?? Sensitivity.defaultMaximum, scoped => renderReport(scoped, template, options));
|
|
367
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Build a read-only sensitivity-scoped store snapshot for data-leaving views. */
|
|
2
|
+
import { Sensitivity } from '@cavelang/store';
|
|
3
|
+
import type { Store } from '@cavelang/store';
|
|
4
|
+
/**
|
|
5
|
+
* Runs `body` against rows at or below `maximum`. Restricted includes every
|
|
6
|
+
* row, so it can use the source directly; narrower views get an isolated
|
|
7
|
+
* in-memory store whose counts, aliases, history, search, and lineage cannot
|
|
8
|
+
* observe filtered rows indirectly.
|
|
9
|
+
*/
|
|
10
|
+
export declare const withScopedStore: <T>(source: Store, maximum: Sensitivity.Level, body: (store: Store) => T) => T;
|
|
11
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/scope.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAIlF,OAAO,EAAE,WAAW,EAAQ,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAO,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,QAAQ,KAAK,EAAE,SAAS,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,KAAG,CA8BzG,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Build a read-only sensitivity-scoped store snapshot for data-leaving views. */
|
|
2
|
+
import { Uuidv7 } from '@cavelang/core';
|
|
3
|
+
import { Sensitivity, open } from '@cavelang/store';
|
|
4
|
+
/**
|
|
5
|
+
* Runs `body` against rows at or below `maximum`. Restricted includes every
|
|
6
|
+
* row, so it can use the source directly; narrower views get an isolated
|
|
7
|
+
* in-memory store whose counts, aliases, history, search, and lineage cannot
|
|
8
|
+
* observe filtered rows indirectly.
|
|
9
|
+
*/
|
|
10
|
+
export const withScopedStore = (source, maximum, body) => {
|
|
11
|
+
if (maximum === 'restricted') {
|
|
12
|
+
return body(source);
|
|
13
|
+
}
|
|
14
|
+
return Uuidv7.withStatePreserved(() => {
|
|
15
|
+
const target = open(':memory:', { registry: source.baseRegistry() });
|
|
16
|
+
try {
|
|
17
|
+
const rows = source.db.prepare(`
|
|
18
|
+
SELECT c.* FROM cave_claim c
|
|
19
|
+
WHERE ${Sensitivity.sql('c', maximum)} ORDER BY c.tx
|
|
20
|
+
`).all();
|
|
21
|
+
const index = new Map(rows.map((row, at) => [row.id, at]));
|
|
22
|
+
const edges = source.db.prepare('SELECT parent_id, role, child_id FROM cave_edge ORDER BY rowid').all().flatMap(edge => {
|
|
23
|
+
const parent = index.get(edge.parent_id);
|
|
24
|
+
const child = index.get(edge.child_id);
|
|
25
|
+
return parent === undefined || child === undefined ? [] : [{ parent, role: edge.role, child }];
|
|
26
|
+
});
|
|
27
|
+
target.insertResult({
|
|
28
|
+
claims: rows.map(row => ({ claim: source.toClaim(row), line: 0 })),
|
|
29
|
+
edges,
|
|
30
|
+
registry: source.baseRegistry(),
|
|
31
|
+
problems: []
|
|
32
|
+
}, { ids: rows.map(row => row.id) });
|
|
33
|
+
target.reloadRegistry();
|
|
34
|
+
return body(target);
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
target.close();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/scope.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGnD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAI,MAAa,EAAE,OAA0B,EAAE,IAAyB,EAAK,EAAE;IAC5G,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QACpE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;;gBAErB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;OACtC,CAAC,CAAC,GAAG,EAAwB,CAAA;YAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1D,MAAM,KAAK,GAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,EAC1C,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACxE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACxC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACtC,OAAO,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YAChG,CAAC,CAAC,CAAA;YACJ,MAAM,CAAC,YAAY,CAAC;gBAClB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClE,KAAK;gBACL,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE;gBAC/B,QAAQ,EAAE,EAAE;aACb,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACpC,MAAM,CAAC,cAAc,EAAE,CAAA;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAA;QAChB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cave serve` (spec §30.3) — the store behind a local HTTP server: the
|
|
3
|
+
* §30.1 page at `/`, the §30.2 view models under `/api/*`. Strictly a
|
|
4
|
+
* read surface: only GET/HEAD are answered (anything else is 405), no
|
|
5
|
+
* route writes, and the page's CSP forbids every non-self source — the
|
|
6
|
+
* browser can render the store but never mutate it or leak it.
|
|
7
|
+
*
|
|
8
|
+
* Binds 127.0.0.1 by default: the store is one person's knowledge on
|
|
9
|
+
* one machine (§19), and serving it wider is an explicit `--host` act.
|
|
10
|
+
*/
|
|
11
|
+
import type { Server } from 'node:http';
|
|
12
|
+
import { Sensitivity } from '@cavelang/store';
|
|
13
|
+
import type { Store } from '@cavelang/store';
|
|
14
|
+
/** `cave` on a phone keypad. */
|
|
15
|
+
export declare const defaultPort = 2283;
|
|
16
|
+
export declare const defaultHost = "127.0.0.1";
|
|
17
|
+
export type ServeOptions = {
|
|
18
|
+
/** Interface to bind (default {@link defaultHost} — localhost only). */
|
|
19
|
+
readonly host?: string;
|
|
20
|
+
/** Port to bind (default {@link defaultPort}; `0` picks a free one). */
|
|
21
|
+
readonly port?: number;
|
|
22
|
+
/** Store label shown on the page — typically the `--db` path. */
|
|
23
|
+
readonly label?: string;
|
|
24
|
+
/** Highest sensitivity level served (default `internal`, spec §9.7). */
|
|
25
|
+
readonly maxSensitivity?: Sensitivity.Level;
|
|
26
|
+
};
|
|
27
|
+
export type Handle = {
|
|
28
|
+
/** The root URL actually bound, e.g. `http://127.0.0.1:2283/`. */
|
|
29
|
+
readonly url: string;
|
|
30
|
+
readonly server: Server;
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
};
|
|
33
|
+
/** Starts the read surface; resolves once the port is bound. */
|
|
34
|
+
export declare const serve: (store: Store, options?: ServeOptions) => Promise<Handle>;
|
|
35
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAmB,MAAM,EAAkB,MAAM,WAAW,CAAA;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAI5C,gCAAgC;AAChC,eAAO,MAAM,WAAW,OAAO,CAAA;AAC/B,eAAO,MAAM,WAAW,cAAc,CAAA;AAEtC,MAAM,MAAM,YAAY,GAAG;IACzB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,wEAAwE;IACxE,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,KAAK,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB,CAAA;AA+GD,gEAAgE;AAChE,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,EAAE,UAAS,YAAiB,KAAG,OAAO,CAAC,MAAM,CAsB9E,CAAA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cave serve` (spec §30.3) — the store behind a local HTTP server: the
|
|
3
|
+
* §30.1 page at `/`, the §30.2 view models under `/api/*`. Strictly a
|
|
4
|
+
* read surface: only GET/HEAD are answered (anything else is 405), no
|
|
5
|
+
* route writes, and the page's CSP forbids every non-self source — the
|
|
6
|
+
* browser can render the store but never mutate it or leak it.
|
|
7
|
+
*
|
|
8
|
+
* Binds 127.0.0.1 by default: the store is one person's knowledge on
|
|
9
|
+
* one machine (§19), and serving it wider is an explicit `--host` act.
|
|
10
|
+
*/
|
|
11
|
+
import { createServer } from 'node:http';
|
|
12
|
+
import { Version } from '@cavelang/core';
|
|
13
|
+
import { Sensitivity } from '@cavelang/store';
|
|
14
|
+
import { entity, history, lineage, overview, search, topic } from "./api.js";
|
|
15
|
+
import { page } from "./page.js";
|
|
16
|
+
/** `cave` on a phone keypad. */
|
|
17
|
+
export const defaultPort = 2283;
|
|
18
|
+
export const defaultHost = '127.0.0.1';
|
|
19
|
+
const escapeHtml = (text) => text.replace(/[&<>"']/g, char => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[char]);
|
|
20
|
+
const json = (res, status, body) => {
|
|
21
|
+
res.writeHead(status, {
|
|
22
|
+
'content-type': 'application/json; charset=utf-8',
|
|
23
|
+
'x-content-type-options': 'nosniff',
|
|
24
|
+
'cache-control': 'no-store'
|
|
25
|
+
});
|
|
26
|
+
res.end(JSON.stringify(body));
|
|
27
|
+
};
|
|
28
|
+
/** A required query parameter, `undefined` when absent or blank. */
|
|
29
|
+
const param = (url, name) => {
|
|
30
|
+
const value = url.searchParams.get(name);
|
|
31
|
+
return value === null || value === '' ? undefined : value;
|
|
32
|
+
};
|
|
33
|
+
const handler = (store, label, maximum) => {
|
|
34
|
+
const html = page
|
|
35
|
+
.replaceAll('__CAVE_DB__', escapeHtml(label))
|
|
36
|
+
.replaceAll('__CAVE_VERSION__', escapeHtml(Version.current()))
|
|
37
|
+
.replaceAll('__CAVE_SENSITIVITY__', escapeHtml(maximum));
|
|
38
|
+
return (req, res) => {
|
|
39
|
+
try {
|
|
40
|
+
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
41
|
+
res.writeHead(405, { allow: 'GET, HEAD', 'content-type': 'application/json; charset=utf-8' });
|
|
42
|
+
res.end(req.method === 'HEAD' ? undefined : JSON.stringify({ error: 'read-only surface — GET only (spec §30.3)' }));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const url = new URL(req.url ?? '/', 'http://cave.local');
|
|
46
|
+
const head = req.method === 'HEAD';
|
|
47
|
+
if (url.pathname === '/') {
|
|
48
|
+
res.writeHead(200, {
|
|
49
|
+
'content-type': 'text/html; charset=utf-8',
|
|
50
|
+
'x-content-type-options': 'nosniff',
|
|
51
|
+
'cache-control': 'no-store',
|
|
52
|
+
// Self-contained (spec §30.1): inline style/script, same-origin
|
|
53
|
+
// fetches, nothing else — the page cannot call out anywhere.
|
|
54
|
+
'content-security-policy': "default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; connect-src 'self'; img-src data:"
|
|
55
|
+
});
|
|
56
|
+
res.end(head ? undefined : html);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!url.pathname.startsWith('/api/')) {
|
|
60
|
+
json(res, 404, { error: `no such path: ${url.pathname}` });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const aliases = url.searchParams.get('aliases') === '1';
|
|
64
|
+
const body = (() => {
|
|
65
|
+
switch (url.pathname) {
|
|
66
|
+
case '/api/overview':
|
|
67
|
+
return { status: 200, body: { db: label, maxSensitivity: maximum, ...overview(store, { maxSensitivity: maximum }) } };
|
|
68
|
+
case '/api/entity': {
|
|
69
|
+
const name = param(url, 'name');
|
|
70
|
+
return name === undefined ?
|
|
71
|
+
{ status: 400, body: { error: 'entity requires ?name=' } } :
|
|
72
|
+
{ status: 200, body: entity(store, name, { aliases, maxSensitivity: maximum }) };
|
|
73
|
+
}
|
|
74
|
+
case '/api/topic': {
|
|
75
|
+
const name = param(url, 'name');
|
|
76
|
+
return name === undefined ?
|
|
77
|
+
{ status: 400, body: { error: 'topic requires ?name=' } } :
|
|
78
|
+
{ status: 200, body: topic(store, name, { aliases, maxSensitivity: maximum }) };
|
|
79
|
+
}
|
|
80
|
+
case '/api/history': {
|
|
81
|
+
const key = param(url, 'key');
|
|
82
|
+
if (key === undefined) {
|
|
83
|
+
return { status: 400, body: { error: 'history requires ?key=' } };
|
|
84
|
+
}
|
|
85
|
+
const series = history(store, key, { maxSensitivity: maximum });
|
|
86
|
+
return series.rows.length === 0 ?
|
|
87
|
+
{ status: 404, body: { error: `unknown claim key: ${key}` } } :
|
|
88
|
+
{ status: 200, body: series };
|
|
89
|
+
}
|
|
90
|
+
case '/api/lineage': {
|
|
91
|
+
const id = param(url, 'id');
|
|
92
|
+
if (id === undefined) {
|
|
93
|
+
return { status: 400, body: { error: 'lineage requires ?id=' } };
|
|
94
|
+
}
|
|
95
|
+
const tree = lineage(store, id, { maxSensitivity: maximum });
|
|
96
|
+
return tree === undefined ?
|
|
97
|
+
{ status: 404, body: { error: `unknown row id: ${id}` } } :
|
|
98
|
+
{ status: 200, body: tree };
|
|
99
|
+
}
|
|
100
|
+
case '/api/search': {
|
|
101
|
+
const text = param(url, 'q');
|
|
102
|
+
return text === undefined ?
|
|
103
|
+
{ status: 400, body: { error: 'search requires ?q=' } } :
|
|
104
|
+
{ status: 200, body: search(store, text, { maxSensitivity: maximum }) };
|
|
105
|
+
}
|
|
106
|
+
default:
|
|
107
|
+
return { status: 404, body: { error: `no such endpoint: ${url.pathname}` } };
|
|
108
|
+
}
|
|
109
|
+
})();
|
|
110
|
+
if (head) {
|
|
111
|
+
res.writeHead(body.status, { 'content-type': 'application/json; charset=utf-8' });
|
|
112
|
+
res.end();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
json(res, body.status, body.body);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
json(res, 500, { error: error instanceof Error ? error.message : String(error) });
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
/** Starts the read surface; resolves once the port is bound. */
|
|
123
|
+
export const serve = (store, options = {}) => {
|
|
124
|
+
const host = options.host ?? defaultHost;
|
|
125
|
+
const server = createServer(handler(store, options.label ?? 'cave.db', options.maxSensitivity ?? Sensitivity.defaultMaximum));
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
server.once('error', reject);
|
|
128
|
+
server.listen(options.port ?? defaultPort, host, () => {
|
|
129
|
+
const address = server.address();
|
|
130
|
+
const port = typeof address === 'object' && address !== null ? address.port : options.port ?? defaultPort;
|
|
131
|
+
// Bracket IPv6 hosts; the default is IPv4 loopback.
|
|
132
|
+
const shown = host.includes(':') ? `[${host}]` : host;
|
|
133
|
+
resolve({
|
|
134
|
+
url: `http://${shown}:${port}/`,
|
|
135
|
+
server,
|
|
136
|
+
close: () => new Promise((done, fail) => server.close(error => error === undefined ? done() : fail(error)))
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAA;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAA;AAoBtC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAC9B,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAE,CAAC,CAAA;AAErF,MAAM,IAAI,GAAG,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa,EAAQ,EAAE;IACxE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,iCAAiC;QACjD,wBAAwB,EAAE,SAAS;QACnC,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAA;IACF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,oEAAoE;AACpE,MAAM,KAAK,GAAG,CAAC,GAAQ,EAAE,IAAY,EAAsB,EAAE;IAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAA;AAC3D,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,KAAa,EAAE,OAA0B,EAAE,EAAE;IAC1E,MAAM,IAAI,GAAG,IAAI;SACd,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;SAC5C,UAAU,CAAC,kBAAkB,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;SAC7D,UAAU,CAAC,sBAAsB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D,OAAO,CAAC,GAAoB,EAAE,GAAmB,EAAQ,EAAE;QACzD,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,iCAAiC,EAAE,CAAC,CAAA;gBAC7F,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC,CAAA;gBACnH,OAAM;YACR,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,mBAAmB,CAAC,CAAA;YACxD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM,CAAA;YAClC,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,cAAc,EAAE,0BAA0B;oBAC1C,wBAAwB,EAAE,SAAS;oBACnC,eAAe,EAAE,UAAU;oBAC3B,gEAAgE;oBAChE,6DAA6D;oBAC7D,yBAAyB,EACvB,8GAA8G;iBACjH,CAAC,CAAA;gBACF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;gBAChC,OAAM;YACR,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,iBAAiB,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAC1D,OAAM;YACR,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAA;YACvD,MAAM,IAAI,GAAG,CAAC,GAAsC,EAAE;gBACpD,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACrB,KAAK,eAAe;wBAClB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAA;oBACvH,KAAK,aAAa,CAAC,CAAC,CAAC;wBACnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;wBAC/B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC;4BACzB,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;4BAC5D,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;oBACpF,CAAC;oBACD,KAAK,YAAY,CAAC,CAAC,CAAC;wBAClB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;wBAC/B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC;4BACzB,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;4BAC3D,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;oBACnF,CAAC;oBACD,KAAK,cAAc,CAAC,CAAC,CAAC;wBACpB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;wBAC7B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;4BACtB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAA;wBACnE,CAAC;wBACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAA;wBAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;4BAC/B,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,sBAAsB,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;4BAC/D,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;oBACjC,CAAC;oBACD,KAAK,cAAc,CAAC,CAAC,CAAC;wBACpB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;wBAC3B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;4BACrB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,CAAA;wBAClE,CAAC;wBACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAA;wBAC5D,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC;4BACzB,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;4BAC3D,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;oBAC/B,CAAC;oBACD,KAAK,aAAa,CAAC,CAAC,CAAC;wBACnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;wBAC5B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC;4BACzB,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;4BACzD,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;oBAC3E,CAAC;oBACD;wBACE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,qBAAqB,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAA;gBAChF,CAAC;YACH,CAAC,CAAC,EAAE,CAAA;YACJ,IAAI,IAAI,EAAE,CAAC;gBACT,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,CAAC,CAAA;gBACjF,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,OAAM;YACR,CAAC;YACD,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACnF,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,UAAwB,EAAE,EAAmB,EAAE;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAA;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CACjC,KAAK,EACL,OAAO,CAAC,KAAK,IAAI,SAAS,EAC1B,OAAO,CAAC,cAAc,IAAI,WAAW,CAAC,cAAc,CACrD,CAAC,CAAA;IACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE;YACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;YAChC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAA;YACzG,oDAAoD;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;YACrD,OAAO,CAAC;gBACN,GAAG,EAAE,UAAU,KAAK,IAAI,IAAI,GAAG;gBAC/B,MAAM;gBACN,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAC5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aACrE,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|