aontu 0.62.0 → 0.63.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 (356) hide show
  1. package/README.md +1 -1
  2. package/dist/agentsmd.js +0 -27
  3. package/dist/agentsmd.js.map +1 -1
  4. package/dist/alias.js.map +1 -1
  5. package/dist/allow.js +0 -92
  6. package/dist/allow.js.map +1 -1
  7. package/dist/aontu.d.ts +1 -1
  8. package/dist/aontu.js +1 -79
  9. package/dist/aontu.js.map +1 -1
  10. package/dist/aontumodel.d.ts +4 -0
  11. package/dist/aontumodel.js +33 -0
  12. package/dist/aontumodel.js.map +1 -0
  13. package/dist/cli.js +101 -620
  14. package/dist/cli.js.map +1 -1
  15. package/dist/ctx.js +0 -48
  16. package/dist/ctx.js.map +1 -1
  17. package/dist/diff.js +0 -32
  18. package/dist/diff.js.map +1 -1
  19. package/dist/err.js +0 -40
  20. package/dist/err.js.map +1 -1
  21. package/dist/escape.js +0 -45
  22. package/dist/escape.js.map +1 -1
  23. package/dist/exactjson.d.ts +0 -35
  24. package/dist/exactjson.js +0 -131
  25. package/dist/exactjson.js.map +1 -1
  26. package/dist/format.js +13 -203
  27. package/dist/format.js.map +1 -1
  28. package/dist/grammar.d.ts +9 -0
  29. package/dist/grammar.js +54 -0
  30. package/dist/grammar.js.map +1 -0
  31. package/dist/graph.js +0 -26
  32. package/dist/graph.js.map +1 -1
  33. package/dist/hcanon.js +0 -82
  34. package/dist/hcanon.js.map +1 -1
  35. package/dist/helpdoc.js +1 -1
  36. package/dist/helpdoc.js.map +1 -1
  37. package/dist/hints.d.ts +0 -6
  38. package/dist/hints.js +54 -55
  39. package/dist/hints.js.map +1 -1
  40. package/dist/jsonschema.js +0 -114
  41. package/dist/jsonschema.js.map +1 -1
  42. package/dist/keyorder.d.ts +0 -7
  43. package/dist/keyorder.js +0 -41
  44. package/dist/keyorder.js.map +1 -1
  45. package/dist/lang.js +17 -915
  46. package/dist/lang.js.map +1 -1
  47. package/dist/lower.js +11 -61
  48. package/dist/lower.js.map +1 -1
  49. package/dist/lsp-server.js +0 -16
  50. package/dist/lsp-server.js.map +1 -1
  51. package/dist/lsp.d.ts +1 -1
  52. package/dist/lsp.js +12 -159
  53. package/dist/lsp.js.map +1 -1
  54. package/dist/mcp-server.js +0 -26
  55. package/dist/mcp-server.js.map +1 -1
  56. package/dist/mcp.js +0 -113
  57. package/dist/mcp.js.map +1 -1
  58. package/dist/mod-tool.js +0 -130
  59. package/dist/mod-tool.js.map +1 -1
  60. package/dist/mod.js +0 -162
  61. package/dist/mod.js.map +1 -1
  62. package/dist/patch.js +0 -217
  63. package/dist/patch.js.map +1 -1
  64. package/dist/provenance.js +0 -140
  65. package/dist/provenance.js.map +1 -1
  66. package/dist/query.js +0 -75
  67. package/dist/query.js.map +1 -1
  68. package/dist/reach.js +0 -43
  69. package/dist/reach.js.map +1 -1
  70. package/dist/relation.js +0 -61
  71. package/dist/relation.js.map +1 -1
  72. package/dist/render.js +20 -135
  73. package/dist/render.js.map +1 -1
  74. package/dist/report-sarif.d.ts +0 -11
  75. package/dist/report-sarif.js +0 -28
  76. package/dist/report-sarif.js.map +1 -1
  77. package/dist/sig.js +0 -35
  78. package/dist/sig.js.map +1 -1
  79. package/dist/sigdecl.js +1 -1
  80. package/dist/sigdecl.js.map +1 -1
  81. package/dist/siggate.js +0 -4
  82. package/dist/siggate.js.map +1 -1
  83. package/dist/site.js +3 -29
  84. package/dist/site.js.map +1 -1
  85. package/dist/subsume.d.ts +0 -10
  86. package/dist/subsume.js +0 -137
  87. package/dist/subsume.js.map +1 -1
  88. package/dist/template.d.ts +2 -1
  89. package/dist/template.js +58 -138
  90. package/dist/template.js.map +1 -1
  91. package/dist/trim.js +0 -41
  92. package/dist/trim.js.map +1 -1
  93. package/dist/tsconfig.tsbuildinfo +1 -1
  94. package/dist/type.js.map +1 -1
  95. package/dist/unify.js +12 -242
  96. package/dist/unify.js.map +1 -1
  97. package/dist/utility.js +0 -22
  98. package/dist/utility.js.map +1 -1
  99. package/dist/val/AbnfFuncVal.d.ts +18 -0
  100. package/dist/val/AbnfFuncVal.js +132 -0
  101. package/dist/val/AbnfFuncVal.js.map +1 -0
  102. package/dist/val/AbsentVal.d.ts +11 -0
  103. package/dist/val/AbsentVal.js +30 -0
  104. package/dist/val/AbsentVal.js.map +1 -0
  105. package/dist/val/AggFuncVal.d.ts +10 -1
  106. package/dist/val/AggFuncVal.js +104 -116
  107. package/dist/val/AggFuncVal.js.map +1 -1
  108. package/dist/val/ArithFuncVal.js +0 -12
  109. package/dist/val/ArithFuncVal.js.map +1 -1
  110. package/dist/val/BagVal.js +1 -78
  111. package/dist/val/BagVal.js.map +1 -1
  112. package/dist/val/BigDecimalVal.js +0 -16
  113. package/dist/val/BigDecimalVal.js.map +1 -1
  114. package/dist/val/BigIntegerVal.js +0 -16
  115. package/dist/val/BigIntegerVal.js.map +1 -1
  116. package/dist/val/CloseFuncVal.js +0 -9
  117. package/dist/val/CloseFuncVal.js.map +1 -1
  118. package/dist/val/CmpFuncVal.js +2 -59
  119. package/dist/val/CmpFuncVal.js.map +1 -1
  120. package/dist/val/ConjunctVal.js +0 -29
  121. package/dist/val/ConjunctVal.js.map +1 -1
  122. package/dist/val/ConstraintVal.js +0 -500
  123. package/dist/val/ConstraintVal.js.map +1 -1
  124. package/dist/val/ContainerKindVal.js +0 -2
  125. package/dist/val/ContainerKindVal.js.map +1 -1
  126. package/dist/val/CopyFuncVal.js +0 -3
  127. package/dist/val/CopyFuncVal.js.map +1 -1
  128. package/dist/val/Decimal.js +0 -179
  129. package/dist/val/Decimal.js.map +1 -1
  130. package/dist/val/DeprecateFuncVal.js.map +1 -1
  131. package/dist/val/DisjunctVal.js +0 -152
  132. package/dist/val/DisjunctVal.js.map +1 -1
  133. package/dist/val/EachFuncVal.js +0 -3
  134. package/dist/val/EachFuncVal.js.map +1 -1
  135. package/dist/val/EmitFuncVal.d.ts +1 -1
  136. package/dist/val/EmitFuncVal.js +6 -119
  137. package/dist/val/EmitFuncVal.js.map +1 -1
  138. package/dist/val/ExpectVal.js +0 -62
  139. package/dist/val/ExpectVal.js.map +1 -1
  140. package/dist/val/FilterFuncVal.js +0 -25
  141. package/dist/val/FilterFuncVal.js.map +1 -1
  142. package/dist/val/FuncBaseVal.d.ts +1 -0
  143. package/dist/val/FuncBaseVal.js +7 -127
  144. package/dist/val/FuncBaseVal.js.map +1 -1
  145. package/dist/val/GraphAtomVal.js +0 -15
  146. package/dist/val/GraphAtomVal.js.map +1 -1
  147. package/dist/val/HideFuncVal.js +0 -13
  148. package/dist/val/HideFuncVal.js.map +1 -1
  149. package/dist/val/IntegerVal.js +0 -61
  150. package/dist/val/IntegerVal.js.map +1 -1
  151. package/dist/val/JunctionVal.js +0 -20
  152. package/dist/val/JunctionVal.js.map +1 -1
  153. package/dist/val/KeyFuncVal.js +0 -46
  154. package/dist/val/KeyFuncVal.js.map +1 -1
  155. package/dist/val/ListVal.js +0 -57
  156. package/dist/val/ListVal.js.map +1 -1
  157. package/dist/val/LowerFuncVal.js +0 -11
  158. package/dist/val/LowerFuncVal.js.map +1 -1
  159. package/dist/val/MapVal.js +0 -151
  160. package/dist/val/MapVal.js.map +1 -1
  161. package/dist/val/MatchFuncVal.js +0 -27
  162. package/dist/val/MatchFuncVal.js.map +1 -1
  163. package/dist/val/{FormFuncVal.d.ts → MaybeFuncVal.d.ts} +5 -5
  164. package/dist/val/MaybeFuncVal.js +50 -0
  165. package/dist/val/MaybeFuncVal.js.map +1 -0
  166. package/dist/val/MoveFuncVal.js +0 -18
  167. package/dist/val/MoveFuncVal.js.map +1 -1
  168. package/dist/val/NilVal.js +0 -60
  169. package/dist/val/NilVal.js.map +1 -1
  170. package/dist/val/NomFuncVal.js +8 -42
  171. package/dist/val/NomFuncVal.js.map +1 -1
  172. package/dist/val/NumberVal.js +0 -15
  173. package/dist/val/NumberVal.js.map +1 -1
  174. package/dist/val/OpBaseVal.d.ts +1 -0
  175. package/dist/val/OpBaseVal.js +3 -15
  176. package/dist/val/OpBaseVal.js.map +1 -1
  177. package/dist/val/PackFuncVal.js +0 -34
  178. package/dist/val/PackFuncVal.js.map +1 -1
  179. package/dist/val/PathFuncVal.js +0 -6
  180. package/dist/val/PathFuncVal.js.map +1 -1
  181. package/dist/val/PathVal.js +0 -41
  182. package/dist/val/PathVal.js.map +1 -1
  183. package/dist/val/PlaceVal.js +0 -25
  184. package/dist/val/PlaceVal.js.map +1 -1
  185. package/dist/val/PlusOpVal.d.ts +1 -7
  186. package/dist/val/PlusOpVal.js +13 -74
  187. package/dist/val/PlusOpVal.js.map +1 -1
  188. package/dist/val/PrefFuncVal.js +0 -1
  189. package/dist/val/PrefFuncVal.js.map +1 -1
  190. package/dist/val/PrefVal.js +0 -167
  191. package/dist/val/PrefVal.js.map +1 -1
  192. package/dist/val/RecurseVal.js +0 -55
  193. package/dist/val/RecurseVal.js.map +1 -1
  194. package/dist/val/RefVal.js +0 -282
  195. package/dist/val/RefVal.js.map +1 -1
  196. package/dist/val/ReferFuncVal.js +0 -232
  197. package/dist/val/ReferFuncVal.js.map +1 -1
  198. package/dist/val/ScalarKindVal.js +0 -49
  199. package/dist/val/ScalarKindVal.js.map +1 -1
  200. package/dist/val/ScalarVal.js +0 -11
  201. package/dist/val/ScalarVal.js.map +1 -1
  202. package/dist/val/StrFuncVal.js +0 -18
  203. package/dist/val/StrFuncVal.js.map +1 -1
  204. package/dist/val/SuperFuncVal.js +0 -32
  205. package/dist/val/SuperFuncVal.js.map +1 -1
  206. package/dist/val/TopVal.js +0 -1
  207. package/dist/val/TopVal.js.map +1 -1
  208. package/dist/val/TranslateFuncVal.js +1 -3
  209. package/dist/val/TranslateFuncVal.js.map +1 -1
  210. package/dist/val/UpperFuncVal.js +0 -11
  211. package/dist/val/UpperFuncVal.js.map +1 -1
  212. package/dist/val/Val.d.ts +1 -0
  213. package/dist/val/Val.js +2 -133
  214. package/dist/val/Val.js.map +1 -1
  215. package/dist/val/VarVal.js +0 -12
  216. package/dist/val/VarVal.js.map +1 -1
  217. package/dist/val/arith.js +0 -37
  218. package/dist/val/arith.js.map +1 -1
  219. package/dist/val/caserange.js +0 -61
  220. package/dist/val/caserange.js.map +1 -1
  221. package/dist/val/members.js +0 -6
  222. package/dist/val/members.js.map +1 -1
  223. package/dist/val/numcmp.js +0 -11
  224. package/dist/val/numcmp.js.map +1 -1
  225. package/dist/val/numkind.js +0 -145
  226. package/dist/val/numkind.js.map +1 -1
  227. package/dist/val/valutil.js +0 -16
  228. package/dist/val/valutil.js.map +1 -1
  229. package/dist/vet.js +0 -461
  230. package/dist/vet.js.map +1 -1
  231. package/dist/view.js +0 -414
  232. package/dist/view.js.map +1 -1
  233. package/dist/walk.js +0 -41
  234. package/dist/walk.js.map +1 -1
  235. package/grammar/aontu.abnf +8 -6
  236. package/grammar/aontu.gbnf +4 -4
  237. package/grammar/aontu.lark +4 -4
  238. package/grammar/aontu.tmLanguage.json +1 -1
  239. package/package.json +4 -2
  240. package/src/agentsmd.ts +0 -35
  241. package/src/alias.ts +0 -39
  242. package/src/allow.ts +1 -96
  243. package/src/aontu.ts +3 -110
  244. package/src/aontumodel.ts +32 -0
  245. package/src/cli.ts +113 -682
  246. package/src/ctx.ts +0 -103
  247. package/src/diff.ts +0 -40
  248. package/src/err.ts +0 -40
  249. package/src/escape.ts +0 -46
  250. package/src/exactjson.ts +0 -131
  251. package/src/format.ts +14 -257
  252. package/src/grammar.ts +72 -0
  253. package/src/graph.ts +0 -61
  254. package/src/hcanon.ts +0 -82
  255. package/src/helpdoc.ts +1 -1
  256. package/src/hints.ts +66 -57
  257. package/src/jsonschema.ts +0 -123
  258. package/src/keyorder.ts +0 -42
  259. package/src/lang.ts +19 -931
  260. package/src/lower.ts +12 -62
  261. package/src/lsp-server.ts +0 -16
  262. package/src/lsp.ts +12 -180
  263. package/src/mcp-server.ts +0 -31
  264. package/src/mcp.ts +0 -130
  265. package/src/mod-tool.ts +0 -158
  266. package/src/mod.ts +0 -178
  267. package/src/patch.ts +0 -232
  268. package/src/provenance.ts +0 -183
  269. package/src/query.ts +0 -84
  270. package/src/reach.ts +0 -53
  271. package/src/relation.ts +0 -84
  272. package/src/render.ts +20 -172
  273. package/src/report-sarif.ts +0 -48
  274. package/src/sig.ts +0 -35
  275. package/src/sigdecl.ts +1 -1
  276. package/src/siggate.ts +0 -30
  277. package/src/site.ts +3 -29
  278. package/src/subsume.ts +1 -161
  279. package/src/template.ts +69 -140
  280. package/src/trim.ts +0 -53
  281. package/src/type.ts +2 -45
  282. package/src/unify.ts +13 -251
  283. package/src/utility.ts +0 -31
  284. package/src/val/AbnfFuncVal.ts +181 -0
  285. package/src/val/AbsentVal.ts +54 -0
  286. package/src/val/AggFuncVal.ts +152 -188
  287. package/src/val/ArithFuncVal.ts +0 -20
  288. package/src/val/BagVal.ts +1 -78
  289. package/src/val/BigDecimalVal.ts +0 -16
  290. package/src/val/BigIntegerVal.ts +0 -16
  291. package/src/val/CloseFuncVal.ts +0 -9
  292. package/src/val/CmpFuncVal.ts +4 -166
  293. package/src/val/ConjunctVal.ts +0 -33
  294. package/src/val/ConstraintVal.ts +2 -537
  295. package/src/val/ContainerKindVal.ts +0 -18
  296. package/src/val/CopyFuncVal.ts +0 -5
  297. package/src/val/Decimal.ts +1 -185
  298. package/src/val/DeprecateFuncVal.ts +0 -10
  299. package/src/val/DisjunctVal.ts +0 -157
  300. package/src/val/EachFuncVal.ts +0 -40
  301. package/src/val/EmitFuncVal.ts +8 -208
  302. package/src/val/ExpectVal.ts +0 -62
  303. package/src/val/FilterFuncVal.ts +0 -55
  304. package/src/val/FuncBaseVal.ts +9 -130
  305. package/src/val/GraphAtomVal.ts +0 -42
  306. package/src/val/HideFuncVal.ts +0 -15
  307. package/src/val/IntegerVal.ts +0 -61
  308. package/src/val/JunctionVal.ts +0 -20
  309. package/src/val/KeyFuncVal.ts +0 -48
  310. package/src/val/ListVal.ts +0 -59
  311. package/src/val/LowerFuncVal.ts +0 -12
  312. package/src/val/MapVal.ts +0 -151
  313. package/src/val/MatchFuncVal.ts +0 -59
  314. package/src/val/MaybeFuncVal.ts +86 -0
  315. package/src/val/MoveFuncVal.ts +0 -20
  316. package/src/val/NilVal.ts +0 -60
  317. package/src/val/NomFuncVal.ts +8 -95
  318. package/src/val/NumberVal.ts +0 -16
  319. package/src/val/OpBaseVal.ts +4 -17
  320. package/src/val/PackFuncVal.ts +0 -63
  321. package/src/val/PathFuncVal.ts +0 -32
  322. package/src/val/PathVal.ts +0 -66
  323. package/src/val/PlaceVal.ts +0 -45
  324. package/src/val/PlusOpVal.ts +18 -75
  325. package/src/val/PrefFuncVal.ts +0 -1
  326. package/src/val/PrefVal.ts +0 -179
  327. package/src/val/RecurseVal.ts +0 -81
  328. package/src/val/RefVal.ts +1 -285
  329. package/src/val/ReferFuncVal.ts +0 -255
  330. package/src/val/ScalarKindVal.ts +0 -50
  331. package/src/val/ScalarVal.ts +0 -12
  332. package/src/val/StrFuncVal.ts +0 -44
  333. package/src/val/SuperFuncVal.ts +0 -42
  334. package/src/val/TopVal.ts +0 -1
  335. package/src/val/TranslateFuncVal.ts +1 -51
  336. package/src/val/UpperFuncVal.ts +0 -12
  337. package/src/val/Val.ts +3 -192
  338. package/src/val/VarVal.ts +0 -15
  339. package/src/val/arith.ts +0 -92
  340. package/src/val/caserange.ts +0 -62
  341. package/src/val/members.ts +0 -23
  342. package/src/val/numcmp.ts +1 -27
  343. package/src/val/numkind.ts +0 -149
  344. package/src/val/valutil.ts +0 -16
  345. package/src/vet.ts +1 -582
  346. package/src/view.ts +0 -507
  347. package/src/walk.ts +0 -41
  348. package/dist/std.d.ts +0 -3
  349. package/dist/std.js +0 -672
  350. package/dist/std.js.map +0 -1
  351. package/dist/val/FormFuncVal.js +0 -55
  352. package/dist/val/FormFuncVal.js.map +0 -1
  353. package/dist/val/NamerFuncVal.d.ts +0 -12
  354. package/dist/val/NamerFuncVal.js +0 -176
  355. package/dist/val/NamerFuncVal.js.map +0 -1
  356. package/src/std.ts +0 -683
