@astrale-os/kernel-dsl 0.1.5 → 0.2.0-beta.10

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 (701) hide show
  1. package/dist/index.d.ts +1 -57
  2. package/dist/index.js +1 -31
  3. package/dist/upgrade/contract.d.ts +31 -0
  4. package/dist/upgrade/contract.js +1 -0
  5. package/dist/upgrade/index.d.ts +1 -0
  6. package/dist/upgrade/index.js +1 -0
  7. package/dist/v1/addressing/class-key.d.ts +12 -0
  8. package/dist/v1/addressing/class-key.js +39 -0
  9. package/dist/v1/addressing/definition-ref.d.ts +28 -0
  10. package/dist/v1/addressing/definition-ref.js +63 -0
  11. package/dist/v1/addressing/domain-dependency.d.ts +18 -0
  12. package/dist/v1/addressing/domain-dependency.js +6 -0
  13. package/dist/v1/addressing/index.d.ts +12 -0
  14. package/dist/v1/addressing/index.js +7 -0
  15. package/dist/v1/addressing/key.d.ts +19 -0
  16. package/dist/v1/addressing/key.js +39 -0
  17. package/dist/v1/addressing/method-address.d.ts +9 -0
  18. package/dist/v1/addressing/method-address.js +1 -0
  19. package/dist/v1/addressing/method-key.d.ts +15 -0
  20. package/dist/v1/addressing/method-key.js +60 -0
  21. package/dist/v1/addressing/ordering.d.ts +6 -0
  22. package/dist/v1/addressing/ordering.js +20 -0
  23. package/dist/v1/addressing/patterns.d.ts +27 -0
  24. package/dist/v1/addressing/patterns.js +29 -0
  25. package/dist/v1/addressing/property-key.d.ts +13 -0
  26. package/dist/v1/addressing/property-key.js +39 -0
  27. package/dist/v1/addressing/revision.d.ts +8 -0
  28. package/dist/v1/addressing/revision.js +8 -0
  29. package/dist/v1/builder/callable/authoring.d.ts +117 -0
  30. package/dist/v1/builder/callable/authoring.js +67 -0
  31. package/dist/v1/builder/class/authoring.d.ts +367 -0
  32. package/dist/v1/builder/class/authoring.js +134 -0
  33. package/dist/v1/builder/class/property.d.ts +52 -0
  34. package/dist/v1/builder/class/property.js +49 -0
  35. package/dist/v1/builder/core/authoring.d.ts +42 -0
  36. package/dist/v1/builder/core/authoring.js +39 -0
  37. package/dist/v1/builder/index.d.ts +26 -0
  38. package/dist/v1/builder/index.js +11 -0
  39. package/dist/v1/builder/lowering/callable.d.ts +24 -0
  40. package/dist/v1/builder/lowering/callable.js +135 -0
  41. package/dist/v1/builder/lowering/class.d.ts +22 -0
  42. package/dist/v1/builder/lowering/class.js +129 -0
  43. package/dist/v1/builder/lowering/core-properties.d.ts +10 -0
  44. package/dist/v1/builder/lowering/core-properties.js +76 -0
  45. package/dist/v1/builder/lowering/core.d.ts +22 -0
  46. package/dist/v1/builder/lowering/core.js +50 -0
  47. package/dist/v1/builder/lowering/policy.d.ts +16 -0
  48. package/dist/v1/builder/lowering/policy.js +59 -0
  49. package/dist/v1/builder/lowering/schema/capture.d.ts +4 -0
  50. package/dist/v1/builder/lowering/schema/capture.js +70 -0
  51. package/dist/v1/builder/lowering/schema/compile.d.ts +10 -0
  52. package/dist/v1/builder/lowering/schema/compile.js +80 -0
  53. package/dist/v1/builder/lowering/schema/context.d.ts +44 -0
  54. package/dist/v1/builder/lowering/schema/context.js +247 -0
  55. package/dist/v1/builder/lowering/schema/ownership.d.ts +8 -0
  56. package/dist/v1/builder/lowering/schema/ownership.js +29 -0
  57. package/dist/v1/builder/lowering/value/compile.d.ts +15 -0
  58. package/dist/v1/builder/lowering/value/compile.js +136 -0
  59. package/dist/v1/builder/lowering/value/path.d.ts +3 -0
  60. package/dist/v1/builder/lowering/value/path.js +20 -0
  61. package/dist/v1/builder/lowering/value/zod.d.ts +32 -0
  62. package/dist/v1/builder/lowering/value/zod.js +342 -0
  63. package/dist/v1/builder/lowering/view.d.ts +11 -0
  64. package/dist/v1/builder/lowering/view.js +27 -0
  65. package/dist/v1/builder/policy/authoring.d.ts +52 -0
  66. package/dist/v1/builder/policy/authoring.js +90 -0
  67. package/dist/v1/builder/schema/define.d.ts +11 -0
  68. package/dist/v1/builder/schema/define.js +5 -0
  69. package/dist/v1/builder/schema/diagnostic.d.ts +16 -0
  70. package/dist/v1/builder/schema/diagnostic.js +31 -0
  71. package/dist/v1/builder/schema/handle.d.ts +7 -0
  72. package/dist/v1/builder/schema/handle.js +14 -0
  73. package/dist/v1/builder/schema/input.d.ts +15 -0
  74. package/dist/v1/builder/schema/input.js +1 -0
  75. package/dist/v1/builder/schema/lazy.d.ts +2 -0
  76. package/dist/v1/builder/schema/lazy.js +13 -0
  77. package/dist/v1/builder/schema/projection.d.ts +364 -0
  78. package/dist/v1/builder/schema/projection.js +1 -0
  79. package/dist/v1/builder/value/full-match.d.ts +4 -0
  80. package/dist/v1/builder/value/full-match.js +11 -0
  81. package/dist/v1/builder/value/path-metadata.d.ts +4 -0
  82. package/dist/v1/builder/value/path-metadata.js +7 -0
  83. package/dist/v1/builder/value/path.d.ts +8 -0
  84. package/dist/v1/builder/value/path.js +11 -0
  85. package/dist/v1/builder/value/schema.d.ts +16 -0
  86. package/dist/v1/builder/value/schema.js +10 -0
  87. package/dist/v1/builder/view/authoring.d.ts +17 -0
  88. package/dist/v1/builder/view/authoring.js +16 -0
  89. package/dist/v1/bundle/codec.d.ts +5 -0
  90. package/dist/v1/bundle/codec.js +168 -0
  91. package/dist/v1/bundle/create.d.ts +3 -0
  92. package/dist/v1/bundle/create.js +5 -0
  93. package/dist/v1/bundle/diagnostic.d.ts +10 -0
  94. package/dist/v1/bundle/diagnostic.js +17 -0
  95. package/dist/v1/bundle/index.d.ts +18 -0
  96. package/dist/v1/bundle/index.js +20 -0
  97. package/dist/v1/bundle/model.d.ts +16 -0
  98. package/dist/v1/bundle/model.js +11 -0
  99. package/dist/v1/bundle/structure.d.ts +7 -0
  100. package/dist/v1/bundle/structure.js +71 -0
  101. package/dist/v1/bundle/transport.d.ts +8 -0
  102. package/dist/v1/bundle/transport.js +7 -0
  103. package/dist/v1/compiled/admission/accept.d.ts +3 -0
  104. package/dist/v1/compiled/admission/accept.js +881 -0
  105. package/dist/v1/compiled/admission/revision.d.ts +4 -0
  106. package/dist/v1/compiled/admission/revision.js +73 -0
  107. package/dist/v1/compiled/admission/semantics.d.ts +7 -0
  108. package/dist/v1/compiled/admission/semantics.js +1091 -0
  109. package/dist/v1/compiled/codec/json.d.ts +3 -0
  110. package/dist/v1/compiled/codec/json.js +9 -0
  111. package/dist/v1/compiled/compiler/compile.d.ts +4 -0
  112. package/dist/v1/compiled/compiler/compile.js +113 -0
  113. package/dist/v1/compiled/diagnostic.d.ts +11 -0
  114. package/dist/v1/compiled/diagnostic.js +13 -0
  115. package/dist/v1/compiled/index.d.ts +7 -0
  116. package/dist/v1/compiled/index.js +5 -0
  117. package/dist/v1/compiled/loader/index.d.ts +1 -0
  118. package/dist/v1/compiled/loader/index.js +1 -0
  119. package/dist/v1/compiled/loader/load.d.ts +4 -0
  120. package/dist/v1/compiled/loader/load.js +141 -0
  121. package/dist/v1/compiled/model/schema.d.ts +73 -0
  122. package/dist/v1/compiled/model/schema.js +1 -0
  123. package/dist/v1/domain/create.d.ts +8 -0
  124. package/dist/v1/domain/create.js +264 -0
  125. package/dist/v1/domain/index.d.ts +2 -0
  126. package/dist/v1/domain/index.js +1 -0
  127. package/dist/v1/domain/model/domain.d.ts +59 -0
  128. package/dist/v1/domain/model/domain.js +1 -0
  129. package/dist/v1/domain/model/input.d.ts +31 -0
  130. package/dist/v1/domain/model/input.js +1 -0
  131. package/dist/v1/domain/namespace/member-collection.d.ts +5 -0
  132. package/dist/v1/domain/namespace/member-collection.js +81 -0
  133. package/dist/v1/domain/projection/classes.d.ts +4 -0
  134. package/dist/v1/domain/projection/classes.js +200 -0
  135. package/dist/v1/domain/validation/create.d.ts +18 -0
  136. package/dist/v1/domain/validation/create.js +75 -0
  137. package/dist/v1/index.d.ts +16 -0
  138. package/dist/v1/index.js +8 -0
  139. package/dist/v1/language/callable/index.d.ts +2 -0
  140. package/dist/v1/language/callable/index.js +1 -0
  141. package/dist/v1/language/callable/model/callable.d.ts +33 -0
  142. package/dist/v1/language/callable/model/callable.js +1 -0
  143. package/dist/v1/language/callable/resolved.d.ts +68 -0
  144. package/dist/v1/language/callable/resolved.js +1 -0
  145. package/dist/v1/language/class/facets.d.ts +58 -0
  146. package/dist/v1/language/class/facets.js +1 -0
  147. package/dist/v1/language/class/index.d.ts +8 -0
  148. package/dist/v1/language/class/index.js +1 -0
  149. package/dist/v1/language/class/model/class.d.ts +36 -0
  150. package/dist/v1/language/class/model/class.js +1 -0
  151. package/dist/v1/language/class/model/data.d.ts +11 -0
  152. package/dist/v1/language/class/model/data.js +2 -0
  153. package/dist/v1/language/class/model/edge.d.ts +38 -0
  154. package/dist/v1/language/class/model/edge.js +1 -0
  155. package/dist/v1/language/class/model/property.d.ts +18 -0
  156. package/dist/v1/language/class/model/property.js +1 -0
  157. package/dist/v1/language/class/property-values.d.ts +15 -0
  158. package/dist/v1/language/class/property-values.js +30 -0
  159. package/dist/v1/language/class/resolved.d.ts +123 -0
  160. package/dist/v1/language/class/resolved.js +1 -0
  161. package/dist/v1/language/core/index.d.ts +2 -0
  162. package/dist/v1/language/core/index.js +1 -0
  163. package/dist/v1/language/core/model/core.d.ts +20 -0
  164. package/dist/v1/language/core/model/core.js +1 -0
  165. package/dist/v1/language/core/resolved.d.ts +21 -0
  166. package/dist/v1/language/core/resolved.js +1 -0
  167. package/dist/v1/language/definition/metadata.d.ts +12 -0
  168. package/dist/v1/language/definition/metadata.js +12 -0
  169. package/dist/v1/language/definition.d.ts +7 -0
  170. package/dist/v1/language/definition.js +1 -0
  171. package/dist/v1/language/index.d.ts +23 -0
  172. package/dist/v1/language/index.js +1 -0
  173. package/dist/v1/language/policy/analysis/branches.d.ts +19 -0
  174. package/dist/v1/language/policy/analysis/branches.js +132 -0
  175. package/dist/v1/language/policy/analysis/budgets.d.ts +16 -0
  176. package/dist/v1/language/policy/analysis/budgets.js +25 -0
  177. package/dist/v1/language/policy/index.d.ts +3 -0
  178. package/dist/v1/language/policy/index.js +1 -0
  179. package/dist/v1/language/policy/model/policy.d.ts +77 -0
  180. package/dist/v1/language/policy/model/policy.js +1 -0
  181. package/dist/v1/language/policy/normalization/normalize.d.ts +4 -0
  182. package/dist/v1/language/policy/normalization/normalize.js +226 -0
  183. package/dist/v1/language/policy/resolved.d.ts +9 -0
  184. package/dist/v1/language/policy/resolved.js +1 -0
  185. package/dist/v1/language/resolved.d.ts +10 -0
  186. package/dist/v1/language/resolved.js +1 -0
  187. package/dist/v1/language/validation/diagnostic.d.ts +8 -0
  188. package/dist/v1/language/validation/diagnostic.js +3 -0
  189. package/dist/v1/language/value/compile/fields.d.ts +3 -0
  190. package/dist/v1/language/value/compile/fields.js +60 -0
  191. package/dist/v1/language/value/compile/load.d.ts +4 -0
  192. package/dist/v1/language/value/compile/load.js +41 -0
  193. package/dist/v1/language/value/compile/model.d.ts +27 -0
  194. package/dist/v1/language/value/compile/model.js +1 -0
  195. package/dist/v1/language/value/evaluate/assertions.d.ts +6 -0
  196. package/dist/v1/language/value/evaluate/assertions.js +58 -0
  197. package/dist/v1/language/value/evaluate/evaluator.d.ts +4 -0
  198. package/dist/v1/language/value/evaluate/evaluator.js +361 -0
  199. package/dist/v1/language/value/evaluate/preparation.d.ts +13 -0
  200. package/dist/v1/language/value/evaluate/preparation.js +135 -0
  201. package/dist/v1/language/value/evaluate/program.d.ts +3 -0
  202. package/dist/v1/language/value/evaluate/program.js +16 -0
  203. package/dist/v1/language/value/evaluate/types.d.ts +36 -0
  204. package/dist/v1/language/value/evaluate/types.js +9 -0
  205. package/dist/v1/language/value/evaluate/validate.d.ts +12 -0
  206. package/dist/v1/language/value/evaluate/validate.js +43 -0
  207. package/dist/v1/language/value/index.d.ts +11 -0
  208. package/dist/v1/language/value/index.js +8 -0
  209. package/dist/v1/language/value/model/instant.d.ts +9 -0
  210. package/dist/v1/language/value/model/instant.js +37 -0
  211. package/dist/v1/language/value/model/object.d.ts +5 -0
  212. package/dist/v1/language/value/model/object.js +3 -0
  213. package/dist/v1/language/value/model/schema.d.ts +25 -0
  214. package/dist/v1/language/value/model/schema.js +11 -0
  215. package/dist/v1/language/value/ordering.d.ts +13 -0
  216. package/dist/v1/language/value/ordering.js +174 -0
  217. package/dist/v1/language/value/profile/canonicalize.d.ts +4 -0
  218. package/dist/v1/language/value/profile/canonicalize.js +130 -0
  219. package/dist/v1/language/value/profile/json.validate.d.ts +2 -0
  220. package/dist/v1/language/value/profile/json.validate.js +14 -0
  221. package/dist/v1/language/value/profile/meta-schema.compiled.d.ts +78 -0
  222. package/dist/v1/language/value/profile/meta-schema.compiled.js +2079 -0
  223. package/dist/v1/language/value/profile/meta-schema.d.ts +4 -0
  224. package/dist/v1/language/value/profile/meta-schema.js +19 -0
  225. package/dist/v1/language/value/profile/rules.d.ts +3 -0
  226. package/dist/v1/language/value/profile/rules.js +109 -0
  227. package/dist/v1/language/value/profile/validate.d.ts +4 -0
  228. package/dist/v1/language/value/profile/validate.js +39 -0
  229. package/dist/v1/language/value/profile/vocabulary.d.ts +2 -0
  230. package/dist/v1/language/value/profile/vocabulary.js +68 -0
  231. package/dist/v1/language/value/reference/closure.d.ts +11 -0
  232. package/dist/v1/language/value/reference/closure.js +51 -0
  233. package/dist/v1/language/value/reference/recursion.d.ts +5 -0
  234. package/dist/v1/language/value/reference/recursion.js +95 -0
  235. package/dist/v1/language/value/reference/references.d.ts +17 -0
  236. package/dist/v1/language/value/reference/references.js +45 -0
  237. package/dist/v1/language/value/reference/registry.d.ts +24 -0
  238. package/dist/v1/language/value/reference/registry.index.d.ts +14 -0
  239. package/dist/v1/language/value/reference/registry.index.js +76 -0
  240. package/dist/v1/language/value/reference/registry.js +1 -0
  241. package/dist/v1/language/value/regexp/ast.d.ts +21 -0
  242. package/dist/v1/language/value/regexp/ast.js +326 -0
  243. package/dist/v1/language/value/regexp/compile.d.ts +3 -0
  244. package/dist/v1/language/value/regexp/compile.js +96 -0
  245. package/dist/v1/language/value/regexp/lower.d.ts +3 -0
  246. package/dist/v1/language/value/regexp/lower.js +26 -0
  247. package/dist/v1/language/value/regexp/matcher.d.ts +7 -0
  248. package/dist/v1/language/value/regexp/matcher.js +50 -0
  249. package/dist/v1/language/value/regexp/pattern.d.ts +2 -0
  250. package/dist/v1/language/value/regexp/pattern.js +38 -0
  251. package/dist/v1/language/value/regexp/syntax.d.ts +2 -0
  252. package/dist/v1/language/value/regexp/syntax.js +5 -0
  253. package/dist/v1/language/value/syntax/full-match.d.ts +6 -0
  254. package/dist/v1/language/value/syntax/full-match.js +20 -0
  255. package/dist/v1/language/value/syntax/keywords.d.ts +3 -0
  256. package/dist/v1/language/value/syntax/keywords.js +20 -0
  257. package/dist/v1/language/value/syntax/node-path/schema.d.ts +5 -0
  258. package/dist/v1/language/value/syntax/node-path/schema.js +18 -0
  259. package/dist/v1/language/value/syntax/node-path/validate.d.ts +4 -0
  260. package/dist/v1/language/value/syntax/node-path/validate.js +80 -0
  261. package/dist/v1/language/value/syntax/pointer.d.ts +4 -0
  262. package/dist/v1/language/value/syntax/pointer.js +49 -0
  263. package/dist/v1/language/value/syntax/walk.d.ts +10 -0
  264. package/dist/v1/language/value/syntax/walk.js +53 -0
  265. package/dist/v1/language/view/index.d.ts +2 -0
  266. package/dist/v1/language/view/index.js +1 -0
  267. package/dist/v1/language/view/model/view.d.ts +11 -0
  268. package/dist/v1/language/view/model/view.js +1 -0
  269. package/dist/v1/language/view/resolved.d.ts +9 -0
  270. package/dist/v1/language/view/resolved.js +1 -0
  271. package/dist/v1/schema/admission/accept.d.ts +3 -0
  272. package/dist/v1/schema/admission/accept.js +26 -0
  273. package/dist/v1/schema/analysis/class.d.ts +41 -0
  274. package/dist/v1/schema/analysis/class.js +181 -0
  275. package/dist/v1/schema/canonical/domain.d.ts +3 -0
  276. package/dist/v1/schema/canonical/domain.digest.d.ts +3 -0
  277. package/dist/v1/schema/canonical/domain.digest.js +5 -0
  278. package/dist/v1/schema/canonical/domain.js +5 -0
  279. package/dist/v1/schema/canonical/freeze.d.ts +1 -0
  280. package/dist/v1/schema/canonical/freeze.js +9 -0
  281. package/dist/v1/schema/canonical/revision.d.ts +11 -0
  282. package/dist/v1/schema/canonical/revision.js +17 -0
  283. package/dist/v1/schema/codec/header.d.ts +17 -0
  284. package/dist/v1/schema/codec/header.js +26 -0
  285. package/dist/v1/schema/codec/schema.d.ts +5 -0
  286. package/dist/v1/schema/codec/schema.js +21 -0
  287. package/dist/v1/schema/compatibility/meaning.d.ts +29 -0
  288. package/dist/v1/schema/compatibility/meaning.js +605 -0
  289. package/dist/v1/schema/dependency/lookup.d.ts +18 -0
  290. package/dist/v1/schema/dependency/lookup.js +31 -0
  291. package/dist/v1/schema/diagnostic.d.ts +12 -0
  292. package/dist/v1/schema/diagnostic.js +21 -0
  293. package/dist/v1/schema/index.d.ts +26 -0
  294. package/dist/v1/schema/index.js +13 -0
  295. package/dist/v1/schema/model/format.d.ts +2 -0
  296. package/dist/v1/schema/model/format.js +2 -0
  297. package/dist/v1/schema/model/schema.d.ts +30 -0
  298. package/dist/v1/schema/model/schema.js +4 -0
  299. package/dist/v1/schema/normalization/domain.d.ts +2 -0
  300. package/dist/v1/schema/normalization/domain.js +207 -0
  301. package/dist/v1/schema/resolution/closure.d.ts +9 -0
  302. package/dist/v1/schema/resolution/closure.js +49 -0
  303. package/dist/v1/schema/resolution/context.d.ts +17 -0
  304. package/dist/v1/schema/resolution/context.js +158 -0
  305. package/dist/v1/schema/resolution/definition.index.d.ts +21 -0
  306. package/dist/v1/schema/resolution/definition.index.js +17 -0
  307. package/dist/v1/schema/resolution/domain.d.ts +4 -0
  308. package/dist/v1/schema/resolution/domain.js +112 -0
  309. package/dist/v1/schema/resolution/origins.d.ts +14 -0
  310. package/dist/v1/schema/resolution/origins.js +121 -0
  311. package/dist/v1/schema/resolution/value.registry.d.ts +7 -0
  312. package/dist/v1/schema/resolution/value.registry.js +39 -0
  313. package/dist/v1/schema/revision.d.ts +1 -0
  314. package/dist/v1/schema/revision.js +1 -0
  315. package/dist/v1/schema/validation/class.d.ts +5 -0
  316. package/dist/v1/schema/validation/class.js +208 -0
  317. package/dist/v1/schema/validation/core.d.ts +5 -0
  318. package/dist/v1/schema/validation/core.js +264 -0
  319. package/dist/v1/schema/validation/domain.d.ts +11 -0
  320. package/dist/v1/schema/validation/domain.js +36 -0
  321. package/dist/v1/schema/validation/domain.route.d.ts +4 -0
  322. package/dist/v1/schema/validation/domain.route.js +32 -0
  323. package/dist/v1/schema/validation/domain.structure.d.ts +4 -0
  324. package/dist/v1/schema/validation/domain.structure.js +427 -0
  325. package/dist/v1/schema/validation/policy/budgets.d.ts +4 -0
  326. package/dist/v1/schema/validation/policy/budgets.js +102 -0
  327. package/dist/v1/schema/validation/policy/context.d.ts +28 -0
  328. package/dist/v1/schema/validation/policy/context.js +89 -0
  329. package/dist/v1/schema/validation/policy/references.d.ts +2 -0
  330. package/dist/v1/schema/validation/policy/references.js +143 -0
  331. package/dist/v1/schema/validation/policy/typing.d.ts +19 -0
  332. package/dist/v1/schema/validation/policy/typing.js +318 -0
  333. package/dist/v1/schema/validation/policy/uses.d.ts +5 -0
  334. package/dist/v1/schema/validation/policy/uses.js +258 -0
  335. package/dist/v1/schema/validation/policy/validate.d.ts +11 -0
  336. package/dist/v1/schema/validation/policy/validate.js +23 -0
  337. package/dist/v1/schema/validation/value-api.d.ts +13 -0
  338. package/dist/v1/schema/validation/value-api.js +23 -0
  339. package/dist/v1/schema/validation/value.d.ts +4 -0
  340. package/dist/v1/schema/validation/value.js +39 -0
  341. package/dist/v1/schema/validation/view.d.ts +3 -0
  342. package/dist/v1/schema/validation/view.js +29 -0
  343. package/dist/v1/value/full-match.d.ts +2 -0
  344. package/dist/v1/value/full-match.js +2 -0
  345. package/dist/v1.d.ts +2 -0
  346. package/dist/v1.js +2 -0
  347. package/dist/value/accept.d.ts +8 -0
  348. package/dist/value/accept.js +132 -0
  349. package/dist/value/canonical.d.ts +4 -0
  350. package/dist/value/canonical.js +41 -0
  351. package/dist/value/decode.d.ts +4 -0
  352. package/dist/value/decode.js +108 -0
  353. package/dist/value/equal.d.ts +3 -0
  354. package/dist/value/equal.js +5 -0
  355. package/dist/value/error.d.ts +12 -0
  356. package/dist/value/error.js +21 -0
  357. package/dist/value/index.d.ts +9 -0
  358. package/dist/value/index.js +6 -0
  359. package/dist/value/json.d.ts +3 -0
  360. package/dist/value/json.js +3 -0
  361. package/dist/value/limits.d.ts +21 -0
  362. package/dist/value/limits.js +15 -0
  363. package/dist/value/types.d.ts +6 -0
  364. package/dist/value/types.js +1 -0
  365. package/dist/value/unicode.d.ts +4 -0
  366. package/dist/value/unicode.js +64 -0
  367. package/dist/version/dispatch.d.ts +24 -0
  368. package/dist/version/dispatch.js +47 -0
  369. package/dist/version/index.d.ts +2 -0
  370. package/dist/version/index.js +1 -0
  371. package/package.json +75 -15
  372. package/dist/builders/bitmask.d.ts +0 -5
  373. package/dist/builders/bitmask.d.ts.map +0 -1
  374. package/dist/builders/bitmask.js +0 -12
  375. package/dist/builders/bitmask.js.map +0 -1
  376. package/dist/builders/data.d.ts +0 -7
  377. package/dist/builders/data.d.ts.map +0 -1
  378. package/dist/builders/data.js +0 -18
  379. package/dist/builders/data.js.map +0 -1
  380. package/dist/builders/definition/base.d.ts +0 -13
  381. package/dist/builders/definition/base.d.ts.map +0 -1
  382. package/dist/builders/definition/base.js +0 -24
  383. package/dist/builders/definition/base.js.map +0 -1
  384. package/dist/builders/definition/edge-class.d.ts +0 -8
  385. package/dist/builders/definition/edge-class.d.ts.map +0 -1
  386. package/dist/builders/definition/edge-class.js +0 -9
  387. package/dist/builders/definition/edge-class.js.map +0 -1
  388. package/dist/builders/definition/edge-interface.d.ts +0 -8
  389. package/dist/builders/definition/edge-interface.d.ts.map +0 -1
  390. package/dist/builders/definition/edge-interface.js +0 -9
  391. package/dist/builders/definition/edge-interface.js.map +0 -1
  392. package/dist/builders/definition/node-class.d.ts +0 -7
  393. package/dist/builders/definition/node-class.d.ts.map +0 -1
  394. package/dist/builders/definition/node-class.js +0 -9
  395. package/dist/builders/definition/node-class.js.map +0 -1
  396. package/dist/builders/definition/node-interface.d.ts +0 -7
  397. package/dist/builders/definition/node-interface.d.ts.map +0 -1
  398. package/dist/builders/definition/node-interface.js +0 -9
  399. package/dist/builders/definition/node-interface.js.map +0 -1
  400. package/dist/builders/function.d.ts +0 -34
  401. package/dist/builders/function.d.ts.map +0 -1
  402. package/dist/builders/function.js +0 -8
  403. package/dist/builders/function.js.map +0 -1
  404. package/dist/builders/policy.d.ts +0 -10
  405. package/dist/builders/policy.d.ts.map +0 -1
  406. package/dist/builders/policy.js +0 -28
  407. package/dist/builders/policy.js.map +0 -1
  408. package/dist/builders/prop.d.ts +0 -7
  409. package/dist/builders/prop.d.ts.map +0 -1
  410. package/dist/builders/prop.js +0 -9
  411. package/dist/builders/prop.js.map +0 -1
  412. package/dist/builders/ref.d.ts +0 -12
  413. package/dist/builders/ref.d.ts.map +0 -1
  414. package/dist/builders/ref.js +0 -27
  415. package/dist/builders/ref.js.map +0 -1
  416. package/dist/grammar/definition/base.d.ts +0 -13
  417. package/dist/grammar/definition/base.d.ts.map +0 -1
  418. package/dist/grammar/definition/base.js +0 -2
  419. package/dist/grammar/definition/base.js.map +0 -1
  420. package/dist/grammar/definition/discriminants.d.ts +0 -31
  421. package/dist/grammar/definition/discriminants.d.ts.map +0 -1
  422. package/dist/grammar/definition/discriminants.js +0 -33
  423. package/dist/grammar/definition/discriminants.js.map +0 -1
  424. package/dist/grammar/definition/edge-class.d.ts +0 -19
  425. package/dist/grammar/definition/edge-class.d.ts.map +0 -1
  426. package/dist/grammar/definition/edge-class.js +0 -2
  427. package/dist/grammar/definition/edge-class.js.map +0 -1
  428. package/dist/grammar/definition/edge-interface.d.ts +0 -18
  429. package/dist/grammar/definition/edge-interface.d.ts.map +0 -1
  430. package/dist/grammar/definition/edge-interface.js +0 -2
  431. package/dist/grammar/definition/edge-interface.js.map +0 -1
  432. package/dist/grammar/definition/node-class.d.ts +0 -26
  433. package/dist/grammar/definition/node-class.d.ts.map +0 -1
  434. package/dist/grammar/definition/node-class.js +0 -2
  435. package/dist/grammar/definition/node-class.js.map +0 -1
  436. package/dist/grammar/definition/node-interface.d.ts +0 -14
  437. package/dist/grammar/definition/node-interface.d.ts.map +0 -1
  438. package/dist/grammar/definition/node-interface.js +0 -2
  439. package/dist/grammar/definition/node-interface.js.map +0 -1
  440. package/dist/grammar/facets/constraints.d.ts +0 -8
  441. package/dist/grammar/facets/constraints.d.ts.map +0 -1
  442. package/dist/grammar/facets/constraints.js +0 -2
  443. package/dist/grammar/facets/constraints.js.map +0 -1
  444. package/dist/grammar/facets/content.d.ts +0 -4
  445. package/dist/grammar/facets/content.d.ts.map +0 -1
  446. package/dist/grammar/facets/content.js +0 -2
  447. package/dist/grammar/facets/content.js.map +0 -1
  448. package/dist/grammar/facets/endpoints.d.ts +0 -14
  449. package/dist/grammar/facets/endpoints.d.ts.map +0 -1
  450. package/dist/grammar/facets/endpoints.js +0 -3
  451. package/dist/grammar/facets/endpoints.js.map +0 -1
  452. package/dist/grammar/facets/indexes.d.ts +0 -12
  453. package/dist/grammar/facets/indexes.d.ts.map +0 -1
  454. package/dist/grammar/facets/indexes.js +0 -9
  455. package/dist/grammar/facets/indexes.js.map +0 -1
  456. package/dist/grammar/facets/properties.d.ts +0 -26
  457. package/dist/grammar/facets/properties.d.ts.map +0 -1
  458. package/dist/grammar/facets/properties.js +0 -45
  459. package/dist/grammar/facets/properties.js.map +0 -1
  460. package/dist/grammar/function/config.d.ts +0 -16
  461. package/dist/grammar/function/config.d.ts.map +0 -1
  462. package/dist/grammar/function/config.js +0 -2
  463. package/dist/grammar/function/config.js.map +0 -1
  464. package/dist/grammar/function/def.d.ts +0 -58
  465. package/dist/grammar/function/def.d.ts.map +0 -1
  466. package/dist/grammar/function/def.js +0 -2
  467. package/dist/grammar/function/def.js.map +0 -1
  468. package/dist/grammar/function/inheritance.d.ts +0 -3
  469. package/dist/grammar/function/inheritance.d.ts.map +0 -1
  470. package/dist/grammar/function/inheritance.js +0 -2
  471. package/dist/grammar/function/inheritance.js.map +0 -1
  472. package/dist/grammar/function/output.d.ts +0 -3
  473. package/dist/grammar/function/output.d.ts.map +0 -1
  474. package/dist/grammar/function/output.js +0 -2
  475. package/dist/grammar/function/output.js.map +0 -1
  476. package/dist/grammar/policy/callable.d.ts +0 -40
  477. package/dist/grammar/policy/callable.d.ts.map +0 -1
  478. package/dist/grammar/policy/callable.js +0 -2
  479. package/dist/grammar/policy/callable.js.map +0 -1
  480. package/dist/grammar/policy/def.d.ts +0 -27
  481. package/dist/grammar/policy/def.d.ts.map +0 -1
  482. package/dist/grammar/policy/def.js +0 -2
  483. package/dist/grammar/policy/def.js.map +0 -1
  484. package/dist/grammar/policy/pattern.d.ts +0 -34
  485. package/dist/grammar/policy/pattern.d.ts.map +0 -1
  486. package/dist/grammar/policy/pattern.js +0 -2
  487. package/dist/grammar/policy/pattern.js.map +0 -1
  488. package/dist/grammar/values/bitmask.d.ts +0 -7
  489. package/dist/grammar/values/bitmask.d.ts.map +0 -1
  490. package/dist/grammar/values/bitmask.js +0 -2
  491. package/dist/grammar/values/bitmask.js.map +0 -1
  492. package/dist/grammar/values/data.d.ts +0 -30
  493. package/dist/grammar/values/data.d.ts.map +0 -1
  494. package/dist/grammar/values/data.js +0 -2
  495. package/dist/grammar/values/data.js.map +0 -1
  496. package/dist/grammar/values/ref.d.ts +0 -26
  497. package/dist/grammar/values/ref.d.ts.map +0 -1
  498. package/dist/grammar/values/ref.js +0 -2
  499. package/dist/grammar/values/ref.js.map +0 -1
  500. package/dist/grammar/values/self.d.ts +0 -12
  501. package/dist/grammar/values/self.d.ts.map +0 -1
  502. package/dist/grammar/values/self.js +0 -6
  503. package/dist/grammar/values/self.js.map +0 -1
  504. package/dist/index.d.ts.map +0 -1
  505. package/dist/index.js.map +0 -1
  506. package/dist/inference/content.d.ts +0 -27
  507. package/dist/inference/content.d.ts.map +0 -1
  508. package/dist/inference/content.js +0 -2
  509. package/dist/inference/content.js.map +0 -1
  510. package/dist/inference/index.d.ts +0 -7
  511. package/dist/inference/index.d.ts.map +0 -1
  512. package/dist/inference/index.js +0 -2
  513. package/dist/inference/index.js.map +0 -1
  514. package/dist/inference/inheritance.d.ts +0 -48
  515. package/dist/inference/inheritance.d.ts.map +0 -1
  516. package/dist/inference/inheritance.js +0 -2
  517. package/dist/inference/inheritance.js.map +0 -1
  518. package/dist/inference/input.d.ts +0 -30
  519. package/dist/inference/input.d.ts.map +0 -1
  520. package/dist/inference/input.js +0 -2
  521. package/dist/inference/input.js.map +0 -1
  522. package/dist/inference/methods.d.ts +0 -69
  523. package/dist/inference/methods.d.ts.map +0 -1
  524. package/dist/inference/methods.js +0 -2
  525. package/dist/inference/methods.js.map +0 -1
  526. package/dist/inference/properties.d.ts +0 -37
  527. package/dist/inference/properties.d.ts.map +0 -1
  528. package/dist/inference/properties.js +0 -2
  529. package/dist/inference/properties.js.map +0 -1
  530. package/dist/inference/schema.d.ts +0 -37
  531. package/dist/inference/schema.d.ts.map +0 -1
  532. package/dist/inference/schema.js +0 -2
  533. package/dist/inference/schema.js.map +0 -1
  534. package/dist/instance/core/define.d.ts +0 -13
  535. package/dist/instance/core/define.d.ts.map +0 -1
  536. package/dist/instance/core/define.js +0 -63
  537. package/dist/instance/core/define.js.map +0 -1
  538. package/dist/instance/core/edge.d.ts +0 -9
  539. package/dist/instance/core/edge.d.ts.map +0 -1
  540. package/dist/instance/core/edge.js +0 -11
  541. package/dist/instance/core/edge.js.map +0 -1
  542. package/dist/instance/core/endpoint.d.ts +0 -11
  543. package/dist/instance/core/endpoint.d.ts.map +0 -1
  544. package/dist/instance/core/endpoint.js +0 -19
  545. package/dist/instance/core/endpoint.js.map +0 -1
  546. package/dist/instance/core/node.d.ts +0 -7
  547. package/dist/instance/core/node.d.ts.map +0 -1
  548. package/dist/instance/core/node.js +0 -9
  549. package/dist/instance/core/node.js.map +0 -1
  550. package/dist/instance/core/path.d.ts +0 -21
  551. package/dist/instance/core/path.d.ts.map +0 -1
  552. package/dist/instance/core/path.js +0 -21
  553. package/dist/instance/core/path.js.map +0 -1
  554. package/dist/instance/core/self.d.ts +0 -15
  555. package/dist/instance/core/self.d.ts.map +0 -1
  556. package/dist/instance/core/self.js +0 -8
  557. package/dist/instance/core/self.js.map +0 -1
  558. package/dist/instance/core/types.d.ts +0 -45
  559. package/dist/instance/core/types.d.ts.map +0 -1
  560. package/dist/instance/core/types.js +0 -2
  561. package/dist/instance/core/types.js.map +0 -1
  562. package/dist/instance/seed/define.d.ts +0 -12
  563. package/dist/instance/seed/define.d.ts.map +0 -1
  564. package/dist/instance/seed/define.js +0 -34
  565. package/dist/instance/seed/define.js.map +0 -1
  566. package/dist/instance/seed/types.d.ts +0 -12
  567. package/dist/instance/seed/types.d.ts.map +0 -1
  568. package/dist/instance/seed/types.js +0 -2
  569. package/dist/instance/seed/types.js.map +0 -1
  570. package/dist/ir/classes.d.ts +0 -78
  571. package/dist/ir/classes.d.ts.map +0 -1
  572. package/dist/ir/classes.js +0 -2
  573. package/dist/ir/classes.js.map +0 -1
  574. package/dist/ir/domain.d.ts +0 -13
  575. package/dist/ir/domain.d.ts.map +0 -1
  576. package/dist/ir/domain.js +0 -2
  577. package/dist/ir/domain.js.map +0 -1
  578. package/dist/ir/endpoints.d.ts +0 -27
  579. package/dist/ir/endpoints.d.ts.map +0 -1
  580. package/dist/ir/endpoints.js +0 -2
  581. package/dist/ir/endpoints.js.map +0 -1
  582. package/dist/ir/functions.d.ts +0 -34
  583. package/dist/ir/functions.d.ts.map +0 -1
  584. package/dist/ir/functions.js +0 -2
  585. package/dist/ir/functions.js.map +0 -1
  586. package/dist/ir/index.d.ts +0 -9
  587. package/dist/ir/index.d.ts.map +0 -1
  588. package/dist/ir/index.js +0 -2
  589. package/dist/ir/index.js.map +0 -1
  590. package/dist/ir/ir.d.ts +0 -75
  591. package/dist/ir/ir.d.ts.map +0 -1
  592. package/dist/ir/ir.js +0 -5
  593. package/dist/ir/ir.js.map +0 -1
  594. package/dist/ir/json-schema.d.ts +0 -20
  595. package/dist/ir/json-schema.d.ts.map +0 -1
  596. package/dist/ir/json-schema.js +0 -2
  597. package/dist/ir/json-schema.js.map +0 -1
  598. package/dist/ir/policies.d.ts +0 -74
  599. package/dist/ir/policies.d.ts.map +0 -1
  600. package/dist/ir/policies.js +0 -2
  601. package/dist/ir/policies.js.map +0 -1
  602. package/dist/schema/classify.d.ts +0 -8
  603. package/dist/schema/classify.d.ts.map +0 -1
  604. package/dist/schema/classify.js +0 -20
  605. package/dist/schema/classify.js.map +0 -1
  606. package/dist/schema/define.d.ts +0 -23
  607. package/dist/schema/define.d.ts.map +0 -1
  608. package/dist/schema/define.js +0 -58
  609. package/dist/schema/define.js.map +0 -1
  610. package/dist/schema/error.d.ts +0 -8
  611. package/dist/schema/error.d.ts.map +0 -1
  612. package/dist/schema/error.js +0 -14
  613. package/dist/schema/error.js.map +0 -1
  614. package/dist/schema/refs.d.ts +0 -77
  615. package/dist/schema/refs.d.ts.map +0 -1
  616. package/dist/schema/refs.js +0 -100
  617. package/dist/schema/refs.js.map +0 -1
  618. package/dist/schema/resolve/index.d.ts +0 -5
  619. package/dist/schema/resolve/index.d.ts.map +0 -1
  620. package/dist/schema/resolve/index.js +0 -5
  621. package/dist/schema/resolve/index.js.map +0 -1
  622. package/dist/schema/resolve/methods.d.ts +0 -8
  623. package/dist/schema/resolve/methods.d.ts.map +0 -1
  624. package/dist/schema/resolve/methods.js +0 -18
  625. package/dist/schema/resolve/methods.js.map +0 -1
  626. package/dist/schema/resolve/properties.d.ts +0 -13
  627. package/dist/schema/resolve/properties.d.ts.map +0 -1
  628. package/dist/schema/resolve/properties.js +0 -37
  629. package/dist/schema/resolve/properties.js.map +0 -1
  630. package/dist/schema/resolve/self.d.ts +0 -7
  631. package/dist/schema/resolve/self.d.ts.map +0 -1
  632. package/dist/schema/resolve/self.js +0 -33
  633. package/dist/schema/resolve/self.js.map +0 -1
  634. package/dist/schema/resolve/thunks.d.ts +0 -12
  635. package/dist/schema/resolve/thunks.d.ts.map +0 -1
  636. package/dist/schema/resolve/thunks.js +0 -37
  637. package/dist/schema/resolve/thunks.js.map +0 -1
  638. package/dist/schema/schema.d.ts +0 -25
  639. package/dist/schema/schema.d.ts.map +0 -1
  640. package/dist/schema/schema.js +0 -2
  641. package/dist/schema/schema.js.map +0 -1
  642. package/dist/schema/validators/context.d.ts +0 -17
  643. package/dist/schema/validators/context.d.ts.map +0 -1
  644. package/dist/schema/validators/context.js +0 -2
  645. package/dist/schema/validators/context.js.map +0 -1
  646. package/dist/schema/validators/endpoints.d.ts +0 -4
  647. package/dist/schema/validators/endpoints.d.ts.map +0 -1
  648. package/dist/schema/validators/endpoints.js +0 -27
  649. package/dist/schema/validators/endpoints.js.map +0 -1
  650. package/dist/schema/validators/index.d.ts +0 -12
  651. package/dist/schema/validators/index.d.ts.map +0 -1
  652. package/dist/schema/validators/index.js +0 -25
  653. package/dist/schema/validators/index.js.map +0 -1
  654. package/dist/schema/validators/indexes.d.ts +0 -4
  655. package/dist/schema/validators/indexes.d.ts.map +0 -1
  656. package/dist/schema/validators/indexes.js +0 -19
  657. package/dist/schema/validators/indexes.js.map +0 -1
  658. package/dist/schema/validators/inheritance.d.ts +0 -4
  659. package/dist/schema/validators/inheritance.d.ts.map +0 -1
  660. package/dist/schema/validators/inheritance.js +0 -27
  661. package/dist/schema/validators/inheritance.js.map +0 -1
  662. package/dist/schema/validators/methods.d.ts +0 -9
  663. package/dist/schema/validators/methods.d.ts.map +0 -1
  664. package/dist/schema/validators/methods.js +0 -44
  665. package/dist/schema/validators/methods.js.map +0 -1
  666. package/dist/schema/validators/names.d.ts +0 -4
  667. package/dist/schema/validators/names.d.ts.map +0 -1
  668. package/dist/schema/validators/names.js +0 -19
  669. package/dist/schema/validators/names.js.map +0 -1
  670. package/dist/schema/validators/policies.d.ts +0 -4
  671. package/dist/schema/validators/policies.d.ts.map +0 -1
  672. package/dist/schema/validators/policies.js +0 -61
  673. package/dist/schema/validators/policies.js.map +0 -1
  674. package/dist/schema/validators/ref-targets.d.ts +0 -4
  675. package/dist/schema/validators/ref-targets.d.ts.map +0 -1
  676. package/dist/schema/validators/ref-targets.js +0 -54
  677. package/dist/schema/validators/ref-targets.js.map +0 -1
  678. package/dist/serializer/context.d.ts +0 -35
  679. package/dist/serializer/context.d.ts.map +0 -1
  680. package/dist/serializer/context.js +0 -359
  681. package/dist/serializer/context.js.map +0 -1
  682. package/dist/serializer/helpers.d.ts +0 -34
  683. package/dist/serializer/helpers.d.ts.map +0 -1
  684. package/dist/serializer/helpers.js +0 -116
  685. package/dist/serializer/helpers.js.map +0 -1
  686. package/dist/serializer/index.d.ts +0 -2
  687. package/dist/serializer/index.d.ts.map +0 -1
  688. package/dist/serializer/index.js +0 -2
  689. package/dist/serializer/index.js.map +0 -1
  690. package/dist/serializer/policies.d.ts +0 -34
  691. package/dist/serializer/policies.d.ts.map +0 -1
  692. package/dist/serializer/policies.js +0 -837
  693. package/dist/serializer/policies.js.map +0 -1
  694. package/dist/serializer/policy-typing.d.ts +0 -56
  695. package/dist/serializer/policy-typing.d.ts.map +0 -1
  696. package/dist/serializer/policy-typing.js +0 -490
  697. package/dist/serializer/policy-typing.js.map +0 -1
  698. package/dist/serializer/serialize.d.ts +0 -12
  699. package/dist/serializer/serialize.d.ts.map +0 -1
  700. package/dist/serializer/serialize.js +0 -6
  701. package/dist/serializer/serialize.js.map +0 -1
