@voxgig/sdkgen 4.10.0 → 4.11.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 (304) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/package.json +1 -1
  3. package/project/.sdk/model/feature/secrets.aon +330 -0
  4. package/project/.sdk/model/target/c.aon +15 -2
  5. package/project/.sdk/model/target/cpp.aon +18 -0
  6. package/project/.sdk/model/target/lua.aon +17 -0
  7. package/project/.sdk/model/target/ocaml.aon +48 -5
  8. package/project/.sdk/model/target/zig.aon +30 -4
  9. package/project/.sdk/src/cmp/c/Config_c.ts +338 -1
  10. package/project/.sdk/src/cmp/c/Main_c.ts +57 -2
  11. package/project/.sdk/src/cmp/c/Package_c.ts +12 -2
  12. package/project/.sdk/src/cmp/cpp/Config_cpp.ts +324 -2
  13. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +2 -0
  14. package/project/.sdk/src/cmp/cpp/Main_cpp.ts +62 -4
  15. package/project/.sdk/src/cmp/cpp/Package_cpp.ts +10 -0
  16. package/project/.sdk/src/cmp/lua/Config_lua.ts +88 -0
  17. package/project/.sdk/src/cmp/lua/Gitignore_lua.ts +4 -0
  18. package/project/.sdk/src/cmp/lua/Main_lua.ts +93 -3
  19. package/project/.sdk/src/cmp/lua/Package_lua.ts +60 -0
  20. package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +10 -0
  21. package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +183 -5
  22. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +160 -3
  23. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +25 -1
  24. package/project/.sdk/src/cmp/zig/Config_zig.ts +130 -9
  25. package/project/.sdk/src/cmp/zig/Main_zig.ts +208 -4
  26. package/project/.sdk/{tm/zig/build.zig → src/cmp/zig/fragment/Build.fragment.zig} +7 -0
  27. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +25 -0
  28. package/project/.sdk/{tm/zig/root.zig → src/cmp/zig/fragment/Root.fragment.zig} +9 -0
  29. package/project/.sdk/tm/c/Makefile +58 -9
  30. package/project/.sdk/tm/c/core/sdk.h +10 -0
  31. package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +133 -0
  32. package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +39 -0
  33. package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +83 -0
  34. package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +48 -0
  35. package/project/.sdk/tm/c/feature/secrets/plugin/config.c +413 -0
  36. package/project/.sdk/tm/c/feature/secrets/plugin/config.h +24 -0
  37. package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +264 -0
  38. package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +29 -0
  39. package/project/.sdk/tm/c/feature/secrets/plugin/env.c +220 -0
  40. package/project/.sdk/tm/c/feature/secrets/plugin/env.h +19 -0
  41. package/project/.sdk/tm/c/feature/secrets/plugin/export.c +97 -0
  42. package/project/.sdk/tm/c/feature/secrets/plugin/export.h +19 -0
  43. package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +237 -0
  44. package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +17 -0
  45. package/project/.sdk/tm/c/feature/secrets/plugin/host.c +1494 -0
  46. package/project/.sdk/tm/c/feature/secrets/plugin/host.h +135 -0
  47. package/project/.sdk/tm/c/feature/secrets/plugin/order.c +288 -0
  48. package/project/.sdk/tm/c/feature/secrets/plugin/order.h +18 -0
  49. package/project/.sdk/tm/c/feature/secrets/plugin/point.c +141 -0
  50. package/project/.sdk/tm/c/feature/secrets/plugin/point.h +80 -0
  51. package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +170 -0
  52. package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +52 -0
  53. package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +98 -0
  54. package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +18 -0
  55. package/project/.sdk/tm/c/feature/secrets/plugin/types.c +150 -0
  56. package/project/.sdk/tm/c/feature/secrets/plugin/types.h +104 -0
  57. package/project/.sdk/tm/c/feature/secrets/plugin/value.c +649 -0
  58. package/project/.sdk/tm/c/feature/secrets/plugin/value.h +135 -0
  59. package/project/.sdk/tm/c/feature/secrets/plugin/version.c +151 -0
  60. package/project/.sdk/tm/c/feature/secrets/plugin/version.h +34 -0
  61. package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +281 -0
  62. package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +207 -0
  63. package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +164 -0
  64. package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +75 -0
  65. package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +141 -0
  66. package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +144 -0
  67. package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +177 -0
  68. package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +239 -0
  69. package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +599 -0
  70. package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +165 -0
  71. package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +194 -0
  72. package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +233 -0
  73. package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +125 -0
  74. package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +125 -0
  75. package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +270 -0
  76. package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +382 -0
  77. package/project/.sdk/tm/c/feature/secrets/plugins/support.h +153 -0
  78. package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +420 -0
  79. package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +86 -0
  80. package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +721 -0
  81. package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +813 -0
  82. package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +944 -0
  83. package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +490 -0
  84. package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +442 -0
  85. package/project/.sdk/tm/c/feature/secrets.c +797 -0
  86. package/project/.sdk/tm/c/feature/secrets.h +46 -0
  87. package/project/.sdk/tm/c/src/feature/secrets/.gitkeep +0 -0
  88. package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -0
  89. package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +38 -11
  90. package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +40 -6
  91. package/project/.sdk/tm/cpp/Makefile +48 -4
  92. package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +121 -0
  93. package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +41 -0
  94. package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +60 -0
  95. package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +66 -0
  96. package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +376 -0
  97. package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +29 -0
  98. package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +230 -0
  99. package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +31 -0
  100. package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +205 -0
  101. package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +25 -0
  102. package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +84 -0
  103. package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +24 -0
  104. package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +222 -0
  105. package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +21 -0
  106. package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +1200 -0
  107. package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +250 -0
  108. package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +250 -0
  109. package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +22 -0
  110. package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +110 -0
  111. package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +79 -0
  112. package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +136 -0
  113. package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +60 -0
  114. package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +82 -0
  115. package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +25 -0
  116. package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +90 -0
  117. package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +65 -0
  118. package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +491 -0
  119. package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +120 -0
  120. package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +143 -0
  121. package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +36 -0
  122. package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +248 -0
  123. package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +30 -0
  124. package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +149 -0
  125. package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +23 -0
  126. package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +117 -0
  127. package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +27 -0
  128. package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +180 -0
  129. package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +52 -0
  130. package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +87 -0
  131. package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +23 -0
  132. package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +121 -0
  133. package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +23 -0
  134. package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +153 -0
  135. package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +23 -0
  136. package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +666 -0
  137. package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +160 -0
  138. package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +123 -0
  139. package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +23 -0
  140. package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +125 -0
  141. package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +23 -0
  142. package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +223 -0
  143. package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +47 -0
  144. package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +104 -0
  145. package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +27 -0
  146. package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +242 -0
  147. package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +58 -0
  148. package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +260 -0
  149. package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +47 -0
  150. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +476 -0
  151. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +89 -0
  152. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +312 -0
  153. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +263 -0
  154. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +354 -0
  155. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +111 -0
  156. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +613 -0
  157. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +227 -0
  158. package/project/.sdk/tm/cpp/feature/secrets.hpp +745 -0
  159. package/project/.sdk/tm/cpp/src/feature/secrets/.gitkeep +0 -0
  160. package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
  161. package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +34 -8
  162. package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +85 -0
  163. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +17 -2
  164. package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +41 -0
  165. package/project/.sdk/tm/go/feature/secrets_feature.go +32 -10
  166. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +116 -0
  167. package/project/.sdk/tm/java/feature/SecretsFeature.java +33 -8
  168. package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +64 -0
  169. package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +34 -11
  170. package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +73 -0
  171. package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +32 -7
  172. package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +69 -0
  173. package/project/.sdk/tm/lua/Makefile +15 -4
  174. package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +806 -0
  175. package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +135 -0
  176. package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +63 -0
  177. package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +361 -0
  178. package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +232 -0
  179. package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +168 -0
  180. package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +66 -0
  181. package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +194 -0
  182. package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +1190 -0
  183. package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +169 -0
  184. package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +207 -0
  185. package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +106 -0
  186. package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +115 -0
  187. package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +78 -0
  188. package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +275 -0
  189. package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +131 -0
  190. package/project/.sdk/tm/lua/feature/secrets/plugin.lua +76 -0
  191. package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +124 -0
  192. package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +47 -0
  193. package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +315 -0
  194. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +228 -0
  195. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +137 -0
  196. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +124 -0
  197. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +212 -0
  198. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +89 -0
  199. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +129 -0
  200. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +154 -0
  201. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +248 -0
  202. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +113 -0
  203. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +449 -0
  204. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +198 -0
  205. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +126 -0
  206. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +93 -0
  207. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +269 -0
  208. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +146 -0
  209. package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +346 -0
  210. package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +479 -0
  211. package/project/.sdk/tm/lua/feature/secrets_feature.lua +690 -0
  212. package/project/.sdk/tm/lua/src/feature/secrets/.gitkeep +0 -0
  213. package/project/.sdk/tm/lua/test/extend_test.lua +105 -0
  214. package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +862 -0
  215. package/project/.sdk/tm/ocaml/Makefile +52 -8
  216. package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +106 -0
  217. package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +43 -0
  218. package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +349 -0
  219. package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +143 -0
  220. package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +217 -0
  221. package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +197 -0
  222. package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +89 -0
  223. package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +227 -0
  224. package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +1112 -0
  225. package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +202 -0
  226. package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +138 -0
  227. package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +126 -0
  228. package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +62 -0
  229. package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +97 -0
  230. package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +387 -0
  231. package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +139 -0
  232. package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +171 -0
  233. package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +116 -0
  234. package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +95 -0
  235. package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +149 -0
  236. package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +61 -0
  237. package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +93 -0
  238. package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +120 -0
  239. package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +421 -0
  240. package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +66 -0
  241. package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +85 -0
  242. package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +112 -0
  243. package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +97 -0
  244. package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +68 -0
  245. package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +259 -0
  246. package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +44 -0
  247. package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +358 -0
  248. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +376 -0
  249. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +647 -0
  250. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +299 -0
  251. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +347 -0
  252. package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +453 -0
  253. package/project/.sdk/tm/ocaml/src/feature/secrets/.gitkeep +0 -0
  254. package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
  255. package/project/.sdk/tm/perl/feature/secrets_feature.pm +33 -12
  256. package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +47 -0
  257. package/project/.sdk/tm/php/feature/SecretsFeature.php +30 -6
  258. package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +98 -0
  259. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +28 -6
  260. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
  261. package/project/.sdk/tm/rb/feature/secrets_feature.rb +28 -6
  262. package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +93 -0
  263. package/project/.sdk/tm/rust/feature/secrets.rs +33 -10
  264. package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +96 -0
  265. package/project/.sdk/tm/scala/feature/SecretsFeature.scala +29 -7
  266. package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +71 -0
  267. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +35 -12
  268. package/project/.sdk/tm/ts/test/feature/secrets/Secrets.test.ts +73 -0
  269. package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +137 -0
  270. package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +90 -0
  271. package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +346 -0
  272. package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +244 -0
  273. package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +201 -0
  274. package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +83 -0
  275. package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +212 -0
  276. package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +1224 -0
  277. package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +126 -0
  278. package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +228 -0
  279. package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +34 -0
  280. package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +166 -0
  281. package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +147 -0
  282. package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +74 -0
  283. package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +140 -0
  284. package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +662 -0
  285. package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +139 -0
  286. package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +294 -0
  287. package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +222 -0
  288. package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +188 -0
  289. package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +135 -0
  290. package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +170 -0
  291. package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +242 -0
  292. package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +535 -0
  293. package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +167 -0
  294. package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +202 -0
  295. package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +160 -0
  296. package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +336 -0
  297. package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +148 -0
  298. package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +259 -0
  299. package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +440 -0
  300. package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +944 -0
  301. package/project/.sdk/tm/zig/feature/secrets.zig +854 -0
  302. package/project/.sdk/tm/zig/src/feature/secrets/.gitkeep +0 -0
  303. package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
  304. package/project/sdkgen-package.json +1 -1
