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.
Files changed (310) hide show
  1. package/README.md +88 -0
  2. package/bin/aontu-mcp.js +4 -0
  3. package/dist/agentsmd.d.ts +16 -0
  4. package/dist/agentsmd.js +107 -0
  5. package/dist/agentsmd.js.map +1 -0
  6. package/dist/aontu.d.ts +15 -3
  7. package/dist/aontu.js +126 -5
  8. package/dist/aontu.js.map +1 -1
  9. package/dist/cli.d.ts +45 -1
  10. package/dist/cli.js +2845 -69
  11. package/dist/cli.js.map +1 -1
  12. package/dist/ctx.d.ts +18 -0
  13. package/dist/ctx.js +44 -0
  14. package/dist/ctx.js.map +1 -1
  15. package/dist/diff.d.ts +22 -0
  16. package/dist/diff.js +141 -0
  17. package/dist/diff.js.map +1 -0
  18. package/dist/err.d.ts +3 -1
  19. package/dist/err.js +45 -8
  20. package/dist/err.js.map +1 -1
  21. package/dist/graph.d.ts +13 -0
  22. package/dist/graph.js +110 -0
  23. package/dist/graph.js.map +1 -0
  24. package/dist/hcanon.d.ts +3 -0
  25. package/dist/hcanon.js +145 -0
  26. package/dist/hcanon.js.map +1 -0
  27. package/dist/hints.js +235 -8
  28. package/dist/hints.js.map +1 -1
  29. package/dist/jsonschema.d.ts +20 -0
  30. package/dist/jsonschema.js +425 -0
  31. package/dist/jsonschema.js.map +1 -0
  32. package/dist/lang.js +955 -110
  33. package/dist/lang.js.map +1 -1
  34. package/dist/lsp.d.ts +9 -2
  35. package/dist/lsp.js +343 -48
  36. package/dist/lsp.js.map +1 -1
  37. package/dist/mcp-server.d.ts +20 -0
  38. package/dist/mcp-server.js +147 -0
  39. package/dist/mcp-server.js.map +1 -0
  40. package/dist/mcp.d.ts +42 -0
  41. package/dist/mcp.js +941 -0
  42. package/dist/mcp.js.map +1 -0
  43. package/dist/mod-tool.d.ts +58 -0
  44. package/dist/mod-tool.js +532 -0
  45. package/dist/mod-tool.js.map +1 -0
  46. package/dist/mod.d.ts +35 -0
  47. package/dist/mod.js +345 -0
  48. package/dist/mod.js.map +1 -0
  49. package/dist/patch.d.ts +49 -0
  50. package/dist/patch.js +506 -0
  51. package/dist/patch.js.map +1 -0
  52. package/dist/provenance.d.ts +41 -0
  53. package/dist/provenance.js +336 -0
  54. package/dist/provenance.js.map +1 -0
  55. package/dist/query.d.ts +27 -0
  56. package/dist/query.js +294 -0
  57. package/dist/query.js.map +1 -0
  58. package/dist/reach.d.ts +15 -0
  59. package/dist/reach.js +168 -0
  60. package/dist/reach.js.map +1 -0
  61. package/dist/relation.d.ts +23 -0
  62. package/dist/relation.js +230 -0
  63. package/dist/relation.js.map +1 -0
  64. package/dist/report-sarif.d.ts +14 -0
  65. package/dist/report-sarif.js +102 -0
  66. package/dist/report-sarif.js.map +1 -0
  67. package/dist/sig.d.ts +25 -0
  68. package/dist/sig.js +277 -0
  69. package/dist/sig.js.map +1 -0
  70. package/dist/sigdecl.d.ts +2 -0
  71. package/dist/sigdecl.js +11 -0
  72. package/dist/sigdecl.js.map +1 -0
  73. package/dist/siggate.d.ts +4 -0
  74. package/dist/siggate.js +90 -0
  75. package/dist/siggate.js.map +1 -0
  76. package/dist/site.d.ts +4 -0
  77. package/dist/site.js +31 -0
  78. package/dist/site.js.map +1 -1
  79. package/dist/std.d.ts +1 -0
  80. package/dist/std.js +129 -0
  81. package/dist/std.js.map +1 -0
  82. package/dist/subsume.d.ts +39 -0
  83. package/dist/subsume.js +573 -0
  84. package/dist/subsume.js.map +1 -0
  85. package/dist/trim.d.ts +19 -0
  86. package/dist/trim.js +155 -0
  87. package/dist/trim.js.map +1 -0
  88. package/dist/tsconfig.tsbuildinfo +1 -1
  89. package/dist/type.d.ts +17 -1
  90. package/dist/type.js.map +1 -1
  91. package/dist/unify.d.ts +2 -1
  92. package/dist/unify.js +234 -38
  93. package/dist/unify.js.map +1 -1
  94. package/dist/utility.d.ts +8 -1
  95. package/dist/utility.js +68 -1
  96. package/dist/utility.js.map +1 -1
  97. package/dist/val/AggFuncVal.d.ts +44 -0
  98. package/dist/val/AggFuncVal.js +364 -0
  99. package/dist/val/AggFuncVal.js.map +1 -0
  100. package/dist/val/ArithFuncVal.d.ts +31 -0
  101. package/dist/val/ArithFuncVal.js +62 -0
  102. package/dist/val/ArithFuncVal.js.map +1 -0
  103. package/dist/val/BagVal.d.ts +7 -0
  104. package/dist/val/BagVal.js +150 -11
  105. package/dist/val/BagVal.js.map +1 -1
  106. package/dist/val/CloseFuncVal.js +9 -1
  107. package/dist/val/CloseFuncVal.js.map +1 -1
  108. package/dist/val/ConjunctVal.d.ts +1 -1
  109. package/dist/val/ConjunctVal.js +19 -0
  110. package/dist/val/ConjunctVal.js.map +1 -1
  111. package/dist/val/ConstraintVal.d.ts +7 -1
  112. package/dist/val/ConstraintVal.js +523 -45
  113. package/dist/val/ConstraintVal.js.map +1 -1
  114. package/dist/val/ContainerKindVal.d.ts +35 -0
  115. package/dist/val/ContainerKindVal.js +99 -0
  116. package/dist/val/ContainerKindVal.js.map +1 -0
  117. package/dist/val/CopyFuncVal.d.ts +1 -2
  118. package/dist/val/CopyFuncVal.js.map +1 -1
  119. package/dist/val/Decimal.d.ts +1 -0
  120. package/dist/val/Decimal.js +13 -0
  121. package/dist/val/Decimal.js.map +1 -1
  122. package/dist/val/DeprecateFuncVal.d.ts +11 -0
  123. package/dist/val/DeprecateFuncVal.js +47 -0
  124. package/dist/val/DeprecateFuncVal.js.map +1 -0
  125. package/dist/val/DisjunctVal.d.ts +1 -2
  126. package/dist/val/DisjunctVal.js +269 -53
  127. package/dist/val/DisjunctVal.js.map +1 -1
  128. package/dist/val/EachFuncVal.d.ts +15 -0
  129. package/dist/val/EachFuncVal.js +75 -0
  130. package/dist/val/EachFuncVal.js.map +1 -0
  131. package/dist/val/ExpectVal.js +62 -4
  132. package/dist/val/ExpectVal.js.map +1 -1
  133. package/dist/val/FeatureVal.js +1 -1
  134. package/dist/val/FeatureVal.js.map +1 -1
  135. package/dist/val/FilterFuncVal.d.ts +15 -0
  136. package/dist/val/FilterFuncVal.js +91 -0
  137. package/dist/val/FilterFuncVal.js.map +1 -0
  138. package/dist/val/FuncBaseVal.d.ts +7 -1
  139. package/dist/val/FuncBaseVal.js +183 -2
  140. package/dist/val/FuncBaseVal.js.map +1 -1
  141. package/dist/val/GraphAtomVal.d.ts +39 -0
  142. package/dist/val/GraphAtomVal.js +184 -0
  143. package/dist/val/GraphAtomVal.js.map +1 -0
  144. package/dist/val/HideFuncVal.js.map +1 -1
  145. package/dist/val/JunctionVal.js +24 -1
  146. package/dist/val/JunctionVal.js.map +1 -1
  147. package/dist/val/KeyFuncVal.d.ts +1 -1
  148. package/dist/val/KeyFuncVal.js +38 -30
  149. package/dist/val/KeyFuncVal.js.map +1 -1
  150. package/dist/val/ListVal.js +94 -14
  151. package/dist/val/ListVal.js.map +1 -1
  152. package/dist/val/LowerFuncVal.js.map +1 -1
  153. package/dist/val/MapVal.d.ts +1 -0
  154. package/dist/val/MapVal.js +146 -14
  155. package/dist/val/MapVal.js.map +1 -1
  156. package/dist/val/MatchFuncVal.d.ts +15 -0
  157. package/dist/val/MatchFuncVal.js +107 -0
  158. package/dist/val/MatchFuncVal.js.map +1 -0
  159. package/dist/val/MoveFuncVal.js.map +1 -1
  160. package/dist/val/NilVal.js +24 -0
  161. package/dist/val/NilVal.js.map +1 -1
  162. package/dist/val/OpBaseVal.d.ts +1 -1
  163. package/dist/val/OpBaseVal.js +19 -1
  164. package/dist/val/OpBaseVal.js.map +1 -1
  165. package/dist/val/OpenFuncVal.js +4 -1
  166. package/dist/val/OpenFuncVal.js.map +1 -1
  167. package/dist/val/PackFuncVal.d.ts +15 -0
  168. package/dist/val/PackFuncVal.js +108 -0
  169. package/dist/val/PackFuncVal.js.map +1 -0
  170. package/dist/val/PathFuncVal.d.ts +2 -2
  171. package/dist/val/PathFuncVal.js +75 -16
  172. package/dist/val/PathFuncVal.js.map +1 -1
  173. package/dist/val/PathVal.d.ts +25 -0
  174. package/dist/val/PathVal.js +150 -0
  175. package/dist/val/PathVal.js.map +1 -0
  176. package/dist/val/PlaceVal.d.ts +13 -0
  177. package/dist/val/PlaceVal.js +131 -0
  178. package/dist/val/PlaceVal.js.map +1 -0
  179. package/dist/val/PlusOpVal.d.ts +2 -1
  180. package/dist/val/PlusOpVal.js +61 -37
  181. package/dist/val/PlusOpVal.js.map +1 -1
  182. package/dist/val/PrefFuncVal.js.map +1 -1
  183. package/dist/val/PrefVal.d.ts +4 -2
  184. package/dist/val/PrefVal.js +223 -41
  185. package/dist/val/PrefVal.js.map +1 -1
  186. package/dist/val/RecurseVal.d.ts +19 -0
  187. package/dist/val/RecurseVal.js +217 -0
  188. package/dist/val/RecurseVal.js.map +1 -0
  189. package/dist/val/RefVal.d.ts +3 -2
  190. package/dist/val/RefVal.js +181 -66
  191. package/dist/val/RefVal.js.map +1 -1
  192. package/dist/val/ReferFuncVal.d.ts +59 -0
  193. package/dist/val/ReferFuncVal.js +604 -0
  194. package/dist/val/ReferFuncVal.js.map +1 -0
  195. package/dist/val/ScalarKindVal.d.ts +4 -3
  196. package/dist/val/ScalarKindVal.js +12 -12
  197. package/dist/val/ScalarKindVal.js.map +1 -1
  198. package/dist/val/SuperFuncVal.d.ts +4 -2
  199. package/dist/val/SuperFuncVal.js +118 -14
  200. package/dist/val/SuperFuncVal.js.map +1 -1
  201. package/dist/val/TopVal.d.ts +1 -1
  202. package/dist/val/TopVal.js.map +1 -1
  203. package/dist/val/TypeFuncVal.js.map +1 -1
  204. package/dist/val/UpperFuncVal.js.map +1 -1
  205. package/dist/val/Val.d.ts +7 -1
  206. package/dist/val/Val.js +170 -2
  207. package/dist/val/Val.js.map +1 -1
  208. package/dist/val/VarVal.js.map +1 -1
  209. package/dist/val/arith.d.ts +6 -0
  210. package/dist/val/arith.js +173 -0
  211. package/dist/val/arith.js.map +1 -0
  212. package/dist/vet.d.ts +45 -0
  213. package/dist/vet.js +802 -0
  214. package/dist/vet.js.map +1 -0
  215. package/dist/view.d.ts +85 -0
  216. package/dist/view.js +1948 -0
  217. package/dist/view.js.map +1 -0
  218. package/dist/walk.d.ts +2 -0
  219. package/dist/walk.js +91 -0
  220. package/dist/walk.js.map +1 -0
  221. package/grammar/aontu.gbnf +138 -0
  222. package/grammar/aontu.lark +118 -0
  223. package/grammar/aontu.tmLanguage.json +184 -0
  224. package/package.json +30 -8
  225. package/skill/SKILL.md +37 -0
  226. package/skill/error-codes.md +62 -0
  227. package/skill/examples.md +99 -0
  228. package/skill/grammar-card.md +56 -0
  229. package/src/agentsmd.ts +135 -0
  230. package/src/aontu.ts +166 -5
  231. package/src/cli.ts +3324 -72
  232. package/src/ctx.ts +93 -1
  233. package/src/diff.ts +198 -0
  234. package/src/err.ts +50 -8
  235. package/src/graph.ts +185 -0
  236. package/src/hcanon.ts +167 -0
  237. package/src/hints.ts +291 -8
  238. package/src/jsonschema.ts +552 -0
  239. package/src/lang.ts +1049 -110
  240. package/src/lsp.ts +351 -49
  241. package/src/mcp-server.ts +187 -0
  242. package/src/mcp.ts +1130 -0
  243. package/src/mod-tool.ts +718 -0
  244. package/src/mod.ts +453 -0
  245. package/src/patch.ts +628 -0
  246. package/src/provenance.ts +437 -0
  247. package/src/query.ts +381 -0
  248. package/src/reach.ts +213 -0
  249. package/src/relation.ts +298 -0
  250. package/src/report-sarif.ts +137 -0
  251. package/src/sig.ts +345 -0
  252. package/src/sigdecl.ts +11 -0
  253. package/src/siggate.ts +144 -0
  254. package/src/site.ts +36 -1
  255. package/src/std.ts +131 -0
  256. package/src/subsume.ts +739 -0
  257. package/src/trim.ts +195 -0
  258. package/src/tsconfig.json +10 -4
  259. package/src/type.ts +51 -2
  260. package/src/unify.ts +253 -38
  261. package/src/utility.ts +79 -1
  262. package/src/val/AggFuncVal.ts +546 -0
  263. package/src/val/ArithFuncVal.ts +108 -0
  264. package/src/val/BagVal.ts +158 -12
  265. package/src/val/CloseFuncVal.ts +9 -1
  266. package/src/val/ConjunctVal.ts +20 -0
  267. package/src/val/ConstraintVal.ts +576 -48
  268. package/src/val/ContainerKindVal.ts +158 -0
  269. package/src/val/CopyFuncVal.ts +0 -1
  270. package/src/val/Decimal.ts +15 -0
  271. package/src/val/DeprecateFuncVal.ts +84 -0
  272. package/src/val/DisjunctVal.ts +282 -59
  273. package/src/val/EachFuncVal.ts +133 -0
  274. package/src/val/ExpectVal.ts +65 -8
  275. package/src/val/FeatureVal.ts +1 -1
  276. package/src/val/FilterFuncVal.ts +154 -0
  277. package/src/val/FuncBaseVal.ts +206 -2
  278. package/src/val/GraphAtomVal.ts +264 -0
  279. package/src/val/HideFuncVal.ts +0 -2
  280. package/src/val/JunctionVal.ts +24 -1
  281. package/src/val/KeyFuncVal.ts +39 -35
  282. package/src/val/ListVal.ts +101 -15
  283. package/src/val/LowerFuncVal.ts +0 -1
  284. package/src/val/MapVal.ts +153 -14
  285. package/src/val/MatchFuncVal.ts +176 -0
  286. package/src/val/MoveFuncVal.ts +0 -2
  287. package/src/val/NilVal.ts +25 -0
  288. package/src/val/OpBaseVal.ts +20 -1
  289. package/src/val/OpenFuncVal.ts +4 -2
  290. package/src/val/PackFuncVal.ts +175 -0
  291. package/src/val/PathFuncVal.ts +107 -20
  292. package/src/val/PathVal.ts +221 -0
  293. package/src/val/PlaceVal.ts +193 -0
  294. package/src/val/PlusOpVal.ts +67 -39
  295. package/src/val/PrefFuncVal.ts +0 -1
  296. package/src/val/PrefVal.ts +251 -60
  297. package/src/val/RecurseVal.ts +285 -0
  298. package/src/val/RefVal.ts +183 -78
  299. package/src/val/ReferFuncVal.ts +732 -0
  300. package/src/val/ScalarKindVal.ts +12 -13
  301. package/src/val/SuperFuncVal.ts +137 -13
  302. package/src/val/TopVal.ts +1 -2
  303. package/src/val/TypeFuncVal.ts +0 -2
  304. package/src/val/UpperFuncVal.ts +0 -1
  305. package/src/val/Val.ts +216 -4
  306. package/src/val/VarVal.ts +0 -1
  307. package/src/val/arith.ts +319 -0
  308. package/src/vet.ts +1025 -0
  309. package/src/view.ts +2563 -0
  310. 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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"}
@@ -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;