@@ -0,0 +1,1091 @@
1
+ import { json } from '@astrale-os/kernel-dsl/value';
2
+ import { Key, PropertyKey as PropertyKeyValue } from '../../addressing/index.js';
3
+ import { compareUnicode } from '../../addressing/ordering.js';
4
+ import { branchesOf, branchProduct, capBranches, isConnected, targetMode, termKey, } from '../../language/policy/analysis/branches.js';
5
+ import { BRANCH_OVERFLOW, MAX_BRANCHES, MAX_CHECK_DEPTH, MAX_CHECK_LEAVES, MAX_DOMAINS, MAX_EDGES, MAX_PATTERN_DEPTH, MAX_REPEAT, MAX_VARIABLES, measureChecks, } from '../../language/policy/analysis/budgets.js';
6
+ import { normalizePolicyChecks, normalizePolicyExpression, } from '../../language/policy/normalization/normalize.js';
7
+ import { validateValueProgram } from '../../language/value/evaluate/program.js';
8
+ import { GRAPH_NODE_PATH_SCHEMA_ID } from '../../language/value/syntax/node-path/schema.js';
9
+ import { invalidCompiled } from '../diagnostic.js';
10
+ /**
11
+ * Re-admit contextual Language laws after the portable compiled grammar and
12
+ * exact closure have been established. This module deliberately depends only
13
+ * on compiled and Language runtime machinery; it is safe in the load graph.
14
+ */
15
+ export function validateCompiledSemantics(candidate) {
16
+ const partial = index(candidate);
17
+ const analyses = analyzeClasses(partial.classes);
18
+ const context = { ...partial, analyses };
19
+ validateClassFacets(context);
20
+ validateEdges(context);
21
+ validateViews(candidate, context);
22
+ validatePolicies(candidate, context);
23
+ validateCore(candidate, context);
24
+ }
25
+ function index(candidate) {
26
+ const definitions = new Map();
27
+ const classes = new Map();
28
+ const policies = new Map();
29
+ const core = new Map();
30
+ for (const [entryIndex, entry] of candidate.closure.entries()) {
31
+ const collections = [
32
+ ['classes', entry.definitions.classes],
33
+ ['functions', entry.definitions.functions],
34
+ ['policies', entry.definitions.policies],
35
+ ['views', entry.definitions.views],
36
+ ['core', entry.definitions.core],
37
+ ];
38
+ for (const [collection, values] of collections) {
39
+ for (const [valueIndex, value] of values.entries()) {
40
+ const located = {
41
+ value,
42
+ entry,
43
+ entryIndex,
44
+ index: valueIndex,
45
+ pointer: `/closure/${entryIndex}/definitions/${collection}/${valueIndex}`,
46
+ };
47
+ definitions.set(Key.of(value.ref), {
48
+ ...located,
49
+ value: value.ref,
50
+ });
51
+ if (value.ref.kind === 'class')
52
+ classes.set(Key.of(value.ref), located);
53
+ if (value.ref.kind === 'policy')
54
+ policies.set(Key.of(value.ref), located);
55
+ if (value.ref.kind === 'core')
56
+ core.set(Key.of(value.ref), located);
57
+ }
58
+ }
59
+ }
60
+ return { definitions, classes, policies, core };
61
+ }
62
+ function analyzeClasses(classes) {
63
+ const analyses = new Map();
64
+ const visiting = new Set();
65
+ const analyze = (located) => {
66
+ const classKey = Key.of(located.value.ref);
67
+ const cached = analyses.get(classKey);
68
+ if (cached !== undefined)
69
+ return cached;
70
+ if (visiting.has(classKey))
71
+ fail(`${located.pointer}/extends`, 'Class inheritance is cyclic.');
72
+ visiting.add(classKey);
73
+ const parents = located.value.extends.map((ref, index) => {
74
+ const parent = classes.get(Key.of(ref));
75
+ if (parent === undefined)
76
+ fail(`${located.pointer}/extends/${index}`, 'Parent Class is absent.');
77
+ return analyze(parent);
78
+ });
79
+ const properties = new Map();
80
+ for (const parent of parents)
81
+ for (const [key, value] of parent.properties)
82
+ properties.set(key, value);
83
+ for (const property of located.value.properties) {
84
+ const key = PropertyKeyValue.of(located.value.ref, property.name);
85
+ properties.set(key, {
86
+ key,
87
+ owner: located.value.ref,
88
+ declaration: property,
89
+ entry: located.entry,
90
+ });
91
+ }
92
+ let dataOwner;
93
+ for (const parent of parents) {
94
+ if (parent.dataOwner === undefined)
95
+ continue;
96
+ if (dataOwner !== undefined && Key.of(dataOwner) !== Key.of(parent.dataOwner)) {
97
+ fail(located.pointer, 'Data has distinct inherited declaring owners.');
98
+ }
99
+ dataOwner = parent.dataOwner;
100
+ }
101
+ if (located.value.kind === 'node' && located.value.data !== undefined) {
102
+ if (dataOwner !== undefined)
103
+ fail(`${located.pointer}/data`, 'Data cannot redeclare an inherited contract.');
104
+ dataOwner = located.value.ref;
105
+ }
106
+ const inherited = new Map();
107
+ for (const parent of parents) {
108
+ for (const [name, method] of parent.methods) {
109
+ const values = inherited.get(name) ?? [];
110
+ if (!values.some(({ key }) => key === method.key))
111
+ values.push(method);
112
+ inherited.set(name, values);
113
+ }
114
+ }
115
+ const methods = new Map();
116
+ for (const [name, values] of inherited)
117
+ if (values.length === 1)
118
+ methods.set(name, values[0]);
119
+ if (located.value.kind === 'node') {
120
+ for (const own of located.value.methods) {
121
+ const inheritedMethods = inherited.get(own.name) ?? [];
122
+ for (const parent of inheritedMethods) {
123
+ if (parent.declaration.inheritance === 'sealed') {
124
+ fail(`${located.pointer}/methods`, `Method ${own.name} overrides a sealed Method.`);
125
+ }
126
+ if (!sameMethodSignature(located.entry, own, parent.entry, parent.declaration)) {
127
+ fail(`${located.pointer}/methods`, `Method ${own.name} changes its inherited signature.`);
128
+ }
129
+ if (parent.declaration.inheritance !== 'abstract' &&
130
+ policyKey(parent.declaration.policy) !== policyKey(own.policy)) {
131
+ fail(`${located.pointer}/methods`, `Method ${own.name} changes an executable inherited Policy.`);
132
+ }
133
+ }
134
+ methods.set(own.name, {
135
+ key: `${Key.of(located.value.ref)}.method.${own.name}`,
136
+ owner: located.value.ref,
137
+ declaration: own,
138
+ entry: located.entry,
139
+ });
140
+ inherited.delete(own.name);
141
+ }
142
+ for (const [name, values] of inherited) {
143
+ if (values.length > 1)
144
+ fail(`${located.pointer}/methods`, `Inherited Method ${name} is ambiguous.`);
145
+ }
146
+ if (!located.value.abstract) {
147
+ for (const [name, method] of methods) {
148
+ if (method.declaration.inheritance === 'abstract') {
149
+ fail(`${located.pointer}/methods`, `Concrete Class leaves Method ${name} abstract.`);
150
+ }
151
+ }
152
+ }
153
+ }
154
+ const analysis = { properties, methods, ...(dataOwner === undefined ? {} : { dataOwner }) };
155
+ analyses.set(classKey, analysis);
156
+ visiting.delete(classKey);
157
+ return analysis;
158
+ };
159
+ for (const value of classes.values())
160
+ analyze(value);
161
+ return analyses;
162
+ }
163
+ function sameMethodSignature(leftEntry, left, rightEntry, right) {
164
+ return (programKey(leftEntry, left.input) === programKey(rightEntry, right.input) &&
165
+ outputKey(leftEntry, left.output) === outputKey(rightEntry, right.output) &&
166
+ left.auth === right.auth &&
167
+ left.static === right.static);
168
+ }
169
+ function outputKey(entry, output) {
170
+ return output.mode === 'binary' ? 'binary' : `${output.mode}:${programKey(entry, output.value)}`;
171
+ }
172
+ function programKey(entry, value) {
173
+ return json.serialize(entry.values[value]);
174
+ }
175
+ function policyKey(value) {
176
+ return json.serialize((value === undefined ? null : normalizePolicyChecks(value)));
177
+ }
178
+ function validateClassFacets(context) {
179
+ for (const located of context.classes.values()) {
180
+ for (const [index, property] of located.value.properties.entries()) {
181
+ const path = `${located.pointer}/properties/${index}`;
182
+ if (property.auto !== undefined) {
183
+ if (property.required && !property.auto.on.includes('create')) {
184
+ fail(`${path}/auto/on`, 'A required auto Property must run on create.');
185
+ }
186
+ if (property.auto.set === 'instant' && property.ordering !== 'instant') {
187
+ fail(`${path}/auto/set`, 'The instant setter requires an Instant value program.');
188
+ }
189
+ }
190
+ }
191
+ if (located.value.kind === 'node') {
192
+ for (const [index, method] of located.value.methods.entries()) {
193
+ if (method.inheritance === 'abstract' && method.policy !== undefined) {
194
+ fail(`${located.pointer}/methods/${index}/policy`, 'An abstract Method cannot have a Policy.');
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+ function validateEdges(context) {
201
+ for (const located of context.classes.values()) {
202
+ if (!isCompiledEdge(located.value))
203
+ continue;
204
+ const edge = located.value;
205
+ const endpoints = edge.orientation === 'directed'
206
+ ? [edge.endpoints.source, edge.endpoints.target]
207
+ : edge.endpoints;
208
+ if (endpoints[0].role === endpoints[1].role)
209
+ fail(`${located.pointer}/endpoints`, 'Edge endpoint roles must differ.');
210
+ for (const [endpointIndex, endpoint] of endpoints.entries()) {
211
+ const seen = new Set();
212
+ for (const [acceptIndex, ref] of endpoint.accepts.entries()) {
213
+ const key = Key.of(ref);
214
+ if (seen.has(key))
215
+ fail(`${located.pointer}/endpoints/${endpointIndex}/accepts/${acceptIndex}`, 'Edge endpoint repeats an accepted Class.');
216
+ seen.add(key);
217
+ if (context.classes.get(key)?.value.kind !== 'node')
218
+ fail(`${located.pointer}/endpoints/${endpointIndex}/accepts/${acceptIndex}`, 'Edge endpoint must accept a Node Class.');
219
+ }
220
+ }
221
+ if (edge.orientation === 'undirected' &&
222
+ !sameIncidentEndpoint(edge.endpoints[0], edge.endpoints[1]) &&
223
+ undirectedOverlap(context, edge.endpoints)) {
224
+ fail(`${located.pointer}/endpoints`, 'Unequal undirected endpoint contracts overlap.');
225
+ }
226
+ for (const [parentIndex, parentRef] of edge.extends.entries()) {
227
+ const parent = context.classes.get(Key.of(parentRef))?.value;
228
+ if (parent !== undefined && isCompiledEdge(parent) && !edgeRefines(context, edge, parent)) {
229
+ fail(`${located.pointer}/extends/${parentIndex}`, 'Edge Class does not safely refine its parent.');
230
+ }
231
+ }
232
+ }
233
+ }
234
+ function edgeRefines(context, child, parent) {
235
+ if (child.orientation !== parent.orientation)
236
+ return false;
237
+ if (parent.constraints.noSelf === true && child.constraints.noSelf !== true)
238
+ return false;
239
+ if (parent.constraints.acyclic === true && child.constraints.acyclic !== true)
240
+ return false;
241
+ if (child.orientation === 'directed' && parent.orientation === 'directed') {
242
+ return (endpointRefines(context, child.endpoints.source, parent.endpoints.source) &&
243
+ countRefines(child.endpoints.source.outgoing, parent.endpoints.source.outgoing) &&
244
+ endpointRefines(context, child.endpoints.target, parent.endpoints.target) &&
245
+ countRefines(child.endpoints.target.incoming, parent.endpoints.target.incoming));
246
+ }
247
+ if (child.orientation !== 'undirected' || parent.orientation !== 'undirected')
248
+ return false;
249
+ const refine = (a, b) => endpointRefines(context, child.endpoints[a], parent.endpoints[b]) &&
250
+ countRefines(child.endpoints[a].incident, parent.endpoints[b].incident);
251
+ return (refine(0, 0) && refine(1, 1)) || (refine(0, 1) && refine(1, 0));
252
+ }
253
+ function endpointRefines(context, child, parent) {
254
+ return child.accepts.every((accepted) => classSatisfiesAny(context, accepted, parent.accepts));
255
+ }
256
+ function countRefines(child, parent) {
257
+ const [childMin, childMax] = countBounds(child);
258
+ const [parentMin, parentMax] = countBounds(parent);
259
+ return childMin >= parentMin && childMax <= parentMax;
260
+ }
261
+ function sameIncidentEndpoint(left, right) {
262
+ const a = left.accepts.map(Key.of).sort(compareUnicode);
263
+ const b = right.accepts.map(Key.of).sort(compareUnicode);
264
+ return (left.incident === right.incident &&
265
+ a.length === b.length &&
266
+ a.every((value, index) => value === b[index]));
267
+ }
268
+ function undirectedOverlap(context, endpoints) {
269
+ return [...context.classes.values()].some(({ value }) => value.kind === 'node' &&
270
+ !value.abstract &&
271
+ classSatisfiesAny(context, value.ref, endpoints[0].accepts) &&
272
+ classSatisfiesAny(context, value.ref, endpoints[1].accepts));
273
+ }
274
+ function classSatisfiesAny(context, candidate, accepted) {
275
+ const targets = new Set(accepted.map(Key.of));
276
+ const visit = (ref, seen) => {
277
+ const key = Key.of(ref);
278
+ if (targets.has(key))
279
+ return true;
280
+ if (seen.has(key))
281
+ return false;
282
+ seen.add(key);
283
+ return context.classes.get(key)?.value.extends.some((parent) => visit(parent, seen)) ?? false;
284
+ };
285
+ return visit(candidate, new Set());
286
+ }
287
+ function validateViews(candidate, context) {
288
+ for (const [entryIndex, entry] of candidate.closure.entries()) {
289
+ for (const [viewIndex, view] of entry.definitions.views.entries()) {
290
+ if (view.target.kind !== 'definition')
291
+ continue;
292
+ for (const [targetIndex, ref] of view.target.definitions.entries()) {
293
+ if (context.classes.get(Key.of(ref))?.value.kind !== 'node') {
294
+ fail(`/closure/${entryIndex}/definitions/views/${viewIndex}/target/definitions/${targetIndex}`, 'A View Definition target must resolve to a Node Class.');
295
+ }
296
+ }
297
+ }
298
+ }
299
+ }
300
+ function validatePolicies(candidate, context) {
301
+ for (const [entryIndex, entry] of candidate.closure.entries()) {
302
+ const localPolicies = new Map(entry.definitions.policies.map((value) => [value.ref.name, value]));
303
+ for (const [policyIndex, policy] of entry.definitions.policies.entries()) {
304
+ validatePolicyExpression(context, entry, policy.expression, `/closure/${entryIndex}/definitions/policies/${policyIndex}/expression`, localPolicies);
305
+ }
306
+ validatePolicyCycles(entry, localPolicies, entryIndex);
307
+ validatePolicyParity(context, entry, entryIndex, localPolicies);
308
+ for (const [functionIndex, callable] of entry.definitions.functions.entries()) {
309
+ if (callable.policy !== undefined)
310
+ validateCallablePolicy(context, entry, callable.policy, callable.input, callable.fields, false, `/closure/${entryIndex}/definitions/functions/${functionIndex}/policy`);
311
+ }
312
+ for (const [classIndex, definition] of entry.definitions.classes.entries()) {
313
+ for (const [kind, ref] of Object.entries(definition.policies)) {
314
+ if (ref !== undefined &&
315
+ (ref.origin !== entry.origin || context.policies.get(Key.of(ref)) === undefined)) {
316
+ fail(`/closure/${entryIndex}/definitions/classes/${classIndex}/policies/${kind}`, 'Class Policies must name a local Policy Definition.');
317
+ }
318
+ }
319
+ if (definition.kind !== 'node')
320
+ continue;
321
+ for (const [methodIndex, callable] of definition.methods.entries()) {
322
+ if (callable.policy !== undefined)
323
+ validateCallablePolicy(context, entry, callable.policy, callable.input, callable.fields, !callable.static, `/closure/${entryIndex}/definitions/classes/${classIndex}/methods/${methodIndex}/policy`);
324
+ }
325
+ }
326
+ }
327
+ }
328
+ function validatePolicyExpression(context, entry, expression, path, local) {
329
+ if ('match' in expression) {
330
+ validatePattern(context, expression.match, `${path}/match`, new Set(), new Set());
331
+ return;
332
+ }
333
+ const values = 'allOf' in expression ? expression.allOf : expression.anyOf;
334
+ if (values.length === 0)
335
+ fail(path, 'Named Policy composition must be non-empty.');
336
+ for (const [index, ref] of values.entries()) {
337
+ if (ref.origin !== entry.origin || ref.kind !== 'policy' || !local.has(ref.name))
338
+ fail(`${path}/${index}`, 'Named Policy composition must reference a local Policy.');
339
+ }
340
+ }
341
+ function validatePattern(context, expression, path, scope, declared) {
342
+ if ('source' in expression) {
343
+ if (context.classes.get(Key.of(expression.class))?.value.kind !== 'edge')
344
+ fail(`${path}/class`, 'Policy pattern Class must resolve to an Edge Class.');
345
+ validatePolicyTerm(expression.source, `${path}/source`, scope);
346
+ validatePolicyTerm(expression.target, `${path}/target`, scope);
347
+ if (expression.repeat !== undefined &&
348
+ (!Number.isInteger(expression.repeat.min) ||
349
+ !Number.isInteger(expression.repeat.max) ||
350
+ expression.repeat.min < 0 ||
351
+ expression.repeat.max < expression.repeat.min ||
352
+ expression.repeat.max > MAX_REPEAT))
353
+ fail(`${path}/repeat`, 'Policy repeat is outside the V1 bounds.');
354
+ return;
355
+ }
356
+ if ('exists' in expression) {
357
+ if (expression.exists.nodes.length > MAX_VARIABLES) {
358
+ fail(`${path}/exists/nodes`, 'Policy exists exceeds the V1 variable budget.');
359
+ }
360
+ const nested = new Set(scope);
361
+ for (const [index, node] of expression.exists.nodes.entries()) {
362
+ const id = node.variable.id;
363
+ if (declared.has(id) || nested.has(id))
364
+ fail(`${path}/exists/nodes/${index}/variable/id`, 'Policy variable IDs must be globally unique and cannot shadow.');
365
+ declared.add(id);
366
+ nested.add(id);
367
+ if (context.classes.get(Key.of(node.class))?.value.kind !== 'node')
368
+ fail(`${path}/exists/nodes/${index}/class`, 'Policy variable Class must resolve to a Node Class.');
369
+ }
370
+ validatePattern(context, expression.exists.where, `${path}/exists/where`, nested, declared);
371
+ return;
372
+ }
373
+ const values = 'allOf' in expression ? expression.allOf : expression.anyOf;
374
+ if (values.length === 0)
375
+ fail(path, 'Policy pattern composition must be non-empty.');
376
+ values.forEach((value, index) => validatePattern(context, value, `${path}/${index}`, scope, declared));
377
+ }
378
+ function validatePolicyTerm(term, path, scope) {
379
+ if (term.kind === 'variable' && !scope.has(term.id))
380
+ fail(path, 'Policy variable is outside its declaring scope.');
381
+ }
382
+ function validatePolicyCycles(entry, local, entryIndex) {
383
+ const visiting = new Set();
384
+ const visited = new Set();
385
+ const visit = (name) => {
386
+ if (visiting.has(name))
387
+ fail(`/closure/${entryIndex}/definitions/policies`, `Named Policy composition cycle reaches ${name}.`);
388
+ if (visited.has(name))
389
+ return;
390
+ visiting.add(name);
391
+ const expression = local.get(name)?.expression;
392
+ if (expression !== undefined && !('match' in expression)) {
393
+ for (const ref of 'allOf' in expression ? expression.allOf : expression.anyOf)
394
+ if (ref.origin === entry.origin && ref.kind === 'policy')
395
+ visit(ref.name);
396
+ }
397
+ visiting.delete(name);
398
+ visited.add(name);
399
+ };
400
+ for (const name of local.keys())
401
+ visit(name);
402
+ }
403
+ function validateCallablePolicy(context, entry, expression, inputIndex, fields, instanceMethod, path) {
404
+ if ('check' in expression) {
405
+ if (expression.check.origin !== entry.origin ||
406
+ context.policies.get(Key.of(expression.check)) === undefined)
407
+ fail(`${path}/check`, 'Callable Policy must reference a local named Policy.');
408
+ const object = expression.object;
409
+ if (object.kind === 'self' && !instanceMethod)
410
+ fail(`${path}/object`, 'self is valid only for an instance Method.');
411
+ if (object.kind === 'input') {
412
+ if (fields === undefined ||
413
+ fields[object.field] === undefined ||
414
+ !isSingleNodePathField(context, entry, inputIndex, object.field))
415
+ fail(`${path}/object`, 'Callable Policy input target must be a direct required single-Node Path field.');
416
+ }
417
+ if (object.kind === 'ref') {
418
+ if (object.ref.origin !== entry.origin ||
419
+ context.definitions.get(Key.of(object.ref)) === undefined)
420
+ fail(`${path}/object/ref`, 'Callable Policy object refs must name an exact local Definition.');
421
+ }
422
+ return;
423
+ }
424
+ const children = 'allOf' in expression ? expression.allOf : expression.anyOf;
425
+ if (children.length === 0)
426
+ fail(path, 'Callable Policy composition must be non-empty.');
427
+ children.forEach((child, index) => validateCallablePolicy(context, entry, child, inputIndex, fields, instanceMethod, `${path}/${index}`));
428
+ }
429
+ function isSingleNodePathField(context, entry, inputIndex, field) {
430
+ const rootValue = entry.values[inputIndex]?.nodes[entry.values[inputIndex].root]?.schema;
431
+ if (rootValue === null || typeof rootValue !== 'object' || Array.isArray(rootValue))
432
+ return false;
433
+ const root = rootValue;
434
+ const properties = root.properties;
435
+ if (properties === null || typeof properties !== 'object' || Array.isArray(properties))
436
+ return false;
437
+ const schemaValue = properties[field];
438
+ if (schemaValue === null || typeof schemaValue !== 'object' || Array.isArray(schemaValue))
439
+ return false;
440
+ const schema = schemaValue;
441
+ const annotationValue = schema['x-astrale-path'];
442
+ if (annotationValue === null ||
443
+ typeof annotationValue !== 'object' ||
444
+ Array.isArray(annotationValue))
445
+ return false;
446
+ const annotation = annotationValue;
447
+ return (root.type === 'object' &&
448
+ root.additionalProperties === false &&
449
+ Array.isArray(root.required) &&
450
+ root.required.includes(field) &&
451
+ schema.$ref === GRAPH_NODE_PATH_SCHEMA_ID &&
452
+ annotation.target === 'node' &&
453
+ annotation.cardinality === 'one' &&
454
+ Array.isArray(annotation.accepts) &&
455
+ annotation.accepts.length > 0 &&
456
+ annotation.accepts.every((ref) => isNodeClassRef(context, ref)));
457
+ }
458
+ function isNodeClassRef(context, value) {
459
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
460
+ return false;
461
+ const ref = value;
462
+ if (typeof ref.origin !== 'string' || ref.kind !== 'class' || typeof ref.name !== 'string') {
463
+ return false;
464
+ }
465
+ return context.classes.get(Key.of(ref))?.value.kind === 'node';
466
+ }
467
+ function validatePolicyParity(context, entry, entryIndex, policies) {
468
+ const normalized = new Map([...policies].map(([name, policy]) => [name, normalizePolicyExpression(policy.expression)]));
469
+ const typing = new CompiledPolicyTyping(context, entry, normalized);
470
+ for (const [name, declaration] of policies) {
471
+ const path = `/closure/${entryIndex}/definitions/policies/${declarationIndex(entry, 'policies', name)}`;
472
+ if ('match' in declaration.expression) {
473
+ for (const branch of branchesOf(declaration.expression.match, name)) {
474
+ if (targetMode(branch) === undefined) {
475
+ fail(`${path}/expression/match`, 'A Policy branch must target object or both source and target.');
476
+ }
477
+ if (!isConnected(branch)) {
478
+ fail(`${path}/expression/match`, 'A Policy branch must connect subject, every target, and every scoped variable.');
479
+ }
480
+ }
481
+ }
482
+ const measure = measureCompiledPolicy(entry.origin, name, normalized, new Set());
483
+ if (measure !== undefined &&
484
+ (measure.depth > MAX_PATTERN_DEPTH ||
485
+ measure.edgeCounts.length > MAX_BRANCHES ||
486
+ Math.max(0, ...measure.edgeCounts) > MAX_EDGES ||
487
+ measure.domains.size > MAX_DOMAINS)) {
488
+ fail(path, 'Policy expansion exceeds the V1 depth, branch, Edge, or Domain budget.');
489
+ }
490
+ const branches = typing.expandedBranches(name, new Set(), `$${name}`);
491
+ if (branches !== undefined) {
492
+ for (const branch of branches) {
493
+ const mode = targetMode(branch);
494
+ if (mode === undefined)
495
+ fail(path, 'Expanded Policy branches must use one coherent target mode.');
496
+ const use = mode === 'object'
497
+ ? { kind: 'object', object: { kind: 'default' } }
498
+ : { kind: 'edge', source: { kind: 'default' }, target: { kind: 'default' } };
499
+ if (!typing.branchIsTyped(branch, use))
500
+ fail(path, 'A Policy branch has contradictory endpoint or repeat contracts.');
501
+ }
502
+ }
503
+ }
504
+ for (const [classIndex, definition] of entry.definitions.classes.entries()) {
505
+ if (definition.kind === 'node' && definition.policies.read !== undefined) {
506
+ if (!typing.policyAccepts(definition.policies.read.name, { kind: 'exact', ref: definition.ref })) {
507
+ fail(`/closure/${entryIndex}/definitions/classes/${classIndex}/policies/read`, 'Read Policy is incompatible with its protected Node Class.');
508
+ }
509
+ }
510
+ const traverse = definition.policies.traverse;
511
+ if (traverse !== undefined) {
512
+ if (definition.kind === 'node') {
513
+ if (!typing.policyAccepts(traverse.name, { kind: 'exact', ref: definition.ref })) {
514
+ fail(`/closure/${entryIndex}/definitions/classes/${classIndex}/policies/traverse`, 'Traverse Policy is incompatible with its protected Node Class.');
515
+ }
516
+ }
517
+ else if (isCompiledEdge(definition)) {
518
+ const endpoints = definition.orientation === 'directed'
519
+ ? [definition.endpoints.source, definition.endpoints.target]
520
+ : definition.endpoints;
521
+ const sources = typing.concreteEndpointClasses(endpoints[0].accepts);
522
+ const targets = typing.concreteEndpointClasses(endpoints[1].accepts);
523
+ if (sources.some((source) => targets.some((target) => !typing.policyAcceptsEdge(traverse.name, { kind: 'exact', ref: source }, { kind: 'exact', ref: target })))) {
524
+ fail(`/closure/${entryIndex}/definitions/classes/${classIndex}/policies/traverse`, 'Traverse Policy is incompatible with an accepted Edge endpoint pair.');
525
+ }
526
+ }
527
+ }
528
+ if (definition.kind === 'node') {
529
+ for (const [methodIndex, method] of definition.methods.entries()) {
530
+ if (method.policy !== undefined) {
531
+ validateCallablePolicyTyping(context, typing, entry, method.policy, method.input, method.static ? undefined : definition.ref, `/closure/${entryIndex}/definitions/classes/${classIndex}/methods/${methodIndex}/policy`);
532
+ }
533
+ }
534
+ }
535
+ }
536
+ for (const [functionIndex, callable] of entry.definitions.functions.entries()) {
537
+ if (callable.policy !== undefined) {
538
+ validateCallablePolicyTyping(context, typing, entry, callable.policy, callable.input, undefined, `/closure/${entryIndex}/definitions/functions/${functionIndex}/policy`);
539
+ }
540
+ }
541
+ }
542
+ function declarationIndex(entry, kind, name) {
543
+ return entry.definitions[kind].findIndex(({ ref }) => ref.name === name);
544
+ }
545
+ function validateCallablePolicyTyping(context, typing, entry, expression, input, receiver, path) {
546
+ const measure = measureChecks(expression);
547
+ if (measure.depth > MAX_CHECK_DEPTH ||
548
+ measure.branches > MAX_BRANCHES ||
549
+ measure.leaves > MAX_CHECK_LEAVES) {
550
+ fail(path, 'Callable Policy checks exceed the V1 depth, branch, or leaf budget.');
551
+ }
552
+ const visit = (value, pointer) => {
553
+ if (!('check' in value)) {
554
+ const children = 'allOf' in value ? value.allOf : value.anyOf;
555
+ children.forEach((child, index) => visit(child, `${pointer}/${index}`));
556
+ return;
557
+ }
558
+ const contracts = callableObjectContracts(context, entry, input, receiver, value.object);
559
+ if (contracts !== undefined &&
560
+ contracts.some((contract) => !typing.policyAccepts(value.check.name, contract))) {
561
+ fail(pointer, 'Named Policy is incompatible with the callable object contract.');
562
+ }
563
+ };
564
+ visit(expression, path);
565
+ }
566
+ function callableObjectContracts(context, entry, input, receiver, object) {
567
+ if (object.kind === 'self') {
568
+ return receiver === undefined ? undefined : [{ kind: 'exact', ref: receiver }];
569
+ }
570
+ if (object.kind === 'input') {
571
+ return nodePathAccepts(entry, input, object.field).map((ref) => ({ kind: 'exact', ref }));
572
+ }
573
+ const ref = object.ref;
574
+ if (ref.kind === 'core') {
575
+ const node = context.core.get(Key.of(ref))?.value;
576
+ return node === undefined ? undefined : [{ kind: 'exact', ref: node.class }];
577
+ }
578
+ const projection = ref.kind === 'class'
579
+ ? 'Class'
580
+ : ref.kind === 'function'
581
+ ? 'Function'
582
+ : ref.kind === 'policy'
583
+ ? 'Policy'
584
+ : 'View';
585
+ return [
586
+ {
587
+ kind: 'exact',
588
+ ref: { origin: 'kernel.astrale.ai', kind: 'class', name: projection },
589
+ },
590
+ ];
591
+ }
592
+ function nodePathAccepts(entry, input, field) {
593
+ const root = entry.values[input]?.nodes[entry.values[input].root]?.schema;
594
+ const properties = root?.properties;
595
+ const fieldSchema = properties?.[field];
596
+ const annotation = fieldSchema?.['x-astrale-path'];
597
+ return Array.isArray(annotation?.accepts)
598
+ ? annotation.accepts
599
+ : [];
600
+ }
601
+ class CompiledPolicyTyping {
602
+ context;
603
+ entry;
604
+ normalized;
605
+ allNodeClasses;
606
+ concreteNodeClasses;
607
+ constructor(context, entry, normalized) {
608
+ this.context = context;
609
+ this.entry = entry;
610
+ this.normalized = normalized;
611
+ this.allNodeClasses = [...context.classes.values()]
612
+ .filter(({ value }) => value.kind === 'node')
613
+ .map(({ value }) => value.ref);
614
+ this.concreteNodeClasses = [...context.classes.values()]
615
+ .filter(({ value }) => value.kind === 'node' && !value.abstract)
616
+ .map(({ value }) => value.ref);
617
+ }
618
+ expandedBranches(name, visiting, namespace) {
619
+ if (visiting.has(name))
620
+ return undefined;
621
+ const declaration = this.normalized.get(name);
622
+ if (declaration === undefined)
623
+ return undefined;
624
+ if ('match' in declaration)
625
+ return branchesOf(declaration.match, namespace);
626
+ const nested = new Set(visiting);
627
+ nested.add(name);
628
+ const refs = 'allOf' in declaration ? declaration.allOf : declaration.anyOf;
629
+ const children = [];
630
+ for (const [index, ref] of refs.entries()) {
631
+ if (ref.origin !== this.entry.origin || ref.kind !== 'policy')
632
+ return undefined;
633
+ const expanded = this.expandedBranches(ref.name, nested, `${namespace}/${index}:${ref.name}`);
634
+ if (expanded === undefined)
635
+ return undefined;
636
+ children.push(expanded);
637
+ }
638
+ return 'allOf' in declaration ? branchProduct(children) : capBranches(children.flat());
639
+ }
640
+ policyAccepts(name, object) {
641
+ const branches = this.expandedBranches(name, new Set(), `$use:${name}`);
642
+ return (branches !== undefined &&
643
+ branches.every((branch) => this.branchIsTyped(branch, { kind: 'object', object })));
644
+ }
645
+ policyAcceptsEdge(name, source, target) {
646
+ const branches = this.expandedBranches(name, new Set(), `$edge-use:${name}`);
647
+ return (branches !== undefined &&
648
+ branches.every((branch) => this.branchIsTyped(branch, { kind: 'edge', source, target })));
649
+ }
650
+ concreteEndpointClasses(accepts) {
651
+ return this.concreteNodeClasses.filter((candidate) => classSatisfiesAny(this.context, candidate, accepts));
652
+ }
653
+ endpointsOverlap(left, right) {
654
+ const seed = [{ kind: 'open', requirements: [] }];
655
+ return this.applyEndpoint(this.applyEndpoint(seed, left), right).length > 0;
656
+ }
657
+ branchIsTyped(branch, use) {
658
+ if (targetMode(branch) !== use.kind)
659
+ return false;
660
+ return compiledEdgeAlternatives(branch.edges, this).some((variants) => this.constraintsSatisfiable(branch, variants, use));
661
+ }
662
+ constraintsSatisfiable(branch, variants, use) {
663
+ const terms = new Set(use.kind === 'object' ? ['subject', 'object'] : ['subject', 'source', 'target']);
664
+ for (const key of branch.variables.keys())
665
+ terms.add(key);
666
+ for (const edge of branch.edges) {
667
+ terms.add(termKey(edge.pattern.source, edge.namespace));
668
+ terms.add(termKey(edge.pattern.target, edge.namespace));
669
+ }
670
+ const union = new CompiledUnionFind(terms);
671
+ for (const variant of variants)
672
+ for (const [left, right] of variant.equalities)
673
+ union.join(left, right);
674
+ const constraints = new Map();
675
+ for (const variant of variants) {
676
+ for (const [term, accepts] of variant.constraints) {
677
+ const root = union.find(term);
678
+ const values = constraints.get(root) ?? [];
679
+ values.push(accepts);
680
+ constraints.set(root, values);
681
+ }
682
+ }
683
+ const groups = new Map();
684
+ for (const term of terms) {
685
+ const root = union.find(term);
686
+ const values = groups.get(root) ?? [];
687
+ values.push(term);
688
+ groups.set(root, values);
689
+ }
690
+ for (const [root, members] of groups) {
691
+ let candidates = [{ kind: 'open', requirements: [] }];
692
+ for (const member of members) {
693
+ candidates = this.applyInitial(candidates, member, branch, use);
694
+ if (candidates.length === 0)
695
+ return false;
696
+ }
697
+ for (const endpoint of constraints.get(root) ?? []) {
698
+ candidates = this.applyEndpoint(candidates, endpoint);
699
+ if (candidates.length === 0)
700
+ return false;
701
+ }
702
+ }
703
+ return true;
704
+ }
705
+ applyInitial(candidates, term, branch, use) {
706
+ if (term === 'subject')
707
+ return this.applyAnyNodeClass(candidates);
708
+ const contract = compiledTargetContract(term, use);
709
+ if (contract !== undefined) {
710
+ return contract.kind === 'exact'
711
+ ? this.applyExact(candidates, contract.ref)
712
+ : uniqueCompiledCandidates(this.allNodeClasses.flatMap((ref) => this.applyExact(candidates, ref)));
713
+ }
714
+ const exact = branch.variables.get(term);
715
+ return exact === undefined ? [] : this.applyExact(candidates, exact);
716
+ }
717
+ applyExact(candidates, exact) {
718
+ return uniqueCompiledCandidates(candidates.flatMap((candidate) => {
719
+ if (candidate.kind === 'exact')
720
+ return Key.of(candidate.ref) === Key.of(exact) ? [candidate] : [];
721
+ return candidate.requirements.every((required) => classSatisfiesAny(this.context, exact, [required]))
722
+ ? [{ kind: 'exact', ref: exact }]
723
+ : [];
724
+ }));
725
+ }
726
+ applyAnyNodeClass(candidates) {
727
+ return uniqueCompiledCandidates(candidates.flatMap((candidate) => candidate.kind === 'exact'
728
+ ? [candidate]
729
+ : this.allNodeClasses
730
+ .filter((ref) => candidate.requirements.every((required) => classSatisfiesAny(this.context, ref, [required])))
731
+ .map((ref) => ({ kind: 'exact', ref }))));
732
+ }
733
+ applyEndpoint(candidates, accepts) {
734
+ const result = [];
735
+ for (const candidate of candidates) {
736
+ if (candidate.kind === 'exact') {
737
+ if (classSatisfiesAny(this.context, candidate.ref, accepts))
738
+ result.push(candidate);
739
+ }
740
+ else {
741
+ for (const accept of accepts) {
742
+ result.push({
743
+ kind: 'open',
744
+ requirements: uniqueClassRefs([...candidate.requirements, accept]),
745
+ });
746
+ }
747
+ }
748
+ }
749
+ return uniqueCompiledCandidates(result);
750
+ }
751
+ }
752
+ function compiledTargetContract(term, use) {
753
+ if (use.kind === 'object')
754
+ return term === 'object' ? use.object : undefined;
755
+ return term === 'source' ? use.source : term === 'target' ? use.target : undefined;
756
+ }
757
+ function compiledEdgeAlternatives(edges, typing) {
758
+ let result = [[]];
759
+ for (const edge of edges) {
760
+ const variants = compiledVariantsForEdge(edge, typing);
761
+ if (variants.length === 0)
762
+ return [];
763
+ result = result.flatMap((prefix) => variants.map((variant) => [...prefix, variant]));
764
+ }
765
+ return result;
766
+ }
767
+ function compiledVariantsForEdge(use, typing) {
768
+ const declaration = typing.context.classes.get(Key.of(use.pattern.class))?.value;
769
+ if (declaration === undefined || !isCompiledEdge(declaration))
770
+ return [];
771
+ const endpoints = declaration.orientation === 'directed'
772
+ ? [declaration.endpoints.source, declaration.endpoints.target]
773
+ : declaration.endpoints;
774
+ const repeat = use.pattern.repeat ?? { min: 1, max: 1 };
775
+ const sourceKey = termKey(use.pattern.source, use.namespace);
776
+ const targetKey = termKey(use.pattern.target, use.namespace);
777
+ const variants = [];
778
+ for (let length = repeat.min; length <= repeat.max; length++) {
779
+ if (length === 0) {
780
+ variants.push({ constraints: [], equalities: [[sourceKey, targetKey]] });
781
+ continue;
782
+ }
783
+ const orientationCount = declaration.orientation === 'undirected' ? 2 ** length : 1;
784
+ for (let mask = 0; mask < orientationCount; mask++) {
785
+ const reversed = Array.from({ length }, (_, index) => declaration.orientation === 'undirected' && (mask & (1 << index)) !== 0);
786
+ let valid = true;
787
+ for (let index = 0; index + 1 < length; index++) {
788
+ const incoming = reversed[index] ? endpoints[0] : endpoints[1];
789
+ const outgoing = reversed[index + 1] ? endpoints[1] : endpoints[0];
790
+ if (!typing.endpointsOverlap(incoming.accepts, outgoing.accepts))
791
+ valid = false;
792
+ }
793
+ if (!valid)
794
+ continue;
795
+ const first = reversed[0] ? endpoints[1] : endpoints[0];
796
+ const last = reversed[length - 1] ? endpoints[0] : endpoints[1];
797
+ variants.push({
798
+ constraints: [
799
+ [sourceKey, first.accepts],
800
+ [targetKey, last.accepts],
801
+ ],
802
+ equalities: [],
803
+ });
804
+ }
805
+ }
806
+ return uniqueCompiledEdgeVariants(variants);
807
+ }
808
+ function uniqueCompiledEdgeVariants(values) {
809
+ const result = new Map();
810
+ for (const value of values) {
811
+ const key = `${value.constraints.map(([term, accepts]) => `${term}:${accepts.map(Key.of).sort(compareUnicode).join(',')}`).join('|')}=${value.equalities.map(([left, right]) => `${left}:${right}`).join('|')}`;
812
+ result.set(key, value);
813
+ }
814
+ return [...result.values()];
815
+ }
816
+ function uniqueCompiledCandidates(values) {
817
+ const result = new Map();
818
+ for (const value of values) {
819
+ const key = value.kind === 'exact'
820
+ ? `exact:${Key.of(value.ref)}`
821
+ : `open:${value.requirements.map(Key.of).sort(compareUnicode).join('|')}`;
822
+ result.set(key, value);
823
+ }
824
+ return [...result.values()];
825
+ }
826
+ function uniqueClassRefs(values) {
827
+ return [...new Map(values.map((value) => [Key.of(value), value])).values()];
828
+ }
829
+ function measureCompiledPolicy(origin, name, normalized, visiting) {
830
+ if (visiting.has(name))
831
+ return undefined;
832
+ const expression = normalized.get(name);
833
+ if (expression === undefined)
834
+ return undefined;
835
+ if ('match' in expression)
836
+ return measureCompiledPattern(expression.match, origin);
837
+ const nested = new Set(visiting);
838
+ nested.add(name);
839
+ const refs = 'allOf' in expression ? expression.allOf : expression.anyOf;
840
+ const children = refs.map((ref) => ref.origin === origin ? measureCompiledPolicy(origin, ref.name, normalized, nested) : undefined);
841
+ if (children.some((value) => value === undefined))
842
+ return undefined;
843
+ return combineCompiledMeasures('allOf' in expression ? 'allOf' : 'anyOf', children);
844
+ }
845
+ function measureCompiledPattern(pattern, origin) {
846
+ if ('source' in pattern)
847
+ return { depth: 1, edgeCounts: [1], domains: new Set([origin, pattern.class.origin]) };
848
+ if ('exists' in pattern) {
849
+ const child = measureCompiledPattern(pattern.exists.where, origin);
850
+ return {
851
+ depth: child.depth + 1,
852
+ edgeCounts: child.edgeCounts,
853
+ domains: new Set([
854
+ ...child.domains,
855
+ ...pattern.exists.nodes.map(({ class: ref }) => ref.origin),
856
+ ]),
857
+ };
858
+ }
859
+ return combineCompiledMeasures('allOf' in pattern ? 'allOf' : 'anyOf', ('allOf' in pattern ? pattern.allOf : pattern.anyOf).map((child) => measureCompiledPattern(child, origin)));
860
+ }
861
+ function combineCompiledMeasures(kind, children) {
862
+ const depth = 1 + Math.max(0, ...children.map((child) => child.depth));
863
+ const domains = new Set(children.flatMap((child) => [...child.domains]));
864
+ if (kind === 'anyOf')
865
+ return {
866
+ depth,
867
+ edgeCounts: children.flatMap((child) => child.edgeCounts).slice(0, BRANCH_OVERFLOW),
868
+ domains,
869
+ };
870
+ let edgeCounts = [0];
871
+ for (const child of children) {
872
+ const next = [];
873
+ for (const left of edgeCounts) {
874
+ for (const right of child.edgeCounts) {
875
+ next.push(left + right);
876
+ if (next.length >= BRANCH_OVERFLOW)
877
+ break;
878
+ }
879
+ if (next.length >= BRANCH_OVERFLOW)
880
+ break;
881
+ }
882
+ edgeCounts = next;
883
+ }
884
+ return { depth, edgeCounts, domains };
885
+ }
886
+ class CompiledUnionFind {
887
+ #parents = new Map();
888
+ constructor(values) {
889
+ for (const value of values)
890
+ this.add(value);
891
+ }
892
+ add(value) {
893
+ if (!this.#parents.has(value))
894
+ this.#parents.set(value, value);
895
+ }
896
+ find(value) {
897
+ this.add(value);
898
+ const parent = this.#parents.get(value);
899
+ if (parent === value)
900
+ return value;
901
+ const root = this.find(parent);
902
+ this.#parents.set(value, root);
903
+ return root;
904
+ }
905
+ join(left, right) {
906
+ const a = this.find(left);
907
+ const b = this.find(right);
908
+ if (a !== b)
909
+ this.#parents.set(b, a);
910
+ }
911
+ }
912
+ function validateCore(candidate, context) {
913
+ for (const [entryIndex, entry] of candidate.closure.entries()) {
914
+ const nodes = new Map();
915
+ for (const [index, value] of entry.definitions.core.entries()) {
916
+ const path = `/closure/${entryIndex}/definitions/core/${index}`;
917
+ const classValue = context.classes.get(Key.of(value.class));
918
+ if (value.class.origin !== entry.origin ||
919
+ classValue?.value.kind !== 'node' ||
920
+ classValue.value.abstract)
921
+ fail(`${path}/class`, 'A Core Node requires a local concrete Node Class.');
922
+ const analysis = context.analyses.get(Key.of(value.class));
923
+ if (analysis === undefined)
924
+ fail(`${path}/class`, 'Core Node Class analysis is absent.');
925
+ validateCoreProperties(value.properties, analysis, `${path}/properties`);
926
+ nodes.set(Key.of(value.ref), {
927
+ key: Key.of(value.ref),
928
+ value,
929
+ class: classValue,
930
+ analysis,
931
+ pointer: path,
932
+ });
933
+ }
934
+ const edges = [];
935
+ for (const [index, value] of entry.facts.core.entries()) {
936
+ const path = `/closure/${entryIndex}/facts/core/${index}`;
937
+ const classValue = context.classes.get(Key.of(value.class));
938
+ if (value.class.origin !== entry.origin ||
939
+ classValue === undefined ||
940
+ !isCompiledEdge(classValue.value) ||
941
+ classValue.value.abstract)
942
+ fail(`${path}/class`, 'A Core Edge requires a local concrete Edge Class.');
943
+ const analysis = context.analyses.get(Key.of(value.class));
944
+ if (analysis === undefined)
945
+ fail(`${path}/class`, 'Core Edge Class analysis is absent.');
946
+ validateCoreProperties(value.properties, analysis, `${path}/properties`);
947
+ const source = resolveCoreEndpoint(value.source, nodes, `${path}/source`);
948
+ const target = resolveCoreEndpoint(value.target, nodes, `${path}/target`);
949
+ const declaration = classValue.value;
950
+ const satisfies = declaration.orientation === 'directed'
951
+ ? endpointSatisfies(context, source, declaration.endpoints.source.accepts) &&
952
+ endpointSatisfies(context, target, declaration.endpoints.target.accepts)
953
+ : (endpointSatisfies(context, source, declaration.endpoints[0].accepts) &&
954
+ endpointSatisfies(context, target, declaration.endpoints[1].accepts)) ||
955
+ (endpointSatisfies(context, source, declaration.endpoints[1].accepts) &&
956
+ endpointSatisfies(context, target, declaration.endpoints[0].accepts));
957
+ if (!satisfies)
958
+ fail(path, 'Core Edge endpoints do not satisfy its exact Class.');
959
+ edges.push({
960
+ source,
961
+ target,
962
+ value,
963
+ class: classValue,
964
+ pointer: path,
965
+ });
966
+ }
967
+ validateCoreEdgeSet(context, entry, entryIndex, nodes, edges);
968
+ }
969
+ }
970
+ function validateCoreProperties(values, analysis, path) {
971
+ for (const key of Object.keys(values))
972
+ if (!analysis.properties.has(key))
973
+ fail(`${path}/${escapePointer(key)}`, 'Core properties contain an unknown Property key.');
974
+ for (const property of analysis.properties.values()) {
975
+ if (!Object.hasOwn(values, property.key)) {
976
+ if (property.declaration.required)
977
+ fail(`${path}/${escapePointer(property.key)}`, 'Core properties omit a required Property.');
978
+ continue;
979
+ }
980
+ if (validateValueProgram(property.entry.values[property.declaration.value], values[property.key])
981
+ .length > 0)
982
+ fail(`${path}/${escapePointer(property.key)}`, 'Core Property value does not satisfy its exact contract.');
983
+ }
984
+ }
985
+ function resolveCoreEndpoint(ref, nodes, path) {
986
+ if (ref.kind === 'domain')
987
+ return { key: 'domain' };
988
+ const node = nodes.get(Key.of(ref));
989
+ if (node === undefined)
990
+ fail(path, 'Core endpoint does not name a declared local Core Node.');
991
+ return node;
992
+ }
993
+ function endpointSatisfies(context, endpoint, accepts) {
994
+ return !('value' in endpoint) || classSatisfiesAny(context, endpoint.value.class, accepts);
995
+ }
996
+ function validateCoreEdgeSet(context, entry, entryIndex, nodes, edges) {
997
+ const seen = new Set();
998
+ const slices = new Map();
999
+ for (const edge of edges) {
1000
+ const classKey = Key.of(edge.value.class);
1001
+ const [source, target] = edge.class.value.orientation === 'undirected' &&
1002
+ compareUnicode(edge.source.key, edge.target.key) > 0
1003
+ ? [edge.target.key, edge.source.key]
1004
+ : [edge.source.key, edge.target.key];
1005
+ const key = `${classKey}\u0000${source}\u0000${target}`;
1006
+ if (seen.has(key))
1007
+ fail(edge.pointer, 'Core Edge duplicates an exact normalized Edge identity.');
1008
+ seen.add(key);
1009
+ const values = slices.get(classKey) ?? [];
1010
+ values.push(edge);
1011
+ slices.set(classKey, values);
1012
+ if (edge.class.value.constraints.noSelf === true && edge.source.key === edge.target.key)
1013
+ fail(edge.pointer, 'Core Edge violates noSelf.');
1014
+ }
1015
+ for (const edgeClass of entry.definitions.classes) {
1016
+ if (!isCompiledEdge(edgeClass))
1017
+ continue;
1018
+ const classEdges = slices.get(Key.of(edgeClass.ref)) ?? [];
1019
+ if (edgeClass.constraints.acyclic === true && hasCycle(classEdges))
1020
+ fail(`/closure/${entryIndex}/facts/core`, 'Core Edge set violates exact-Class acyclicity.');
1021
+ validateCardinality(context, edgeClass, classEdges, nodes);
1022
+ }
1023
+ }
1024
+ function validateCardinality(context, declaration, edges, nodes) {
1025
+ for (const node of nodes.values()) {
1026
+ if (declaration.orientation === 'directed') {
1027
+ if (classSatisfiesAny(context, node.value.class, declaration.endpoints.source.accepts))
1028
+ checkCount(declaration.endpoints.source.outgoing, edges.filter(({ source }) => source.key === node.key).length, node.pointer);
1029
+ if (classSatisfiesAny(context, node.value.class, declaration.endpoints.target.accepts))
1030
+ checkCount(declaration.endpoints.target.incoming, edges.filter(({ target }) => target.key === node.key).length, node.pointer);
1031
+ }
1032
+ else {
1033
+ const degree = edges.filter(({ source, target }) => source.key === node.key || target.key === node.key).length;
1034
+ const [first, second] = declaration.endpoints;
1035
+ if (classSatisfiesAny(context, node.value.class, first.accepts))
1036
+ checkCount(first.incident, degree, node.pointer);
1037
+ if (!sameIncidentEndpoint(first, second) &&
1038
+ classSatisfiesAny(context, node.value.class, second.accepts))
1039
+ checkCount(second.incident, degree, node.pointer);
1040
+ }
1041
+ }
1042
+ }
1043
+ function checkCount(count, degree, path) {
1044
+ const [minimum, maximum] = countBounds(count);
1045
+ if (degree < minimum || degree > maximum)
1046
+ fail(path, `Core degree ${degree} violates Edge count ${count}.`);
1047
+ }
1048
+ function countBounds(value) {
1049
+ switch (value) {
1050
+ case '0..*':
1051
+ return [0, Number.POSITIVE_INFINITY];
1052
+ case '1..*':
1053
+ return [1, Number.POSITIVE_INFINITY];
1054
+ case '0..1':
1055
+ return [0, 1];
1056
+ case '1':
1057
+ return [1, 1];
1058
+ }
1059
+ }
1060
+ function hasCycle(edges) {
1061
+ const outgoing = new Map();
1062
+ for (const edge of edges) {
1063
+ const values = outgoing.get(edge.source.key) ?? [];
1064
+ values.push(edge.target.key);
1065
+ outgoing.set(edge.source.key, values);
1066
+ }
1067
+ const visiting = new Set();
1068
+ const visited = new Set();
1069
+ const visit = (key) => {
1070
+ if (visiting.has(key))
1071
+ return true;
1072
+ if (visited.has(key))
1073
+ return false;
1074
+ visiting.add(key);
1075
+ if ((outgoing.get(key) ?? []).some(visit))
1076
+ return true;
1077
+ visiting.delete(key);
1078
+ visited.add(key);
1079
+ return false;
1080
+ };
1081
+ return [...outgoing.keys()].some(visit);
1082
+ }
1083
+ function escapePointer(value) {
1084
+ return value.replaceAll('~', '~0').replaceAll('/', '~1');
1085
+ }
1086
+ function isCompiledEdge(value) {
1087
+ return value.kind === 'edge';
1088
+ }
1089
+ function fail(pointer, message) {
1090
+ return invalidCompiled('COMPILED_SOURCE_INVALID', message, pointer);
1091
+ }