@greenpandastudios/aug-cli 0.19.0 → 0.21.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 (628) hide show
  1. package/README.md +9 -6
  2. package/THIRD_PARTY_NOTICES.md +4 -0
  3. package/bin/aug.mjs +12 -2
  4. package/docs/about.md +27 -0
  5. package/docs/api/crypto.md +103 -69
  6. package/docs/api/io.md +35 -33
  7. package/docs/api/json.md +3 -3
  8. package/docs/api/memory.md +23 -19
  9. package/docs/api/time.md +10 -9
  10. package/docs/api/web.md +33 -38
  11. package/docs/assets/benchmarks/execution.svg +774 -637
  12. package/docs/assets/benchmarks/http.svg +278 -249
  13. package/docs/assets/benchmarks/improvements.svg +66 -66
  14. package/docs/assets/benchmarks/kernels-mobile.svg +1 -0
  15. package/docs/assets/benchmarks/kernels.svg +1 -0
  16. package/docs/assets/benchmarks/memory.svg +153 -153
  17. package/docs/benchmark-results.json +227089 -90363
  18. package/docs/compatibility.md +8 -8
  19. package/docs/contributing-benchmarks.md +68 -0
  20. package/docs/dev-containers.md +88 -0
  21. package/docs/dgx-consumers.json +122 -0
  22. package/docs/dgx-gyms.json +784 -0
  23. package/docs/dgx-kernels.json +1170 -0
  24. package/docs/dgx-performance.json +227849 -0
  25. package/docs/dgx-spark.md +64 -0
  26. package/docs/diagnostics.md +15 -5
  27. package/docs/docker.md +173 -12
  28. package/docs/editor.md +35 -0
  29. package/docs/example-projects.json +238 -24
  30. package/docs/examples/approved-design/counters.md +34 -126
  31. package/docs/examples/approved-design/dependencies/august/0.21.0/io/contracts.md +178 -0
  32. package/docs/examples/approved-design/domain/app.md +13 -77
  33. package/docs/examples/approved-design/domain/export.md +5 -19
  34. package/docs/examples/approved-design/domain/models.md +4 -23
  35. package/docs/examples/approved-design/domain/numbers.md +24 -114
  36. package/docs/examples/approved-design/index.md +16 -7
  37. package/docs/examples/approved-design/main.md +19 -96
  38. package/docs/examples/benchmark/index.md +6 -5
  39. package/docs/examples/benchmark/main.md +7 -35
  40. package/docs/examples/calls-benchmark/index.md +36 -0
  41. package/docs/examples/calls-benchmark/main.md +78 -0
  42. package/docs/examples/calls-benchmark/operations.md +60 -0
  43. package/docs/examples/cli-args/index.md +6 -5
  44. package/docs/examples/cli-args/main.md +6 -31
  45. package/docs/examples/collections/index.md +6 -5
  46. package/docs/examples/collections/main.md +7 -35
  47. package/docs/examples/collections-benchmark/index.md +6 -5
  48. package/docs/examples/collections-benchmark/main.md +7 -35
  49. package/docs/examples/cpu-benchmark/index.md +6 -5
  50. package/docs/examples/cpu-benchmark/main.md +5 -24
  51. package/docs/examples/developer-workflow/calculator.md +39 -186
  52. package/docs/examples/developer-workflow/dependencies/august/0.21.0/io/contracts.md +178 -0
  53. package/docs/examples/developer-workflow/index.md +16 -7
  54. package/docs/examples/developer-workflow/logging/console.md +10 -56
  55. package/docs/examples/developer-workflow/logging/export.md +4 -14
  56. package/docs/examples/developer-workflow/logging/logger.md +7 -43
  57. package/docs/examples/developer-workflow/main.md +17 -69
  58. package/docs/examples/drop/index.md +6 -5
  59. package/docs/examples/drop/main.md +7 -27
  60. package/docs/examples/drop/resource.md +7 -30
  61. package/docs/examples/errors/errors.md +7 -27
  62. package/docs/examples/errors/index.md +6 -5
  63. package/docs/examples/errors/main.md +7 -28
  64. package/docs/examples/errors-benchmark/index.md +36 -0
  65. package/docs/examples/errors-benchmark/main.md +92 -0
  66. package/docs/examples/errors-benchmark/operations.md +65 -0
  67. package/docs/examples/ffi/index.md +6 -5
  68. package/docs/examples/ffi/main.md +6 -20
  69. package/docs/examples/ffi/native.md +8 -34
  70. package/docs/examples/float-benchmark/index.md +35 -0
  71. package/docs/examples/float-benchmark/main.md +75 -0
  72. package/docs/examples/generic-di/dependencies/august/0.21.0/io/contracts.md +178 -0
  73. package/docs/examples/generic-di/index.md +6 -5
  74. package/docs/examples/generic-di/main.md +9 -39
  75. package/docs/examples/generic-di/types.md +23 -92
  76. package/docs/examples/generics/index.md +6 -5
  77. package/docs/examples/generics/main.md +10 -47
  78. package/docs/examples/generics/types.md +25 -100
  79. package/docs/examples/hello/app/export.md +4 -12
  80. package/docs/examples/hello/app/greeter.md +13 -91
  81. package/docs/examples/hello/dependencies/august/0.21.0/io/contracts.md +178 -0
  82. package/docs/examples/hello/index.md +17 -6
  83. package/docs/examples/hello/logging/console.md +10 -54
  84. package/docs/examples/hello/logging/export.md +4 -14
  85. package/docs/examples/hello/logging/logger.md +7 -45
  86. package/docs/examples/hello/main.md +9 -39
  87. package/docs/examples/http-benchmark/index.md +6 -5
  88. package/docs/examples/http-benchmark/main.md +6 -20
  89. package/docs/examples/http-benchmark/routes.md +9 -31
  90. package/docs/examples/index.md +63 -29
  91. package/docs/examples/interceptors/app.md +20 -139
  92. package/docs/examples/interceptors/dependencies/august/0.21.0/io/contracts.md +178 -0
  93. package/docs/examples/interceptors/index.md +6 -5
  94. package/docs/examples/interceptors/interceptors.md +24 -148
  95. package/docs/examples/interceptors/logging.md +13 -76
  96. package/docs/examples/interceptors/main.md +10 -65
  97. package/docs/examples/json-benchmark/data.md +4 -20
  98. package/docs/examples/json-benchmark/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
  99. package/docs/examples/json-benchmark/index.md +7 -5
  100. package/docs/examples/json-benchmark/main-yaml.md +20 -0
  101. package/docs/examples/json-benchmark/main.md +10 -49
  102. package/docs/examples/list-benchmark/index.md +35 -0
  103. package/docs/examples/list-benchmark/main.md +78 -0
  104. package/docs/examples/map-churn-benchmark/index.md +35 -0
  105. package/docs/examples/map-churn-benchmark/main.md +106 -0
  106. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/api.md +104 -0
  107. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.md +54 -0
  108. package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi-json.md +48 -0
  109. package/docs/examples/native-blake3/hashing.md +93 -0
  110. package/docs/examples/native-blake3/index.md +38 -0
  111. package/docs/examples/native-blake3/main.md +73 -0
  112. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/api.md +406 -0
  113. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.md +51 -0
  114. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.md +63 -0
  115. package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi-json.md +161 -0
  116. package/docs/examples/native-pytorch/index.md +38 -0
  117. package/docs/examples/native-pytorch/main.md +73 -0
  118. package/docs/examples/native-pytorch/tensors.md +123 -0
  119. package/docs/examples/native-sqlite/database.md +116 -0
  120. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/api.md +284 -0
  121. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.md +51 -0
  122. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.md +75 -0
  123. package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi-json.md +119 -0
  124. package/docs/examples/native-sqlite/index.md +38 -0
  125. package/docs/examples/native-sqlite/main.md +73 -0
  126. package/docs/examples/native-zlib/compression.md +99 -0
  127. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/api.md +153 -0
  128. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.md +54 -0
  129. package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi-json.md +76 -0
  130. package/docs/examples/native-zlib/index.md +38 -0
  131. package/docs/examples/native-zlib/main.md +78 -0
  132. package/docs/examples/new-syntax/console.md +10 -52
  133. package/docs/examples/new-syntax/dependencies/august/0.21.0/io/contracts.md +178 -0
  134. package/docs/examples/new-syntax/greeter.md +13 -71
  135. package/docs/examples/new-syntax/index.md +6 -5
  136. package/docs/examples/new-syntax/logger.md +7 -43
  137. package/docs/examples/new-syntax/main.md +10 -53
  138. package/docs/examples/new-syntax/math.md +6 -24
  139. package/docs/examples/oidc-login/client/contracts.md +10 -61
  140. package/docs/examples/oidc-login/client/endpoints.md +32 -154
  141. package/docs/examples/oidc-login/client/export.md +5 -23
  142. package/docs/examples/oidc-login/client/login.md +234 -344
  143. package/docs/examples/oidc-login/client/logout.md +38 -143
  144. package/docs/examples/oidc-login/client/protocol.md +183 -304
  145. package/docs/examples/oidc-login/client/session.md +41 -149
  146. package/docs/examples/oidc-login/client/views.md +13 -58
  147. package/docs/examples/oidc-login/common/export.md +6 -26
  148. package/docs/examples/oidc-login/common/headers.md +42 -72
  149. package/docs/examples/oidc-login/common/keys.md +40 -164
  150. package/docs/examples/oidc-login/common/settings.md +24 -40
  151. package/docs/examples/oidc-login/common/views.md +7 -28
  152. package/docs/examples/oidc-login/dependencies/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.md +205 -0
  153. package/docs/examples/oidc-login/dependencies/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +67 -0
  154. package/docs/examples/oidc-login/dependencies/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +267 -0
  155. package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.md +415 -0
  156. package/docs/examples/oidc-login/dependencies/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.md +271 -0
  157. package/docs/examples/oidc-login/dependencies/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.md +89 -0
  158. package/docs/examples/oidc-login/index.md +8 -7
  159. package/docs/examples/oidc-login/main-yaml.md +7 -0
  160. package/docs/examples/oidc-login/main.md +26 -153
  161. package/docs/examples/oidc-login/provider/authorization.md +232 -275
  162. package/docs/examples/oidc-login/provider/contracts.md +24 -146
  163. package/docs/examples/oidc-login/provider/credentials.md +24 -57
  164. package/docs/examples/oidc-login/provider/discovery.md +48 -122
  165. package/docs/examples/oidc-login/provider/export.md +11 -37
  166. package/docs/examples/oidc-login/provider/token.md +159 -237
  167. package/docs/examples/oidc-login/provider/userinfo.md +47 -102
  168. package/docs/examples/oidc-login/provider/views.md +13 -53
  169. package/docs/examples/ownership/counter.md +17 -63
  170. package/docs/examples/ownership/index.md +6 -5
  171. package/docs/examples/ownership/main.md +7 -30
  172. package/docs/examples/ownership-transfer/dependencies/august/0.21.0/io/contracts.md +178 -0
  173. package/docs/examples/ownership-transfer/index.md +6 -5
  174. package/docs/examples/ownership-transfer/main.md +10 -52
  175. package/docs/examples/ownership-transfer/resource.md +15 -67
  176. package/docs/examples/packages-app/dependencies/packages/@example/aug-math/0.1.0/arithmetic.md +12 -50
  177. package/docs/examples/packages-app/index.md +7 -6
  178. package/docs/examples/packages-app/main.md +7 -25
  179. package/docs/examples/packages-math/aug-package-json.md +1 -1
  180. package/docs/examples/packages-math/index.md +7 -6
  181. package/docs/examples/packages-math/src/arithmetic.md +12 -50
  182. package/docs/examples/packages-math/src/export.md +4 -12
  183. package/docs/examples/records-benchmark/data.md +55 -0
  184. package/docs/examples/records-benchmark/index.md +36 -0
  185. package/docs/examples/records-benchmark/main.md +85 -0
  186. package/docs/examples/startup-benchmark/index.md +6 -5
  187. package/docs/examples/startup-benchmark/main.md +5 -17
  188. package/docs/examples/strings-benchmark/index.md +35 -0
  189. package/docs/examples/strings-benchmark/main.md +76 -0
  190. package/docs/examples/tasks-benchmark/index.md +36 -0
  191. package/docs/examples/tasks-benchmark/main.md +89 -0
  192. package/docs/examples/tasks-benchmark/operations.md +58 -0
  193. package/docs/examples/visibility/counter.md +19 -67
  194. package/docs/examples/visibility/index.md +6 -5
  195. package/docs/examples/visibility/main.md +7 -31
  196. package/docs/examples/weather-api/forecasts.md +168 -0
  197. package/docs/examples/weather-api/index.md +42 -0
  198. package/docs/examples/weather-api/main-yaml.md +21 -0
  199. package/docs/examples/weather-api/main.md +65 -0
  200. package/docs/examples.json +10 -0
  201. package/docs/getting-started.md +105 -2
  202. package/docs/grammar.md +7 -5
  203. package/docs/guides/change-a-module.md +64 -0
  204. package/docs/guides/index.md +27 -0
  205. package/docs/gym-results.json +784 -0
  206. package/docs/implementation-map.md +6 -0
  207. package/docs/index.md +51 -29
  208. package/docs/kernel-results.json +1170 -0
  209. package/docs/language-conformance.md +7 -1
  210. package/docs/language-constructs.md +30 -22
  211. package/docs/language-design-audit.md +1 -1
  212. package/docs/learn/data-and-errors.md +77 -0
  213. package/docs/learn/index.md +30 -0
  214. package/docs/learn/modules-and-dependencies.md +73 -0
  215. package/docs/learn/state-and-tests.md +71 -0
  216. package/docs/learn/values-and-functions.md +62 -0
  217. package/docs/lesson-failures.json +8 -0
  218. package/docs/maintaining-docs.md +16 -4
  219. package/docs/native-implementation.md +276 -0
  220. package/docs/native-interop-llvm-plan.md +342 -0
  221. package/docs/native-package-examples.md +684 -0
  222. package/docs/native-packages.md +179 -0
  223. package/docs/packages.md +72 -126
  224. package/docs/performance.md +61 -68
  225. package/docs/production-readiness.md +16 -5
  226. package/docs/public/downloads/approved-design.zip +0 -0
  227. package/docs/public/downloads/benchmark.zip +0 -0
  228. package/docs/public/downloads/calls-benchmark.zip +0 -0
  229. package/docs/public/downloads/cli-args.zip +0 -0
  230. package/docs/public/downloads/collections-benchmark.zip +0 -0
  231. package/docs/public/downloads/collections.zip +0 -0
  232. package/docs/public/downloads/cpu-benchmark.zip +0 -0
  233. package/docs/public/downloads/developer-workflow.zip +0 -0
  234. package/docs/public/downloads/drop.zip +0 -0
  235. package/docs/public/downloads/errors-benchmark.zip +0 -0
  236. package/docs/public/downloads/errors.zip +0 -0
  237. package/docs/public/downloads/ffi.zip +0 -0
  238. package/docs/public/downloads/float-benchmark.zip +0 -0
  239. package/docs/public/downloads/generic-di.zip +0 -0
  240. package/docs/public/downloads/generics.zip +0 -0
  241. package/docs/public/downloads/hello.zip +0 -0
  242. package/docs/public/downloads/http-benchmark.zip +0 -0
  243. package/docs/public/downloads/interceptors.zip +0 -0
  244. package/docs/public/downloads/json-benchmark.zip +0 -0
  245. package/docs/public/downloads/list-benchmark.zip +0 -0
  246. package/docs/public/downloads/map-churn-benchmark.zip +0 -0
  247. package/docs/public/downloads/native-blake3.zip +0 -0
  248. package/docs/public/downloads/native-pytorch.zip +0 -0
  249. package/docs/public/downloads/native-sqlite.zip +0 -0
  250. package/docs/public/downloads/native-zlib.zip +0 -0
  251. package/docs/public/downloads/new-syntax.zip +0 -0
  252. package/docs/public/downloads/oidc-login.zip +0 -0
  253. package/docs/public/downloads/ownership-transfer.zip +0 -0
  254. package/docs/public/downloads/ownership.zip +0 -0
  255. package/docs/public/downloads/packages-app.zip +0 -0
  256. package/docs/public/downloads/packages-math.zip +0 -0
  257. package/docs/public/downloads/records-benchmark.zip +0 -0
  258. package/docs/public/downloads/startup-benchmark.zip +0 -0
  259. package/docs/public/downloads/strings-benchmark.zip +0 -0
  260. package/docs/public/downloads/tasks-benchmark.zip +0 -0
  261. package/docs/public/downloads/visibility.zip +0 -0
  262. package/docs/public/downloads/weather-api.zip +0 -0
  263. package/docs/qualification-results.md +66 -0
  264. package/docs/reference.md +47 -17
  265. package/docs/releasing.md +105 -16
  266. package/docs/research/code-to-natural-language.md +108 -0
  267. package/docs/research/ecosystem-workflow.md +41 -0
  268. package/docs/research/libtorch-native-qualification.md +115 -0
  269. package/docs/research/native-interop-llvm.md +197 -0
  270. package/docs/research/qualification-methods.md +15 -0
  271. package/docs/research/wiki-editorial-design.md +71 -0
  272. package/docs/roadmap.md +2 -1
  273. package/docs/safety-gyms.md +41 -0
  274. package/docs/specifications.md +27 -11
  275. package/docs/testing.md +19 -5
  276. package/docs/tooling.md +36 -22
  277. package/docs/weather-api.md +65 -0
  278. package/docs/web-library-gaps.md +1 -1
  279. package/docs/web.md +54 -18
  280. package/docs/writing-docs.md +49 -0
  281. package/examples/{hello/.aug-spec/august/0.19.0 → approved-design/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  282. package/examples/approved-design/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  283. package/examples/approved-design/.aug-spec/manifest.json +3 -3
  284. package/examples/approved-design/counters.aug +5 -4
  285. package/examples/approved-design/counters.aug.md +25 -132
  286. package/examples/approved-design/domain/app.aug +2 -1
  287. package/examples/approved-design/domain/app.aug.md +10 -80
  288. package/examples/approved-design/domain/export.aug +1 -0
  289. package/examples/approved-design/domain/export.aug.md +4 -20
  290. package/examples/approved-design/domain/models.aug +1 -0
  291. package/examples/approved-design/domain/models.aug.md +3 -25
  292. package/examples/approved-design/domain/numbers.aug +3 -2
  293. package/examples/approved-design/domain/numbers.aug.md +19 -116
  294. package/examples/approved-design/main.aug +1 -0
  295. package/examples/approved-design/main.aug.md +12 -95
  296. package/examples/benchmark/.aug-spec/manifest.json +1 -1
  297. package/examples/benchmark/main.aug +1 -0
  298. package/examples/benchmark/main.aug.md +6 -36
  299. package/examples/cli-args/.aug-spec/manifest.json +1 -1
  300. package/examples/cli-args/main.aug +1 -0
  301. package/examples/cli-args/main.aug.md +5 -32
  302. package/examples/collections/.aug-spec/manifest.json +1 -1
  303. package/examples/collections/main.aug +1 -0
  304. package/examples/collections/main.aug.md +6 -36
  305. package/examples/{generic-di/.aug-spec/august/0.19.0 → developer-workflow/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  306. package/examples/developer-workflow/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  307. package/examples/developer-workflow/.aug-spec/manifest.json +3 -3
  308. package/examples/developer-workflow/calculator.aug +3 -2
  309. package/examples/developer-workflow/calculator.aug.md +28 -189
  310. package/examples/developer-workflow/logging/console.aug +2 -1
  311. package/examples/developer-workflow/logging/console.aug.md +7 -57
  312. package/examples/developer-workflow/logging/export.aug +1 -0
  313. package/examples/developer-workflow/logging/export.aug.md +3 -15
  314. package/examples/developer-workflow/logging/logger.aug +1 -0
  315. package/examples/developer-workflow/logging/logger.aug.md +6 -46
  316. package/examples/developer-workflow/main.aug +1 -0
  317. package/examples/developer-workflow/main.aug.md +10 -68
  318. package/examples/drop/.aug-spec/manifest.json +1 -1
  319. package/examples/drop/main.aug +1 -0
  320. package/examples/drop/main.aug.md +6 -28
  321. package/examples/drop/resource.aug +1 -0
  322. package/examples/drop/resource.aug.md +6 -34
  323. package/examples/errors/.aug-spec/manifest.json +1 -1
  324. package/examples/errors/errors.aug +2 -1
  325. package/examples/errors/errors.aug.md +4 -27
  326. package/examples/errors/main.aug +1 -0
  327. package/examples/errors/main.aug.md +6 -29
  328. package/examples/ffi/.aug-spec/manifest.json +1 -1
  329. package/examples/ffi/main.aug +1 -0
  330. package/examples/ffi/main.aug.md +5 -21
  331. package/examples/ffi/native.aug +2 -1
  332. package/examples/ffi/native.aug.md +5 -35
  333. package/examples/{approved-design/.aug-spec/august/0.19.0 → generic-di/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  334. package/examples/generic-di/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  335. package/examples/generic-di/.aug-spec/manifest.json +3 -3
  336. package/examples/generic-di/main.aug +1 -0
  337. package/examples/generic-di/main.aug.md +8 -40
  338. package/examples/generic-di/types.aug +3 -2
  339. package/examples/generic-di/types.aug.md +18 -97
  340. package/examples/generics/.aug-spec/manifest.json +1 -1
  341. package/examples/generics/main.aug +1 -0
  342. package/examples/generics/main.aug.md +9 -48
  343. package/examples/generics/types.aug +4 -3
  344. package/examples/generics/types.aug.md +18 -104
  345. package/examples/{developer-workflow/.aug-spec/august/0.19.0 → hello/.aug-spec/august/0.21.0}/io/contracts.aug +4 -3
  346. package/examples/hello/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  347. package/examples/hello/.aug-spec/manifest.json +3 -3
  348. package/examples/hello/app/export.aug +1 -0
  349. package/examples/hello/app/export.aug.md +3 -13
  350. package/examples/hello/app/greeter.aug +2 -1
  351. package/examples/hello/app/greeter.aug.md +10 -94
  352. package/examples/hello/logging/console.aug +2 -1
  353. package/examples/hello/logging/console.aug.md +7 -55
  354. package/examples/hello/logging/export.aug +1 -0
  355. package/examples/hello/logging/export.aug.md +3 -15
  356. package/examples/hello/logging/logger.aug +1 -0
  357. package/examples/hello/logging/logger.aug.md +6 -48
  358. package/examples/hello/main.aug +1 -0
  359. package/examples/hello/main.aug.md +8 -40
  360. package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
  361. package/examples/interceptors/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  362. package/examples/interceptors/.aug-spec/manifest.json +3 -3
  363. package/examples/interceptors/app.aug +3 -2
  364. package/examples/interceptors/app.aug.md +15 -141
  365. package/examples/interceptors/interceptors.aug +3 -2
  366. package/examples/interceptors/interceptors.aug.md +19 -152
  367. package/examples/interceptors/logging.aug +2 -1
  368. package/examples/interceptors/logging.aug.md +10 -79
  369. package/examples/interceptors/main.aug +1 -0
  370. package/examples/interceptors/main.aug.md +9 -66
  371. package/examples/native-blake3/.aug-spec/manifest.json +16 -0
  372. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.1/native.abi.json +29 -0
  373. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug +14 -0
  374. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug.md +34 -0
  375. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug +4 -0
  376. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug.md +8 -0
  377. package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi.json +29 -0
  378. package/examples/native-blake3/AGENTS.md +5 -0
  379. package/examples/native-blake3/aug.lock.json +253 -0
  380. package/examples/native-blake3/hashing.aug +11 -0
  381. package/examples/native-blake3/hashing.aug.md +25 -0
  382. package/examples/native-blake3/main.aug +8 -0
  383. package/examples/native-blake3/main.aug.md +13 -0
  384. package/examples/native-pytorch/.aug-spec/manifest.json +18 -0
  385. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.1/native.abi.json +142 -0
  386. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.3/native.abi.json +142 -0
  387. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug +101 -0
  388. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug.md +160 -0
  389. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug +3 -0
  390. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug.md +8 -0
  391. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug +6 -0
  392. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug.md +13 -0
  393. package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi.json +142 -0
  394. package/examples/native-pytorch/AGENTS.md +5 -0
  395. package/examples/native-pytorch/aug.lock.json +309 -0
  396. package/examples/native-pytorch/main.aug +8 -0
  397. package/examples/native-pytorch/main.aug.md +13 -0
  398. package/examples/native-pytorch/tensors.aug +23 -0
  399. package/examples/native-pytorch/tensors.aug.md +35 -0
  400. package/examples/native-sqlite/.aug-spec/manifest.json +18 -0
  401. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.2/native.abi.json +100 -0
  402. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug +48 -0
  403. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug.md +91 -0
  404. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug +3 -0
  405. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug.md +8 -0
  406. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug +8 -0
  407. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug.md +22 -0
  408. package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi.json +100 -0
  409. package/examples/native-sqlite/AGENTS.md +5 -0
  410. package/examples/native-sqlite/aug.lock.json +236 -0
  411. package/examples/native-sqlite/database.aug +15 -0
  412. package/examples/native-sqlite/database.aug.md +27 -0
  413. package/examples/native-sqlite/main.aug +8 -0
  414. package/examples/native-sqlite/main.aug.md +13 -0
  415. package/examples/native-zlib/.aug-spec/manifest.json +16 -0
  416. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.1/native.abi.json +57 -0
  417. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug +29 -0
  418. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug.md +54 -0
  419. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug +4 -0
  420. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug.md +8 -0
  421. package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi.json +57 -0
  422. package/examples/native-zlib/AGENTS.md +5 -0
  423. package/examples/native-zlib/aug.lock.json +236 -0
  424. package/examples/native-zlib/compression.aug +15 -0
  425. package/examples/native-zlib/compression.aug.md +27 -0
  426. package/examples/native-zlib/main.aug +10 -0
  427. package/examples/native-zlib/main.aug.md +13 -0
  428. package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
  429. package/examples/new-syntax/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  430. package/examples/new-syntax/.aug-spec/manifest.json +3 -3
  431. package/examples/new-syntax/console.aug +2 -1
  432. package/examples/new-syntax/console.aug.md +7 -53
  433. package/examples/new-syntax/greeter.aug +2 -1
  434. package/examples/new-syntax/greeter.aug.md +10 -74
  435. package/examples/new-syntax/logger.aug +1 -0
  436. package/examples/new-syntax/logger.aug.md +6 -46
  437. package/examples/new-syntax/main.aug +1 -0
  438. package/examples/new-syntax/main.aug.md +9 -54
  439. package/examples/new-syntax/math.aug +2 -1
  440. package/examples/new-syntax/math.aug.md +3 -24
  441. package/examples/oidc-login/.aug-spec/manifest.json +13 -13
  442. package/examples/oidc-login/.aug-spec/packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/store.aug.md +71 -0
  443. package/examples/oidc-login/.aug-spec/packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +17 -0
  444. package/examples/oidc-login/.aug-spec/packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +125 -0
  445. package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/contracts.aug +12 -11
  446. package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/contracts.aug.md +244 -0
  447. package/examples/oidc-login/.aug-spec/{august/0.19.0/crypto → packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40}/jose.aug +6 -5
  448. package/examples/oidc-login/.aug-spec/packages/@git/url_9ef654c66d34ab8f5527/0.0.0-git.b14a0f9aa41f1ce58bd51133bcdc424033e40d40/jose.aug.md +71 -0
  449. package/examples/oidc-login/.aug-spec/packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301/contracts.aug.md +30 -0
  450. package/examples/oidc-login/aug.lock.json +100 -0
  451. package/examples/oidc-login/client/contracts.aug +1 -0
  452. package/examples/oidc-login/client/contracts.aug.md +9 -66
  453. package/examples/oidc-login/client/endpoints.aug +6 -5
  454. package/examples/oidc-login/client/endpoints.aug.md +13 -145
  455. package/examples/oidc-login/client/export.aug +1 -0
  456. package/examples/oidc-login/client/export.aug.md +4 -24
  457. package/examples/oidc-login/client/login.aug +7 -6
  458. package/examples/oidc-login/client/login.aug.md +25 -303
  459. package/examples/oidc-login/client/logout.aug +5 -4
  460. package/examples/oidc-login/client/logout.aug.md +13 -135
  461. package/examples/oidc-login/client/protocol.aug +7 -6
  462. package/examples/oidc-login/client/protocol.aug.md +36 -283
  463. package/examples/oidc-login/client/session.aug +5 -4
  464. package/examples/oidc-login/client/session.aug.md +12 -139
  465. package/examples/oidc-login/client/views.aug +3 -2
  466. package/examples/oidc-login/client/views.aug.md +8 -57
  467. package/examples/oidc-login/common/export.aug +1 -0
  468. package/examples/oidc-login/common/export.aug.md +5 -27
  469. package/examples/oidc-login/common/headers.aug +4 -3
  470. package/examples/oidc-login/common/headers.aug.md +9 -67
  471. package/examples/oidc-login/common/keys.aug +6 -5
  472. package/examples/oidc-login/common/keys.aug.md +29 -165
  473. package/examples/oidc-login/common/settings.aug +2 -1
  474. package/examples/oidc-login/common/settings.aug.md +5 -39
  475. package/examples/oidc-login/common/views.aug +2 -1
  476. package/examples/oidc-login/common/views.aug.md +4 -28
  477. package/examples/oidc-login/main.aug +6 -16
  478. package/examples/oidc-login/main.aug.md +17 -146
  479. package/examples/oidc-login/main.yaml +7 -0
  480. package/examples/oidc-login/provider/authorization.aug +7 -6
  481. package/examples/oidc-login/provider/authorization.aug.md +23 -238
  482. package/examples/oidc-login/provider/contracts.aug +1 -0
  483. package/examples/oidc-login/provider/contracts.aug.md +23 -158
  484. package/examples/oidc-login/provider/credentials.aug +3 -2
  485. package/examples/oidc-login/provider/credentials.aug.md +9 -53
  486. package/examples/oidc-login/provider/discovery.aug +4 -3
  487. package/examples/oidc-login/provider/discovery.aug.md +11 -118
  488. package/examples/oidc-login/provider/export.aug +1 -0
  489. package/examples/oidc-login/provider/export.aug.md +6 -34
  490. package/examples/oidc-login/provider/token.aug +6 -5
  491. package/examples/oidc-login/provider/token.aug.md +16 -204
  492. package/examples/oidc-login/provider/userinfo.aug +4 -3
  493. package/examples/oidc-login/provider/userinfo.aug.md +10 -92
  494. package/examples/oidc-login/provider/views.aug +3 -2
  495. package/examples/oidc-login/provider/views.aug.md +8 -52
  496. package/examples/ownership/.aug-spec/manifest.json +1 -1
  497. package/examples/ownership/counter.aug +3 -2
  498. package/examples/ownership/counter.aug.md +12 -66
  499. package/examples/ownership/main.aug +1 -0
  500. package/examples/ownership/main.aug.md +6 -31
  501. package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug +37 -0
  502. package/examples/ownership-transfer/.aug-spec/august/0.21.0/io/contracts.aug.md +82 -0
  503. package/examples/ownership-transfer/.aug-spec/manifest.json +3 -3
  504. package/examples/ownership-transfer/main.aug +1 -0
  505. package/examples/ownership-transfer/main.aug.md +9 -53
  506. package/examples/ownership-transfer/resource.aug +2 -1
  507. package/examples/ownership-transfer/resource.aug.md +12 -71
  508. package/examples/packages/app/.aug-spec/manifest.json +1 -1
  509. package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug +2 -1
  510. package/examples/packages/app/.aug-spec/packages/@example/aug-math/0.1.0/arithmetic.aug.md +9 -51
  511. package/examples/packages/app/main.aug +1 -0
  512. package/examples/packages/app/main.aug.md +6 -26
  513. package/examples/packages/math/.aug-spec/manifest.json +1 -1
  514. package/examples/packages/math/aug-package.json +1 -1
  515. package/examples/packages/math/src/arithmetic.aug +2 -1
  516. package/examples/packages/math/src/arithmetic.aug.md +9 -51
  517. package/examples/packages/math/src/export.aug +1 -0
  518. package/examples/packages/math/src/export.aug.md +3 -13
  519. package/examples/visibility/.aug-spec/manifest.json +1 -1
  520. package/examples/visibility/counter.aug +4 -3
  521. package/examples/visibility/counter.aug.md +12 -68
  522. package/examples/visibility/main.aug +1 -0
  523. package/examples/visibility/main.aug.md +6 -32
  524. package/examples/weather-api/.aug-spec/manifest.json +8 -0
  525. package/examples/weather-api/AGENTS.md +17 -0
  526. package/examples/weather-api/README.md +19 -0
  527. package/examples/weather-api/forecasts.aug +47 -0
  528. package/examples/weather-api/forecasts.aug.md +32 -0
  529. package/examples/weather-api/main.aug +4 -0
  530. package/examples/weather-api/main.aug.md +15 -0
  531. package/examples/weather-api/main.yaml +5 -0
  532. package/examples/weather-api/weather.http +5 -0
  533. package/native/compiler-packs.json +43 -0
  534. package/package.json +4 -4
  535. package/runtime/aug_http.c +48 -21
  536. package/runtime/aug_http_ir.c +30 -0
  537. package/runtime/aug_http_ir.h +18 -0
  538. package/runtime/aug_ir.c +209 -0
  539. package/runtime/aug_ir.h +89 -0
  540. package/runtime/aug_json.c +6 -1
  541. package/runtime/aug_runtime.c +82 -16
  542. package/runtime/aug_runtime.h +16 -2
  543. package/runtime/aug_tasks.c +38 -7
  544. package/runtime/aug_values.c +12 -6
  545. package/scripts/bootstrap-native.mjs +184 -106
  546. package/scripts/native-setup.mjs +98 -0
  547. package/scripts/native-toolchain.mjs +28 -0
  548. package/src/ast.js +1 -1
  549. package/src/builtins.js +1 -1
  550. package/src/checker.js +369 -100
  551. package/src/cli.js +198 -26
  552. package/src/codegen.js +32 -7
  553. package/src/compiler-packs.js +66 -0
  554. package/src/config.js +3 -3
  555. package/src/contracts.js +10 -0
  556. package/src/editor.js +86 -22
  557. package/src/fixes.js +90 -2
  558. package/src/formatter.js +23 -10
  559. package/src/git-http.js +137 -0
  560. package/src/git-packages.js +118 -0
  561. package/src/help.js +33 -24
  562. package/src/http-contracts.js +14 -0
  563. package/src/http-policies.js +5 -5
  564. package/src/ir-types.js +5 -0
  565. package/src/ir-verify.js +277 -0
  566. package/src/ir.js +962 -0
  567. package/src/libraries.js +1 -1
  568. package/src/llvm-debug.js +101 -0
  569. package/src/llvm-native.js +152 -0
  570. package/src/llvm-platform.js +20 -0
  571. package/src/llvm.js +781 -0
  572. package/src/lsp.js +14 -5
  573. package/src/native-artifacts.js +207 -0
  574. package/src/native-bindings.js +189 -0
  575. package/src/native-contracts.js +295 -0
  576. package/src/native-declarations.js +68 -0
  577. package/src/native-facts.js +63 -0
  578. package/src/native.js +19 -13
  579. package/src/navigation.js +4 -2
  580. package/src/openapi.js +5 -4
  581. package/src/package-locking.js +88 -0
  582. package/src/package-manager.js +267 -68
  583. package/src/parser.js +32 -6
  584. package/src/policies.js +3 -3
  585. package/src/project-init.js +78 -4
  586. package/src/project.js +11 -9
  587. package/src/runtime-abi.js +23 -0
  588. package/src/runtime-adapters.js +18 -0
  589. package/src/schemas.js +24 -17
  590. package/src/semantic.js +54 -5
  591. package/src/snippets.js +60 -0
  592. package/src/spec-hints.js +56 -0
  593. package/src/spec-tree.js +241 -0
  594. package/src/spec.js +669 -305
  595. package/docs/examples/approved-design/dependencies/august/0.19.0/io/contracts.md +0 -395
  596. package/docs/examples/developer-workflow/dependencies/august/0.19.0/io/contracts.md +0 -395
  597. package/docs/examples/generic-di/dependencies/august/0.19.0/io/contracts.md +0 -395
  598. package/docs/examples/hello/dependencies/august/0.19.0/io/contracts.md +0 -395
  599. package/docs/examples/interceptors/dependencies/august/0.19.0/io/contracts.md +0 -395
  600. package/docs/examples/json-benchmark/dependencies/august/0.19.0/json/contracts.md +0 -103
  601. package/docs/examples/new-syntax/dependencies/august/0.19.0/io/contracts.md +0 -395
  602. package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/contracts.md +0 -925
  603. package/docs/examples/oidc-login/dependencies/august/0.19.0/crypto/jose.md +0 -434
  604. package/docs/examples/oidc-login/dependencies/august/0.19.0/json/contracts.md +0 -103
  605. package/docs/examples/oidc-login/dependencies/august/0.19.0/memory/store.md +0 -374
  606. package/docs/examples/oidc-login/dependencies/august/0.19.0/time/contracts.md +0 -150
  607. package/docs/examples/oidc-login/dependencies/august/0.19.0/web/contracts.md +0 -532
  608. package/docs/examples/ownership-transfer/dependencies/august/0.19.0/io/contracts.md +0 -395
  609. package/examples/approved-design/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  610. package/examples/developer-workflow/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  611. package/examples/generic-di/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  612. package/examples/hello/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  613. package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
  614. package/examples/interceptors/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  615. package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
  616. package/examples/new-syntax/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  617. package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/contracts.aug.md +0 -791
  618. package/examples/oidc-login/.aug-spec/august/0.19.0/crypto/jose.aug.md +0 -266
  619. package/examples/oidc-login/.aug-spec/august/0.19.0/json/contracts.aug.md +0 -55
  620. package/examples/oidc-login/.aug-spec/august/0.19.0/memory/store.aug.md +0 -250
  621. package/examples/oidc-login/.aug-spec/august/0.19.0/time/contracts.aug.md +0 -96
  622. package/examples/oidc-login/.aug-spec/august/0.19.0/web/contracts.aug.md +0 -420
  623. package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug +0 -36
  624. package/examples/ownership-transfer/.aug-spec/august/0.19.0/io/contracts.aug.md +0 -316
  625. /package/examples/oidc-login/.aug-spec/{august/0.19.0/memory → packages/@git/url_0eb7c89453c87681ed15/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/store.aug +0 -0
  626. /package/examples/oidc-login/.aug-spec/{august/0.19.0/json → packages/@git/url_2d3c37c690c0fa115be1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
  627. /package/examples/oidc-login/.aug-spec/{august/0.19.0/web → packages/@git/url_897efafd565158fc4908/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
  628. /package/examples/oidc-login/.aug-spec/{august/0.19.0/time → packages/@git/url_c092cd151499c4e1d8a1/0.0.0-git.a39fc582565d4fca40be4f75fa304d71adc69301}/contracts.aug +0 -0
@@ -0,0 +1,295 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFileSync, realpathSync } from 'node:fs';
3
+ import { isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { release } from 'node:os';
5
+ /** The public native ABI never exposes August runtime layouts. */
6
+ export const nativeProfile = 'aug-native-abi-1';
7
+ const digest = /^[0-9a-f]{64}$/;
8
+ const identifier = /^[A-Za-z_][A-Za-z0-9_]*$/;
9
+ const moduleName = /^[A-Za-z][A-Za-z0-9_]*(?:\/[A-Za-z][A-Za-z0-9_]*)*$/;
10
+ const fail = (message) => { throw new Error('NATIVE_ABI: ' + message); };
11
+ const object = (value, label) => {
12
+ if (!value || typeof value !== 'object' || Array.isArray(value))
13
+ fail(label + ' must be an object');
14
+ return value;
15
+ };
16
+ const fields = (value, allowed, label) => {
17
+ for (const key of Object.keys(value))
18
+ if (!allowed.includes(key))
19
+ fail(`${label} contains unsupported field ${key}`);
20
+ };
21
+ const string = (value, label) => {
22
+ if (typeof value !== 'string' || !value || value.includes('\0'))
23
+ fail(label + ' must be a nonempty string');
24
+ return value;
25
+ };
26
+ const array = (value, label) => {
27
+ if (!Array.isArray(value) || value.length > 10000)
28
+ fail(label + ' must be an array of at most 10,000 entries');
29
+ return value;
30
+ };
31
+ const strings = (value, label) => array(value, label).map(item => string(item, label));
32
+ const positive = (value, label) => { if (!Number.isSafeInteger(value) || Number(value) <= 0)
33
+ fail(label + ' must be a positive safe integer'); };
34
+ const hash = (value, label) => { if (typeof value !== 'string' || !digest.test(value))
35
+ fail(label + ' must be a lowercase SHA-256 digest'); };
36
+ const symbol = (value, label) => { if (typeof value !== 'string' || !identifier.test(value))
37
+ fail(label + ' must be a C identifier'); };
38
+ const https = (value, label) => {
39
+ let url;
40
+ try {
41
+ url = new URL(string(value, label));
42
+ }
43
+ catch {
44
+ fail(label + ' must be an HTTPS URL');
45
+ }
46
+ if (url.protocol !== 'https:' || url.username || url.password || url.hash)
47
+ fail(label + ' must be an HTTPS URL without credentials or a fragment');
48
+ };
49
+ /** Artifact paths are portable and cannot name a file outside their archive. */
50
+ export function nativePath(value) {
51
+ const path = string(value, 'relative artifact path');
52
+ if (isAbsolute(path) || path.includes('\\') || path.split('/').some(part => !part || part === '.' || part === '..' || part.startsWith('.')) || /[:\r\n]/.test(path))
53
+ fail('Expected a relative artifact path without traversal: ' + path);
54
+ return path;
55
+ }
56
+ /** Source installation validates metadata; it does not run a native build recipe. */
57
+ export function validateNativeManifest(value) {
58
+ const native = object(value, 'native metadata');
59
+ fields(native, ['profile', 'bindings', 'bindingsSha256', 'upstream', 'artifacts', 'sourceBuild'], 'native metadata');
60
+ if (native.profile !== nativeProfile)
61
+ fail('Unsupported native profile ' + native.profile);
62
+ nativePath(native.bindings);
63
+ if (native.bindings !== 'native.abi.json')
64
+ fail('Bindings must be declared in native.abi.json at the package root');
65
+ hash(native.bindingsSha256, 'bindingsSha256');
66
+ const upstream = object(native.upstream, 'upstream');
67
+ fields(upstream, ['repository', 'version', 'sourceRevision'], 'upstream');
68
+ https(upstream.repository, 'upstream.repository');
69
+ string(upstream.version, 'upstream.version');
70
+ if (!/^[0-9a-f]{40,64}$/.test(upstream.sourceRevision ?? ''))
71
+ fail('upstream.sourceRevision must pin a full source revision or archive digest');
72
+ const artifacts = array(native.artifacts, 'artifacts');
73
+ if (!artifacts.length)
74
+ fail('At least one prebuilt artifact is required');
75
+ const ids = new Set(), selections = new Set();
76
+ for (const entry of artifacts) {
77
+ const artifact = object(entry, 'artifact');
78
+ fields(artifact, ['id', 'target', 'url', 'sha256', 'maximumDownloadBytes', 'maximumUnpackedBytes', 'link', 'runtime', 'components', 'fileManifest', 'provenance', 'notices'], 'artifact');
79
+ string(artifact.id, 'artifact.id');
80
+ if (ids.has(artifact.id))
81
+ fail('Duplicate artifact id ' + artifact.id);
82
+ ids.add(artifact.id);
83
+ const target = object(artifact.target, 'artifact.target');
84
+ fields(target, ['triple', 'os', 'arch', 'minimumOS', 'minimumLibc', 'cpuBaseline', 'libc', 'cxxRuntime', 'cxxABI', 'features'], 'artifact.target');
85
+ const expected = nativeTarget(string(target.triple, 'target.triple'));
86
+ if (expected.os !== target.os || expected.arch !== target.arch || expected.libc !== target.libc)
87
+ fail('Target triple does not match its OS, architecture, or libc');
88
+ string(target.cpuBaseline, 'target.cpuBaseline');
89
+ if (target.os === 'macos' && (!/^\d+\.\d+(?:\.\d+)?$/.test(target.minimumOS ?? '')))
90
+ fail('macOS artifacts declare minimumOS');
91
+ if (target.os === 'linux' && target.libc === 'glibc' && !/^\d+\.\d+(?:\.\d+)?$/.test(target.minimumLibc ?? ''))
92
+ fail('GNU/Linux artifacts declare minimumLibc');
93
+ if (target.minimumLibc !== undefined && (target.os !== 'linux' || target.libc !== 'glibc'))
94
+ fail('minimumLibc belongs to GNU/Linux artifacts');
95
+ for (const key of ['cxxRuntime', 'cxxABI'])
96
+ if (target[key] !== undefined)
97
+ string(target[key], key);
98
+ if (target.features !== undefined)
99
+ strings(target.features, 'target.features');
100
+ const selection = JSON.stringify([target.triple, target.minimumOS ?? '', target.minimumLibc ?? '', target.features ?? []]);
101
+ if (selections.has(selection))
102
+ fail('Ambiguous artifact selection for ' + target.triple);
103
+ selections.add(selection);
104
+ https(artifact.url, 'artifact.url');
105
+ hash(artifact.sha256, 'artifact.sha256');
106
+ positive(artifact.maximumDownloadBytes, 'maximumDownloadBytes');
107
+ positive(artifact.maximumUnpackedBytes, 'maximumUnpackedBytes');
108
+ const link = object(artifact.link, 'link');
109
+ fields(link, ['kind', 'libraries'], 'link');
110
+ if (!['dynamic', 'static'].includes(link.kind))
111
+ fail('link.kind must be dynamic or static');
112
+ if (!array(link.libraries, 'link.libraries').length)
113
+ fail('An artifact must supply link libraries');
114
+ link.libraries.forEach(nativePath);
115
+ const runtime = object(artifact.runtime, 'runtime');
116
+ fields(runtime, ['files', 'relocation', 'closureManifest'], 'runtime');
117
+ array(runtime.files, 'runtime.files').forEach(nativePath);
118
+ if (runtime.relocation !== 'loader-relative')
119
+ fail('Runtime libraries must use loader-relative relocation');
120
+ if (runtime.closureManifest !== undefined)
121
+ nativePath(runtime.closureManifest);
122
+ for (const component of array(artifact.components, 'components')) {
123
+ const c = object(component, 'component');
124
+ fields(c, ['id', 'version', 'compatibilityKey', 'linkage', 'required'], 'component');
125
+ for (const key of ['id', 'version', 'compatibilityKey'])
126
+ string(c[key], key);
127
+ if (!['static', 'dynamic'].includes(c.linkage) || typeof c.required !== 'boolean')
128
+ fail('Invalid component linkage/required');
129
+ }
130
+ for (const key of ['fileManifest', 'provenance', 'notices'])
131
+ nativePath(artifact[key]);
132
+ }
133
+ if (native.sourceBuild !== undefined) {
134
+ const build = object(native.sourceBuild, 'sourceBuild');
135
+ fields(build, ['recipe', 'inputs', 'tools', 'automatic'], 'sourceBuild');
136
+ nativePath(build.recipe);
137
+ nativePath(build.inputs);
138
+ strings(build.tools, 'sourceBuild.tools');
139
+ if (build.automatic !== false)
140
+ fail('Native source builds must be explicitly requested; automatic must be false');
141
+ }
142
+ return native;
143
+ }
144
+ function view(value, result) {
145
+ const v = object(value, 'native view');
146
+ fields(v, ['kind', 'resource', 'ownership', 'release', 'releaseLength', 'minimum', 'maximum', ...(result ? [] : ['name'])], 'native view');
147
+ if (!['void', 'i64', 'i32', 'f64', 'bool', 'utf8', 'bytes', 'f64-list', 'utf8-list', 'resource'].includes(v.kind))
148
+ fail('Unsupported native kind ' + v.kind);
149
+ if (v.kind === 'void' && !result)
150
+ fail('void is only a result');
151
+ if (v.kind === 'resource') {
152
+ string(v.resource, 'resource identity');
153
+ if (!result && !['read', 'borrow', 'consume'].includes(v.ownership))
154
+ fail('A resource input requires read, borrow, or consume ownership');
155
+ if (result && v.ownership !== undefined)
156
+ fail('Resource results always transfer ownership; do not declare an input loan');
157
+ }
158
+ else if (v.resource !== undefined || v.ownership !== undefined)
159
+ fail('Resource ownership is only valid on resources');
160
+ if (result && ['utf8', 'bytes', 'f64-list', 'utf8-list'].includes(v.kind) && !v.release)
161
+ fail('Allocated native results require a matching release symbol');
162
+ if (result && v.kind === 'utf8-list')
163
+ fail('utf8-list outputs are not in this ABI profile');
164
+ if (v.release !== undefined)
165
+ symbol(v.release, 'result.release');
166
+ if ((v.release !== undefined || v.releaseLength !== undefined) && (!result || !['utf8', 'bytes', 'f64-list'].includes(v.kind)))
167
+ fail('Release metadata belongs only to allocated buffer results');
168
+ if (v.releaseLength !== undefined && typeof v.releaseLength !== 'boolean')
169
+ fail('releaseLength must be boolean');
170
+ if ((v.minimum !== undefined || v.maximum !== undefined) && !['i64', 'i32'].includes(v.kind))
171
+ fail('Integer bounds require i64 or i32');
172
+ for (const key of ['minimum', 'maximum'])
173
+ if (v[key] !== undefined && !Number.isSafeInteger(v[key]))
174
+ fail(key + ' must be a safe integer');
175
+ if (v.minimum !== undefined && v.maximum !== undefined && v.minimum > v.maximum)
176
+ fail('Empty native integer range');
177
+ return v;
178
+ }
179
+ export function validateNativeDescriptor(value) {
180
+ const descriptor = object(value, 'binding descriptor');
181
+ fields(descriptor, ['format', 'profile', 'resources', 'functions'], 'binding descriptor');
182
+ if (descriptor.format !== 1 || descriptor.profile !== nativeProfile)
183
+ fail('Unsupported binding descriptor version/profile');
184
+ const ids = new Set();
185
+ for (const entry of array(descriptor.resources, 'resources')) {
186
+ const r = object(entry, 'resource');
187
+ fields(r, ['module', 'name', 'release'], 'resource');
188
+ if (!moduleName.test(r.module ?? ''))
189
+ fail('Resource module must be a source-relative module path');
190
+ symbol(r.name, 'resource.name');
191
+ symbol(r.release, 'resource.release');
192
+ const id = r.module + '.' + r.name;
193
+ if (ids.has(id))
194
+ fail('Duplicate native resource ' + id);
195
+ ids.add(id);
196
+ }
197
+ const resources = new Set(ids);
198
+ ids.clear();
199
+ for (const entry of array(descriptor.functions, 'functions')) {
200
+ const fn = object(entry, 'function');
201
+ fields(fn, ['module', 'name', 'symbol', 'params', 'result', 'error', 'callingConvention', 'status', 'uses', 'changes', 'thread', 'retainsInputs'], 'function');
202
+ if (!moduleName.test(fn.module ?? ''))
203
+ fail('Function module must be a source-relative module path');
204
+ symbol(fn.name, 'function.name');
205
+ symbol(fn.symbol, 'function.symbol');
206
+ const id = fn.module + '.' + fn.name;
207
+ if (ids.has(id))
208
+ fail('Duplicate native function ' + id);
209
+ ids.add(id);
210
+ const names = new Set();
211
+ for (const p of array(fn.params, 'function.params')) {
212
+ view(p, false);
213
+ if (p.kind === 'resource' && !resources.has(p.resource))
214
+ fail('Unknown resource identity ' + p.resource);
215
+ symbol(p.name, 'parameter.name');
216
+ if (names.has(p.name))
217
+ fail('Duplicate parameter ' + p.name);
218
+ names.add(p.name);
219
+ }
220
+ const result = view(fn.result, true);
221
+ if (result.kind === 'resource' && !resources.has(result.resource))
222
+ fail('Unknown result resource identity ' + result.resource);
223
+ if (fn.callingConvention !== 'C' || !['i32', 'direct'].includes(fn.status) || fn.thread !== 'caller' || fn.retainsInputs !== false)
224
+ fail('Only C calls on the caller thread with call-duration loans are supported');
225
+ if (fn.error !== undefined) {
226
+ string(fn.error, 'function.error');
227
+ const dot = fn.error.lastIndexOf('.');
228
+ if (!moduleName.test(fn.error.slice(0, dot)) || !identifier.test(fn.error.slice(dot + 1)))
229
+ fail('Native checked errors require a module-qualified declaration identity');
230
+ }
231
+ if (fn.status === 'i32' && !fn.error)
232
+ fail('Status-returning native calls require a checked error type');
233
+ if (fn.status === 'direct' && (fn.error || result.kind === 'resource' || ['utf8', 'bytes', 'f64-list', 'utf8-list'].includes(result.kind)))
234
+ fail('Direct native calls support scalar results only');
235
+ strings(fn.uses, 'function.uses');
236
+ strings(fn.changes, 'function.changes');
237
+ }
238
+ return descriptor;
239
+ }
240
+ export function readNativeDescriptor(directory, native) {
241
+ const root = realpathSync(directory), file = realpathSync(resolve(root, native.bindings));
242
+ if (relative(root, file).split(sep).includes('..'))
243
+ fail('Binding descriptor escapes its package');
244
+ const bytes = readFileSync(file);
245
+ if (createHash('sha256').update(bytes).digest('hex') !== native.bindingsSha256)
246
+ throw new Error('NATIVE_INTEGRITY: binding descriptor differs from bindingsSha256 in ' + directory);
247
+ return validateNativeDescriptor(JSON.parse(bytes.toString('utf8')));
248
+ }
249
+ /** A target is a deployment identity, not an assumption that the host can build it. */
250
+ export function nativeTarget(triple, minimumOS) {
251
+ triple ??= process.platform === 'darwin' ? (process.arch === 'arm64' ? 'aarch64' : 'x86_64') + '-apple-darwin' : process.platform === 'linux' ? (process.arch === 'arm64' ? 'aarch64' : 'x86_64') + '-unknown-linux-gnu' : (process.arch === 'arm64' ? 'aarch64' : 'x86_64') + '-pc-windows-msvc';
252
+ const match = /^(aarch64|x86_64)-(apple-darwin|unknown-linux-(gnu|musl)|pc-windows-msvc)$/.exec(triple);
253
+ if (!match)
254
+ throw new Error('NATIVE_TARGET: Unsupported target ' + triple);
255
+ const os = match[2] === 'apple-darwin' ? 'macos' : match[2].startsWith('unknown-linux') ? 'linux' : 'windows';
256
+ const arch = match[1] === 'aarch64' ? 'arm64' : 'x64';
257
+ return { triple, os, arch, cpuBaseline: arch === 'arm64' ? 'armv8-a' : 'x86-64', libc: os === 'macos' ? 'libSystem' : os === 'windows' ? 'ucrt' : match[3] === 'musl' ? 'musl' : 'glibc', ...(os === 'macos' ? { minimumOS: minimumOS ?? '14.0' } : {}) };
258
+ }
259
+ export function nativeHostTarget() {
260
+ // Darwin 23/24 are macOS 14/15. Apple's 2025 numbering change maps Darwin 25 to macOS 26.
261
+ const darwin = Number(release().split('.')[0]), macos = darwin >= 25 ? darwin + 1 : darwin - 9;
262
+ const target = nativeTarget(undefined, process.platform === 'darwin' ? `${macos}.0` : undefined);
263
+ if (process.platform === 'linux') {
264
+ const header = process.report.getReport()?.header;
265
+ if (header?.glibcVersionRuntime)
266
+ target.minimumLibc = header.glibcVersionRuntime;
267
+ else {
268
+ target.libc = 'musl';
269
+ target.triple = target.triple.replace(/-gnu$/, '-musl');
270
+ }
271
+ }
272
+ return target;
273
+ }
274
+ const versionAtLeast = (actual, required) => {
275
+ const a = actual.split('.').map(Number), b = required.split('.').map(Number);
276
+ for (let i = 0; i < Math.max(a.length, b.length); i++) {
277
+ if ((a[i] ?? 0) !== (b[i] ?? 0))
278
+ return (a[i] ?? 0) > (b[i] ?? 0);
279
+ }
280
+ return true;
281
+ };
282
+ export function selectNativeArtifact(artifacts, target) {
283
+ const matching = artifacts.filter(a => a.target.triple === target.triple && a.target.libc === target.libc &&
284
+ a.target.cpuBaseline === target.cpuBaseline && (!a.target.cxxRuntime ||
285
+ a.target.os === 'macos' && a.target.cxxRuntime === 'system-libc++' && a.target.cxxABI === 'apple-libc++' ||
286
+ a.target.os === 'linux' && a.target.cxxRuntime === 'bundled-libstdc++' && a.target.cxxABI === 'itanium-cxx11') &&
287
+ (!a.target.minimumLibc || !!target.minimumLibc && versionAtLeast(target.minimumLibc, a.target.minimumLibc)) &&
288
+ (!a.target.minimumOS || !!target.minimumOS && versionAtLeast(target.minimumOS, a.target.minimumOS)));
289
+ if (matching.length !== 1) {
290
+ const floors = artifacts.filter(a => a.target.triple === target.triple).map(a => a.target.minimumOS ?? a.target.minimumLibc).filter(Boolean);
291
+ const runtime = target.os === 'linux' ? 'glibc' : 'macOS', actual = target.os === 'linux' ? target.minimumLibc : target.minimumOS;
292
+ throw new Error('NATIVE_TARGET: ' + (matching.length ? 'Ambiguous prebuilt artifacts' : floors.length ? `This package requires ${runtime} ${floors.join(' or ')}+ and its declared C++ ABI; requested ${actual ?? 'unknown'}.` : 'No compatible prebuilt artifact for ' + target.triple) + ` Supported artifacts: ${artifacts.map(a => a.id + ' (' + a.target.triple + ')').join(', ')}. No source build was started.`);
293
+ }
294
+ return matching[0];
295
+ }
@@ -0,0 +1,68 @@
1
+ import { resolve } from 'node:path';
2
+ import { readNativeDescriptor } from "./native-contracts.js";
3
+ /** Resolve descriptors against exact source declarations, never unqualified spellings. */
4
+ export function nativeDeclarations(project) {
5
+ const result = { functions: new Map(), resources: new Map(), providers: new Map(), providerMetadata: new Map(), providerDescriptors: new Map(), errors: new Map(), diagnostics: [] };
6
+ const issue = (span, message) => result.diagnostics.push({ ...span, code: 'NATIVE_ABI', message });
7
+ const sources = [];
8
+ const symbols = new Map();
9
+ if (project.library?.native)
10
+ sources.push({ directory: project.root, sourceRoot: project.sourceRoot, native: project.library.native, identity: project.library.name + '@' + project.library.version });
11
+ for (const scope of project.packages.scopes.values()) {
12
+ // readPackage already verified the descriptor hash; retain that source identity.
13
+ const native = scope.native;
14
+ if (native)
15
+ sources.push({ directory: scope.directory, sourceRoot: scope.sourceRoot, native, identity: scope.name + '@' + scope.version });
16
+ }
17
+ for (const source of sources) {
18
+ result.providerMetadata.set(source.identity, source.native);
19
+ result.providerDescriptors.set(source.identity, resolve(source.directory, source.native.bindings));
20
+ let descriptor;
21
+ try {
22
+ descriptor = readNativeDescriptor(source.directory, source.native);
23
+ }
24
+ catch (error) {
25
+ issue({ file: resolve(source.directory, source.native.bindings), start: 0, end: 0, line: 1, column: 1 }, error instanceof Error ? error.message : String(error));
26
+ continue;
27
+ }
28
+ for (const name of [...descriptor.resources.map(r => r.release), ...descriptor.functions.flatMap(f => [f.symbol, ...(f.result.release ? [f.result.release] : [])])]) {
29
+ const provider = symbols.get(name);
30
+ if (provider && provider !== source.identity)
31
+ issue({ file: resolve(source.directory, source.native.bindings), start: 0, end: 0, line: 1, column: 1 }, `Native symbol ${name} has ambiguous providers ${provider} and ${source.identity}`);
32
+ else
33
+ symbols.set(name, source.identity);
34
+ }
35
+ for (const resource of descriptor.resources) {
36
+ const file = resolve(source.sourceRoot, resource.module + '.aug');
37
+ const def = project.scopes.get(file)?.get(resource.name);
38
+ if (!def || def.file !== file || def.node.kind !== 'resource') {
39
+ issue({ file, start: 0, end: 0, line: 1, column: 1 }, 'Native descriptor has no matching resource declaration ' + resource.module + '.' + resource.name);
40
+ continue;
41
+ }
42
+ result.resources.set(def.node, resource);
43
+ result.providers.set(def.node, source.identity);
44
+ }
45
+ for (const fn of descriptor.functions) {
46
+ const file = resolve(source.sourceRoot, fn.module + '.aug');
47
+ const def = project.scopes.get(file)?.get(fn.name);
48
+ if (!def || def.file !== file || def.node.kind !== 'function' || !def.node.externC || def.node.valueAbi) {
49
+ issue({ file, start: 0, end: 0, line: 1, column: 1 }, 'Native descriptor has no matching extern C declaration ' + fn.module + '.' + fn.name);
50
+ continue;
51
+ }
52
+ result.functions.set(def.node, fn);
53
+ result.providers.set(def.node, source.identity);
54
+ if (fn.error) {
55
+ const dot = fn.error.lastIndexOf('.'), errorFile = resolve(source.sourceRoot, fn.error.slice(0, dot) + '.aug');
56
+ const error = project.scopes.get(errorFile)?.get(fn.error.slice(dot + 1));
57
+ if (!error || error.file !== errorFile || error.node.kind !== 'class')
58
+ issue(def.node.span, 'Native descriptor has no matching checked error declaration ' + fn.error);
59
+ else
60
+ result.errors.set(def.node, error);
61
+ }
62
+ }
63
+ }
64
+ for (const def of project.definitions.values())
65
+ if (def.node.kind === 'resource' && !result.resources.has(def.node))
66
+ issue(def.node.span, 'extern C resource requires a release identity in its package native.abi.json');
67
+ return result;
68
+ }
@@ -0,0 +1,63 @@
1
+ /** Keep checked binding facts separate from promises made by foreign code. */
2
+ export function nativeFact(checked, node) {
3
+ const provider = checked.native.providers.get(node), manifest = provider && checked.native.providerMetadata.get(provider);
4
+ if (!provider || !manifest)
5
+ return;
6
+ const common = { provider, profile: manifest.profile, descriptor: manifest.bindings, descriptorSha256: manifest.bindingsSha256,
7
+ upstream: manifest.upstream, supportedTargets: manifest.artifacts.map(artifact => artifact.target) };
8
+ if (node.kind === 'resource') {
9
+ const contract = checked.native.resources.get(node);
10
+ return contract ? { ...common, kind: 'resource', contract, cleanup: 'scope-exit' } : undefined;
11
+ }
12
+ const contract = checked.native.functions.get(node);
13
+ return contract ? { ...common, kind: 'function', contract,
14
+ compilerChecks: ['provider identity', 'descriptor digest', 'August signature', 'ownership at August call sites'],
15
+ nativeAuthorPromises: ['inputs are not retained', 'boundary entry stays on the caller thread', 'foreign threads do not enter August', 'C ABI boundary does not unwind into August'] } : undefined;
16
+ }
17
+ /** Resolve only standalone calls. Member dispatch is not claimed as complete. */
18
+ export function nativeDependencies(checked, method) {
19
+ const found = new Map(), seen = new Set();
20
+ const visit = (current) => {
21
+ if (seen.has(current))
22
+ return;
23
+ seen.add(current);
24
+ const fact = nativeFact(checked, current);
25
+ if (fact?.kind === 'function') {
26
+ found.set(current, fact);
27
+ return;
28
+ }
29
+ const walk = (value) => {
30
+ if (!value || typeof value !== 'object')
31
+ return;
32
+ if (Array.isArray(value)) {
33
+ value.forEach(walk);
34
+ return;
35
+ }
36
+ const call = value;
37
+ if (call.kind === 'call' && call.callee?.kind === 'name' && call.span) {
38
+ const target = checked.project.scopes.get(call.span.file)?.get(call.callee.name);
39
+ if (target?.node.kind === 'function')
40
+ visit(target.node);
41
+ }
42
+ for (const [key, child] of Object.entries(value))
43
+ if (!['span', 'nameSpan', 'sourceSpan'].includes(key))
44
+ walk(child);
45
+ };
46
+ walk(current.body);
47
+ };
48
+ visit(method);
49
+ return [...found.values()].sort((a, b) => (a.provider + '/' + a.contract.symbol).localeCompare(b.provider + '/' + b.contract.symbol, 'en'));
50
+ }
51
+ export function nativeDescription(fact, contractLink) {
52
+ const quote = (text) => '`' + text + '`';
53
+ const targets = fact.supportedTargets.map(target => target.os + ' ' + target.arch + (target.minimumOS ? ' ' + target.minimumOS + '+' : '') + (target.minimumLibc ? ' glibc ' + target.minimumLibc + '+' : '') + (target.cxxABI ? ' ' + target.cxxABI : '')).join(', ');
54
+ const origin = `Native implementation: ${quote(fact.provider)}, ${quote(fact.upstream.version)}. Supported targets: ${targets}. Binding contract: ${contractLink ?? quote(fact.descriptor)} (SHA-256 ${quote(fact.descriptorSha256)}).`;
55
+ if (fact.kind === 'resource')
56
+ return `${origin} An owned value releases its opaque handle through ${quote(fact.contract.release)} when its scope ends, including error and return paths.`;
57
+ const contract = fact.contract;
58
+ const loans = contract.params.filter(param => param.kind === 'resource').map(param => quote(param.name) + (param.ownership === 'consume' ? ' transfers ownership' : param.ownership === 'borrow' ? ' lends mutable access for this call' : ' lends read access for this call'));
59
+ const result = contract.result.kind === 'resource' ? 'The caller owns the returned handle.' : contract.result.release ?
60
+ `August copies the returned buffer, then calls ${quote(contract.result.release)} to release it.` : '';
61
+ return `${origin} It calls ${quote(contract.symbol)} through the C ABI on the caller thread; a blocking native call blocks that thread. ${loans.length ? loans.join('; ') + '. ' : ''}${result ? result + ' ' : ''}` +
62
+ 'The compiler checks the provider, descriptor digest, signature and ownership at August call sites. The native author promises not to retain inputs, enter August from foreign threads, or unwind across the C boundary; internal native workers may run. The compiler does not prove those promises.';
63
+ }
package/src/native.js CHANGED
@@ -6,6 +6,8 @@ import { createHash } from 'node:crypto';
6
6
  import { loadConfig } from "./config.js";
7
7
  import { generateOpenApi } from "./openapi.js";
8
8
  import { nativeHome } from '../scripts/native-home.mjs';
9
+ import { nativeRequirements } from '../scripts/native-setup.mjs';
10
+ import { cCompiler, compilerHelp } from '../scripts/native-toolchain.mjs';
9
11
  export function compileNative(root, generated, options = {}) {
10
12
  const config = loadConfig(root).config;
11
13
  const buildDir = join(root, '.aug-build', ...(options.testIndex === undefined ? [] : ['tests']));
@@ -27,38 +29,38 @@ export function compileNative(root, generated, options = {}) {
27
29
  copyFileSync(join(runtimeDir, 'aug_values.c'), valuesPath);
28
30
  const outputName = options.testIndex === undefined ? options.output ?? config.output ?? basename(root) : name;
29
31
  const output = isAbsolute(outputName) ? outputName : join(buildDir, outputName);
30
- const cc = process.env.CC ?? (existsSync('/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang') ?
31
- '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang' : 'clang');
32
+ mkdirSync(dirname(output), { recursive: true });
33
+ const cc = cCompiler();
32
34
  const release = options.release ?? config.optimization === 'release';
33
35
  const args = [release ? '-O2' : '-O0', '-g', '-std=c11', '-D_POSIX_C_SOURCE=200809L', '-Wall', '-Wextra',
34
36
  '-pthread',
35
37
  cPath, runtimePath, valuesPath, ...config.library_paths.map(path => `-L${resolve(root, path)}`), ...config.libraries.map(name => `-l${name}`), '-o', output];
36
- const web = generated.includes('aug_http_') || generated.includes('_aug_http_') || generated.includes('aug_headers_');
38
+ const needs = nativeRequirements(generated), web = needs.web;
37
39
  if (web)
38
40
  args.push('-DAUG_HTTP_RUNTIME');
39
- if (generated.includes('aug_html_') || web) {
41
+ if (needs.html) {
40
42
  const htmlSource = join(buildDir, 'aug_html.c');
41
43
  copyFileSync(join(runtimeDir, 'aug_html.c'), htmlSource);
42
44
  args.push(htmlSource);
43
45
  }
44
- if (generated.includes('_aug_time_')) {
46
+ if (needs.time) {
45
47
  const timeSource = join(buildDir, 'aug_time.c');
46
48
  copyFileSync(join(runtimeDir, 'aug_time.c'), timeSource);
47
49
  args.push(timeSource);
48
50
  }
49
- if (web || generated.includes('aug_task_')) {
51
+ if (needs.tasks) {
50
52
  const taskSource = join(buildDir, 'aug_tasks.c');
51
53
  copyFileSync(join(runtimeDir, 'aug_tasks.c'), taskSource);
52
54
  const minicoro = join(nativeRoot, 'sources', 'minicoro');
53
55
  if (!existsSync(join(minicoro, 'minicoro.h')))
54
- throw new Error('Task dependency is missing. Run the compiler scripts/bootstrap-native.mjs with --extract-only; AUG_NATIVE_HOME selects its directory.');
56
+ throw new Error('Task dependencies are missing. Run aug run to prepare them automatically, or use aug-native --extract-only --only minicoro to prewarm the cache.');
55
57
  args.push(taskSource, '-I' + minicoro, process.platform === 'darwin' ? '-D_DARWIN_C_SOURCE' : '-D_DEFAULT_SOURCE');
56
58
  }
57
- if (generated.includes('_aug_crypto_') || web) {
59
+ if (needs.crypto) {
58
60
  const prefix = join(nativeRoot, 'prefix');
59
61
  const manifestPath = join(prefix, 'aug-native-manifest.json');
60
62
  if (!existsSync(manifestPath))
61
- throw new Error('Native libraries are not ready. Run node scripts/bootstrap-native.mjs in the compiler directory; AUG_NATIVE_HOME selects its directory.');
63
+ throw new Error('Native libraries are not ready. Run aug run to prepare them automatically, or use aug-native to prewarm the cache.');
62
64
  const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
63
65
  if (manifest.platform !== process.platform || manifest.architecture !== process.arch)
64
66
  throw new Error(`Native dependencies target ${manifest.platform}/${manifest.architecture}; this compiler runs on ${process.platform}/${process.arch}. Build dependencies on this host.`);
@@ -74,12 +76,12 @@ export function compileNative(root, generated, options = {}) {
74
76
  args.push('-framework', 'CoreFoundation', '-framework', 'SystemConfiguration');
75
77
  }
76
78
  }
77
- if (generated.includes('_aug_json_') || generated.includes('aug_json_') || web) {
79
+ if (needs.json) {
78
80
  const jsonSource = join(buildDir, 'aug_json.c');
79
81
  copyFileSync(join(runtimeDir, 'aug_json.c'), jsonSource);
80
82
  const yyjson = join(nativeRoot, 'sources', 'yyjson', 'src');
81
83
  if (!existsSync(join(yyjson, 'yyjson.c')))
82
- throw new Error('JSON dependency is missing. Run node scripts/bootstrap-native.mjs --extract-only.');
84
+ throw new Error('JSON dependencies are missing. Run aug run to prepare them automatically, or use aug-native --extract-only --only yyjson to prewarm the cache.');
83
85
  args.push(jsonSource, join(yyjson, 'yyjson.c'), '-I' + yyjson);
84
86
  }
85
87
  const sdk = '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk';
@@ -87,8 +89,12 @@ export function compileNative(root, generated, options = {}) {
87
89
  args.unshift('-isysroot', sdk);
88
90
  const compile = spawnSync(cc, args, { encoding: 'utf8', cwd: root });
89
91
  if (compile.error)
90
- throw compile.error;
91
- const error = compile.status === 0 ? '' : compile.stderr || compile.stdout || 'C compiler failed';
92
+ throw new Error(`Cannot compile the program with ${cc}: ${compile.error.message}.\n${compilerHelp()}`);
93
+ const detail = (compile.stderr || compile.stdout || (compile.signal ? `Compiler stopped by ${compile.signal}` : 'C compiler failed')).trim();
94
+ const error = compile.status === 0 ? '' : `Native compilation failed with ${cc}.\n${detail}\n` +
95
+ (/cannot find -l|library not found|file not found|No such file/.test(detail) ?
96
+ 'Check main.yaml libraries/library_paths and the named header or library. On Linux, HTTP also needs zlib development headers.\n' : '') +
97
+ `Generated C: ${cPath}\nIf this is valid August code without external C declarations, please report it with this compiler output.`;
92
98
  const diagnostics = [];
93
99
  for (const match of error.matchAll(/^(.+\.aug):(\d+):(\d+):\s*(?:fatal )?error:\s*(.+)$/gm))
94
100
  diagnostics.push({ file: match[1], line: Number(match[2]), column: Number(match[3]), code: 'NATIVE', message: match[4] });
package/src/navigation.js CHANGED
@@ -2,6 +2,7 @@ import { statSync } from 'node:fs';
2
2
  import { basename, dirname, join, resolve } from 'node:path';
3
3
  import { lex } from "./lexer.js";
4
4
  import { libraryChild } from "./libraries.js";
5
+ import { isGitSource, sourceAlias } from "./git-packages.js";
5
6
  function definitionTarget(def) {
6
7
  const span = def.node.kind === 'interceptor' ? def.node.nameSpan : def.node.span;
7
8
  return { name: def.name, file: def.file, line: span.line,
@@ -41,7 +42,8 @@ function importPathTarget(project, importer, from, name, segment) {
41
42
  return exportTarget(project, folder, name, segment < from.length - 1 ? from[segment + 1] : undefined);
42
43
  }
43
44
  const owner = importer.package ? project.packages.scopes.get(importer.package) : undefined;
44
- const dependency = owner ? project.packages.scopes.get(owner.dependencies[from[0]]) : project.packages.roots.get(from[0]);
45
+ const alias = isGitSource(from[0]) ? sourceAlias(from[0]) : from[0];
46
+ const dependency = owner ? project.packages.scopes.get(owner.dependencies[alias]) : project.packages.roots.get(alias);
45
47
  if (dependency) {
46
48
  const folder = join(dependency.sourceRoot, ...from.slice(1, segment + 1));
47
49
  return exportTarget(project, folder, name, segment < from.length - 1 ? from[segment + 1] : undefined);
@@ -128,7 +130,7 @@ export function definitionAt(project, fileName, offset) {
128
130
  entry.span.end <= item.span.end);
129
131
  const fromIndex = declarationTokens.findIndex(entry => entry.kind === 'from');
130
132
  const sourceTokens = declarationTokens.slice(fromIndex + 1)
131
- .filter(entry => entry.kind === 'identifier');
133
+ .filter(entry => entry.kind === 'identifier' || entry.kind === 'string');
132
134
  const segments = item.kind === 'import' ? item.from : [item.from];
133
135
  const selected = token.kind === 'from' ? segments.length - 1 :
134
136
  sourceTokens.findIndex((entry) => entry === token);
package/src/openapi.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { callableResult } from "./contracts.js";
1
2
  import { createHash } from 'node:crypto';
2
3
  import { schemaType } from "./schemas.js";
3
4
  import { callableDocumentation } from "./documentation.js";
@@ -81,7 +82,7 @@ export function generateOpenApi(checked) {
81
82
  result.push({ status: fn.endpoint?.status ?? 200, type: primitive('void') });
82
83
  return;
83
84
  }
84
- const type = checked.expressionTypes.get(expr) ?? schemaType(project, fn.returns, fn.span.file);
85
+ const type = checked.expressionTypes.get(expr) ?? callableResult(checked, fn);
85
86
  if (expr.kind === 'call' && expr.callee.kind === 'name' && type.name === 'HttpResponse') {
86
87
  if (expr.callee.name !== 'HttpResponse') {
87
88
  const def = project.scopes.get(fn.span.file)?.get(expr.callee.name);
@@ -125,8 +126,8 @@ export function generateOpenApi(checked) {
125
126
  }
126
127
  result.push({ status: fn.endpoint?.status ?? 200, type });
127
128
  });
128
- if (!result.length && fn.returns.name !== 'HttpResponse')
129
- result.push({ status: fn.endpoint?.status ?? 200, type: schemaType(project, fn.returns, fn.span.file) });
129
+ if (!result.length && callableResult(checked, fn).name !== 'HttpResponse')
130
+ result.push({ status: fn.endpoint?.status ?? 200, type: callableResult(checked, fn) });
130
131
  return result;
131
132
  };
132
133
  const served = new Map();
@@ -152,7 +153,7 @@ export function generateOpenApi(checked) {
152
153
  current.schema = { oneOf: [current.schema, value] };
153
154
  };
154
155
  if (endpoint.streams) {
155
- const item = schemaType(project, fn.returns, fn.span.file), sse = item.name === 'ServerEvent';
156
+ const item = callableResult(checked, fn), sse = item.name === 'ServerEvent';
156
157
  const itemSchema = sse ? { type: 'object', required: ['data'], properties: { data: { type: 'string', contentMediaType: 'application/json', contentSchema: schema(item.args[0], fn.span) }, id: { type: 'string' }, event: { type: 'string' }, retry: { type: 'integer', minimum: 0 } } } : schema(item, fn.span);
157
158
  responses[endpoint.status] = { description: 'Streaming response', content: { [sse ? 'text/event-stream' : item.name === 'Html' ? 'text/html' : 'application/octet-stream']: { itemSchema } } };
158
159
  }