aontu 0.52.1 → 0.54.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/README.md +88 -0
- package/bin/aontu-mcp.js +4 -0
- package/dist/agentsmd.d.ts +16 -0
- package/dist/agentsmd.js +107 -0
- package/dist/agentsmd.js.map +1 -0
- package/dist/aontu.d.ts +15 -3
- package/dist/aontu.js +126 -5
- package/dist/aontu.js.map +1 -1
- package/dist/cli.d.ts +45 -1
- package/dist/cli.js +2845 -69
- package/dist/cli.js.map +1 -1
- package/dist/ctx.d.ts +18 -0
- package/dist/ctx.js +44 -0
- package/dist/ctx.js.map +1 -1
- package/dist/diff.d.ts +22 -0
- package/dist/diff.js +141 -0
- package/dist/diff.js.map +1 -0
- package/dist/err.d.ts +3 -1
- package/dist/err.js +45 -8
- package/dist/err.js.map +1 -1
- package/dist/graph.d.ts +13 -0
- package/dist/graph.js +110 -0
- package/dist/graph.js.map +1 -0
- package/dist/hcanon.d.ts +3 -0
- package/dist/hcanon.js +145 -0
- package/dist/hcanon.js.map +1 -0
- package/dist/hints.js +235 -8
- package/dist/hints.js.map +1 -1
- package/dist/jsonschema.d.ts +20 -0
- package/dist/jsonschema.js +425 -0
- package/dist/jsonschema.js.map +1 -0
- package/dist/lang.js +955 -110
- package/dist/lang.js.map +1 -1
- package/dist/lsp.d.ts +9 -2
- package/dist/lsp.js +343 -48
- package/dist/lsp.js.map +1 -1
- package/dist/mcp-server.d.ts +20 -0
- package/dist/mcp-server.js +147 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp.d.ts +42 -0
- package/dist/mcp.js +941 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mod-tool.d.ts +58 -0
- package/dist/mod-tool.js +532 -0
- package/dist/mod-tool.js.map +1 -0
- package/dist/mod.d.ts +35 -0
- package/dist/mod.js +345 -0
- package/dist/mod.js.map +1 -0
- package/dist/patch.d.ts +49 -0
- package/dist/patch.js +506 -0
- package/dist/patch.js.map +1 -0
- package/dist/provenance.d.ts +41 -0
- package/dist/provenance.js +336 -0
- package/dist/provenance.js.map +1 -0
- package/dist/query.d.ts +27 -0
- package/dist/query.js +294 -0
- package/dist/query.js.map +1 -0
- package/dist/reach.d.ts +15 -0
- package/dist/reach.js +168 -0
- package/dist/reach.js.map +1 -0
- package/dist/relation.d.ts +23 -0
- package/dist/relation.js +230 -0
- package/dist/relation.js.map +1 -0
- package/dist/report-sarif.d.ts +14 -0
- package/dist/report-sarif.js +102 -0
- package/dist/report-sarif.js.map +1 -0
- package/dist/sig.d.ts +25 -0
- package/dist/sig.js +277 -0
- package/dist/sig.js.map +1 -0
- package/dist/sigdecl.d.ts +2 -0
- package/dist/sigdecl.js +11 -0
- package/dist/sigdecl.js.map +1 -0
- package/dist/siggate.d.ts +4 -0
- package/dist/siggate.js +90 -0
- package/dist/siggate.js.map +1 -0
- package/dist/site.d.ts +4 -0
- package/dist/site.js +31 -0
- package/dist/site.js.map +1 -1
- package/dist/std.d.ts +1 -0
- package/dist/std.js +129 -0
- package/dist/std.js.map +1 -0
- package/dist/subsume.d.ts +39 -0
- package/dist/subsume.js +573 -0
- package/dist/subsume.js.map +1 -0
- package/dist/trim.d.ts +19 -0
- package/dist/trim.js +155 -0
- package/dist/trim.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/type.d.ts +17 -1
- package/dist/type.js.map +1 -1
- package/dist/unify.d.ts +2 -1
- package/dist/unify.js +234 -38
- package/dist/unify.js.map +1 -1
- package/dist/utility.d.ts +8 -1
- package/dist/utility.js +68 -1
- package/dist/utility.js.map +1 -1
- package/dist/val/AggFuncVal.d.ts +44 -0
- package/dist/val/AggFuncVal.js +364 -0
- package/dist/val/AggFuncVal.js.map +1 -0
- package/dist/val/ArithFuncVal.d.ts +31 -0
- package/dist/val/ArithFuncVal.js +62 -0
- package/dist/val/ArithFuncVal.js.map +1 -0
- package/dist/val/BagVal.d.ts +7 -0
- package/dist/val/BagVal.js +150 -11
- package/dist/val/BagVal.js.map +1 -1
- package/dist/val/CloseFuncVal.js +9 -1
- package/dist/val/CloseFuncVal.js.map +1 -1
- package/dist/val/ConjunctVal.d.ts +1 -1
- package/dist/val/ConjunctVal.js +19 -0
- package/dist/val/ConjunctVal.js.map +1 -1
- package/dist/val/ConstraintVal.d.ts +7 -1
- package/dist/val/ConstraintVal.js +523 -45
- package/dist/val/ConstraintVal.js.map +1 -1
- package/dist/val/ContainerKindVal.d.ts +35 -0
- package/dist/val/ContainerKindVal.js +99 -0
- package/dist/val/ContainerKindVal.js.map +1 -0
- package/dist/val/CopyFuncVal.d.ts +1 -2
- package/dist/val/CopyFuncVal.js.map +1 -1
- package/dist/val/Decimal.d.ts +1 -0
- package/dist/val/Decimal.js +13 -0
- package/dist/val/Decimal.js.map +1 -1
- package/dist/val/DeprecateFuncVal.d.ts +11 -0
- package/dist/val/DeprecateFuncVal.js +47 -0
- package/dist/val/DeprecateFuncVal.js.map +1 -0
- package/dist/val/DisjunctVal.d.ts +1 -2
- package/dist/val/DisjunctVal.js +269 -53
- package/dist/val/DisjunctVal.js.map +1 -1
- package/dist/val/EachFuncVal.d.ts +15 -0
- package/dist/val/EachFuncVal.js +75 -0
- package/dist/val/EachFuncVal.js.map +1 -0
- package/dist/val/ExpectVal.js +62 -4
- package/dist/val/ExpectVal.js.map +1 -1
- package/dist/val/FeatureVal.js +1 -1
- package/dist/val/FeatureVal.js.map +1 -1
- package/dist/val/FilterFuncVal.d.ts +15 -0
- package/dist/val/FilterFuncVal.js +91 -0
- package/dist/val/FilterFuncVal.js.map +1 -0
- package/dist/val/FuncBaseVal.d.ts +7 -1
- package/dist/val/FuncBaseVal.js +183 -2
- package/dist/val/FuncBaseVal.js.map +1 -1
- package/dist/val/GraphAtomVal.d.ts +39 -0
- package/dist/val/GraphAtomVal.js +184 -0
- package/dist/val/GraphAtomVal.js.map +1 -0
- package/dist/val/HideFuncVal.js.map +1 -1
- package/dist/val/JunctionVal.js +24 -1
- package/dist/val/JunctionVal.js.map +1 -1
- package/dist/val/KeyFuncVal.d.ts +1 -1
- package/dist/val/KeyFuncVal.js +38 -30
- package/dist/val/KeyFuncVal.js.map +1 -1
- package/dist/val/ListVal.js +94 -14
- package/dist/val/ListVal.js.map +1 -1
- package/dist/val/LowerFuncVal.js.map +1 -1
- package/dist/val/MapVal.d.ts +1 -0
- package/dist/val/MapVal.js +146 -14
- package/dist/val/MapVal.js.map +1 -1
- package/dist/val/MatchFuncVal.d.ts +15 -0
- package/dist/val/MatchFuncVal.js +107 -0
- package/dist/val/MatchFuncVal.js.map +1 -0
- package/dist/val/MoveFuncVal.js.map +1 -1
- package/dist/val/NilVal.js +24 -0
- package/dist/val/NilVal.js.map +1 -1
- package/dist/val/OpBaseVal.d.ts +1 -1
- package/dist/val/OpBaseVal.js +19 -1
- package/dist/val/OpBaseVal.js.map +1 -1
- package/dist/val/OpenFuncVal.js +4 -1
- package/dist/val/OpenFuncVal.js.map +1 -1
- package/dist/val/PackFuncVal.d.ts +15 -0
- package/dist/val/PackFuncVal.js +108 -0
- package/dist/val/PackFuncVal.js.map +1 -0
- package/dist/val/PathFuncVal.d.ts +2 -2
- package/dist/val/PathFuncVal.js +75 -16
- package/dist/val/PathFuncVal.js.map +1 -1
- package/dist/val/PathVal.d.ts +25 -0
- package/dist/val/PathVal.js +150 -0
- package/dist/val/PathVal.js.map +1 -0
- package/dist/val/PlaceVal.d.ts +13 -0
- package/dist/val/PlaceVal.js +131 -0
- package/dist/val/PlaceVal.js.map +1 -0
- package/dist/val/PlusOpVal.d.ts +2 -1
- package/dist/val/PlusOpVal.js +61 -37
- package/dist/val/PlusOpVal.js.map +1 -1
- package/dist/val/PrefFuncVal.js.map +1 -1
- package/dist/val/PrefVal.d.ts +4 -2
- package/dist/val/PrefVal.js +223 -41
- package/dist/val/PrefVal.js.map +1 -1
- package/dist/val/RecurseVal.d.ts +19 -0
- package/dist/val/RecurseVal.js +217 -0
- package/dist/val/RecurseVal.js.map +1 -0
- package/dist/val/RefVal.d.ts +3 -2
- package/dist/val/RefVal.js +181 -66
- package/dist/val/RefVal.js.map +1 -1
- package/dist/val/ReferFuncVal.d.ts +59 -0
- package/dist/val/ReferFuncVal.js +604 -0
- package/dist/val/ReferFuncVal.js.map +1 -0
- package/dist/val/ScalarKindVal.d.ts +4 -3
- package/dist/val/ScalarKindVal.js +12 -12
- package/dist/val/ScalarKindVal.js.map +1 -1
- package/dist/val/SuperFuncVal.d.ts +4 -2
- package/dist/val/SuperFuncVal.js +118 -14
- package/dist/val/SuperFuncVal.js.map +1 -1
- package/dist/val/TopVal.d.ts +1 -1
- package/dist/val/TopVal.js.map +1 -1
- package/dist/val/TypeFuncVal.js.map +1 -1
- package/dist/val/UpperFuncVal.js.map +1 -1
- package/dist/val/Val.d.ts +7 -1
- package/dist/val/Val.js +170 -2
- package/dist/val/Val.js.map +1 -1
- package/dist/val/VarVal.js.map +1 -1
- package/dist/val/arith.d.ts +6 -0
- package/dist/val/arith.js +173 -0
- package/dist/val/arith.js.map +1 -0
- package/dist/vet.d.ts +45 -0
- package/dist/vet.js +802 -0
- package/dist/vet.js.map +1 -0
- package/dist/view.d.ts +85 -0
- package/dist/view.js +1948 -0
- package/dist/view.js.map +1 -0
- package/dist/walk.d.ts +2 -0
- package/dist/walk.js +91 -0
- package/dist/walk.js.map +1 -0
- package/grammar/aontu.gbnf +138 -0
- package/grammar/aontu.lark +118 -0
- package/grammar/aontu.tmLanguage.json +184 -0
- package/package.json +30 -8
- package/skill/SKILL.md +37 -0
- package/skill/error-codes.md +62 -0
- package/skill/examples.md +99 -0
- package/skill/grammar-card.md +56 -0
- package/src/agentsmd.ts +135 -0
- package/src/aontu.ts +166 -5
- package/src/cli.ts +3324 -72
- package/src/ctx.ts +93 -1
- package/src/diff.ts +198 -0
- package/src/err.ts +50 -8
- package/src/graph.ts +185 -0
- package/src/hcanon.ts +167 -0
- package/src/hints.ts +291 -8
- package/src/jsonschema.ts +552 -0
- package/src/lang.ts +1049 -110
- package/src/lsp.ts +351 -49
- package/src/mcp-server.ts +187 -0
- package/src/mcp.ts +1130 -0
- package/src/mod-tool.ts +718 -0
- package/src/mod.ts +453 -0
- package/src/patch.ts +628 -0
- package/src/provenance.ts +437 -0
- package/src/query.ts +381 -0
- package/src/reach.ts +213 -0
- package/src/relation.ts +298 -0
- package/src/report-sarif.ts +137 -0
- package/src/sig.ts +345 -0
- package/src/sigdecl.ts +11 -0
- package/src/siggate.ts +144 -0
- package/src/site.ts +36 -1
- package/src/std.ts +131 -0
- package/src/subsume.ts +739 -0
- package/src/trim.ts +195 -0
- package/src/tsconfig.json +10 -4
- package/src/type.ts +51 -2
- package/src/unify.ts +253 -38
- package/src/utility.ts +79 -1
- package/src/val/AggFuncVal.ts +546 -0
- package/src/val/ArithFuncVal.ts +108 -0
- package/src/val/BagVal.ts +158 -12
- package/src/val/CloseFuncVal.ts +9 -1
- package/src/val/ConjunctVal.ts +20 -0
- package/src/val/ConstraintVal.ts +576 -48
- package/src/val/ContainerKindVal.ts +158 -0
- package/src/val/CopyFuncVal.ts +0 -1
- package/src/val/Decimal.ts +15 -0
- package/src/val/DeprecateFuncVal.ts +84 -0
- package/src/val/DisjunctVal.ts +282 -59
- package/src/val/EachFuncVal.ts +133 -0
- package/src/val/ExpectVal.ts +65 -8
- package/src/val/FeatureVal.ts +1 -1
- package/src/val/FilterFuncVal.ts +154 -0
- package/src/val/FuncBaseVal.ts +206 -2
- package/src/val/GraphAtomVal.ts +264 -0
- package/src/val/HideFuncVal.ts +0 -2
- package/src/val/JunctionVal.ts +24 -1
- package/src/val/KeyFuncVal.ts +39 -35
- package/src/val/ListVal.ts +101 -15
- package/src/val/LowerFuncVal.ts +0 -1
- package/src/val/MapVal.ts +153 -14
- package/src/val/MatchFuncVal.ts +176 -0
- package/src/val/MoveFuncVal.ts +0 -2
- package/src/val/NilVal.ts +25 -0
- package/src/val/OpBaseVal.ts +20 -1
- package/src/val/OpenFuncVal.ts +4 -2
- package/src/val/PackFuncVal.ts +175 -0
- package/src/val/PathFuncVal.ts +107 -20
- package/src/val/PathVal.ts +221 -0
- package/src/val/PlaceVal.ts +193 -0
- package/src/val/PlusOpVal.ts +67 -39
- package/src/val/PrefFuncVal.ts +0 -1
- package/src/val/PrefVal.ts +251 -60
- package/src/val/RecurseVal.ts +285 -0
- package/src/val/RefVal.ts +183 -78
- package/src/val/ReferFuncVal.ts +732 -0
- package/src/val/ScalarKindVal.ts +12 -13
- package/src/val/SuperFuncVal.ts +137 -13
- package/src/val/TopVal.ts +1 -2
- package/src/val/TypeFuncVal.ts +0 -2
- package/src/val/UpperFuncVal.ts +0 -1
- package/src/val/Val.ts +216 -4
- package/src/val/VarVal.ts +0 -1
- package/src/val/arith.ts +319 -0
- package/src/vet.ts +1025 -0
- package/src/view.ts +2563 -0
- package/src/walk.ts +99 -0
package/dist/query.js
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Richard Rodger, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.nearestKey = nearestKey;
|
|
5
|
+
exports.pathParts = pathParts;
|
|
6
|
+
exports.projectFor = projectFor;
|
|
7
|
+
exports.evalFailure = evalFailure;
|
|
8
|
+
exports.noPathFinding = noPathFinding;
|
|
9
|
+
exports.get = get;
|
|
10
|
+
exports.why = why;
|
|
11
|
+
// THE QUERY SURFACE (G7 phase 1,
|
|
12
|
+
// docs/capability-review/g7-machine-access.md): select one node of an
|
|
13
|
+
// evaluated document by path and render it — the slice an agent asks
|
|
14
|
+
// for, instead of the whole file as one JSON blob.
|
|
15
|
+
//
|
|
16
|
+
// Evaluation is still GLOBAL. Unification has no partial mode to sell:
|
|
17
|
+
// the whole document is evaluated and then one node is selected. What
|
|
18
|
+
// `get` buys is the SIZE OF THE ANSWER, not the cost of producing it.
|
|
19
|
+
//
|
|
20
|
+
// The three projections are lattice ABSTRACTIONS, and each is defined
|
|
21
|
+
// so that the view it prints is a valid Aontu document that SUBSUMES
|
|
22
|
+
// the truth — generalisation, never distortion:
|
|
23
|
+
//
|
|
24
|
+
// - `types` replaces every concrete leaf with its own kind, using
|
|
25
|
+
// the lattice's own superior() rather than a table of this file's
|
|
26
|
+
// opinions: {"replicas":3} becomes {"replicas":integer}.
|
|
27
|
+
// - `depth n` keeps structure to depth n and renders every elided
|
|
28
|
+
// subtree as `top` — "no further information at this tier".
|
|
29
|
+
// - `keys` is `depth 1` degenerated to a listing.
|
|
30
|
+
//
|
|
31
|
+
// That property is not a promise here: every projection row of
|
|
32
|
+
// test/spec/query.tsv asserts subsume(view, truth) == 'subsumes' in
|
|
33
|
+
// both runners, which G3 made mechanically checkable.
|
|
34
|
+
//
|
|
35
|
+
// Projections are NOT canonical form and are never fed to G6's hash,
|
|
36
|
+
// which is why they are named views rather than spellings of --canon.
|
|
37
|
+
const aontu_1 = require("./aontu");
|
|
38
|
+
const exactjson_1 = require("./exactjson");
|
|
39
|
+
const vet_1 = require("./vet");
|
|
40
|
+
const keyorder_1 = require("./keyorder");
|
|
41
|
+
const provenance_1 = require("./provenance");
|
|
42
|
+
const TOP = 'top';
|
|
43
|
+
// The nearest key at the parent of a path that named nothing, by a
|
|
44
|
+
// plain edit distance over the sibling names — the "did you mean"
|
|
45
|
+
// half of the no_path contract. Undefined when nothing is close
|
|
46
|
+
// enough to be worth suggesting.
|
|
47
|
+
function nearestKey(want, have) {
|
|
48
|
+
let best;
|
|
49
|
+
let bestd = Infinity;
|
|
50
|
+
for (const k of have) {
|
|
51
|
+
const d = editDistance(want, k);
|
|
52
|
+
if (d < bestd) {
|
|
53
|
+
bestd = d;
|
|
54
|
+
best = k;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Half the name may differ, no more: past that the suggestion is
|
|
58
|
+
// noise, and a wrong suggestion costs more than none.
|
|
59
|
+
return bestd <= Math.max(1, Math.floor(want.length / 2)) ? best : undefined;
|
|
60
|
+
}
|
|
61
|
+
function editDistance(a, b) {
|
|
62
|
+
const prev = [];
|
|
63
|
+
for (let j = 0; j <= b.length; j++) {
|
|
64
|
+
prev[j] = j;
|
|
65
|
+
}
|
|
66
|
+
for (let i = 1; i <= a.length; i++) {
|
|
67
|
+
let diag = prev[0];
|
|
68
|
+
prev[0] = i;
|
|
69
|
+
for (let j = 1; j <= b.length; j++) {
|
|
70
|
+
const tmp = prev[j];
|
|
71
|
+
prev[j] = Math.min(prev[j] + 1, prev[j - 1] + 1, diag + (a[i - 1] === b[j - 1] ? 0 : 1));
|
|
72
|
+
diag = tmp;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return prev[b.length];
|
|
76
|
+
}
|
|
77
|
+
// The path split anchorAt walks: `$` and empty segments dropped, so
|
|
78
|
+
// `$`, `$.` and `` all name the root.
|
|
79
|
+
function pathParts(path) {
|
|
80
|
+
const trimmed = path.startsWith('$') ? path.slice(1) : path;
|
|
81
|
+
return trimmed.split('.').filter((p) => '' !== p);
|
|
82
|
+
}
|
|
83
|
+
// The queried path, normalised the way anchorAt reads it — so a
|
|
84
|
+
// finding names `$.a.b` whether the caller wrote that, `a.b` or
|
|
85
|
+
// `$.a.b.` — and `$` for the root.
|
|
86
|
+
function pathText(path) {
|
|
87
|
+
const parts = pathParts(path);
|
|
88
|
+
return '$' + (0 < parts.length ? '.' + parts.join('.') : '');
|
|
89
|
+
}
|
|
90
|
+
// The projection walk, exported for the direct unit tests (ADR-002,
|
|
91
|
+
// ts/test/coverage3.test.ts): a junction member that is itself a
|
|
92
|
+
// junction of more than one term keeps its parens, and no SOURCE
|
|
93
|
+
// reaches that arm because norm flattens junctions at unification.
|
|
94
|
+
function projectFor(v, view, depth) {
|
|
95
|
+
return project(v, view, depth);
|
|
96
|
+
}
|
|
97
|
+
// The canon-shaped views. One walk, two knobs: `types` generalises
|
|
98
|
+
// each leaf through the lattice, `depth` elides below its level. Bags
|
|
99
|
+
// recurse (their canon getters would render children through plain
|
|
100
|
+
// canon, which neither knob can reach); everything else is a leaf.
|
|
101
|
+
function project(v, view, depth) {
|
|
102
|
+
if (depth <= 0) {
|
|
103
|
+
return TOP;
|
|
104
|
+
}
|
|
105
|
+
if (true === v?.isMap) {
|
|
106
|
+
const keys = Object.keys(v.peg).sort(keyorder_1.cmpCodePoint);
|
|
107
|
+
return '{' +
|
|
108
|
+
(v.spread.cj ? '&:' + project(v.spread.cj, view, depth - 1) +
|
|
109
|
+
(0 < keys.length ? ',' : '') : '') +
|
|
110
|
+
keys.map((k) => JSON.stringify(k) +
|
|
111
|
+
(v.optionalKeys.includes(k) ? '?' : '') +
|
|
112
|
+
':' +
|
|
113
|
+
project(v.peg[k], view, depth - 1)).join(',') +
|
|
114
|
+
'}';
|
|
115
|
+
}
|
|
116
|
+
if (true === v?.isList) {
|
|
117
|
+
const keys = Object.keys(v.peg);
|
|
118
|
+
return '[' +
|
|
119
|
+
(v.spread.cj ? '&:' + project(v.spread.cj, view, depth - 1) +
|
|
120
|
+
(0 < keys.length ? ',' : '') : '') +
|
|
121
|
+
keys.map((k) => project(v.peg[k], view, depth - 1)).join(',') +
|
|
122
|
+
']';
|
|
123
|
+
}
|
|
124
|
+
// Junctions and prefs are TRANSPARENT: not a structural tier (so
|
|
125
|
+
// they do not spend a level of depth) but not a leaf either (so
|
|
126
|
+
// `*8080|integer` generalises to `*integer|integer` rather than
|
|
127
|
+
// collapsing to `top` and throwing the alternatives away).
|
|
128
|
+
if (true === v?.isPref) {
|
|
129
|
+
return '*' + project(v.peg, view, depth);
|
|
130
|
+
}
|
|
131
|
+
if (true === v?.isConjunct || true === v?.isDisjunct) {
|
|
132
|
+
return v.peg.map((m) => true === m?.isJunction && 1 < m.peg.length
|
|
133
|
+
? '(' + project(m, view, depth) + ')'
|
|
134
|
+
: project(m, view, depth))
|
|
135
|
+
.join(true === v.isConjunct ? '&' : '|');
|
|
136
|
+
}
|
|
137
|
+
// A LEAF. Under `types` a CONCRETE scalar lifts to its own kind —
|
|
138
|
+
// superior() is the lattice's answer, so the view subsumes the truth
|
|
139
|
+
// by construction and not by this file's good intentions. Everything
|
|
140
|
+
// else is already an abstraction (a kind marker, a constraint, an
|
|
141
|
+
// unresolved reference) and is left alone: lifting `integer` to
|
|
142
|
+
// `number` would generalise a shape view that was already a shape.
|
|
143
|
+
return 'types' === view && true === v?.isScalar ? v.superior().canon : v.canon;
|
|
144
|
+
}
|
|
145
|
+
// The `keys` listing: the node's own key names (or list indices), one
|
|
146
|
+
// per line, code-point ordered as canon orders them. A leaf has none,
|
|
147
|
+
// which is an empty answer rather than an error — "nothing below
|
|
148
|
+
// here" is a true statement about a scalar.
|
|
149
|
+
function keyList(v) {
|
|
150
|
+
if (true === v?.isMap) {
|
|
151
|
+
return Object.keys(v.peg).sort(keyorder_1.cmpCodePoint).join('\n');
|
|
152
|
+
}
|
|
153
|
+
if (true === v?.isList) {
|
|
154
|
+
return Object.keys(v.peg).join('\n');
|
|
155
|
+
}
|
|
156
|
+
return '';
|
|
157
|
+
}
|
|
158
|
+
function finding(code, path, message, note) {
|
|
159
|
+
return {
|
|
160
|
+
code,
|
|
161
|
+
class: 'reference',
|
|
162
|
+
severity: 'error',
|
|
163
|
+
path,
|
|
164
|
+
message,
|
|
165
|
+
sites: [],
|
|
166
|
+
...(null == note ? {} : { note }),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// A document that does not stand up has no node to select. The
|
|
170
|
+
// engine's own first error IS the report: the query surface adds
|
|
171
|
+
// nothing to a diagnosis the evaluator already made. The path is the
|
|
172
|
+
// DOCUMENT — what failed is the whole thing standing up, not the node
|
|
173
|
+
// the caller asked about, which may never have existed.
|
|
174
|
+
function evalFailure(ctx) {
|
|
175
|
+
// ctx.err is never empty at a call site: every failure that reaches
|
|
176
|
+
// one collected an error first — a parse that did not stand up, a
|
|
177
|
+
// root that came back nil. Not coalesced, on the vet siteOf
|
|
178
|
+
// precedent: an impossible state should fail loudly rather than be
|
|
179
|
+
// quietly papered over with a made-up code.
|
|
180
|
+
const err = ctx.err[0];
|
|
181
|
+
return finding(err.why, '$', err.msg);
|
|
182
|
+
}
|
|
183
|
+
// The refusal for a path that names nothing, shared by `get` and
|
|
184
|
+
// `why`: WHICH segment failed, and what was there instead — the "did
|
|
185
|
+
// you mean" the no_path contract promises. Walking again is cheap (the
|
|
186
|
+
// tree is in hand) and is the only way to name the parent.
|
|
187
|
+
function noPathFinding(root, path) {
|
|
188
|
+
const parts = pathParts(path);
|
|
189
|
+
let at = root;
|
|
190
|
+
let want = '';
|
|
191
|
+
for (const part of parts) {
|
|
192
|
+
const next = (0, vet_1.anchorAt)(at, part);
|
|
193
|
+
if (null == next) {
|
|
194
|
+
want = part;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
at = next;
|
|
198
|
+
}
|
|
199
|
+
const have = true === at?.isMap
|
|
200
|
+
? Object.keys(at.peg).sort(keyorder_1.cmpCodePoint)
|
|
201
|
+
: (true === at?.isList ? Object.keys(at.peg) : []);
|
|
202
|
+
const near = nearestKey(want, have);
|
|
203
|
+
return finding('no_path', pathText(path), `The path ${path} names nothing in this document.`, null == near ? undefined : `did you mean ${near}?`);
|
|
204
|
+
}
|
|
205
|
+
// Evaluate the document, select the node at `path`, and render it.
|
|
206
|
+
function get(src, path, opts) {
|
|
207
|
+
const options = opts ?? {};
|
|
208
|
+
const view = options.view ?? 'json';
|
|
209
|
+
const aontu = new aontu_1.Aontu(null == options.trust ? undefined : { trust: options.trust });
|
|
210
|
+
const ctx = aontu.ctx({ collect: true });
|
|
211
|
+
const parseOpts = null == options.path ? undefined : { path: options.path };
|
|
212
|
+
const root = aontu.unify(src, parseOpts, ctx);
|
|
213
|
+
if (0 < ctx.err.length || null == root || true === root.isNil) {
|
|
214
|
+
return { ok: false, out: '', findings: [evalFailure(ctx)] };
|
|
215
|
+
}
|
|
216
|
+
const node = (0, vet_1.anchorAt)(root, path);
|
|
217
|
+
if (null == node) {
|
|
218
|
+
return { ok: false, out: '', findings: [noPathFinding(root, path)] };
|
|
219
|
+
}
|
|
220
|
+
if ('json' === view) {
|
|
221
|
+
// GENERATION CAN FAIL WHERE UNIFICATION DID NOT: `k: integer` is a
|
|
222
|
+
// perfectly good unified document and not a concrete value, so the
|
|
223
|
+
// json view of it is an error, exactly as `aontu file.aon` on the
|
|
224
|
+
// same document is. Under `collect` the failure lands on the
|
|
225
|
+
// context rather than throwing, so it has to be read back — the Go
|
|
226
|
+
// port's Gen returns it as an error and the two must agree.
|
|
227
|
+
const before = ctx.err.length;
|
|
228
|
+
const gen = node.gen(ctx);
|
|
229
|
+
if (before < ctx.err.length) {
|
|
230
|
+
const err = ctx.err[before];
|
|
231
|
+
return {
|
|
232
|
+
ok: false,
|
|
233
|
+
out: '',
|
|
234
|
+
findings: [finding(err?.why ?? 'no_gen', pathText(path), err?.msg ?? 'The value at this path is not concrete.')],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return { ok: true, out: (0, exactjson_1.exactJSON)(gen, 2), findings: [] };
|
|
238
|
+
}
|
|
239
|
+
if ('keys' === view) {
|
|
240
|
+
return { ok: true, out: keyList(node), findings: [] };
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
ok: true,
|
|
244
|
+
out: project(node, view, options.depth ?? Infinity),
|
|
245
|
+
findings: [],
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
// WHY does the value at this path hold? Evaluate with the provenance
|
|
249
|
+
// recorder on, select the node, and answer the ordered contributions
|
|
250
|
+
// that met there — the positive twin of G2's error report.
|
|
251
|
+
//
|
|
252
|
+
// Two evaluations are NOT needed: the recorder rides the one run this
|
|
253
|
+
// call makes. What it costs is site materialisation and one map entry
|
|
254
|
+
// per path met, which an instrumented run pays knowingly.
|
|
255
|
+
function why(src, path, opts) {
|
|
256
|
+
const options = opts ?? {};
|
|
257
|
+
const aontu = new aontu_1.Aontu(null == options.trust ? undefined : { trust: options.trust });
|
|
258
|
+
const prov = new provenance_1.Provenance();
|
|
259
|
+
const ctx = aontu.ctx({ collect: true, prov });
|
|
260
|
+
const parseOpts = null == options.path ? undefined : { path: options.path };
|
|
261
|
+
// Parse and unify SEPARATELY, so the parsed tree can be stamped
|
|
262
|
+
// before the fixpoint runs: a contribution is a value the author
|
|
263
|
+
// wrote, and after unification there is no longer any way to tell
|
|
264
|
+
// one from a value the engine minted on the way.
|
|
265
|
+
const parsed = aontu.parse(src, parseOpts, ctx);
|
|
266
|
+
if (0 < ctx.err.length || null == parsed) {
|
|
267
|
+
return { ok: false, findings: [evalFailure(ctx)] };
|
|
268
|
+
}
|
|
269
|
+
prov.writtenFrom(parsed);
|
|
270
|
+
const root = aontu.unify(parsed, parseOpts, ctx);
|
|
271
|
+
if (0 < ctx.err.length || null == root || true === root.isNil) {
|
|
272
|
+
return { ok: false, findings: [evalFailure(ctx)] };
|
|
273
|
+
}
|
|
274
|
+
const node = (0, vet_1.anchorAt)(root, path);
|
|
275
|
+
if (null == node) {
|
|
276
|
+
return { ok: false, findings: [noPathFinding(root, path)] };
|
|
277
|
+
}
|
|
278
|
+
// The value that stands here is a contribution when nothing met
|
|
279
|
+
// (see Provenance.stands): a generator places a value without a
|
|
280
|
+
// meet, and "nothing met at this path" is not an answer to "where
|
|
281
|
+
// did this come from".
|
|
282
|
+
const parts = pathParts(path);
|
|
283
|
+
prov.stands(parts, node);
|
|
284
|
+
return {
|
|
285
|
+
ok: true,
|
|
286
|
+
record: {
|
|
287
|
+
conjuncts: prov.at(parts),
|
|
288
|
+
path: pathText(path),
|
|
289
|
+
value: node.canon,
|
|
290
|
+
},
|
|
291
|
+
findings: [],
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/reach.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { VetFinding } from './vet';
|
|
2
|
+
import type { TrustOptions } from './type';
|
|
3
|
+
export type ReachVerdict = 'reaches' | 'unreachable' | 'error';
|
|
4
|
+
export type ReachReport = {
|
|
5
|
+
verdict: ReachVerdict;
|
|
6
|
+
path?: string[];
|
|
7
|
+
errors?: VetFinding[];
|
|
8
|
+
};
|
|
9
|
+
export type ReachOptions = {
|
|
10
|
+
path?: string;
|
|
11
|
+
trust?: TrustOptions;
|
|
12
|
+
relation?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function parseNodePath(s: string): string[] | undefined;
|
|
15
|
+
export declare function reachCheck(src: string, from: string, to: string, opts?: ReachOptions): ReachReport;
|
package/dist/reach.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Richard Rodger, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.parseNodePath = parseNodePath;
|
|
5
|
+
exports.reachCheck = reachCheck;
|
|
6
|
+
// REACHABILITY OVER THE LINK GRAPH (the review's finding J,
|
|
7
|
+
// use-cases/REVIEW.md): "ship a transitive `reaches(a, b)` check verb".
|
|
8
|
+
//
|
|
9
|
+
// `relations` answers questions about the edge set as a whole --- is it
|
|
10
|
+
// acyclic, does every edge have its inverse, is every far end what the
|
|
11
|
+
// relation says it is. This answers the question that needs the CLOSURE
|
|
12
|
+
// rather than the edges: does anything `a` depends on, at any remove,
|
|
13
|
+
// end up at `b`? That is the shape of every blast-radius question an
|
|
14
|
+
// operator asks ("if the billing database goes, what falls over?") and
|
|
15
|
+
// every containment question a policy asks ("nothing in the public tier
|
|
16
|
+
// may reach the ledger"), and neither can be expressed by looking one
|
|
17
|
+
// edge at a time.
|
|
18
|
+
//
|
|
19
|
+
// It is a VERB and not a constraint, for the same reason acyclicity is
|
|
20
|
+
// (docs/reference-language.md, "Declared relations"): reachability is
|
|
21
|
+
// global and non-monotone. One more edge can make an unreachable pair
|
|
22
|
+
// reachable, so a lattice citizen asserting non-reachability could be
|
|
23
|
+
// true and then false, and the lattice guarantee is that more
|
|
24
|
+
// information never falsifies what has already been observed.
|
|
25
|
+
//
|
|
26
|
+
// TRANSITIVE, NOT REFLEXIVE-TRANSITIVE: `reaches(a, a)` is true only
|
|
27
|
+
// when a path of one or more edges returns to `a`, which is the useful
|
|
28
|
+
// answer (it says the graph has a cycle through `a`) rather than the
|
|
29
|
+
// vacuous one.
|
|
30
|
+
//
|
|
31
|
+
// The Go twin is go/reach.go; what the two ports must agree on --- the
|
|
32
|
+
// verdict and the path --- is test/spec/reach.tsv.
|
|
33
|
+
const aontu_1 = require("./aontu");
|
|
34
|
+
const vet_1 = require("./vet");
|
|
35
|
+
const graph_1 = require("./graph");
|
|
36
|
+
const keyorder_1 = require("./keyorder");
|
|
37
|
+
// The segments a `$.dotted` endpoint spells, or undefined when it is
|
|
38
|
+
// not one. Reachability is between TREE POSITIONS (ADR-014), so an
|
|
39
|
+
// endpoint is a path and nothing else --- the same spelling the report
|
|
40
|
+
// prints back.
|
|
41
|
+
function parseNodePath(s) {
|
|
42
|
+
if ('$' === s) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
if (!s.startsWith('$.')) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const parts = s.slice(2).split('.');
|
|
49
|
+
return parts.every((p) => /^[A-Za-z0-9_-]+$/.test(p)) ? parts : undefined;
|
|
50
|
+
}
|
|
51
|
+
// Whether a path names a node of the evaluated tree. An endpoint that
|
|
52
|
+
// exists but has no edges is a perfectly good question with the answer
|
|
53
|
+
// `unreachable`; only one that names NOTHING is an error.
|
|
54
|
+
function nodeAt(root, path) {
|
|
55
|
+
let node = root;
|
|
56
|
+
for (const seg of path) {
|
|
57
|
+
if (true !== node?.isMap && true !== node?.isList) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
node = node.peg[seg];
|
|
61
|
+
if (null == node) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null != node;
|
|
66
|
+
}
|
|
67
|
+
function endpointFinding(name, known) {
|
|
68
|
+
return {
|
|
69
|
+
code: 'refer_unresolved',
|
|
70
|
+
class: 'reference',
|
|
71
|
+
severity: 'error',
|
|
72
|
+
path: '$',
|
|
73
|
+
// NOT "unreachable". An endpoint that names no node is a question
|
|
74
|
+
// the document cannot answer, and answering it `no` would report a
|
|
75
|
+
// typo as a fact about the model --- the fail-open shape this
|
|
76
|
+
// review exists to retire.
|
|
77
|
+
message: `${name} names no node in this document.`,
|
|
78
|
+
sites: [],
|
|
79
|
+
...(0 === known.length ? {} : {
|
|
80
|
+
note: 'nodes with links: ' + known.join(', '),
|
|
81
|
+
}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// The reachability check for one document.
|
|
85
|
+
function reachCheck(src, from, to, opts) {
|
|
86
|
+
const options = opts ?? {};
|
|
87
|
+
const aontu = new aontu_1.Aontu(null == options.trust ? undefined : { trust: options.trust });
|
|
88
|
+
const ctx = aontu.ctx({ collect: true });
|
|
89
|
+
const parseOpts = null == options.path ? undefined : { path: options.path };
|
|
90
|
+
const root = aontu.unify(src, parseOpts, ctx);
|
|
91
|
+
// A document that does not stand up is not a document with an
|
|
92
|
+
// unreachable pair: the errors it already has are the answer.
|
|
93
|
+
if (0 < ctx.err.length || true === root?.isNil) {
|
|
94
|
+
return {
|
|
95
|
+
verdict: 'error',
|
|
96
|
+
errors: [(0, vet_1.failureFinding)(ctx, options.path, root)],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const graph = (0, graph_1.graphOf)(root);
|
|
100
|
+
// The nodes the graph actually touches, for the error note: a
|
|
101
|
+
// document has every path in it, and listing them all would drown the
|
|
102
|
+
// one fact a mistyped endpoint needs.
|
|
103
|
+
const linked = [...new Set(graph.edges
|
|
104
|
+
.flatMap((e) => [e.from, e.to]))].sort(keyorder_1.cmpCodePoint);
|
|
105
|
+
const missing = [from, to].filter((n) => {
|
|
106
|
+
const parts = parseNodePath(n);
|
|
107
|
+
return undefined === parts || !nodeAt(root, parts);
|
|
108
|
+
});
|
|
109
|
+
if (0 < missing.length) {
|
|
110
|
+
return {
|
|
111
|
+
verdict: 'error',
|
|
112
|
+
errors: missing.map((n) => endpointFinding(n, linked)),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// The successor map, restricted to one relation when the caller asked
|
|
116
|
+
// for one. Sorted, so the path the search finds is the same one in
|
|
117
|
+
// both ports.
|
|
118
|
+
const succ = new Map();
|
|
119
|
+
for (const e of graph.edges) {
|
|
120
|
+
if (null != options.relation && options.relation !== e.key) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const list = succ.get(e.from);
|
|
124
|
+
const dest = e.to;
|
|
125
|
+
if (undefined === list) {
|
|
126
|
+
succ.set(e.from, [dest]);
|
|
127
|
+
}
|
|
128
|
+
else if (!list.includes(dest)) {
|
|
129
|
+
list.push(dest);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
for (const list of succ.values()) {
|
|
133
|
+
list.sort(keyorder_1.cmpCodePoint);
|
|
134
|
+
}
|
|
135
|
+
// BREADTH-FIRST, so the path reported is a SHORTEST one --- the
|
|
136
|
+
// evidence an operator wants is the tightest chain, not whichever the
|
|
137
|
+
// walk happened to find first --- and, with the successors sorted, a
|
|
138
|
+
// determined one: among shortest paths, the first in code-point order
|
|
139
|
+
// at the first step that distinguishes them.
|
|
140
|
+
const prev = new Map();
|
|
141
|
+
const seen = new Set();
|
|
142
|
+
let front = [from];
|
|
143
|
+
while (0 < front.length) {
|
|
144
|
+
const next = [];
|
|
145
|
+
for (const node of front) {
|
|
146
|
+
for (const dest of succ.get(node) ?? []) {
|
|
147
|
+
if (dest === to) {
|
|
148
|
+
const path = [dest];
|
|
149
|
+
let step = node;
|
|
150
|
+
while (step !== from) {
|
|
151
|
+
path.unshift(step);
|
|
152
|
+
step = prev.get(step);
|
|
153
|
+
}
|
|
154
|
+
path.unshift(from);
|
|
155
|
+
return { verdict: 'reaches', path };
|
|
156
|
+
}
|
|
157
|
+
if (!seen.has(dest)) {
|
|
158
|
+
seen.add(dest);
|
|
159
|
+
prev.set(dest, node);
|
|
160
|
+
next.push(dest);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
front = next;
|
|
165
|
+
}
|
|
166
|
+
return { verdict: 'unreachable' };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=reach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reach.js","sourceRoot":"","sources":["../src/reach.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { VetFinding } from './vet';
|
|
2
|
+
import type { TrustOptions } from './type';
|
|
3
|
+
import type { Graph } from './graph';
|
|
4
|
+
import type { RelDecl } from './val/GraphAtomVal';
|
|
5
|
+
export type RelationVerdict = 'pass' | 'fail' | 'error';
|
|
6
|
+
export type RelationFinding = {
|
|
7
|
+
code: string;
|
|
8
|
+
relation: string;
|
|
9
|
+
at: string;
|
|
10
|
+
detail: string[];
|
|
11
|
+
};
|
|
12
|
+
export type RelationReport = {
|
|
13
|
+
verdict: RelationVerdict;
|
|
14
|
+
findings: RelationFinding[];
|
|
15
|
+
errors?: VetFinding[];
|
|
16
|
+
};
|
|
17
|
+
export type RelationOptions = {
|
|
18
|
+
path?: string;
|
|
19
|
+
trust?: TrustOptions;
|
|
20
|
+
};
|
|
21
|
+
export declare function relationFindings(decls: Map<string, RelDecl>, graph: Graph): RelationFinding[];
|
|
22
|
+
export declare function relationErrors(ctx: any, root: any): void;
|
|
23
|
+
export declare function relationCheck(src: string, opts?: RelationOptions): RelationReport;
|