aontu 0.61.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 (371) hide show
  1. package/README.md +4 -4
  2. package/dist/agentsmd.d.ts +1 -0
  3. package/dist/agentsmd.js +7 -28
  4. package/dist/agentsmd.js.map +1 -1
  5. package/dist/alias.js.map +1 -1
  6. package/dist/allow.d.ts +23 -0
  7. package/dist/allow.js +138 -0
  8. package/dist/allow.js.map +1 -0
  9. package/dist/aontu.d.ts +4 -2
  10. package/dist/aontu.js +4 -80
  11. package/dist/aontu.js.map +1 -1
  12. package/dist/aontumodel.d.ts +4 -0
  13. package/dist/aontumodel.js +33 -0
  14. package/dist/aontumodel.js.map +1 -0
  15. package/dist/cli.d.ts +10 -1
  16. package/dist/cli.js +877 -479
  17. package/dist/cli.js.map +1 -1
  18. package/dist/ctx.js +0 -48
  19. package/dist/ctx.js.map +1 -1
  20. package/dist/diff.js +0 -32
  21. package/dist/diff.js.map +1 -1
  22. package/dist/err.js +0 -40
  23. package/dist/err.js.map +1 -1
  24. package/dist/escape.js +0 -45
  25. package/dist/escape.js.map +1 -1
  26. package/dist/exactjson.d.ts +0 -35
  27. package/dist/exactjson.js +0 -131
  28. package/dist/exactjson.js.map +1 -1
  29. package/dist/format.js +55 -189
  30. package/dist/format.js.map +1 -1
  31. package/dist/grammar.d.ts +9 -0
  32. package/dist/grammar.js +54 -0
  33. package/dist/grammar.js.map +1 -0
  34. package/dist/graph.js +0 -26
  35. package/dist/graph.js.map +1 -1
  36. package/dist/hcanon.js +0 -82
  37. package/dist/hcanon.js.map +1 -1
  38. package/dist/helpdoc.d.ts +16 -0
  39. package/dist/helpdoc.js +59 -0
  40. package/dist/helpdoc.js.map +1 -0
  41. package/dist/hints.d.ts +0 -6
  42. package/dist/hints.js +59 -47
  43. package/dist/hints.js.map +1 -1
  44. package/dist/jsonschema.js +0 -114
  45. package/dist/jsonschema.js.map +1 -1
  46. package/dist/keyorder.d.ts +0 -7
  47. package/dist/keyorder.js +0 -41
  48. package/dist/keyorder.js.map +1 -1
  49. package/dist/lang.js +32 -877
  50. package/dist/lang.js.map +1 -1
  51. package/dist/lower.d.ts +3 -0
  52. package/dist/lower.js +14 -61
  53. package/dist/lower.js.map +1 -1
  54. package/dist/lsp-server.js +0 -16
  55. package/dist/lsp-server.js.map +1 -1
  56. package/dist/lsp.d.ts +1 -1
  57. package/dist/lsp.js +12 -159
  58. package/dist/lsp.js.map +1 -1
  59. package/dist/mcp-server.js +0 -26
  60. package/dist/mcp-server.js.map +1 -1
  61. package/dist/mcp.js +0 -113
  62. package/dist/mcp.js.map +1 -1
  63. package/dist/mod-tool.js +0 -130
  64. package/dist/mod-tool.js.map +1 -1
  65. package/dist/mod.js +0 -162
  66. package/dist/mod.js.map +1 -1
  67. package/dist/patch.js +0 -217
  68. package/dist/patch.js.map +1 -1
  69. package/dist/provenance.js +0 -140
  70. package/dist/provenance.js.map +1 -1
  71. package/dist/query.js +0 -75
  72. package/dist/query.js.map +1 -1
  73. package/dist/reach.js +0 -43
  74. package/dist/reach.js.map +1 -1
  75. package/dist/relation.d.ts +2 -0
  76. package/dist/relation.js +3 -58
  77. package/dist/relation.js.map +1 -1
  78. package/dist/render.js +33 -143
  79. package/dist/render.js.map +1 -1
  80. package/dist/report-sarif.d.ts +0 -11
  81. package/dist/report-sarif.js +0 -28
  82. package/dist/report-sarif.js.map +1 -1
  83. package/dist/sig.js +0 -35
  84. package/dist/sig.js.map +1 -1
  85. package/dist/sigdecl.js +1 -1
  86. package/dist/sigdecl.js.map +1 -1
  87. package/dist/siggate.js +0 -4
  88. package/dist/siggate.js.map +1 -1
  89. package/dist/site.js +3 -29
  90. package/dist/site.js.map +1 -1
  91. package/dist/subsume.d.ts +0 -10
  92. package/dist/subsume.js +0 -137
  93. package/dist/subsume.js.map +1 -1
  94. package/dist/template.d.ts +2 -1
  95. package/dist/template.js +58 -138
  96. package/dist/template.js.map +1 -1
  97. package/dist/trim.js +0 -41
  98. package/dist/trim.js.map +1 -1
  99. package/dist/tsconfig.tsbuildinfo +1 -1
  100. package/dist/type.js.map +1 -1
  101. package/dist/unify.js +12 -242
  102. package/dist/unify.js.map +1 -1
  103. package/dist/utility.js +0 -22
  104. package/dist/utility.js.map +1 -1
  105. package/dist/val/AbnfFuncVal.d.ts +18 -0
  106. package/dist/val/AbnfFuncVal.js +132 -0
  107. package/dist/val/AbnfFuncVal.js.map +1 -0
  108. package/dist/val/AbsentVal.d.ts +11 -0
  109. package/dist/val/AbsentVal.js +30 -0
  110. package/dist/val/AbsentVal.js.map +1 -0
  111. package/dist/val/AggFuncVal.d.ts +10 -1
  112. package/dist/val/AggFuncVal.js +104 -116
  113. package/dist/val/AggFuncVal.js.map +1 -1
  114. package/dist/val/ArithFuncVal.js +0 -12
  115. package/dist/val/ArithFuncVal.js.map +1 -1
  116. package/dist/val/BagVal.js +1 -78
  117. package/dist/val/BagVal.js.map +1 -1
  118. package/dist/val/BigDecimalVal.js +0 -16
  119. package/dist/val/BigDecimalVal.js.map +1 -1
  120. package/dist/val/BigIntegerVal.js +0 -16
  121. package/dist/val/BigIntegerVal.js.map +1 -1
  122. package/dist/val/CloseFuncVal.js +0 -9
  123. package/dist/val/CloseFuncVal.js.map +1 -1
  124. package/dist/val/CmpFuncVal.d.ts +20 -0
  125. package/dist/val/CmpFuncVal.js +188 -0
  126. package/dist/val/CmpFuncVal.js.map +1 -0
  127. package/dist/val/ConjunctVal.js +0 -29
  128. package/dist/val/ConjunctVal.js.map +1 -1
  129. package/dist/val/ConstraintVal.js +0 -500
  130. package/dist/val/ConstraintVal.js.map +1 -1
  131. package/dist/val/ContainerKindVal.js +0 -2
  132. package/dist/val/ContainerKindVal.js.map +1 -1
  133. package/dist/val/CopyFuncVal.js +0 -3
  134. package/dist/val/CopyFuncVal.js.map +1 -1
  135. package/dist/val/Decimal.js +0 -179
  136. package/dist/val/Decimal.js.map +1 -1
  137. package/dist/val/DeprecateFuncVal.js.map +1 -1
  138. package/dist/val/DisjunctVal.js +0 -152
  139. package/dist/val/DisjunctVal.js.map +1 -1
  140. package/dist/val/EachFuncVal.d.ts +1 -2
  141. package/dist/val/EachFuncVal.js +12 -29
  142. package/dist/val/EachFuncVal.js.map +1 -1
  143. package/dist/val/EmitFuncVal.d.ts +1 -1
  144. package/dist/val/EmitFuncVal.js +6 -119
  145. package/dist/val/EmitFuncVal.js.map +1 -1
  146. package/dist/val/ExpectVal.js +0 -62
  147. package/dist/val/ExpectVal.js.map +1 -1
  148. package/dist/val/FilterFuncVal.js +0 -25
  149. package/dist/val/FilterFuncVal.js.map +1 -1
  150. package/dist/val/FuncBaseVal.d.ts +1 -0
  151. package/dist/val/FuncBaseVal.js +7 -127
  152. package/dist/val/FuncBaseVal.js.map +1 -1
  153. package/dist/val/GraphAtomVal.js +0 -15
  154. package/dist/val/GraphAtomVal.js.map +1 -1
  155. package/dist/val/HideFuncVal.js +0 -13
  156. package/dist/val/HideFuncVal.js.map +1 -1
  157. package/dist/val/IntegerVal.js +0 -61
  158. package/dist/val/IntegerVal.js.map +1 -1
  159. package/dist/val/JunctionVal.js +0 -20
  160. package/dist/val/JunctionVal.js.map +1 -1
  161. package/dist/val/KeyFuncVal.js +0 -46
  162. package/dist/val/KeyFuncVal.js.map +1 -1
  163. package/dist/val/ListVal.js +0 -57
  164. package/dist/val/ListVal.js.map +1 -1
  165. package/dist/val/LowerFuncVal.js +11 -6
  166. package/dist/val/LowerFuncVal.js.map +1 -1
  167. package/dist/val/MapVal.js +0 -151
  168. package/dist/val/MapVal.js.map +1 -1
  169. package/dist/val/MatchFuncVal.js +0 -27
  170. package/dist/val/MatchFuncVal.js.map +1 -1
  171. package/dist/val/{FormFuncVal.d.ts → MaybeFuncVal.d.ts} +5 -5
  172. package/dist/val/MaybeFuncVal.js +50 -0
  173. package/dist/val/MaybeFuncVal.js.map +1 -0
  174. package/dist/val/MoveFuncVal.js +0 -18
  175. package/dist/val/MoveFuncVal.js.map +1 -1
  176. package/dist/val/NilVal.js +2 -36
  177. package/dist/val/NilVal.js.map +1 -1
  178. package/dist/val/NomFuncVal.d.ts +12 -0
  179. package/dist/val/NomFuncVal.js +153 -0
  180. package/dist/val/NomFuncVal.js.map +1 -0
  181. package/dist/val/NumberVal.js +0 -15
  182. package/dist/val/NumberVal.js.map +1 -1
  183. package/dist/val/OpBaseVal.d.ts +1 -0
  184. package/dist/val/OpBaseVal.js +3 -15
  185. package/dist/val/OpBaseVal.js.map +1 -1
  186. package/dist/val/PackFuncVal.js +0 -34
  187. package/dist/val/PackFuncVal.js.map +1 -1
  188. package/dist/val/PathFuncVal.js +0 -6
  189. package/dist/val/PathFuncVal.js.map +1 -1
  190. package/dist/val/PathVal.js +0 -41
  191. package/dist/val/PathVal.js.map +1 -1
  192. package/dist/val/PlaceVal.js +0 -25
  193. package/dist/val/PlaceVal.js.map +1 -1
  194. package/dist/val/PlusOpVal.d.ts +1 -7
  195. package/dist/val/PlusOpVal.js +13 -74
  196. package/dist/val/PlusOpVal.js.map +1 -1
  197. package/dist/val/PrefFuncVal.js +0 -1
  198. package/dist/val/PrefFuncVal.js.map +1 -1
  199. package/dist/val/PrefVal.js +0 -167
  200. package/dist/val/PrefVal.js.map +1 -1
  201. package/dist/val/RecurseVal.js +0 -55
  202. package/dist/val/RecurseVal.js.map +1 -1
  203. package/dist/val/RefVal.js +0 -282
  204. package/dist/val/RefVal.js.map +1 -1
  205. package/dist/val/ReferFuncVal.js +0 -232
  206. package/dist/val/ReferFuncVal.js.map +1 -1
  207. package/dist/val/ScalarKindVal.js +0 -49
  208. package/dist/val/ScalarKindVal.js.map +1 -1
  209. package/dist/val/ScalarVal.js +0 -11
  210. package/dist/val/ScalarVal.js.map +1 -1
  211. package/dist/val/StrFuncVal.js +0 -18
  212. package/dist/val/StrFuncVal.js.map +1 -1
  213. package/dist/val/SuperFuncVal.js +0 -32
  214. package/dist/val/SuperFuncVal.js.map +1 -1
  215. package/dist/val/TopVal.js +0 -1
  216. package/dist/val/TopVal.js.map +1 -1
  217. package/dist/val/TranslateFuncVal.d.ts +12 -0
  218. package/dist/val/TranslateFuncVal.js +99 -0
  219. package/dist/val/TranslateFuncVal.js.map +1 -0
  220. package/dist/val/UpperFuncVal.js +11 -6
  221. package/dist/val/UpperFuncVal.js.map +1 -1
  222. package/dist/val/Val.d.ts +1 -0
  223. package/dist/val/Val.js +2 -133
  224. package/dist/val/Val.js.map +1 -1
  225. package/dist/val/VarVal.js +0 -12
  226. package/dist/val/VarVal.js.map +1 -1
  227. package/dist/val/arith.js +0 -37
  228. package/dist/val/arith.js.map +1 -1
  229. package/dist/val/caserange.d.ts +3 -0
  230. package/dist/val/caserange.js +49 -0
  231. package/dist/val/caserange.js.map +1 -0
  232. package/dist/val/members.js +0 -6
  233. package/dist/val/members.js.map +1 -1
  234. package/dist/val/numcmp.js +0 -11
  235. package/dist/val/numcmp.js.map +1 -1
  236. package/dist/val/numkind.js +0 -145
  237. package/dist/val/numkind.js.map +1 -1
  238. package/dist/val/valutil.js +0 -16
  239. package/dist/val/valutil.js.map +1 -1
  240. package/dist/vet.d.ts +12 -0
  241. package/dist/vet.js +159 -412
  242. package/dist/vet.js.map +1 -1
  243. package/dist/view.js +0 -414
  244. package/dist/view.js.map +1 -1
  245. package/dist/walk.js +0 -41
  246. package/dist/walk.js.map +1 -1
  247. package/grammar/aontu.abnf +9 -7
  248. package/grammar/aontu.gbnf +5 -5
  249. package/grammar/aontu.lark +5 -5
  250. package/grammar/aontu.tmLanguage.json +1 -1
  251. package/package.json +4 -2
  252. package/skill/SKILL.md +8 -0
  253. package/skill/init/check.sh +28 -0
  254. package/skill/init/data.aon +12 -0
  255. package/skill/init/model.aon +19 -0
  256. package/skill/tasks.md +151 -0
  257. package/src/agentsmd.ts +8 -32
  258. package/src/alias.ts +0 -39
  259. package/src/allow.ts +221 -0
  260. package/src/aontu.ts +10 -108
  261. package/src/aontumodel.ts +32 -0
  262. package/src/cli.ts +1009 -540
  263. package/src/ctx.ts +0 -103
  264. package/src/diff.ts +0 -40
  265. package/src/err.ts +0 -40
  266. package/src/escape.ts +0 -46
  267. package/src/exactjson.ts +0 -131
  268. package/src/format.ts +63 -234
  269. package/src/grammar.ts +72 -0
  270. package/src/graph.ts +0 -61
  271. package/src/hcanon.ts +0 -82
  272. package/src/helpdoc.ts +77 -0
  273. package/src/hints.ts +72 -49
  274. package/src/jsonschema.ts +0 -123
  275. package/src/keyorder.ts +0 -42
  276. package/src/lang.ts +39 -895
  277. package/src/lower.ts +15 -65
  278. package/src/lsp-server.ts +0 -16
  279. package/src/lsp.ts +12 -180
  280. package/src/mcp-server.ts +0 -31
  281. package/src/mcp.ts +0 -130
  282. package/src/mod-tool.ts +0 -158
  283. package/src/mod.ts +0 -178
  284. package/src/patch.ts +0 -232
  285. package/src/provenance.ts +0 -183
  286. package/src/query.ts +0 -84
  287. package/src/reach.ts +0 -53
  288. package/src/relation.ts +7 -71
  289. package/src/render.ts +33 -180
  290. package/src/report-sarif.ts +0 -48
  291. package/src/sig.ts +0 -35
  292. package/src/sigdecl.ts +1 -1
  293. package/src/siggate.ts +0 -30
  294. package/src/site.ts +3 -29
  295. package/src/subsume.ts +1 -161
  296. package/src/template.ts +69 -140
  297. package/src/trim.ts +0 -53
  298. package/src/type.ts +2 -45
  299. package/src/unify.ts +13 -251
  300. package/src/utility.ts +0 -31
  301. package/src/val/AbnfFuncVal.ts +181 -0
  302. package/src/val/AbsentVal.ts +54 -0
  303. package/src/val/AggFuncVal.ts +152 -188
  304. package/src/val/ArithFuncVal.ts +0 -20
  305. package/src/val/BagVal.ts +1 -78
  306. package/src/val/BigDecimalVal.ts +0 -16
  307. package/src/val/BigIntegerVal.ts +0 -16
  308. package/src/val/CloseFuncVal.ts +0 -9
  309. package/src/val/CmpFuncVal.ts +249 -0
  310. package/src/val/ConjunctVal.ts +0 -33
  311. package/src/val/ConstraintVal.ts +2 -537
  312. package/src/val/ContainerKindVal.ts +0 -18
  313. package/src/val/CopyFuncVal.ts +0 -5
  314. package/src/val/Decimal.ts +1 -185
  315. package/src/val/DeprecateFuncVal.ts +0 -10
  316. package/src/val/DisjunctVal.ts +0 -157
  317. package/src/val/EachFuncVal.ts +12 -53
  318. package/src/val/EmitFuncVal.ts +8 -208
  319. package/src/val/ExpectVal.ts +0 -62
  320. package/src/val/FilterFuncVal.ts +0 -55
  321. package/src/val/FuncBaseVal.ts +9 -130
  322. package/src/val/GraphAtomVal.ts +0 -42
  323. package/src/val/HideFuncVal.ts +0 -15
  324. package/src/val/IntegerVal.ts +0 -61
  325. package/src/val/JunctionVal.ts +0 -20
  326. package/src/val/KeyFuncVal.ts +0 -48
  327. package/src/val/ListVal.ts +0 -59
  328. package/src/val/LowerFuncVal.ts +12 -7
  329. package/src/val/MapVal.ts +0 -151
  330. package/src/val/MatchFuncVal.ts +0 -59
  331. package/src/val/MaybeFuncVal.ts +86 -0
  332. package/src/val/MoveFuncVal.ts +0 -20
  333. package/src/val/NilVal.ts +2 -36
  334. package/src/val/NomFuncVal.ts +200 -0
  335. package/src/val/NumberVal.ts +0 -16
  336. package/src/val/OpBaseVal.ts +4 -17
  337. package/src/val/PackFuncVal.ts +0 -63
  338. package/src/val/PathFuncVal.ts +0 -32
  339. package/src/val/PathVal.ts +0 -66
  340. package/src/val/PlaceVal.ts +0 -45
  341. package/src/val/PlusOpVal.ts +18 -75
  342. package/src/val/PrefFuncVal.ts +0 -1
  343. package/src/val/PrefVal.ts +0 -179
  344. package/src/val/RecurseVal.ts +0 -81
  345. package/src/val/RefVal.ts +1 -285
  346. package/src/val/ReferFuncVal.ts +0 -255
  347. package/src/val/ScalarKindVal.ts +0 -50
  348. package/src/val/ScalarVal.ts +0 -12
  349. package/src/val/StrFuncVal.ts +0 -44
  350. package/src/val/SuperFuncVal.ts +0 -42
  351. package/src/val/TopVal.ts +0 -1
  352. package/src/val/TranslateFuncVal.ts +132 -0
  353. package/src/val/UpperFuncVal.ts +12 -7
  354. package/src/val/Val.ts +3 -192
  355. package/src/val/VarVal.ts +0 -15
  356. package/src/val/arith.ts +0 -92
  357. package/src/val/caserange.ts +53 -0
  358. package/src/val/members.ts +0 -23
  359. package/src/val/numcmp.ts +1 -27
  360. package/src/val/numkind.ts +0 -149
  361. package/src/val/valutil.ts +0 -16
  362. package/src/vet.ts +209 -504
  363. package/src/view.ts +0 -507
  364. package/src/walk.ts +0 -41
  365. package/dist/std.d.ts +0 -3
  366. package/dist/std.js +0 -637
  367. package/dist/std.js.map +0 -1
  368. package/dist/val/FormFuncVal.js +0 -55
  369. package/dist/val/FormFuncVal.js.map +0 -1
  370. package/src/std.ts +0 -648
  371. package/src/val/FormFuncVal.ts +0 -119
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
+ }