package/src/utility.ts CHANGED
@@ -1,18 +1,9 @@
1
1
  /* Copyright (c) 2023-2025 Richard Rodger, MIT License */
2
2
 
3
3
 
4
-
5
4
  import type { AontuOptions, TrustOptions, Val } from './type'
6
5
 
7
6
 
8
- // THE INCLUDE OPTIONS AN ENGINE HANDS ITS Aontu INSTANCE. Every verb
9
- // engine builds one, and until there were two such options each did it
10
- // inline -- `null == options.trust ? undefined : { trust: options.trust }`,
11
- // written out twelve times. That is fine while there is one option and
12
- // a latent bug the moment there are two: `textExt` had to reach the
13
- // same twelve places, and the one it missed refused a `.md` include
14
- // under a flag the bare command honoured. One function now, so a third
15
- // include option is threaded once.
16
7
  type IncludeOptions = {
17
8
  trust?: TrustOptions
18
9
  textExt?: string[]
@@ -27,11 +18,6 @@ function includeOpts(options: IncludeOptions): Partial<AontuOptions> {
27
18
  }
28
19
 
29
20
 
30
- // Default walk() depth limit. High enough that real configs are never
31
- // silently truncated (the old default of 32 dropped marks on deeply
32
- // nested refs/funcs → wrong output), while still bounding runaway or
33
- // accidentally-cyclic walks (walk has no cycle detection). Pass null for
34
- // truly unbounded.
35
21
  const WALK_DEFAULT_MAXDEPTH = 9999
36
22
 
37
23
 
@@ -47,12 +33,6 @@ function propagateMarks(source: Val, target: Val): void {
47
33
  }
48
34
 
49
35
 
50
- // Collect every value in the tree carrying the deprecation record (G3
51
- // phase 4), with its path — the one walk behind vet's `deprecated`
52
- // warnings and the LSP's Deprecated tags. The record travels on meets
53
- // (the unite rider) and clones, so this sees the declaration and every
54
- // use resolving through it. The non-Val guard is for a bag's raw peg
55
- // entries, which degenerate parses can leave behind.
56
36
  function collectDeprecations(
57
37
  root: Val): Array<{ val: Val, path: string[] }> {
58
38
  const out: Array<{ val: Val, path: string[] }> = []
@@ -97,17 +77,6 @@ function deprecationMessage(d: Record<string, string>): string {
97
77
  }
98
78
 
99
79
 
100
- // The canonical form of a value, wrapped in the RIDER it carries —
101
- // the deprecation record (G3 phase 4) — reparseably, so
102
- // `deprecate(x, m)` survives canon. Bags render their children through
103
- // this (MapVal/ListVal canon), which is where a marked FIELD — the
104
- // realistic case — lives.
105
- //
106
- // The rider renders HERE and not in the value's own `canon` for the
107
- // same reason the guard at the MapVal call site tests the isVal flag:
108
- // a bag's canon recursion visits each child once, and a child that
109
- // wrapped itself as well would render its subtree twice per level —
110
- // 2^depth on a nested document.
111
80
  function canonRiders(v: Val): string {
112
81
  const c = v.canon
113
82
  const d = v.deprecation
@@ -0,0 +1,181 @@
1
+ /* Copyright (c) 2026 Richard Rodger, MIT License */
2
+
3
+ // The grammar pair, ADR-033. Twin of go/abnf.go.
4
+
5
+ import type { Val, ValSpec } from '../type'
6
+ import { DONE } from '../type'
7
+ import { AontuContext } from '../ctx'
8
+ import { FuncBaseVal } from './FuncBaseVal'
9
+ import { StringVal } from './StringVal'
10
+ import { MapVal } from './MapVal'
11
+ import { ListVal } from './ListVal'
12
+ import { ConjunctVal } from './ConjunctVal'
13
+ import { makeNilErr } from '../err'
14
+ import { compileGrammar, parseWith } from '../grammar'
15
+
16
+
17
+ class AbnfFuncVal extends FuncBaseVal {
18
+ isAbnfFunc = true
19
+
20
+ constructor(spec: ValSpec, ctx?: AontuContext) {
21
+ super(spec, ctx)
22
+ }
23
+
24
+ funcname() {
25
+ return 'abnf'
26
+ }
27
+
28
+ resolve(ctx: AontuContext, args: Val[]): Val {
29
+ const a: any = args[0]
30
+
31
+ // Not an arity check: the arity and signature gates run first, so
32
+ // what reaches here is a nil argument, which both pass over.
33
+ if ('string' !== typeof a?.peg) {
34
+ return this.place(makeNilErr(ctx, 'abnf_grammar', this, undefined,
35
+ 'abnf'))
36
+ }
37
+
38
+ const [, why] = compileGrammar(a.peg)
39
+ if (undefined !== why) {
40
+ return this.place(makeNilErr(ctx, 'abnf_grammar', this, undefined,
41
+ 'abnf', { reason: why }))
42
+ }
43
+
44
+ return this.place(new StringVal({ peg: a.peg }, ctx))
45
+ }
46
+ }
47
+
48
+
49
+ // A tree node is just the map {rule, src, kids}, so it needs no case of
50
+ // its own. Keys are sorted so both ports build the same member order.
51
+ function astVal(node: any, ctx: AontuContext): Val {
52
+ if ('string' === typeof node) {
53
+ return new StringVal({ peg: node }, ctx)
54
+ }
55
+
56
+ if (Array.isArray(node)) {
57
+ return new ListVal({
58
+ peg: node.map(
59
+ (e: any, i: number) => astVal(e, ctx.descend(String(i)))),
60
+ }, ctx)
61
+ }
62
+
63
+ const peg: Record<string, Val> = {}
64
+ for (const k of Object.keys(node).sort()) {
65
+ peg[k] = astVal(node[k], ctx.descend(k))
66
+ }
67
+ return new MapVal({ peg }, ctx)
68
+ }
69
+
70
+
71
+ class ParseFuncVal extends FuncBaseVal {
72
+ isParseFunc = true
73
+
74
+ constructor(spec: ValSpec, ctx?: AontuContext) {
75
+ super(spec, ctx)
76
+ }
77
+
78
+ funcname() {
79
+ return 'parse'
80
+ }
81
+
82
+
83
+ // Meets its peer instead of resolving, so it must see the peer
84
+ // before the base drives to resolve().
85
+ unify(peer: Val, ctx: AontuContext): Val {
86
+ if (1 !== this.peg.length) {
87
+ return super.unify(peer, ctx)
88
+ }
89
+
90
+ this.driveStagedArgs(ctx, 1)
91
+
92
+ const g: any = this.peg[0]
93
+ if ('string' !== typeof g?.peg) {
94
+ return this.residuate(peer, ctx)
95
+ }
96
+
97
+ // A settled constraint is stable, as a residual constraint atom is.
98
+ // Without this a `type()` holding one never resolves.
99
+ this.dc = DONE
100
+
101
+ const p: any = peer
102
+ if (true !== p?.isString || 'string' !== typeof p?.peg) {
103
+ return this.hold(peer, ctx)
104
+ }
105
+
106
+ const [grammar, why] = compileGrammar(g.peg)
107
+ if (undefined !== why) {
108
+ return makeNilErr(ctx, 'abnf_grammar', this, peer, 'parse',
109
+ { reason: why })
110
+ }
111
+ if ('' === p.peg) {
112
+ return makeNilErr(ctx, 'parse_failed', this, peer, 'parse',
113
+ { reason: 'the empty string parses under no grammar' })
114
+ }
115
+ const [, err] = parseWith(grammar, p.peg, ctx)
116
+ if (undefined !== err) {
117
+ return makeNilErr(ctx, 'parse_failed', this, peer, 'parse',
118
+ { reason: err })
119
+ }
120
+
121
+ return peer
122
+ }
123
+
124
+
125
+ // The stable twin of residuate: no `notdone()`, because a settled
126
+ // constraint stays done while it waits for a value.
127
+ hold(peer: Val, ctx: AontuContext): Val {
128
+ if (peer.isTop || peer.id === this.id) {
129
+ // Cloned, or a driver meeting it twice reports `unify_cycle`.
130
+ const out: Val = this.clone(ctx)
131
+ out.dc = DONE
132
+ return out
133
+ }
134
+
135
+ if (peer.isFunc
136
+ && (peer as any).funcname() === this.funcname()
137
+ && peer.path.join('.') === this.path.join('.')
138
+ && peer.canon === this.canon) {
139
+ return this
140
+ }
141
+
142
+ return new ConjunctVal({ peg: [this, peer] }, ctx)
143
+ }
144
+
145
+
146
+ resolve(ctx: AontuContext, args: Val[]): Val {
147
+ const g: any = args[0]
148
+ const v: any = args[1]
149
+
150
+ // Not an arity check: see the abnf twin above.
151
+ if ('string' !== typeof g?.peg || 'string' !== typeof v?.peg) {
152
+ return this.place(makeNilErr(ctx, 'parse_arg', this, undefined, 'parse'))
153
+ }
154
+
155
+ const [grammar, why] = compileGrammar(g.peg)
156
+ if (undefined !== why) {
157
+ return this.place(makeNilErr(ctx, 'abnf_grammar', this, undefined,
158
+ 'parse', { reason: why }))
159
+ }
160
+
161
+ // The host answers an empty tree for empty input.
162
+ if ('' === v.peg) {
163
+ return this.place(makeNilErr(ctx, 'parse_failed', this, undefined,
164
+ 'parse', { reason: 'the empty string parses under no grammar' }))
165
+ }
166
+
167
+ const [node, err] = parseWith(grammar, v.peg, ctx)
168
+ if (undefined !== err) {
169
+ return this.place(makeNilErr(ctx, 'parse_failed', this, undefined,
170
+ 'parse', { reason: err }))
171
+ }
172
+
173
+ return this.place(astVal(node, ctx))
174
+ }
175
+ } /* node:coverage ignore next 6 */
176
+
177
+
178
+ export {
179
+ AbnfFuncVal,
180
+ ParseFuncVal,
181
+ }
@@ -0,0 +1,54 @@
1
+ /* Copyright (c) 2026 Richard Rodger, MIT License */
2
+
3
+
4
+ import type {
5
+ Val,
6
+ ValSpec,
7
+ } from '../type'
8
+
9
+ import {
10
+ DONE,
11
+ } from '../type'
12
+
13
+ import {
14
+ AontuContext,
15
+ } from '../ctx'
16
+
17
+ import { FeatureVal } from './FeatureVal'
18
+
19
+
20
+ // Top with one difference (ADR-034): absence is GENERABLE, and
21
+ // generates nothing, so a bag drops it at a required key too.
22
+ class AbsentVal extends FeatureVal {
23
+ isAbsent = true
24
+
25
+ constructor(
26
+ spec: ValSpec,
27
+ ctx?: AontuContext
28
+ ) {
29
+ super(spec, ctx)
30
+ this.dc = DONE
31
+ this.mark.type = false
32
+ this.mark.hide = false
33
+ }
34
+
35
+ // The unit of the meet, called for EITHER operand so `&` commutes.
36
+ // Nothing here meets an absence with TOP, so there is no top arm;
37
+ // Go has one because it MEETS an op's result where this port places
38
+ // it. edge-plus-list-absent guards the day that changes.
39
+ unify(peer: Val, _ctx: AontuContext): Val {
40
+ return peer
41
+ }
42
+
43
+ get canon() { return 'maybe()' }
44
+
45
+ gen(_ctx?: AontuContext) {
46
+ return undefined
47
+ }
48
+
49
+ } /* node:coverage ignore next 6 */
50
+
51
+
52
+ export {
53
+ AbsentVal,
54
+ }