@@ -4,7 +4,7 @@ import * as Path from 'node:path'
4
4
  import {
5
5
  cmp, each, names, cmap,
6
6
  List, File, Content, Copy, Folder, Fragment, Line, FeatureHook,
7
- targetFeatures,
7
+ targetFeatures, pluginExcludes,
8
8
  TEST_CONTROL_EXCLUDE
9
9
  } from '@voxgig/sdkgen'
10
10
 
@@ -27,6 +27,18 @@ import { MainEntity } from './MainEntity_lua'
27
27
  import { EntityTypes } from './EntityTypes_lua'
28
28
 
29
29
 
30
+ // Features whose source is a CONTAINER under the top-level feature/ dir,
31
+ // beside the flat `<name>_feature.lua` every other lua feature is. Today
32
+ // that is `secrets`: its folder holds a vendored @voxgig/sekreto port, the
33
+ // voxgig/plugin runtime and the C transport helper - some forty files of
34
+ // key-store, request-signing and child-process code that an SDK which never
35
+ // asked for secrets must not ship. Anything named here is EXCLUDED from the
36
+ // verbatim copy unless the model SELECTS the feature (see the Copy below);
37
+ // its shipped test suite under test/feature/<name>/ goes with it. The
38
+ // clojure target gates its container the same way (Main_clojure.ts).
39
+ const CONTAINED = ['secrets']
40
+
41
+
30
42
  const Main = cmp(async function Main(props: any) {
31
43
 
32
44
  const { target } = props
@@ -42,15 +54,93 @@ const Main = cmp(async function Main(props: any) {
42
54
 
43
55
  Gitignore({})
44
56
 
45
- // Copy tm/lua files with replacements
57
+ // THE feature/<name>/ CONTAINER IS GATED HERE, at generate time - the
58
+ // top-level-container peer of the `srcFeatureExcludes` gate ts and js
59
+ // apply to src/feature/<name>/. `target add` keeps an unselected
60
+ // feature out of a project's tm/ in the first place; this covers a
61
+ // feature switched off after it was added, and the generator suite,
62
+ // which copies the whole scaffold tree.
63
+ const containerExcludes = CONTAINED
64
+ .filter((name: string) => null == feature[name])
65
+ .flatMap((name: string) => [
66
+ new RegExp('(^|/)feature/' + name + '_feature\\.lua$'),
67
+ new RegExp('(^|/)feature/' + name + '/'),
68
+ new RegExp('(^|/)test/feature/' + name + '/'),
69
+ ])
70
+
71
+ // Copy tm/lua files with replacements.
72
+ //
73
+ // pluginExcludes: the generate-time plugin trim (an ACTIVE feature's
74
+ // INACTIVE plugin group's declared files stay out of the tree). The
75
+ // model's lua `path` entries are target-root-relative, which is this
76
+ // Copy's root - helpers/featureSource documents that getting the root
77
+ // wrong makes the trim a silent no-op.
46
78
  Copy({
47
79
  from: 'tm/' + target.name,
48
- exclude: [/src\//, TEST_CONTROL_EXCLUDE],
80
+ exclude: [/src\//, TEST_CONTROL_EXCLUDE,
81
+ ...containerExcludes, ...pluginExcludes(model)],
49
82
  replace: {
50
83
  ...props.ctx$.stdrep,
51
84
  }
52
85
  })
53
86
 
87
+ // THE NATIVE BUILD SEAM. sekreto's lua PLUGIN kinds (hashicorp, aws, ...)
88
+ // run a small compiled transport helper, because Lua 5.4 has no sockets
89
+ // and no TLS; the four built-in kinds never reach it. The helper's
90
+ // source is vendored with the feature (feature/secrets/native/
91
+ // sekretonet.c) and the template Makefile `-include`s this fragment, so
92
+ // it is compiled - and OpenSSL linked - ONLY when the model activates a
93
+ // plugin group that lua has definitions for. An SDK without secrets, or
94
+ // with the built-in chain alone, gets no fragment, no compiler run and
95
+ // no OpenSSL dependency.
96
+ //
97
+ // The vendored file opens with the vendoring tool's three-line `--`
98
+ // provenance header (every file under tm/lua is stamped in lua's comment
99
+ // syntax; the guard holds that), which the C compiler cannot read - so
100
+ // the rule feeds the compiler from line four. Line numbers in a compiler
101
+ // diagnostic are therefore three lower than in the file.
102
+ const nativeGroups: string[] = []
103
+ each(feature, (f: any) => {
104
+ each(f.plugin, (plugin: any) => {
105
+ if (false === plugin.active || null == plugin.active) return
106
+ if (0 < Object.keys(plugin.def?.lua || {}).length) {
107
+ nativeGroups.push(f.name + '.' + plugin.name)
108
+ }
109
+ })
110
+ })
111
+
112
+ if (0 < nativeGroups.length) {
113
+ Folder({ name: 'feature' }, () => {
114
+ Folder({ name: 'secrets' }, () => {
115
+ File({ name: 'native.mk' }, () => {
116
+ Content(`# ${model.const.Name} SDK: the sekreto transport helper build.
117
+ #
118
+ # GENERATED because a secrets plugin group is active
119
+ # (${nativeGroups.sort().join(', ')}): the plugin provider kinds run this
120
+ # helper for every socket and child process, since Lua 5.4 has none. An
121
+ # SDK without an active plugin group has no such file, and its Makefile's
122
+ # optional include of it is a no-op - nothing is compiled and OpenSSL is
123
+ # not linked.
124
+ #
125
+ # The source carries the vendoring tool's three-line provenance header in
126
+ # lua comment syntax, which the compiler cannot read: it is fed the file
127
+ # from line four. Compiler line numbers are therefore three lower than the
128
+ # file's.
129
+ NATIVE := feature/secrets/native/sekreto-net
130
+
131
+ CC ?= cc
132
+ CFLAGS ?= -std=c11 -O2 -Wall -Wextra
133
+ LDLIBS ?= -lssl -lcrypto
134
+
135
+ feature/secrets/native/sekreto-net: feature/secrets/native/sekretonet.c
136
+ @command -v $(CC) >/dev/null 2>&1 || { echo "secrets: a C compiler ($(CC)) is needed to build the sekreto transport helper that this SDK's plugin provider kinds run - install one, or use only the built-in provider kinds" >&2; exit 1; }
137
+ tail -n +4 $< | $(CC) $(CFLAGS) -x c - -o $@ $(LDLIBS)
138
+ `)
139
+ })
140
+ })
141
+ })
142
+ }
143
+
54
144
  // Generate main SDK file
55
145
  File({ name: model.name + '_sdk.' + target.ext }, () => {
56
146
 
@@ -23,6 +23,43 @@ import type {
23
23
  } from '@voxgig/apidef'
24
24
 
25
25
 
26
+ // The vendored modules the secrets feature needs whatever its chain names
27
+ // (ts/vendor/routes.json `sekreto/lua` and `plugin/lua`, minus the plugin
28
+ // KINDS, which are listed per active group from the model). Held to the
29
+ // vendored tree by ts/test/generate.test.ts's lua secrets case.
30
+ const SECRETS_CORE_MODULES = [
31
+ 'feature/secrets/sekreto',
32
+ 'feature/secrets/sekreto/addr',
33
+ 'feature/secrets/sekreto/err',
34
+ 'feature/secrets/sekreto/name',
35
+ 'feature/secrets/sekreto/providers',
36
+ // The shared plugin helpers, in no group: httpjson (eight kinds), net
37
+ // (httpjson, boru, secretspec), json and support (every kind), crypto
38
+ // (aws AND gcpsecrets - two groups, so neither may own it).
39
+ 'feature/secrets/sekreto/plugins/crypto',
40
+ 'feature/secrets/sekreto/plugins/httpjson',
41
+ 'feature/secrets/sekreto/plugins/json',
42
+ 'feature/secrets/sekreto/plugins/net',
43
+ 'feature/secrets/sekreto/plugins/support',
44
+ 'feature/secrets/plugin',
45
+ 'feature/secrets/plugin/capability',
46
+ 'feature/secrets/plugin/catalog',
47
+ 'feature/secrets/plugin/config',
48
+ 'feature/secrets/plugin/depend',
49
+ 'feature/secrets/plugin/env',
50
+ 'feature/secrets/plugin/export',
51
+ 'feature/secrets/plugin/graph',
52
+ 'feature/secrets/plugin/host',
53
+ 'feature/secrets/plugin/json',
54
+ 'feature/secrets/plugin/order',
55
+ 'feature/secrets/plugin/point',
56
+ 'feature/secrets/plugin/ref',
57
+ 'feature/secrets/plugin/resolve',
58
+ 'feature/secrets/plugin/types',
59
+ 'feature/secrets/plugin/version',
60
+ ]
61
+
62
+
26
63
  const Package = cmp(async function Package(props: any) {
27
64
  const ctx$ = props.ctx$
28
65
  const target = props.target
@@ -81,6 +118,15 @@ dependencies = {
81
118
  // rock exists to depend on - station design 9.2's registry-less tier).
82
119
  // Gated: a feature that does not apply to lua must not be listed
83
120
  // as a rockspec module — the require would not resolve.
121
+ //
122
+ // The secrets feature carries the VENDORED sekreto core, the
123
+ // voxgig/plugin runtime and the shared plugin helpers (no sekreto or
124
+ // plugin rock exists to depend on); the plugin KINDS themselves are
125
+ // listed from the model's active `def.lua` entries, so a trimmed
126
+ // group's modules are not claimed. The compiled transport helper the
127
+ // plugin kinds run is NOT a rock module: `build.type = "builtin"`
128
+ // cannot produce an executable, so an install-from-rock carries the
129
+ // helper's source and `make build` compiles it where the SDK runs.
84
130
  const feature = targetFeatures(model, target)
85
131
  let featureModules = ` ["feature.base_feature"] = "feature/base_feature.lua",\n`
86
132
  each(feature, (f: any) => {
@@ -90,6 +136,19 @@ dependencies = {
90
136
  featureModules +=
91
137
  ` ["feature.station.voxgig_station"] = "feature/station/voxgig_station.lua",\n`
92
138
  }
139
+ if ('secrets' === f.name) {
140
+ const mods = [...SECRETS_CORE_MODULES]
141
+ each(f.plugin, (plugin: any) => {
142
+ if (false === plugin.active || null == plugin.active) return
143
+ for (const one of Object.values(plugin.def?.lua || {})) {
144
+ mods.push(String(one).replace(/\.lua$/, ''))
145
+ }
146
+ })
147
+ for (const mod of Array.from(new Set(mods)).sort()) {
148
+ featureModules +=
149
+ ` ["${mod.replace(/\//g, '.')}"] = "${mod}.lua",\n`
150
+ }
151
+ }
93
152
  })
94
153
 
95
154
  Content(`}
@@ -99,6 +158,7 @@ build = {
99
158
  ["${model.name}_sdk"] = "${model.name}_sdk.lua",
100
159
  ["config"] = "config.lua",
101
160
  ["config_shared"] = "config_shared.lua",
161
+ ["config_plugins"] = "config_plugins.lua",
102
162
  ["features"] = "features.lua",
103
163
  ${featureModules} }
104
164
  }
@@ -85,6 +85,16 @@ function ProjectNameSDK.new(options)
85
85
  end
86
86
  end
87
87
 
88
+ -- CONSUMED, not kept. `extend` holds feature INSTANCES, and every shipped
89
+ -- feature's init stores `self.client = ctx.client` - so leaving the list
90
+ -- in self.options makes the options map CYCLIC (client.options.extend[1]
91
+ -- .client == client), and options_map()'s vs.clone, which has no cycle
92
+ -- guard, blew the stack on the first prepare_auth of any client built with
93
+ -- an extend feature. The instances live on self.features from here on,
94
+ -- which is the only place anything reads them; the SAME table is
95
+ -- self._rootctx.options, so the root context loses the key too.
96
+ self.options["extend"] = nil
97
+
88
98
  -- Initialize features.
89
99
  for _, f in ipairs(self.features) do
90
100
  utility.feature_init(self._rootctx, f)
@@ -26,6 +26,106 @@ import {
26
26
  } from './utility_ocaml'
27
27
 
28
28
 
29
+ // THE SECRETS BUILD MODEL, derived from the model ONCE and read by both the
30
+ // Makefile fragment (Main_ocaml emits feature/secrets/feature.mk from it)
31
+ // and the generated config (the definitions list and the bundled transport
32
+ // below), so the two cannot disagree about which kinds are compiled.
33
+ //
34
+ // Upstream sekreto retired its self-registration registry for voxgig/plugin
35
+ // definitions: a provider kind the caller did not pass in `~plugins` is
36
+ // unknown to that Sekreto. So the model's choice of plugin groups IS the
37
+ // SDK's provider vocabulary, and the generated code names each active
38
+ // group's constructor (`def: ocaml:` in model/feature/secrets.aon -
39
+ // `Hashicorp.plugin`, the `unit -> Defs.definition` each vendored kind
40
+ // module defines) and nothing else. A symbol named here whose module the
41
+ // plugin trim removed is an "Unbound module" at compile time - a loud
42
+ // failure, which is the right kind.
43
+ //
44
+ // MODULE ORDER IS THE DEPENDENCY ORDER, written down (upstream's own
45
+ // Makefile is the source): the voxgig/plugin host, the sekreto core, the
46
+ // shared helpers, the kinds. The helpers are ungrouped in the model (see the
47
+ // ocaml note at the head of its `plugin` block) and are listed here only
48
+ // when a selected kind needs them - the transport chain (crypto, sigv4, tls,
49
+ // http, httpjson) when an active group declares `needs.fetch`, the
50
+ // child-process helper (runcmd) when any kind is on - because OCaml
51
+ // compiles exactly what it is handed: an [env, memory] chain compiles the
52
+ // two cores alone, and `secretspec` alone compiles runcmd.ml and no TLS.
53
+ //
54
+ // Null when the model does not activate `secrets` for this target. Read
55
+ // with `only_active: false` on the plugin map (pluginExcludesFor's
56
+ // subtlety: the feature object a component is handed has already been
57
+ // filtered, so a feature whose groups are all off would look like one
58
+ // with no plugin machinery).
59
+ type SecretsBuild = {
60
+ groups: string[],
61
+ tlsGroups: string[],
62
+ tls: boolean,
63
+ plugin: string[],
64
+ core: string[],
65
+ helpers: string[],
66
+ kinds: string[],
67
+ syms: string[],
68
+ }
69
+
70
+ const SECRETS_PLUGIN_MODULES = [
71
+ 'value', 'types', 'ref', 'version', 'capability', 'resolve', 'env',
72
+ 'config', 'graph', 'order', 'export', 'depend', 'point', 'defs',
73
+ 'catalog', 'host',
74
+ ].map((m) => 'feature/secrets/plugin/' + m + '.ml')
75
+
76
+ const SECRETS_CORE_MODULES = ['json', 'secret', 'provider', 'sekreto']
77
+ .map((m) => 'feature/secrets/sekreto/' + m + '.ml')
78
+
79
+ const SECRETS_TLS_HELPERS = ['crypto', 'sigv4', 'tls', 'http', 'httpjson']
80
+ .map((m) => 'feature/secrets/plugins/' + m + '.ml')
81
+
82
+ const SECRETS_PROC_HELPERS = ['feature/secrets/plugins/runcmd.ml']
83
+
84
+ function secretsBuild(model: Model, target: any): SecretsBuild | null {
85
+ const feature = targetFeatures(model, target)
86
+ if (null == (feature as any).secrets) return null
87
+
88
+ const declared = getModelPath(model,
89
+ `main.${KIT}.feature.secrets.plugin`,
90
+ { required: false, only_active: false }) || {}
91
+
92
+ const groups: string[] = []
93
+ const tlsGroups: string[] = []
94
+ const syms = new Set<string>()
95
+ const kinds = new Set<string>()
96
+
97
+ each(declared, (plugin: any) => {
98
+ // Filter on `active` HERE rather than trusting the feature object to
99
+ // arrive filtered (Config_go's note): getting this wrong names a
100
+ // constructor for a module the trim just deleted.
101
+ if (true !== plugin.active) return
102
+ const defs: Record<string, string> = plugin.def?.[target.name] || {}
103
+ if (0 === Object.keys(defs).length) return
104
+ groups.push(plugin.name)
105
+ if (true === plugin.needs?.fetch) tlsGroups.push(plugin.name)
106
+ for (const [sym, path] of Object.entries(defs)) {
107
+ syms.add(sym)
108
+ kinds.add(String(path))
109
+ }
110
+ })
111
+
112
+ const tls = 0 < tlsGroups.length
113
+ return {
114
+ groups: groups.sort(),
115
+ tlsGroups: tlsGroups.sort(),
116
+ tls,
117
+ plugin: SECRETS_PLUGIN_MODULES,
118
+ core: SECRETS_CORE_MODULES,
119
+ helpers: [
120
+ ...(tls ? SECRETS_TLS_HELPERS : []),
121
+ ...(0 < kinds.size ? SECRETS_PROC_HELPERS : []),
122
+ ],
123
+ kinds: Array.from(kinds).sort(),
124
+ syms: Array.from(syms).sort(),
125
+ }
126
+ }
127
+
128
+
29
129
  // sdk_config.ml: make_config () builds the embedded API model as a value;
30
130
  // make_feature name is the N-feature-safe factory the client uses to
31
131
  // instantiate features named in the options (mirrors go/rust Config).
@@ -40,6 +140,8 @@ const Config = cmp(async function Config(props: any) {
40
140
  // helpers/applicability.
41
141
  const feature = targetFeatures(model, target)
42
142
 
143
+ const secrets = secretsBuild(model, target)
144
+
43
145
  // The canonical config OBJECT and its JSON, from the shared helper. Both
44
146
  // representations render from the same `def`, so they cannot describe
45
147
  // different configs - and this target picks up `options.server` (the OpenAPI
@@ -80,9 +182,6 @@ let config_data = "${ocamlString(configJson)}"
80
182
 
81
183
  let make_config () : value =
82
184
  Sdk_json.json_read config_data
83
-
84
- let make_feature (name : string) : feature =
85
- match name with
86
185
  `)
87
186
  }
88
187
  else {
@@ -99,11 +198,76 @@ open Sdk_features
99
198
 
100
199
  let make_config () : value =
101
200
  ${formatOcamlValue(config, 1)}
201
+ `)
202
+ }
102
203
 
103
- let make_feature (name : string) : feature =
204
+ // THE PLUGIN DEFINITIONS the model selected, per feature (the ocaml
205
+ // peer of Config_go's featurePlugins map). EMITTED UNCONDITIONALLY, so
206
+ // every generated config answers the same question - but typed as
207
+ // `Defs.definition list` only when the secrets feature is active: the
208
+ // `Defs` module is part of the vendored voxgig/plugin tree, which is
209
+ // compiled only then, so an inactive model gets the polymorphic empty
210
+ // list instead (`'a list`, which unifies with anything a caller
211
+ // expects). DELIBERATE DIVERGENCE from the c/lua accessors, whose
212
+ // untyped return (void**, a table) needs no such split.
213
+ if (null == secrets) {
214
+ Content(`
215
+ (* The plugin definitions the model selected, per feature: none - no
216
+ * plugin-bearing feature is active in this SDK. *)
217
+ let feature_plugins (_name : string) = []
218
+ `)
219
+ }
220
+ else {
221
+ Content(`
222
+ (* The plugin definitions the model selected for the secrets feature's
223
+ * provider chain${0 === secrets.groups.length ? ': none - the chain can name the four built-in kinds (env, memory, dotenv, file) and a custom provider, and nothing else' : ' (plugin groups: ' + secrets.groups.join(', ') + ')'}.
224
+ * Built, not held: every call is a fresh list, so two chains never share
225
+ * a definition. *)
226
+ let feature_plugins (name : string) : Defs.definition list =
104
227
  match name with
228
+ | "secrets" -> [${0 === secrets.syms.length ? '' : '\n' + secrets.syms.map((sym: string) => ' ' + sym + ' ();\n').join('') + ' '}]
229
+ | _ -> []
230
+ `)
231
+
232
+ // THE EXCHANGE TRANSPORT OF LAST RESORT (go's rawExchangeFetch): the
233
+ // vendored sekreto HTTP client, which the active plugin groups
234
+ // compile and link anyway (feature/secrets/feature.mk adds the OpenSSL binding on
235
+ // exactly this condition). It exists so an exchange works with
236
+ // ordinary SDK options - requiring a custom transport for the COMMON
237
+ // case would refuse every live token purchase before a request was
238
+ // made. Same result shape the system.fetch seam promises ({status,
239
+ // statusText, headers, body, json()}). With no such group the feature
240
+ // is built without it and a purchase with no options.system.fetch
241
+ // fails with a named error (see secrets_feature.ml).
242
+ if (secrets.tls) {
243
+ Content(`
244
+ (* The token-exchange transport of last resort: the vendored sekreto HTTP
245
+ * client (plugins/http.ml over plugins/tls.ml), compiled because a plugin
246
+ * group needing a transport is active (${secrets.tlsGroups.join(', ')}).
247
+ * A network failure raises sekreto's own Sekreto_error, which the feature
248
+ * reports as the refusal. *)
249
+ let secrets_transport (url : string) (fetchdef : value) : value =
250
+ let meth = match getp fetchdef "method" with Str s -> s | _ -> "POST" in
251
+ let headers = match getp fetchdef "headers" with
252
+ | Map _ as h ->
253
+ List.filter_map (fun k -> match getp h k with Str v -> Some (k, v) | _ -> None) (keysof h)
254
+ | _ -> [] in
255
+ let body = match getp fetchdef "body" with Str s -> Some s | _ -> None in
256
+ let res = Http.request meth url headers body in
257
+ let text = res.Http.body in
258
+ jo [("status", Num (float_of_int res.Http.status));
259
+ ("statusText", Str (if res.Http.status >= 400 then "ERR" else "OK"));
260
+ ("headers", empty_map ());
261
+ ("body", Str text);
262
+ ("json", json_thunk (try Sdk_json.json_read text with _ -> Noval))]
105
263
  `)
264
+ }
106
265
  }
266
+ // The factory, AFTER the definitions it names: OCaml binds top to bottom.
267
+ Content(`
268
+ let make_feature (name : string) : feature =
269
+ match name with
270
+ `)
107
271
 
108
272
  // ONLY THE FEATURES THIS PORT ACTUALLY IMPLEMENTS. Emitting an arm for a
109
273
  // name with no `<name>_feature` in tm/ocaml/sdk_features.ml is an
@@ -124,12 +288,26 @@ let make_feature (name : string) : feature =
124
288
  }
125
289
  })
126
290
 
291
+ // The secrets feature is the one ocaml feature that lives OUTSIDE
292
+ // sdk_features.ml (a container: feature/secrets_feature.ml plus the
293
+ // vendored trees), so its arm names its own module and hands it the
294
+ // definitions the model selected and, when a plugin group needing a
295
+ // transport is active, the bundled exchange transport. Emitted only
296
+ // when the feature is active: the module is not compiled otherwise
297
+ // (Main_ocaml's container gate, and the Makefile's feature/secrets/feature.mk).
298
+ if (null != secrets) {
299
+ Content(` | "secrets" -> Secrets_feature.make ~plugins:(feature_plugins "secrets")${secrets.tls ? ' ~transport:secrets_transport' : ''} ()
300
+ `)
301
+ }
302
+
127
303
  Content(` | _ -> base_feature ()
128
304
  `)
305
+
129
306
  })
130
307
  })
131
308
 
132
309
 
133
310
  export {
134
- Config
311
+ Config,
312
+ secretsBuild,
135
313
  }
@@ -1,8 +1,10 @@
1
1
 
2
2
  import {
3
3
  cmp, each,
4
- File, Content, Copy,
4
+ File, Content, Copy, Folder,
5
5
  entityClassName,
6
+ pluginExcludes,
7
+ targetFeatures,
6
8
  } from '@voxgig/sdkgen'
7
9
 
8
10
 
@@ -18,10 +20,24 @@ import {
18
20
 
19
21
 
20
22
  import { Package } from './Package_ocaml'
21
- import { Config } from './Config_ocaml'
23
+ import { Config, secretsBuild } from './Config_ocaml'
22
24
  import { Gitignore } from './Gitignore_ocaml'
23
25
  import { MainEntity } from './MainEntity_ocaml'
24
26
  import { SdkError } from './SdkError_ocaml'
27
+ import { entityModule, ocamlString } from './utility_ocaml'
28
+
29
+
30
+ // Features whose source is a CONTAINER under the top-level feature/ dir,
31
+ // beside the single template module (sdk_features.ml) every other ocaml
32
+ // feature lives in. Today that is `secrets`: feature/secrets_feature.ml,
33
+ // feature/secrets/ (the vendored @voxgig/sekreto port, the voxgig/plugin
34
+ // host and the provider kinds - some forty modules of key-store,
35
+ // request-signing and child-process code that an SDK which never asked for
36
+ // secrets must not ship) and its shipped suite under test/feature/secrets/.
37
+ // Anything named here is EXCLUDED from the verbatim copy unless the model
38
+ // SELECTS the feature (see the Copy below). The lua and clojure targets gate
39
+ // their containers the same way (Main_lua.ts, Main_clojure.ts).
40
+ const CONTAINED = ['secrets']
25
41
 
26
42
 
27
43
  const Main = cmp(async function Main(props: any) {
@@ -30,6 +46,27 @@ const Main = cmp(async function Main(props: any) {
30
46
  const { model } = props.ctx$
31
47
 
32
48
  const entity: Record<string, ModelEntity> = getModelPath(model, `main.${KIT}.entity`)
49
+ // Gated by the applicability tags, so this target never names a feature
50
+ // it has no source for. One rule, one place: helpers/applicability.
51
+ const feature = targetFeatures(model, target)
52
+
53
+ // THE feature/<name>/ CONTAINER IS GATED HERE, at generate time - the
54
+ // top-level-container peer of the `srcFeatureExcludes` gate ts and js
55
+ // apply to src/feature/<name>/. `target add` keeps an unselected
56
+ // feature out of a project's tm/ in the first place (ocaml.aon has
57
+ // `feature: { trim: true }`); this covers a feature switched off after
58
+ // it was added, and the generator suite, which copies the whole scaffold
59
+ // tree. An inactive feature's vendored kind files go with it - every
60
+ // declared group's, not only the groups marked inactive, because
61
+ // pluginExcludes below walks only ACTIVE features (Main_c's
62
+ // inactivePluginExcludes, for the same reason one target over).
63
+ const containerExcludes = CONTAINED
64
+ .filter((name: string) => null == (feature as any)[name])
65
+ .flatMap((name: string) => [
66
+ new RegExp('(^|/)feature/' + name + '_feature\\.ml$'),
67
+ new RegExp('(^|/)feature/' + name + '/'),
68
+ new RegExp('(^|/)test/feature/' + name + '/'),
69
+ ])
33
70
 
34
71
  Package({ target })
35
72
 
@@ -42,15 +79,108 @@ const Main = cmp(async function Main(props: any) {
42
79
  // @voxgig/omni corpus engine) rides along verbatim - the replacements are
43
80
  // ProjectName-shaped and the port names nothing project-specific, so it
44
81
  // lands byte-identical to its recorded vendored.json digest.
82
+ //
83
+ // pluginExcludes: the generate-time plugin trim (an ACTIVE feature's
84
+ // INACTIVE plugin group's declared files stay out of the tree). The
85
+ // model's ocaml `path` entries are target-root-relative, which is this
86
+ // Copy's root - helpers/featureSource documents that getting the root
87
+ // wrong makes the trim a silent no-op. ocaml has `srcfeature: false`, so
88
+ // the per-feature Copy in cmp/Feature.ts - where pluginExcludesFor
89
+ // normally applies this trim - never runs for it, and this whole-tree
90
+ // Copy is the ONLY copy the target has (Main_go.ts precedent).
45
91
  Copy({
46
92
  from: 'tm/' + target.name,
47
93
  exclude: [/src\//, /\.(cmi|cmo|cmx|cma|cmxa|o|a)$/, /a\.out$/,
48
- /run_sdk_test$/, /run_omni_smoke$/, /run_struct_corpus$/, /run_primary_corpus$/],
94
+ /run_sdk_test$/, /run_omni_smoke$/, /run_struct_corpus$/, /run_primary_corpus$/,
95
+ ...containerExcludes, ...pluginExcludes(model)],
49
96
  replace: {
50
97
  ...props.ctx$.stdrep,
51
98
  }
52
99
  })
53
100
 
101
+ // THE BUILD SEAM: feature/secrets/feature.mk, GENERATED only when the
102
+ // model activates `secrets` for this target. It is what only the model
103
+ // knows and only a Makefile can say in OCaml - the module list in
104
+ // DEPENDENCY ORDER (ocamlc compiles a module before anything that uses
105
+ // it and has no link-time reordering, so a wildcard over the vendored
106
+ // directories would not build), the -I paths, unix.cma for the dotenv
107
+ // and file built-ins, the gated suite, and, ONLY when an active plugin
108
+ // group declares `needs.fetch`, the OpenSSL binding: plugins/tls_stubs.c
109
+ // compiled and linked with `-custom -cclib -lssl -cclib -lcrypto`. The
110
+ // template Makefile includes `$(wildcard feature/*/feature.mk)` - it names
111
+ // no feature itself - and every variable a fragment sets is empty without
112
+ // one, so an SDK without secrets - or with the built-in
113
+ // chain alone, or with `secretspec` alone - runs no C compiler and links
114
+ // no OpenSSL. The shape lua's native.mk and c's kinds.c take.
115
+ //
116
+ // The vendored stub opens with the vendoring tool's three-line `(* *)`
117
+ // provenance header (every file under tm/ocaml is stamped in ocaml's
118
+ // comment syntax; the guard holds that), which a C compiler cannot
119
+ // read - so the rule feeds the compiler from line four, as lua's does.
120
+ // Compiler line numbers are therefore three lower than in the file.
121
+ const build = secretsBuild(model, target)
122
+ if (null != build) {
123
+ Folder({ name: 'feature' }, () => {
124
+ Folder({ name: 'secrets' }, () => {
125
+ File({ name: 'feature.mk' }, () => {
126
+ Content(`# ${model.const.Name} SDK: the secrets feature build.
127
+ #
128
+ # GENERATED because the model activates \`secrets\` for this target
129
+ # (plugin groups: ${0 === build.groups.length ? 'none - the built-in kinds alone' : build.groups.join(', ')}).
130
+ # An SDK whose model does not has no such file, and its Makefile's optional
131
+ # include of it is a no-op: nothing of the feature is compiled. Do not
132
+ # hand-edit - change the model's plugin groups and regenerate.
133
+ #
134
+ # MODULE ORDER IS THE DEPENDENCY ORDER: the voxgig/plugin host, the sekreto
135
+ # core, the shared helpers the selected kinds open, the kinds, the feature.
136
+
137
+ FEATURE_INC = -I +unix -I feature -I feature/secrets/plugin \\
138
+ -I feature/secrets/sekreto -I feature/secrets/plugins
139
+ FEATURE_LIB = unix.cma
140
+
141
+ SECRETS_PLUGIN = ${build.plugin.join(' \\\n ')}
142
+
143
+ SECRETS_CORE = ${build.core.join(' \\\n ')}
144
+
145
+ SECRETS_HELPERS =${0 === build.helpers.length ? '' : ' ' + build.helpers.join(' \\\n ')}
146
+
147
+ SECRETS_KINDS =${0 === build.kinds.length ? '' : ' ' + build.kinds.join(' \\\n ')}
148
+
149
+ FEATURE_SRC = $(SECRETS_PLUGIN) $(SECRETS_CORE) $(SECRETS_HELPERS) $(SECRETS_KINDS) \\
150
+ feature/secrets_feature.ml
151
+
152
+ FEATURE_TESTS = test/feature/secrets/t_secrets.ml
153
+ `)
154
+
155
+ if (build.tls) {
156
+ Content(`
157
+ # THE ONE EXTERNAL DEPENDENCY, behind the plugin groups that need a
158
+ # transport (${build.tlsGroups.join(', ')}): plugins/tls.ml's externals live in
159
+ # plugins/tls_stubs.c against OpenSSL, so the stub is compiled here and the
160
+ # bytecode executables are linked \`-custom\` with libssl and libcrypto.
161
+ # The stub is fed from line four (past the provenance header, see above).
162
+ OCAMLLIB = $(shell $(OCAMLC) -where)
163
+ FEATURE_OBJ = feature/secrets/plugins/tls_stubs.o
164
+ FEATURE_LINK = -custom -cclib -lssl -cclib -lcrypto
165
+
166
+ feature/secrets/plugins/tls_stubs.o: feature/secrets/plugins/tls_stubs.c
167
+ @command -v $(CC) >/dev/null 2>&1 || { echo "secrets: a C compiler ($(CC)) is needed to build the OpenSSL binding that this SDK's secrets plugin kinds (${build.tlsGroups.join(', ')}) run - install one, or use only the built-in provider kinds" >&2; exit 1; }
168
+ tail -n +4 $< | $(CC) -std=c11 -O2 -Wall -Wextra -I$(OCAMLLIB) -x c - -c -o $@
169
+ `)
170
+ }
171
+ else {
172
+ Content(`
173
+ # No active plugin group needs a transport, so the OpenSSL binding is not
174
+ # compiled and nothing is linked beyond the OCaml distribution.
175
+ FEATURE_OBJ =
176
+ FEATURE_LINK =
177
+ `)
178
+ }
179
+ })
180
+ })
181
+ })
182
+ }
183
+
54
184
  // Generated API config + branded-error re-export.
55
185
  Config({ target })
56
186
  SdkError({ target })
@@ -109,6 +239,33 @@ let prepare (client : sdk_client) (fetchargs : value) : value =
109
239
  each(entity, (entity: ModelEntity) => {
110
240
  MainEntity({ target, entity })
111
241
  })
242
+
243
+ // Entity by NAME. DELIBERATE DIVERGENCE: OCaml has no dynamic dispatch
244
+ // over module names, so a caller that discovers entities from the config
245
+ // rather than naming a generated accessor - the shipped feature suites
246
+ // are templates and know no project's entity names - has no way to reach
247
+ // one without this. The go peer is the untyped interface go-cli/go-mcp
248
+ // dispatch through. None for a name this SDK did not generate.
249
+ const names = each(entity).map((e: ModelEntity) => e.name).sort()
250
+ if (0 === names.length) {
251
+ Content(`
252
+ (* Entity by name: this SDK generated no entities. *)
253
+ let entity (_client : sdk_client) (_name : string) (_entopts : value) : entity_obj option =
254
+ None
255
+ `)
256
+ }
257
+ else {
258
+ Content(`
259
+ (* Entity by name (None for a name this SDK did not generate). *)
260
+ let entity (client : sdk_client) (name : string) (entopts : value) : entity_obj option =
261
+ match name with
262
+ ${names.map((name: string) => {
263
+ const mod = entityModule(name)
264
+ const Mod = mod.charAt(0).toUpperCase() + mod.slice(1)
265
+ return ` | "${ocamlString(name)}" -> Some (${Mod}.make client entopts)\n`
266
+ }).join('')} | _ -> None
267
+ `)
268
+ }
112
269
  })
113
270
 
114
271
  })