@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
package/src/lsp.js CHANGED
@@ -49,7 +49,7 @@ export async function runLanguageServer(root) {
49
49
  if (message.method === 'initialize')
50
50
  result = { capabilities: {
51
51
  textDocumentSync: { openClose: true, change: 1 }, hoverProvider: true, completionProvider: { triggerCharacters: ['.', '(', '=', ' '] },
52
- definitionProvider: true, documentFormattingProvider: true, codeActionProvider: true,
52
+ definitionProvider: true, documentFormattingProvider: true, codeActionProvider: true, inlayHintProvider: true,
53
53
  semanticTokensProvider: { legend: { tokenTypes, tokenModifiers: ['declaration'] }, full: true },
54
54
  }, serverInfo: { name: 'AugScript', version: compilerVersion() } };
55
55
  else if (message.method === 'shutdown')
@@ -92,7 +92,8 @@ export async function runLanguageServer(root) {
92
92
  const view = document(uri), offset = params.offset ?? 0;
93
93
  result = params.command === 'hover' ? view.hover(offset) ?? null : params.command === 'complete' ? view.complete(offset) :
94
94
  params.command === 'fixes' ? view.fixes() : params.command === 'semantic-tokens' ? view.tokens() :
95
- params.command === 'format' ? view.format() : params.command === 'definition' ? view.definition(offset) ?? null : params.command === 'diagnostics' ? view.diagnostics.map(issue => ({ ...issue, help: diagnosticHelp[issue.code] })) : view.describe(params.options);
95
+ params.command === 'inlay-hints' ? view.inlayHints(params.options?.start, params.options?.end) :
96
+ params.command === 'format' ? view.format() : params.command === 'definition' ? view.definition(offset) ?? null : params.command === 'diagnostics' ? view.diagnostics.map(issue => ({ ...issue, help: diagnosticHelp[issue.code] })) : view.describe(params.options);
96
97
  }
97
98
  else if (message.method.startsWith('textDocument/')) {
98
99
  const view = document(params.textDocument.uri);
@@ -101,11 +102,18 @@ export async function runLanguageServer(root) {
101
102
  const hover = view.hover(offset);
102
103
  result = hover ? { contents: { kind: 'markdown', value: `\`\`\`augscript\n${hover.detail}\n\`\`\`\n\n${hover.documentation ?? ''}` } } : null;
103
104
  }
105
+ else if (message.method === 'textDocument/inlayHint')
106
+ result = view.inlayHints(params.range ? offsetAt(view.source, params.range.start) : undefined, params.range ? offsetAt(view.source, params.range.end) : undefined).map(hint => ({
107
+ position: positionAt(view.source, hint.offset), label: hint.label, kind: 1,
108
+ paddingLeft: true, tooltip: { kind: 'markdown', value: hint.tooltip },
109
+ }));
104
110
  else if (message.method === 'textDocument/completion')
105
111
  result = view.complete(offset).map(item => ({ label: item.label,
106
112
  kind: { method: 2, function: 3, variable: 6, class: 7, interface: 8, property: 10, keyword: 14, snippet: 15, type: 25 }[item.kind] ?? 6,
107
113
  detail: item.detail, documentation: { kind: 'markdown', value: item.documentation ?? '' }, insertText: item.insertText ?? item.label,
108
- insertTextFormat: item.kind === 'snippet' ? 2 : 1 }));
114
+ insertTextFormat: item.insertText ? 2 : 1, sortText: item.sortText,
115
+ textEdit: item.replacement ? { range: { start: positionAt(view.source, item.replacement.start), end: positionAt(view.source, item.replacement.end) }, newText: item.insertText ?? item.label } : undefined,
116
+ additionalTextEdits: item.additionalEdits?.map(edit => ({ range: { start: positionAt(view.source, edit.start), end: positionAt(view.source, edit.end) }, newText: edit.text })) }));
109
117
  else if (message.method === 'textDocument/definition') {
110
118
  const target = view.definition(offset);
111
119
  result = target ? { uri: pathToFileURL(target.file).href,
@@ -114,13 +122,14 @@ export async function runLanguageServer(root) {
114
122
  else if (message.method === 'textDocument/formatting')
115
123
  result = [{ range: { start: { line: 0, character: 0 }, end: positionAt(view.source, view.source.length) }, newText: view.format() }];
116
124
  else if (message.method === 'textDocument/codeAction')
117
- result = view.fixes().map(fix => {
125
+ result = view.fixes().filter(fix => !params.range || fix.issue.line - 1 >= params.range.start.line && fix.issue.line - 1 <= params.range.end.line).map(fix => {
118
126
  const changes = {};
119
127
  for (const edit of fix.edits) {
120
128
  const source = workspace.document(edit.file).source, uri = pathToFileURL(edit.file).href;
121
129
  (changes[uri] ??= []).push({ range: { start: positionAt(source, edit.start), end: positionAt(source, edit.end) }, newText: edit.text });
122
130
  }
123
- return { title: fix.title, kind: 'quickfix', edit: { changes } };
131
+ return { title: fix.title, kind: 'quickfix', isPreferred: fix.preferred, diagnostics: [{ code: fix.issue.code, message: fix.issue.message,
132
+ range: { start: { line: fix.issue.line - 1, character: fix.issue.column - 1 }, end: { line: fix.issue.line - 1, character: fix.issue.column } } }], edit: { changes } };
124
133
  });
125
134
  else if (message.method === 'textDocument/semanticTokens/full') {
126
135
  let line = 0, column = 0;
@@ -0,0 +1,207 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { chmodSync, closeSync, existsSync, lstatSync, mkdirSync, mkdtempSync, openSync, readFileSync, readSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { UnpackSync } from 'tar';
6
+ import { withPackageLockAsync } from "./package-locking.js";
7
+ import { nativePath, nativeHostTarget, selectNativeArtifact } from "./native-contracts.js";
8
+ import { compilerVersion, readPackage, sourcePaths, projectPackages } from "./package-manager.js";
9
+ import { sourceAlias } from "./git-packages.js";
10
+ const sha = (bytes) => createHash('sha256').update(bytes).digest('hex');
11
+ const files = (directory, prefix = '') => readdirSync(join(directory, prefix), { withFileTypes: true }).flatMap(entry => {
12
+ const name = prefix ? prefix + '/' + entry.name : entry.name;
13
+ if (entry.isSymbolicLink())
14
+ throw new Error('NATIVE_INTEGRITY: Native archives cannot contain symbolic links');
15
+ return entry.isDirectory() ? files(directory, name) : entry.isFile() ? [name] : (() => { throw new Error('NATIVE_INTEGRITY: Native archives require regular files'); })();
16
+ });
17
+ /** Verify the complete extracted file set. Hashes never authorize arbitrary install scripts. */
18
+ export function verifyArtifactFiles(directory, archive) {
19
+ const path = nativePath(archive.fileManifest), manifest = JSON.parse(readFileSync(join(directory, path), 'utf8'));
20
+ if (manifest.format !== 1 || !manifest.files || Array.isArray(manifest.files) || typeof manifest.files !== 'object')
21
+ throw new Error('NATIVE_INTEGRITY: Invalid artifact file manifest');
22
+ const expected = manifest.files, actual = files(directory).sort();
23
+ if (JSON.stringify(actual) !== JSON.stringify([...Object.keys(expected), path].sort()))
24
+ throw new Error('NATIVE_INTEGRITY: Artifact file set differs from its manifest');
25
+ for (const [file, digest] of Object.entries(expected)) {
26
+ nativePath(file);
27
+ if (!/^[0-9a-f]{64}$/.test(digest) || !lstatSync(join(directory, file)).isFile() || sha(readFileSync(join(directory, file))) !== digest)
28
+ throw new Error('NATIVE_INTEGRITY: Artifact file hash mismatch: ' + file);
29
+ }
30
+ return expected;
31
+ }
32
+ /** Bounded HTTPS downloads with checked redirects. No external downloader/toolchain is used. */
33
+ export async function downloadVerified(archive) {
34
+ if (!/^[0-9a-f]{64}$/.test(archive.sha256) || !Number.isSafeInteger(archive.maximumDownloadBytes) || archive.maximumDownloadBytes < 1)
35
+ throw new Error('NATIVE_INTEGRITY: Invalid archive digest or size bound');
36
+ let url = new URL(archive.url), response;
37
+ const signal = AbortSignal.timeout(120000);
38
+ for (let i = 0; i <= 5; i++) {
39
+ if (url.protocol !== 'https:' || url.username || url.password || url.hash)
40
+ throw new Error('NATIVE_INTEGRITY: Artifact downloads and redirects require HTTPS without credentials');
41
+ response = await fetch(url, { redirect: 'manual', signal });
42
+ if ([301, 302, 303, 307, 308].includes(response.status)) {
43
+ const location = response.headers.get('location');
44
+ await response.body?.cancel();
45
+ if (!location || i === 5)
46
+ throw new Error('NATIVE_DOWNLOAD: Too many or invalid redirects');
47
+ url = new URL(location, url);
48
+ continue;
49
+ }
50
+ break;
51
+ }
52
+ if (!response?.ok || !response.body)
53
+ throw new Error(`NATIVE_DOWNLOAD: Missing artifact (${response?.status}) at ${archive.url}. Ask the package maintainer to publish the matching artifact. No source build was started.`);
54
+ if (Number(response.headers.get('content-length') ?? 0) > archive.maximumDownloadBytes) {
55
+ await response.body.cancel();
56
+ throw new Error('NATIVE_INTEGRITY: Artifact exceeds its download limit');
57
+ }
58
+ const chunks = [];
59
+ let length = 0;
60
+ for await (const chunk of response.body) {
61
+ length += chunk.length;
62
+ if (length > archive.maximumDownloadBytes)
63
+ throw new Error('NATIVE_INTEGRITY: Artifact exceeds its download limit');
64
+ chunks.push(Buffer.from(chunk));
65
+ }
66
+ const bytes = Buffer.concat(chunks);
67
+ if (sha(bytes) !== archive.sha256)
68
+ throw new Error('NATIVE_INTEGRITY: Downloaded artifact SHA-256 does not match the locked package');
69
+ return bytes;
70
+ }
71
+ /** Content-addressed immutable installs; failed extraction never installs an accepted cache. */
72
+ export async function ensureVerifiedArchive(archive, options = {}) {
73
+ if (!/^[0-9a-f]{64}$/.test(archive.sha256) || !Number.isSafeInteger(archive.maximumUnpackedBytes) || archive.maximumUnpackedBytes < 1)
74
+ throw new Error('NATIVE_INTEGRITY: Invalid archive digest or unpacked size bound');
75
+ nativePath(archive.fileManifest);
76
+ const cache = resolve(options.cache ?? process.env.AUG_NATIVE_ARTIFACT_CACHE ?? join(homedir(), '.cache/augscript/native-artifacts'));
77
+ mkdirSync(cache, { recursive: true });
78
+ const destination = join(cache, archive.sha256);
79
+ return withPackageLockAsync(destination + '.lock', async () => {
80
+ if (existsSync(destination)) {
81
+ if (lstatSync(destination).isSymbolicLink())
82
+ throw new Error('NATIVE_INTEGRITY: Artifact cache cannot be a symbolic link');
83
+ verifyArtifactFiles(destination, archive);
84
+ return destination;
85
+ }
86
+ if (options.offline)
87
+ throw new Error('NATIVE_OFFLINE: Locked native artifact is not cached. Run aug install online once. ' + archive.url);
88
+ const stage = mkdtempSync(join(cache, '.install-')), transport = join(stage, 'download.tar.gz'), output = join(stage, 'files');
89
+ mkdirSync(output);
90
+ try {
91
+ writeFileSync(transport, await downloadVerified(archive));
92
+ const seen = new Set();
93
+ let unpacked = 0;
94
+ const extractor = new UnpackSync({ cwd: output, strict: true, preserveOwner: false, filter: (path, entry) => {
95
+ const name = path.replace(/\/$/, '');
96
+ nativePath(name);
97
+ if (!('type' in entry))
98
+ throw new Error('NATIVE_INTEGRITY: Expected an archive entry');
99
+ if (!['File', 'Directory'].includes(entry.type))
100
+ throw new Error('NATIVE_INTEGRITY: Archive links and special files are forbidden');
101
+ if (seen.has(name))
102
+ throw new Error('NATIVE_INTEGRITY: Duplicate archive path ' + name);
103
+ seen.add(name);
104
+ unpacked += entry.size;
105
+ if (seen.size > 20000 || unpacked > archive.maximumUnpackedBytes)
106
+ throw new Error('NATIVE_INTEGRITY: Archive exceeds its unpacked size or file limit');
107
+ return true;
108
+ } });
109
+ // tar's synchronous file convenience API has no error listener. A disk
110
+ // write failure can otherwise become an uncaught stream event instead of
111
+ // the CLI's actionable error and rejected-install cleanup.
112
+ let extractionError;
113
+ extractor.on('error', (error) => { extractionError ??= error; });
114
+ const input = openSync(transport, 'r');
115
+ try {
116
+ let length;
117
+ do {
118
+ const buffer = Buffer.allocUnsafe(16 * 1024 * 1024);
119
+ length = readSync(input, buffer, 0, buffer.length, null);
120
+ if (length)
121
+ extractor.write(buffer.subarray(0, length));
122
+ if (extractionError)
123
+ throw extractionError;
124
+ } while (length);
125
+ extractor.end();
126
+ if (extractionError)
127
+ throw extractionError;
128
+ }
129
+ finally {
130
+ closeSync(input);
131
+ }
132
+ verifyArtifactFiles(output, archive);
133
+ for (const executable of options.executables ?? []) {
134
+ nativePath(executable);
135
+ if (!lstatSync(join(output, executable)).isFile())
136
+ throw new Error('NATIVE_INTEGRITY: Missing verified executable ' + executable);
137
+ chmodSync(join(output, executable), 0o755);
138
+ }
139
+ renameSync(output, destination);
140
+ return destination;
141
+ }
142
+ finally {
143
+ rmSync(stage, { recursive: true, force: true });
144
+ }
145
+ });
146
+ }
147
+ /** Extend the existing source lock with exact native target selections. */
148
+ export async function prepareNativePackages(root, options = {}) {
149
+ const lockFile = join(root, 'aug.lock.json'), self = existsSync(join(root, 'aug-package.json')) ? readPackage(root) : undefined;
150
+ if (!existsSync(lockFile) && !self?.manifest.native)
151
+ return [];
152
+ return withPackageLockAsync(join(root, '.aug-install.lock'), async () => {
153
+ const initial = existsSync(lockFile) ? readFileSync(lockFile, 'utf8') : undefined;
154
+ const lock = initial ? JSON.parse(initial) : { format: 1, compiler: compilerVersion(), specifications: {}, roots: {}, packages: [], npm: {} };
155
+ if (lock.compiler !== compilerVersion())
156
+ throw new Error('NATIVE_LOCK: Source lock compiler differs; run aug install');
157
+ const target = options.target ?? nativeHostTarget(), key = target.triple + '/' + (target.os === 'macos' ? 'macos14' : target.libc);
158
+ const verified = projectPackages(root, lock.specifications);
159
+ if (verified.diagnostics.length)
160
+ throw new Error(verified.diagnostics.map(d => d.message).join('\n'));
161
+ const packages = [...verified.scopes.values()].filter(entry => entry.native).map(entry => ({ sourcePackage: entry.name + '@' + entry.version, sourceDigest: entry.digest,
162
+ sourceCommit: lock.git?.find(g => entry.path === 'packages/' + sourceAlias(g.request))?.commit,
163
+ contractSha256: entry.native.bindingsSha256, artifact: selectNativeArtifact(entry.native.artifacts, target) }));
164
+ if (self?.manifest.native) {
165
+ const digest = createHash('sha256');
166
+ for (const file of ['aug-package.json', 'native.abi.json', ...sourcePaths(self.sourceRoot).map(path => path.slice(root.length + 1))].sort())
167
+ digest.update(file + '\0').update(readFileSync(join(root, file))).update('\0');
168
+ packages.push({ sourcePackage: self.manifest.name + '@' + self.manifest.version, sourceDigest: digest.digest('hex'), sourceCommit: undefined, contractSha256: self.manifest.native.bindingsSha256, artifact: selectNativeArtifact(self.manifest.native.artifacts, target) });
169
+ }
170
+ if (!packages.length)
171
+ return [];
172
+ const native = lock.native ?? { format: 1, targets: {} };
173
+ if (native.format !== 1)
174
+ throw new Error('NATIVE_LOCK: Unsupported native lock schema');
175
+ const previous = native.targets[key];
176
+ if (options.frozen && (!previous || JSON.stringify(previous.packages) !== JSON.stringify(packages)))
177
+ throw new Error('NATIVE_LOCK: Frozen install has no matching native target lock. Run aug install online to record this target.');
178
+ const components = new Map();
179
+ for (const p of packages)
180
+ for (const c of p.artifact.components)
181
+ if (c.required) {
182
+ const identity = c.id + '@' + c.version;
183
+ if (components.has(c.compatibilityKey) && components.get(c.compatibilityKey) !== identity)
184
+ throw new Error('NATIVE_CONFLICT: Incompatible native component ' + c.compatibilityKey);
185
+ components.set(c.compatibilityKey, identity);
186
+ }
187
+ const inputs = [];
188
+ for (const p of packages) {
189
+ const directory = await ensureVerifiedArchive(p.artifact, { offline: options.offline });
190
+ const supplied = verifyArtifactFiles(directory, p.artifact);
191
+ for (const path of [...p.artifact.link.libraries, ...p.artifact.runtime.files, p.artifact.provenance, p.artifact.notices, ...(p.artifact.runtime.closureManifest ? [p.artifact.runtime.closureManifest] : [])])
192
+ if (!supplied[path])
193
+ throw new Error('NATIVE_INTEGRITY: Artifact is missing declared file ' + path);
194
+ inputs.push({ directory, libraries: p.artifact.link.libraries, runtimeFiles: p.artifact.runtime.files, artifactSha256: p.artifact.sha256,
195
+ metadata: [...Object.keys(supplied).filter(path => !p.artifact.link.libraries.includes(path) && !p.artifact.runtime.files.includes(path)), p.artifact.fileManifest] });
196
+ }
197
+ if (packages.length && !options.frozen) {
198
+ native.targets[key] = { target, packages };
199
+ lock.native = native;
200
+ if ((existsSync(lockFile) ? readFileSync(lockFile, 'utf8') : undefined) !== initial)
201
+ throw new Error('NATIVE_LOCK: Source lock changed during native installation; retry aug install');
202
+ writeFileSync(lockFile + '.native.tmp', JSON.stringify(lock, null, 2) + '\n');
203
+ renameSync(lockFile + '.native.tmp', lockFile);
204
+ }
205
+ return inputs;
206
+ });
207
+ }
@@ -0,0 +1,189 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, mkdtempSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { dirname, join, relative, resolve } from 'node:path';
5
+ import { spawnSync } from 'node:child_process';
6
+ import { nativeTarget, validateNativeDescriptor } from "./native-contracts.js";
7
+ const fail = (message) => { throw new Error('NATIVE_HEADER: ' + message); };
8
+ const hash = (path) => createHash('sha256').update(readFileSync(path)).digest('hex');
9
+ const scalar = (view) => ({ void: 'void', i64: 'int64_t', i32: 'int32_t', f64: 'double', bool: 'uint8_t' }[view.kind]);
10
+ /** Check a maintainer-supplied ownership contract against real C declarations.
11
+ * Clang is invoked only by this explicit command, never by package installation.
12
+ * The result records physical checks, not proof of allocator or thread promises.
13
+ */
14
+ export function bindNativeHeader(options) {
15
+ const header = resolve(options.header), contract = resolve(options.contract), output = resolve(options.output), flags = options.flags ?? [];
16
+ nativeTarget(options.target);
17
+ if (existsSync(output))
18
+ fail('Output already exists. Select a new directory; accepted bindings are never overwritten.');
19
+ const descriptor = validateNativeDescriptor(JSON.parse(readFileSync(contract, 'utf8'))), initialHeader = hash(header), initialContract = hash(contract);
20
+ const invoke = (args) => {
21
+ const result = spawnSync(options.clang, args, { encoding: 'utf8', timeout: 60000, maxBuffer: 32 * 1024 * 1024 });
22
+ if (result.status !== 0)
23
+ fail('Clang rejected the header or ABI probe. ' + (result.error?.message ?? result.stderr.split('\n').filter(line => !/^\.+ /.test(line)).join('\n').slice(0, 8000)));
24
+ return result;
25
+ };
26
+ const compiler = invoke(['--version']).stdout.trim();
27
+ if (!/clang version\s+(\d+)/.test(compiler))
28
+ fail('The selected executable is not Clang.');
29
+ // Force parsing and probing as C. C++ libraries expose a C adapter header.
30
+ const base = [...flags, '-target', options.target, '-std=c11', '-x', 'c'];
31
+ const includePaths = (stderr) => stderr.split('\n').flatMap(line => { const match = /^\.+ (.+)$/.exec(line); return match && existsSync(match[1]) ? [resolve(match[1])] : []; });
32
+ const parsed = invoke([...base, '-H', '-Xclang', '-ast-dump=json', '-fsyntax-only', header]);
33
+ const ast = JSON.parse(parsed.stdout);
34
+ const headerInputs = new Map([...new Set([header, ...includePaths(parsed.stderr)])].map(path => [path, hash(path)]));
35
+ const declarations = new Map(), records = new Map(), aliases = new Map();
36
+ const visit = (node) => {
37
+ if (node.kind === 'FunctionDecl' && node.name) {
38
+ const previous = declarations.get(node.name);
39
+ if (previous && previous.type?.qualType !== node.type?.qualType)
40
+ fail('Conflicting declarations for ' + node.name);
41
+ declarations.set(node.name, node);
42
+ }
43
+ if (node.kind === 'RecordDecl' && node.name) {
44
+ records.set(node.name, node);
45
+ if (node.id)
46
+ records.set(node.id, node);
47
+ }
48
+ if (node.kind === 'TypedefDecl' && node.name)
49
+ aliases.set(node.name, node);
50
+ for (const child of node.inner ?? [])
51
+ visit(child);
52
+ };
53
+ visit(ast);
54
+ const get = (symbol) => declarations.get(symbol) ?? fail('Missing C declaration for ' + symbol);
55
+ const params = (node) => (node.inner ?? []).filter(child => child.kind === 'ParmVarDecl').map(child => child.type.qualType);
56
+ const opaque = new Map();
57
+ for (const resource of descriptor.resources) {
58
+ const declaration = get(resource.release), arguments_ = params(declaration);
59
+ if (arguments_.length !== 1)
60
+ fail(resource.release + ' must release exactly one opaque pointer.');
61
+ const type = arguments_[0].replace(/\s+/g, ' ').trim();
62
+ if (!/^(?:struct )?[A-Za-z_]\w* \*$/.test(type) || type.startsWith('const '))
63
+ fail(resource.release + ' requires a mutable opaque pointer.');
64
+ const name = type.replace(/ \*$/, '').replace(/^struct /, '');
65
+ if (name !== 'void') {
66
+ let record = records.get(name);
67
+ const findRecord = (node) => { if (node.kind === 'RecordType' && node.decl)
68
+ record = records.get(node.decl.id); for (const child of node.inner ?? [])
69
+ findRecord(child); };
70
+ const alias = aliases.get(name);
71
+ if (alias)
72
+ findRecord(alias);
73
+ if (!record || record.completeDefinition)
74
+ fail('Resource ' + resource.name + ' requires an incomplete C record or void pointer; use an opaque adapter.');
75
+ }
76
+ opaque.set(resource.module + '.' + resource.name, type);
77
+ }
78
+ const checks = [], signatures = [];
79
+ const check = (symbol, result, arguments_) => {
80
+ get(symbol);
81
+ const index = checks.length;
82
+ checks.push(`typedef ${result} (*aug_check_${index})(${arguments_.join(', ') || 'void'});\n_Static_assert(__builtin_types_compatible_p(__typeof__(&${symbol}), aug_check_${index}), "ABI mismatch: ${symbol}");`);
83
+ signatures.push({ symbol, parameters: arguments_, result });
84
+ };
85
+ for (const resource of descriptor.resources)
86
+ check(resource.release, 'void', [opaque.get(resource.module + '.' + resource.name)]);
87
+ const input = (view, actual) => {
88
+ const primitive = scalar(view);
89
+ if (primitive)
90
+ return [primitive];
91
+ if (view.kind === 'resource') {
92
+ const type = opaque.get(view.resource), unqualified = actual.replace(/^const\s+/, '').replace(/\s+/g, ' ').trim();
93
+ if (unqualified !== type || view.ownership !== 'read' && /^const\s/.test(actual))
94
+ fail('Resource pointer or mutable loan differs for ' + view.resource);
95
+ return [actual];
96
+ }
97
+ if (view.kind === 'f64-list')
98
+ return ['const double *', 'uint64_t'];
99
+ if (view.kind === 'utf8-list')
100
+ return ['const void *const *', 'const uint64_t *', 'uint64_t'];
101
+ return ['const void *', 'uint64_t'];
102
+ };
103
+ for (const fn of descriptor.functions) {
104
+ const actual = params(get(fn.symbol)), arguments_ = [];
105
+ for (const view of fn.params)
106
+ arguments_.push(...input(view, actual[arguments_.length] ?? ''));
107
+ if (fn.status === 'i32') {
108
+ const result = scalar(fn.result);
109
+ if (fn.result.kind === 'resource')
110
+ arguments_.push(opaque.get(fn.result.resource) + '*');
111
+ else if (result && result !== 'void')
112
+ arguments_.push(result + ' *');
113
+ else if (!result)
114
+ arguments_.push(fn.result.kind === 'f64-list' ? 'double **' : 'void **', 'uint64_t *');
115
+ arguments_.push('aug_native_error_v1 *');
116
+ }
117
+ check(fn.symbol, fn.status === 'i32' ? 'int32_t' : scalar(fn.result), arguments_);
118
+ if (fn.result.release)
119
+ check(fn.result.release, 'void', [fn.result.kind === 'f64-list' ? 'double *' : 'void *', ...(fn.result.releaseLength ? ['uint64_t'] : [])]);
120
+ }
121
+ const stage = mkdtempSync(join(tmpdir(), 'aug-header-check-'));
122
+ try {
123
+ const probe = join(stage, 'probe.c');
124
+ const layout = descriptor.functions.some(fn => fn.status === 'i32') ? `
125
+ _Static_assert(sizeof(aug_native_error_v1)==520, "error size");
126
+ _Static_assert(_Alignof(aug_native_error_v1)==4, "error alignment");
127
+ _Static_assert(offsetof(aug_native_error_v1,code)==0, "error code offset");
128
+ _Static_assert(offsetof(aug_native_error_v1,message_length)==4, "error length offset");
129
+ _Static_assert(offsetof(aug_native_error_v1,message)==8, "error buffer offset");
130
+ _Static_assert(__builtin_types_compatible_p(__typeof__(((aug_native_error_v1*)0)->code),int32_t), "error code type");
131
+ _Static_assert(__builtin_types_compatible_p(__typeof__(((aug_native_error_v1*)0)->message_length),uint32_t), "error length type");
132
+ _Static_assert(__builtin_types_compatible_p(__typeof__(((aug_native_error_v1*)0)->message),unsigned char[512]), "error buffer type");` : '';
133
+ writeFileSync(probe, '#include <stdint.h>\n#include <stddef.h>\n#include ' + JSON.stringify(header) + '\n' + layout + '\n' + checks.join('\n') + '\n');
134
+ const verified = invoke([...base, '-Werror', '-H', '-fsyntax-only', probe]);
135
+ const included = [...new Set([header, ...includePaths(verified.stderr)])].sort();
136
+ const inputs = included.map(path => ({ path: relative(dirname(header), path).replaceAll('\\', '/'), sha256: hash(path) }));
137
+ for (const [path, digest] of headerInputs)
138
+ if (!existsSync(path) || hash(path) !== digest)
139
+ fail('An included header changed during validation; retry.');
140
+ if (hash(header) !== initialHeader || hash(contract) !== initialContract)
141
+ fail('Header or ownership contract changed during validation; retry.');
142
+ mkdirSync(dirname(output), { recursive: true });
143
+ const generated = mkdtempSync(join(dirname(output), '.aug-bind-'));
144
+ try {
145
+ writeFileSync(join(generated, 'native.abi.json'), JSON.stringify(descriptor, null, 2) + '\n');
146
+ writeFileSync(join(generated, 'header-check.json'), JSON.stringify({ format: 1, profile: descriptor.profile, target: options.target, compiler, flags, contractSha256: initialContract, inputs, signatures, errorLayout: layout ? { size: 520, alignment: 4, offsets: [0, 4, 8] } : undefined, ownership: 'author-declared', retention: 'author-declared', allocatorPairing: 'author-declared' }, null, 2) + '\n');
147
+ emitDeclarations(descriptor, generated);
148
+ renameSync(generated, output);
149
+ }
150
+ finally {
151
+ rmSync(generated, { recursive: true, force: true });
152
+ }
153
+ }
154
+ finally {
155
+ rmSync(stage, { recursive: true, force: true });
156
+ }
157
+ }
158
+ function emitDeclarations(descriptor, directory) {
159
+ const modules = new Map();
160
+ const module = (name) => { if (!modules.has(name))
161
+ modules.set(name, { imports: new Set(), lines: [] }); return modules.get(name); };
162
+ const type = (view, current) => {
163
+ if (view.kind === 'resource') {
164
+ const dot = view.resource.lastIndexOf('.'), source = view.resource.slice(0, dot), name = view.resource.slice(dot + 1);
165
+ if (source !== current)
166
+ module(current).imports.add(`import ${name} from ${source.replaceAll('/', '.')}`);
167
+ return name;
168
+ }
169
+ return ({ void: 'void', i64: 'int', i32: 'c_int', f64: 'float', bool: 'bool', utf8: 'string', bytes: 'Bytes', 'f64-list': 'List<float>', 'utf8-list': 'List<string>' })[view.kind];
170
+ };
171
+ for (const resource of descriptor.resources)
172
+ module(resource.module).lines.push('extern C resource ' + resource.name);
173
+ for (const fn of descriptor.functions) {
174
+ const parameters = fn.params.map(view => (view.ownership === 'consume' ? 'own ' : view.ownership === 'borrow' ? 'borrow ' : '') + type(view, fn.module) + ' ' + view.name);
175
+ let error = '';
176
+ if (fn.error) {
177
+ const dot = fn.error.lastIndexOf('.'), name = fn.error.slice(dot + 1), source = fn.error.slice(0, dot);
178
+ if (source !== fn.module)
179
+ module(fn.module).imports.add(`import ${name} from ${source.replaceAll('/', '.')}`);
180
+ error = ' unless ' + name;
181
+ }
182
+ module(fn.module).lines.push(`extern C ${fn.name}(${parameters.join(', ')}) returns ${fn.result.kind === 'resource' ? 'own ' : ''}${type(fn.result, fn.module)}${error}${fn.uses.length ? ' uses ' + fn.uses.join(' and ') : ''}${fn.changes.length ? ' changes ' + fn.changes.join(' and ') : ''}`);
183
+ }
184
+ for (const [name, value] of [...modules].sort(([a], [b]) => a.localeCompare(b, 'en'))) {
185
+ const file = join(directory, 'src', name + '.aug');
186
+ mkdirSync(dirname(file), { recursive: true });
187
+ writeFileSync(file, [...value.imports].sort().concat(value.lines).join('\n') + '\n');
188
+ }
189
+ }