@voxgig/sdkgen 4.8.3 → 4.10.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 (917) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/helpers/manifest.d.ts +2 -1
  3. package/dist/helpers/manifest.js +75 -1
  4. package/dist/helpers/manifest.js.map +1 -1
  5. package/dist/helpers/modelNames.d.ts +7 -0
  6. package/dist/helpers/modelNames.js +232 -0
  7. package/dist/helpers/modelNames.js.map +1 -0
  8. package/dist/helpers/naming.d.ts +2 -1
  9. package/dist/helpers/naming.js +45 -1
  10. package/dist/helpers/naming.js.map +1 -1
  11. package/dist/sdkgen.d.ts +3 -2
  12. package/dist/sdkgen.js +12 -3
  13. package/dist/sdkgen.js.map +1 -1
  14. package/dist/testkit.d.ts +2 -0
  15. package/dist/testkit.js +80 -24
  16. package/dist/testkit.js.map +1 -1
  17. package/dist/tsconfig.tsbuildinfo +1 -1
  18. package/dist/utility.js +17 -7
  19. package/dist/utility.js.map +1 -1
  20. package/package.json +1 -1
  21. package/project/.sdk/model/feature/secrets.aon +671 -0
  22. package/project/.sdk/model/target/clojure.aon +10 -0
  23. package/project/.sdk/model/target/csharp.aon +5 -0
  24. package/project/.sdk/model/target/elixir.aon +6 -0
  25. package/project/.sdk/model/target/java.aon +5 -0
  26. package/project/.sdk/model/target/js.aon +5 -0
  27. package/project/.sdk/model/target/kotlin.aon +7 -0
  28. package/project/.sdk/model/target/perl.aon +5 -0
  29. package/project/.sdk/model/target/php.aon +5 -0
  30. package/project/.sdk/model/target/rb.aon +5 -0
  31. package/project/.sdk/model/target/rust.aon +5 -0
  32. package/project/.sdk/model/target/scala.aon +38 -2
  33. package/project/.sdk/model/target/swift.aon +10 -0
  34. package/project/.sdk/model/target/zig.aon +9 -0
  35. package/project/.sdk/src/cmp/clojure/Config_clojure.ts +51 -4
  36. package/project/.sdk/src/cmp/clojure/Main_clojure.ts +43 -1
  37. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +17 -1
  38. package/project/.sdk/src/cmp/clojure/featureextra_clojure.ts +130 -0
  39. package/project/.sdk/src/cmp/csharp/Config_csharp.ts +70 -0
  40. package/project/.sdk/src/cmp/csharp/Main_csharp.ts +9 -1
  41. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +25 -1
  42. package/project/.sdk/src/cmp/elixir/Config_elixir.ts +68 -2
  43. package/project/.sdk/src/cmp/elixir/Main_elixir.ts +16 -0
  44. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +14 -1
  45. package/project/.sdk/src/cmp/java/Config_java.ts +84 -2
  46. package/project/.sdk/src/cmp/java/Main_java.ts +10 -1
  47. package/project/.sdk/src/cmp/js/Config_js.ts +75 -8
  48. package/project/.sdk/src/cmp/js/Main_js.ts +66 -2
  49. package/project/.sdk/src/cmp/js/fragment/Config.data.fragment.js +18 -1
  50. package/project/.sdk/src/cmp/js/fragment/Config.fragment.js +18 -1
  51. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +7 -0
  52. package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +63 -1
  53. package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +32 -2
  54. package/project/.sdk/src/cmp/perl/Config_perl.ts +129 -3
  55. package/project/.sdk/src/cmp/perl/Main_perl.ts +41 -1
  56. package/project/.sdk/src/cmp/perl/Package_perl.ts +13 -1
  57. package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +1 -0
  58. package/project/.sdk/src/cmp/php/Config_php.ts +105 -1
  59. package/project/.sdk/src/cmp/php/Gitignore_php.ts +4 -2
  60. package/project/.sdk/src/cmp/php/Main_php.ts +16 -1
  61. package/project/.sdk/src/cmp/rb/Config_rb.ts +92 -2
  62. package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +11 -1
  63. package/project/.sdk/src/cmp/rb/Main_rb.ts +7 -1
  64. package/project/.sdk/src/cmp/rust/Main_rust.ts +99 -1
  65. package/project/.sdk/src/cmp/rust/Package_rust.ts +72 -6
  66. package/project/.sdk/src/cmp/scala/Config_scala.ts +44 -0
  67. package/project/.sdk/src/cmp/scala/Main_scala.ts +68 -1
  68. package/project/.sdk/src/cmp/swift/Config_swift.ts +62 -1
  69. package/project/.sdk/src/cmp/swift/Main_swift.ts +35 -1
  70. package/project/.sdk/src/cmp/swift/Package_swift.ts +81 -11
  71. package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +58 -44
  72. package/project/.sdk/src/cmp/swift/utility_swift.ts +22 -0
  73. package/project/.sdk/src/cmp/zig/Package_zig.ts +15 -11
  74. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +3 -3
  75. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +3 -3
  76. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +3 -3
  77. package/project/.sdk/src/cmp/zig/utility_zig.ts +50 -1
  78. package/project/.sdk/tm/c/tests/vendor/omni/json.c +2 -2
  79. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +2 -2
  80. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +2 -2
  81. package/project/.sdk/tm/c/tests/vendor/omni/util.c +2 -2
  82. package/project/.sdk/tm/clojure/Makefile +3 -0
  83. package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +503 -0
  84. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +84 -0
  85. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +44 -0
  86. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +240 -0
  87. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +199 -0
  88. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +111 -0
  89. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +46 -0
  90. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +122 -0
  91. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +1018 -0
  92. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +106 -0
  93. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +157 -0
  94. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +77 -0
  95. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +92 -0
  96. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +46 -0
  97. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +177 -0
  98. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +90 -0
  99. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +40 -0
  100. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +111 -0
  101. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +297 -0
  102. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +192 -0
  103. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +261 -0
  104. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +165 -0
  105. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +111 -0
  106. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +107 -0
  107. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +61 -0
  108. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +88 -0
  109. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +115 -0
  110. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +214 -0
  111. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +80 -0
  112. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +93 -0
  113. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +63 -0
  114. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +99 -0
  115. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +142 -0
  116. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +25 -0
  117. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +196 -0
  118. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +113 -0
  119. package/project/.sdk/tm/clojure/src/sdk/core.clj +9 -0
  120. package/project/.sdk/tm/clojure/src/sdk/features.clj +13 -1
  121. package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +547 -0
  122. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +103 -14
  123. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +2 -2
  124. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +2 -2
  125. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +2 -2
  126. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +2 -2
  127. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +2 -2
  128. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +2 -2
  129. package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +889 -0
  130. package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +196 -0
  131. package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +70 -0
  132. package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +505 -0
  133. package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +52 -0
  134. package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +285 -0
  135. package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +55 -0
  136. package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +228 -0
  137. package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +102 -0
  138. package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +256 -0
  139. package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +1379 -0
  140. package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +177 -0
  141. package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +326 -0
  142. package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +295 -0
  143. package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +113 -0
  144. package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +177 -0
  145. package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +198 -0
  146. package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +95 -0
  147. package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +351 -0
  148. package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +196 -0
  149. package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +325 -0
  150. package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +195 -0
  151. package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +192 -0
  152. package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +75 -0
  153. package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +112 -0
  154. package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +167 -0
  155. package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +221 -0
  156. package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +213 -0
  157. package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +155 -0
  158. package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +169 -0
  159. package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +172 -0
  160. package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +240 -0
  161. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +192 -0
  162. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +503 -0
  163. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +775 -0
  164. package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +1702 -0
  165. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +2 -2
  166. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +2 -2
  167. package/project/.sdk/tm/csharp/utility/MakeOptions.cs +10 -0
  168. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +1 -1
  169. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +118 -0
  170. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +56 -0
  171. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +320 -0
  172. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +205 -0
  173. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +166 -0
  174. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +13 -0
  175. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +73 -0
  176. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +185 -0
  177. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +1182 -0
  178. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +139 -0
  179. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +132 -0
  180. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +179 -0
  181. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +99 -0
  182. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +129 -0
  183. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +59 -0
  184. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +190 -0
  185. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +136 -0
  186. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +42 -0
  187. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +368 -0
  188. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +257 -0
  189. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +160 -0
  190. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +127 -0
  191. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +96 -0
  192. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +124 -0
  193. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +162 -0
  194. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +627 -0
  195. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +134 -0
  196. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +125 -0
  197. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +152 -0
  198. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +80 -0
  199. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +101 -0
  200. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +176 -0
  201. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +67 -0
  202. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +536 -0
  203. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +662 -0
  204. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +824 -0
  205. package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +1072 -0
  206. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +2 -2
  207. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +2 -2
  208. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +2 -2
  209. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +1 -1
  210. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +1 -1
  211. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +1 -1
  212. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +1 -1
  213. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +1 -1
  214. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +1 -1
  215. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
  216. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1 -1
  217. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +1 -1
  218. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +1 -1
  219. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +1 -1
  220. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +1 -1
  221. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +1 -1
  222. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +1 -1
  223. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +1 -1
  224. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +4 -4
  225. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +2 -2
  226. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +2 -2
  227. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +2 -2
  228. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +2 -2
  229. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +2 -2
  230. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +4 -5
  231. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +3 -3
  232. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +3 -4
  233. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +2 -2
  234. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +2 -2
  235. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +2 -2
  236. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +5 -2
  237. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +31 -2
  238. package/project/.sdk/tm/go/feature/secrets_feature.go +16 -0
  239. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +123 -0
  240. package/project/.sdk/tm/go/test/omni/omni.go +8 -3
  241. package/project/.sdk/tm/go/test/omni/util.go +25 -4
  242. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +1 -1
  243. package/project/.sdk/tm/java/feature/SecretsFeature.java +766 -0
  244. package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +181 -0
  245. package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +64 -0
  246. package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +433 -0
  247. package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +54 -0
  248. package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +292 -0
  249. package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +49 -0
  250. package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +204 -0
  251. package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +93 -0
  252. package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +244 -0
  253. package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +1196 -0
  254. package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +173 -0
  255. package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +339 -0
  256. package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +274 -0
  257. package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +94 -0
  258. package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +37 -0
  259. package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +172 -0
  260. package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +171 -0
  261. package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +89 -0
  262. package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +232 -0
  263. package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +198 -0
  264. package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +142 -0
  265. package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +229 -0
  266. package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +302 -0
  267. package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +21 -0
  268. package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +698 -0
  269. package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +100 -0
  270. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +294 -0
  271. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +164 -0
  272. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +161 -0
  273. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +103 -0
  274. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +143 -0
  275. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +186 -0
  276. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +192 -0
  277. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +139 -0
  278. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +143 -0
  279. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +80 -0
  280. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +138 -0
  281. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +243 -0
  282. package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +986 -0
  283. package/project/.sdk/tm/java/test/vendor/omni/Json.java +2 -2
  284. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +2 -2
  285. package/project/.sdk/tm/java/test/vendor/omni/Util.java +2 -2
  286. package/project/.sdk/tm/java/utility/MakeOptions.java +7 -0
  287. package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
  288. package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +431 -0
  289. package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +119 -0
  290. package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +42 -0
  291. package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +323 -0
  292. package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +196 -0
  293. package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +120 -0
  294. package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +48 -0
  295. package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +150 -0
  296. package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +949 -0
  297. package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +35 -0
  298. package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +165 -0
  299. package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +94 -0
  300. package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +106 -0
  301. package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +59 -0
  302. package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +79 -0
  303. package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +100 -0
  304. package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +574 -0
  305. package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +56 -0
  306. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +188 -0
  307. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +135 -0
  308. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +128 -0
  309. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +67 -0
  310. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +115 -0
  311. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +139 -0
  312. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +93 -0
  313. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +99 -0
  314. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +111 -0
  315. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +105 -0
  316. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +157 -0
  317. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +119 -0
  318. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +39 -0
  319. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +40 -0
  320. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +21 -0
  321. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +42 -0
  322. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +18 -0
  323. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +151 -0
  324. package/project/.sdk/tm/js/src/utility/StructUtility.js +2 -2
  325. package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +946 -0
  326. package/project/.sdk/tm/js/test/vendor/omni/index.js +1 -1
  327. package/project/.sdk/tm/js/test/vendor/omni/runner.js +18 -3
  328. package/project/.sdk/tm/js/test/vendor/omni/util.js +25 -8
  329. package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +659 -0
  330. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +117 -0
  331. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +40 -0
  332. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +322 -0
  333. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +227 -0
  334. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +163 -0
  335. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +57 -0
  336. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +179 -0
  337. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +1131 -0
  338. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +241 -0
  339. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +180 -0
  340. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +64 -0
  341. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +124 -0
  342. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +125 -0
  343. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +66 -0
  344. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +171 -0
  345. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +132 -0
  346. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +359 -0
  347. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +21 -0
  348. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +308 -0
  349. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +525 -0
  350. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +126 -0
  351. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +205 -0
  352. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +251 -0
  353. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +145 -0
  354. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +130 -0
  355. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +77 -0
  356. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +119 -0
  357. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +156 -0
  358. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +219 -0
  359. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +114 -0
  360. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +114 -0
  361. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +118 -0
  362. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +220 -0
  363. package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +1148 -0
  364. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +2 -2
  365. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +2 -2
  366. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +2 -2
  367. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
  368. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +2 -2
  369. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +2 -2
  370. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +2 -2
  371. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +2 -2
  372. package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
  373. package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
  374. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
  375. package/project/.sdk/tm/perl/Makefile +6 -1
  376. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +141 -0
  377. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +65 -0
  378. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +346 -0
  379. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +216 -0
  380. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +176 -0
  381. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +59 -0
  382. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +157 -0
  383. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +1139 -0
  384. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +187 -0
  385. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +100 -0
  386. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +119 -0
  387. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +71 -0
  388. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +251 -0
  389. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +122 -0
  390. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +70 -0
  391. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +263 -0
  392. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +159 -0
  393. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +180 -0
  394. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +92 -0
  395. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +138 -0
  396. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +213 -0
  397. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +173 -0
  398. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +132 -0
  399. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +132 -0
  400. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +102 -0
  401. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +132 -0
  402. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +190 -0
  403. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +124 -0
  404. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +301 -0
  405. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +605 -0
  406. package/project/.sdk/tm/perl/feature/secrets_feature.pm +675 -0
  407. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
  408. package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +957 -0
  409. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +1 -1
  410. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +1 -1
  411. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +1 -1
  412. package/project/.sdk/tm/php/feature/SecretsFeature.php +670 -0
  413. package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +226 -0
  414. package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +75 -0
  415. package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +444 -0
  416. package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +262 -0
  417. package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +202 -0
  418. package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +74 -0
  419. package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +195 -0
  420. package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +1514 -0
  421. package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +260 -0
  422. package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +129 -0
  423. package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +169 -0
  424. package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +79 -0
  425. package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +348 -0
  426. package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +163 -0
  427. package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +40 -0
  428. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +274 -0
  429. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +170 -0
  430. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +163 -0
  431. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +106 -0
  432. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +144 -0
  433. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +194 -0
  434. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +113 -0
  435. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +131 -0
  436. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +150 -0
  437. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +101 -0
  438. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +146 -0
  439. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +161 -0
  440. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +129 -0
  441. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +322 -0
  442. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +724 -0
  443. package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +1067 -0
  444. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +2 -2
  445. package/project/.sdk/tm/php/test/vendor/omni/Util.php +2 -2
  446. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +1 -1
  447. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +1 -1
  448. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +1 -1
  449. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +1 -1
  450. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +1 -1
  451. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +1 -1
  452. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +1 -1
  453. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +1 -1
  454. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1 -1
  455. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
  456. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
  457. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
  458. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
  459. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
  460. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
  461. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +4 -2
  462. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
  463. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +3 -3
  464. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
  465. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
  466. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
  467. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
  468. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +3 -4
  469. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
  470. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +4 -6
  471. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +1 -1
  472. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +1 -1
  473. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +1 -1
  474. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +1 -1
  475. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +21 -1
  476. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
  477. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
  478. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +16 -2
  479. package/project/.sdk/tm/py/test/voxgig_omni/util.py +27 -12
  480. package/project/.sdk/tm/rb/Makefile +7 -1
  481. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +118 -0
  482. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +55 -0
  483. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +315 -0
  484. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +197 -0
  485. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +143 -0
  486. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +52 -0
  487. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +147 -0
  488. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +1079 -0
  489. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +169 -0
  490. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +93 -0
  491. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +112 -0
  492. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +56 -0
  493. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +99 -0
  494. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +106 -0
  495. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +24 -0
  496. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +111 -0
  497. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +200 -0
  498. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +130 -0
  499. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +121 -0
  500. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +66 -0
  501. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +107 -0
  502. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +137 -0
  503. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +136 -0
  504. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +97 -0
  505. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +104 -0
  506. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +113 -0
  507. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +127 -0
  508. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +210 -0
  509. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +465 -0
  510. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +30 -0
  511. package/project/.sdk/tm/rb/feature/secrets_feature.rb +561 -0
  512. package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +842 -0
  513. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +2 -2
  514. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +2 -2
  515. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +2 -2
  516. package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +130 -0
  517. package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +114 -0
  518. package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +416 -0
  519. package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +245 -0
  520. package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +200 -0
  521. package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +90 -0
  522. package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +231 -0
  523. package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +1565 -0
  524. package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +18 -0
  525. package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +226 -0
  526. package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +137 -0
  527. package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +148 -0
  528. package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +83 -0
  529. package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +132 -0
  530. package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +433 -0
  531. package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +174 -0
  532. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +146 -0
  533. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +230 -0
  534. package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +328 -0
  535. package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +184 -0
  536. package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +172 -0
  537. package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +102 -0
  538. package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +153 -0
  539. package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +228 -0
  540. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +537 -0
  541. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +300 -0
  542. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +137 -0
  543. package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +148 -0
  544. package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +165 -0
  545. package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +150 -0
  546. package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +144 -0
  547. package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +51 -0
  548. package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +637 -0
  549. package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +677 -0
  550. package/project/.sdk/tm/rust/feature/secrets.rs +961 -0
  551. package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +1509 -0
  552. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +2 -2
  553. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +2 -2
  554. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +2 -2
  555. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +2 -2
  556. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +2 -2
  557. package/project/.sdk/tm/scala/Makefile +8 -3
  558. package/project/.sdk/tm/scala/feature/SecretsFeature.scala +556 -0
  559. package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +96 -0
  560. package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +270 -0
  561. package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +216 -0
  562. package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +144 -0
  563. package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +59 -0
  564. package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +149 -0
  565. package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +1089 -0
  566. package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +156 -0
  567. package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +169 -0
  568. package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +47 -0
  569. package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +107 -0
  570. package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +131 -0
  571. package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +53 -0
  572. package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +110 -0
  573. package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +157 -0
  574. package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +136 -0
  575. package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +302 -0
  576. package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +20 -0
  577. package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +281 -0
  578. package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +473 -0
  579. package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +123 -0
  580. package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +216 -0
  581. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +225 -0
  582. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +124 -0
  583. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +104 -0
  584. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +68 -0
  585. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +97 -0
  586. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +131 -0
  587. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +209 -0
  588. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +98 -0
  589. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +90 -0
  590. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +95 -0
  591. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +214 -0
  592. package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +971 -0
  593. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +2 -2
  594. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +2 -2
  595. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +2 -2
  596. package/project/.sdk/tm/scala/utility/Make.scala +7 -0
  597. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +669 -0
  598. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +98 -0
  599. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +87 -0
  600. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +298 -0
  601. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +209 -0
  602. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +191 -0
  603. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +63 -0
  604. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +158 -0
  605. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +1141 -0
  606. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +192 -0
  607. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +183 -0
  608. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +130 -0
  609. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +141 -0
  610. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +59 -0
  611. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +125 -0
  612. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +198 -0
  613. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +139 -0
  614. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +271 -0
  615. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +173 -0
  616. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +139 -0
  617. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +198 -0
  618. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +86 -0
  619. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +129 -0
  620. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +175 -0
  621. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +310 -0
  622. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +140 -0
  623. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +118 -0
  624. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +105 -0
  625. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +111 -0
  626. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +297 -0
  627. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +120 -0
  628. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +452 -0
  629. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +25 -0
  630. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +689 -0
  631. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +755 -0
  632. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +9 -0
  633. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +30 -0
  634. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/feature/secrets/SecretsFeatureTest.swift +1030 -0
  635. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +2 -2
  636. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +2 -2
  637. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +2 -2
  638. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +1 -1
  639. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +1 -1
  640. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +1 -1
  641. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +1 -1
  642. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +1 -1
  643. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +1 -1
  644. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +1 -1
  645. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +1 -1
  646. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1 -1
  647. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +1 -1
  648. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +1 -1
  649. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +1 -1
  650. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +1 -1
  651. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +1 -1
  652. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +1 -1
  653. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +1 -1
  654. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +1 -1
  655. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +1 -1
  656. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/aws.ts +1 -1
  657. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/azuresecrets.ts +1 -1
  658. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/boru.ts +1 -1
  659. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/doppler.ts +1 -1
  660. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/gcpsecrets.ts +1 -1
  661. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/hashicorp.ts +1 -1
  662. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +1 -1
  663. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/infisical.ts +1 -1
  664. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/onepassword.ts +1 -1
  665. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +1 -1
  666. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/sigv4.ts +1 -1
  667. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +1 -1
  668. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +1 -1
  669. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +1 -1
  670. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +1 -1
  671. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +1 -1
  672. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +1 -1
  673. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +1 -1
  674. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +2 -2
  675. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +1 -1
  676. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +1 -1
  677. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
  678. package/project/.sdk/tm/zig/Makefile +15 -1
  679. package/project/.sdk/tm/zig/build.zig +23 -5
  680. package/project/.sdk/tm/zig/core/helpers.zig +52 -11
  681. package/project/.sdk/tm/zig/core/mem.zig +17 -1
  682. package/project/.sdk/tm/zig/core/utility.zig +23 -19
  683. package/project/.sdk/tm/zig/feature/audit.zig +2 -2
  684. package/project/.sdk/tm/zig/feature/cache.zig +2 -2
  685. package/project/.sdk/tm/zig/feature/debug.zig +5 -5
  686. package/project/.sdk/tm/zig/feature/netsim.zig +2 -2
  687. package/project/.sdk/tm/zig/feature/paging.zig +2 -2
  688. package/project/.sdk/tm/zig/feature/proxy.zig +15 -8
  689. package/project/.sdk/tm/zig/feature/streaming.zig +5 -5
  690. package/project/.sdk/tm/zig/feature/support.zig +3 -3
  691. package/project/.sdk/tm/zig/feature/telemetry.zig +5 -5
  692. package/project/.sdk/tm/zig/feature/test.zig +10 -5
  693. package/project/.sdk/tm/zig/test/fh.zig +10 -10
  694. package/project/.sdk/tm/zig/test/gotcha_test.zig +5 -5
  695. package/project/.sdk/tm/zig/test/omniresolver.zig +515 -0
  696. package/project/.sdk/tm/zig/test/omnismoke_test.zig +284 -0
  697. package/project/.sdk/tm/zig/test/pipeline_test.zig +8 -8
  698. package/project/.sdk/tm/zig/test/primary_utility_test.zig +144 -154
  699. package/project/.sdk/tm/zig/test/struct_corpus.zig +264 -187
  700. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1314 -0
  701. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +446 -0
  702. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +7 -4
  703. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +356 -157
  704. package/project/sdkgen-package.json +1 -4
  705. package/src/helpers/manifest.ts +81 -1
  706. package/src/helpers/modelNames.ts +284 -0
  707. package/src/helpers/naming.ts +45 -1
  708. package/src/sdkgen.ts +11 -1
  709. package/src/testkit.ts +115 -26
  710. package/src/utility.ts +17 -7
  711. package/project/.sdk/model/target/dart.aon +0 -58
  712. package/project/.sdk/model/target/lean.aon +0 -91
  713. package/project/.sdk/model/target/seneca-provider.aon +0 -120
  714. package/project/.sdk/src/cmp/dart/Config_dart.ts +0 -176
  715. package/project/.sdk/src/cmp/dart/EntityBase_dart.ts +0 -34
  716. package/project/.sdk/src/cmp/dart/EntityOperation_dart.ts +0 -43
  717. package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +0 -207
  718. package/project/.sdk/src/cmp/dart/Entity_dart.ts +0 -87
  719. package/project/.sdk/src/cmp/dart/Gitignore_dart.ts +0 -34
  720. package/project/.sdk/src/cmp/dart/MainEntity_dart.ts +0 -33
  721. package/project/.sdk/src/cmp/dart/Main_dart.ts +0 -106
  722. package/project/.sdk/src/cmp/dart/Package_dart.ts +0 -82
  723. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +0 -177
  724. package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +0 -238
  725. package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +0 -53
  726. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +0 -152
  727. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +0 -59
  728. package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +0 -65
  729. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +0 -151
  730. package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +0 -63
  731. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +0 -225
  732. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +0 -397
  733. package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +0 -24
  734. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +0 -106
  735. package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +0 -78
  736. package/project/.sdk/src/cmp/dart/SdkError_dart.ts +0 -42
  737. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +0 -516
  738. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +0 -628
  739. package/project/.sdk/src/cmp/dart/Test_dart.ts +0 -116
  740. package/project/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +0 -79
  741. package/project/.sdk/src/cmp/dart/fragment/Config.fragment.dart +0 -51
  742. package/project/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +0 -25
  743. package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +0 -29
  744. package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +0 -28
  745. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +0 -302
  746. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +0 -98
  747. package/project/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +0 -90
  748. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +0 -102
  749. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +0 -108
  750. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +0 -102
  751. package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +0 -338
  752. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +0 -26
  753. package/project/.sdk/src/cmp/dart/tsconfig.json +0 -15
  754. package/project/.sdk/src/cmp/dart/utility_dart.ts +0 -155
  755. package/project/.sdk/src/cmp/lean/Config_lean.ts +0 -93
  756. package/project/.sdk/src/cmp/lean/Entity_lean.ts +0 -9
  757. package/project/.sdk/src/cmp/lean/Gitignore_lean.ts +0 -18
  758. package/project/.sdk/src/cmp/lean/Main_lean.ts +0 -120
  759. package/project/.sdk/src/cmp/lean/Package_lean.ts +0 -93
  760. package/project/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +0 -29
  761. package/project/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +0 -19
  762. package/project/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +0 -25
  763. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +0 -39
  764. package/project/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +0 -25
  765. package/project/.sdk/src/cmp/lean/ReadmeModel_lean.ts +0 -24
  766. package/project/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +0 -22
  767. package/project/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +0 -50
  768. package/project/.sdk/src/cmp/lean/ReadmeRef_lean.ts +0 -40
  769. package/project/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +0 -16
  770. package/project/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +0 -23
  771. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +0 -19
  772. package/project/.sdk/src/cmp/lean/Test_lean.ts +0 -261
  773. package/project/.sdk/src/cmp/lean/utility_lean.ts +0 -129
  774. package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +0 -4080
  775. package/project/.sdk/src/cmp/seneca-provider/Gitignore_seneca-provider.ts +0 -161
  776. package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +0 -1011
  777. package/project/.sdk/tm/dart/LICENSE +0 -22
  778. package/project/.sdk/tm/dart/Makefile +0 -50
  779. package/project/.sdk/tm/dart/lib/Context.dart +0 -150
  780. package/project/.sdk/tm/dart/lib/Control.dart +0 -15
  781. package/project/.sdk/tm/dart/lib/Operation.dart +0 -31
  782. package/project/.sdk/tm/dart/lib/Point.dart +0 -51
  783. package/project/.sdk/tm/dart/lib/Response.dart +0 -32
  784. package/project/.sdk/tm/dart/lib/Result.dart +0 -39
  785. package/project/.sdk/tm/dart/lib/Spec.dart +0 -49
  786. package/project/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +0 -103
  787. package/project/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +0 -76
  788. package/project/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +0 -152
  789. package/project/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +0 -104
  790. package/project/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +0 -446
  791. package/project/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +0 -153
  792. package/project/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +0 -92
  793. package/project/.sdk/tm/dart/lib/feature/log/LogFeature.dart +0 -85
  794. package/project/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +0 -103
  795. package/project/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +0 -186
  796. package/project/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +0 -240
  797. package/project/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +0 -118
  798. package/project/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +0 -103
  799. package/project/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +0 -121
  800. package/project/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +0 -155
  801. package/project/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +0 -97
  802. package/project/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +0 -136
  803. package/project/.sdk/tm/dart/lib/feature/test/TestFeature.dart +0 -328
  804. package/project/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +0 -104
  805. package/project/.sdk/tm/dart/lib/utility/CleanUtility.dart +0 -12
  806. package/project/.sdk/tm/dart/lib/utility/DoneUtility.dart +0 -18
  807. package/project/.sdk/tm/dart/lib/utility/ErrUtility.dart +0 -46
  808. package/project/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +0 -35
  809. package/project/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +0 -20
  810. package/project/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +0 -9
  811. package/project/.sdk/tm/dart/lib/utility/FetcherUtility.dart +0 -104
  812. package/project/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +0 -162
  813. package/project/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +0 -6
  814. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +0 -71
  815. package/project/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +0 -42
  816. package/project/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +0 -233
  817. package/project/.sdk/tm/dart/lib/utility/MakePointUtility.dart +0 -130
  818. package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +0 -66
  819. package/project/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +0 -59
  820. package/project/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +0 -49
  821. package/project/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +0 -77
  822. package/project/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +0 -51
  823. package/project/.sdk/tm/dart/lib/utility/ParamUtility.dart +0 -56
  824. package/project/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +0 -46
  825. package/project/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +0 -19
  826. package/project/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +0 -11
  827. package/project/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +0 -30
  828. package/project/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +0 -23
  829. package/project/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +0 -9
  830. package/project/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +0 -18
  831. package/project/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +0 -29
  832. package/project/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +0 -15
  833. package/project/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +0 -18
  834. package/project/.sdk/tm/dart/lib/utility/StructUtility.dart +0 -127
  835. package/project/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +0 -28
  836. package/project/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +0 -44
  837. package/project/.sdk/tm/dart/lib/utility/Utility.dart +0 -239
  838. package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +0 -2462
  839. package/project/.sdk/tm/dart/src/feature/README.md +0 -3
  840. package/project/.sdk/tm/dart/src/feature/proxy/.gitkeep +0 -0
  841. package/project/.sdk/tm/dart/src/feature/ratelimit/.gitkeep +0 -0
  842. package/project/.sdk/tm/dart/src/feature/rbac/.gitkeep +0 -0
  843. package/project/.sdk/tm/dart/src/feature/retry/.gitkeep +0 -0
  844. package/project/.sdk/tm/dart/src/feature/streaming/.gitkeep +0 -0
  845. package/project/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
  846. package/project/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
  847. package/project/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
  848. package/project/.sdk/tm/dart/test/custom_test.dart +0 -65
  849. package/project/.sdk/tm/dart/test/exists_test.dart +0 -12
  850. package/project/.sdk/tm/dart/test/feature/harness.dart +0 -329
  851. package/project/.sdk/tm/dart/test/feature_test.dart +0 -1193
  852. package/project/.sdk/tm/dart/test/harness.dart +0 -153
  853. package/project/.sdk/tm/dart/test/netsim_test.dart +0 -48
  854. package/project/.sdk/tm/dart/test/omni.dart +0 -520
  855. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +0 -143
  856. package/project/.sdk/tm/dart/test/pipeline_test.dart +0 -608
  857. package/project/.sdk/tm/dart/test/primary_test.dart +0 -476
  858. package/project/.sdk/tm/dart/test/sdk-test-control.json +0 -19
  859. package/project/.sdk/tm/dart/test/struct_test.dart +0 -468
  860. package/project/.sdk/tm/dart/test/utility.dart +0 -198
  861. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +0 -7
  862. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +0 -653
  863. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +0 -232
  864. package/project/.sdk/tm/lean/LICENSE +0 -21
  865. package/project/.sdk/tm/lean/Makefile +0 -32
  866. package/project/.sdk/tm/lean/VERSION +0 -1
  867. package/project/.sdk/tm/lean/src/SdkFeature.lean +0 -171
  868. package/project/.sdk/tm/lean/src/SdkFeatures.lean +0 -787
  869. package/project/.sdk/tm/lean/src/SdkJson.lean +0 -134
  870. package/project/.sdk/tm/lean/src/SdkRuntime.lean +0 -374
  871. package/project/.sdk/tm/lean/src/SdkUtility.lean +0 -809
  872. package/project/.sdk/tm/lean/src/VoxgigStruct.lean +0 -2880
  873. package/project/.sdk/tm/lean/src/Vregex.lean +0 -412
  874. package/project/.sdk/tm/lean/src/feature/README.md +0 -5
  875. package/project/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
  876. package/project/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
  877. package/project/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
  878. package/project/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
  879. package/project/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
  880. package/project/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
  881. package/project/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
  882. package/project/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
  883. package/project/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
  884. package/project/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
  885. package/project/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
  886. package/project/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
  887. package/project/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
  888. package/project/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
  889. package/project/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
  890. package/project/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
  891. package/project/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
  892. package/project/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
  893. package/project/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
  894. package/project/.sdk/tm/lean/test/OmniResolver.lean +0 -358
  895. package/project/.sdk/tm/lean/test/OmniSmoke.lean +0 -174
  896. package/project/.sdk/tm/lean/test/StructCorpus.lean +0 -368
  897. package/project/.sdk/tm/lean/test/TFeature.lean +0 -281
  898. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +0 -227
  899. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +0 -997
  900. package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +0 -132
  901. package/project/.sdk/tm/seneca-provider/LICENSE +0 -21
  902. package/project/.sdk/tm/seneca-provider/Makefile +0 -15
  903. package/project/.sdk/tm/seneca-provider/src/tsconfig.json +0 -18
  904. package/project/.sdk/tm/seneca-provider/test/tsconfig.json +0 -16
  905. package/project/.sdk/tm/seneca-provider/tsfmt.json +0 -3
  906. package/project/.sdk/tm/zig/test/struct_runner.zig +0 -465
  907. /package/project/.sdk/tm/{dart/src/feature/audit → clojure/src/feature/secrets}/.gitkeep +0 -0
  908. /package/project/.sdk/tm/{dart/src/feature/base → csharp/src/feature/secrets}/.gitkeep +0 -0
  909. /package/project/.sdk/tm/{dart/src/feature/cache → elixir/src/feature/secrets}/.gitkeep +0 -0
  910. /package/project/.sdk/tm/{dart/src/feature/clienttrack → java/src/feature/secrets}/.gitkeep +0 -0
  911. /package/project/.sdk/tm/{dart/src/feature/cost → kotlin/src/feature/secrets}/.gitkeep +0 -0
  912. /package/project/.sdk/tm/{dart/src/feature/debug → perl/src/feature/secrets}/.gitkeep +0 -0
  913. /package/project/.sdk/tm/{dart/src/feature/idempotency → php/src/feature/secrets}/.gitkeep +0 -0
  914. /package/project/.sdk/tm/{dart/src/feature/log → rb/src/feature/secrets}/.gitkeep +0 -0
  915. /package/project/.sdk/tm/{dart/src/feature/metrics → rust/src/feature/secrets}/.gitkeep +0 -0
  916. /package/project/.sdk/tm/{dart/src/feature/netsim → scala/src/feature/secrets}/.gitkeep +0 -0
  917. /package/project/.sdk/tm/{dart/src/feature/paging → swift/src/feature/secrets}/.gitkeep +0 -0
@@ -0,0 +1,1702 @@
1
+ // Behavioural tests for the secrets feature (vendored @voxgig/sekreto) -
2
+ // the csharp port of tm/ts/test/feature/secrets/Secrets.test.ts and
3
+ // tm/go/test/feature/secrets/secrets_feature_test.go.
4
+ //
5
+ // The contract under test: the `apikey` OPTION keeps its exact old meaning
6
+ // and always wins, because SecretsFeature places it FIRST in the provider
7
+ // chain (a `memory` store named `options`) - explicit-beats-lookup falls
8
+ // out of sekreto's first-hit rule rather than from special-case logic.
9
+ // With the feature inactive nothing changes at all. With it active and the
10
+ // option unset, the chain (env, dotenv, a custom provider, a vault)
11
+ // supplies the credential instead.
12
+ //
13
+ // This file lives in the test `feature/` container on purpose: `target add`
14
+ // trims it, along with the feature source and the vendored library, for a
15
+ // project whose model does not select `secrets`.
16
+ //
17
+ // WHAT MAKES THESE TESTS ABLE TO FAIL, which is the whole point of the
18
+ // file. Every fail-closed case is driven through a LIVE client with a
19
+ // recording `system.fetch`, so the thing being counted IS the transport.
20
+ // A previous tranche shipped fail-closed tests built on the offline test
21
+ // harness, whose mock transport REPLACES the fetcher - so the counter they
22
+ // asserted on was never reached, and "no request went out" was true for a
23
+ // healthy SDK carrying no secrets feature at all. Here:
24
+ //
25
+ // * the assertion is on a recorder hung off `system.fetch`;
26
+ // * the failure is matched on the PROVIDER'S OWN message, so an
27
+ // unrelated failure (a blocked op, a missing route) cannot stand in
28
+ // for fail-closed;
29
+ // * and every fail-closed case carries a CONTROL leg - the same
30
+ // construction with a WORKING provider, which must reach that same
31
+ // transport exactly once, carrying the credential. Only then does a
32
+ // zero mean REFUSED rather than UNWIRED.
33
+ //
34
+ // The feature is CONSTRUCTED DIRECTLY and handed in through the `extend`
35
+ // option when the generated config did not already install it, so these
36
+ // tests hold in any generated tree - whether or not the project's model
37
+ // activated the feature.
38
+
39
+ using System.Net;
40
+ using System.Reflection;
41
+ using System.Text;
42
+ using System.Text.Json;
43
+
44
+ using Voxgig.Struct;
45
+ using Xunit;
46
+
47
+ using Voxgig.Sekreto;
48
+
49
+ using ProjectNameSdk;
50
+ using ProjectNameSdk.Feature;
51
+
52
+ namespace ProjectNameSdk.Test.Secrets;
53
+
54
+ // --- support ---------------------------------------------------------------
55
+
56
+ // A source of secrets built in code: sekreto's IProvider is two methods,
57
+ // and Sekreto's constructor takes a live instance directly.
58
+ internal class ProbeProvider : IProvider
59
+ {
60
+ public Func<string, string?> Fn = _ => null;
61
+ public List<string> Asked = new();
62
+
63
+ public string Lookup(string name)
64
+ {
65
+ lock (Asked)
66
+ {
67
+ Asked.Add(name);
68
+ }
69
+ return Fn(name)!;
70
+ }
71
+
72
+ public string Describe() => "probe:test";
73
+ }
74
+
75
+ // One recorded request, as the transport saw it.
76
+ internal class WireCall
77
+ {
78
+ public string Url = "";
79
+ public string Auth = "";
80
+ public bool HasAuth;
81
+ public string Body = "";
82
+ }
83
+
84
+ // The recording transport: `system.fetch` for a LIVE client. It scripts one
85
+ // status per API call (the last repeating) and answers the exchange's token
86
+ // endpoint separately, so a case can say "401 then 200" without counting
87
+ // calls itself.
88
+ internal class Wire
89
+ {
90
+ private readonly object _mu = new();
91
+
92
+ public List<WireCall> Calls = new();
93
+ public List<int> ApiStatus = new() { 200 };
94
+ public List<string> Tokens = new() { "ACCESS01", "ACCESS02", "ACCESS03" };
95
+ public string TokenPath = "auth/token";
96
+ public string RespField = "access_token";
97
+
98
+ private int _issued;
99
+ private int _apicalls;
100
+
101
+ public Dictionary<string, object?> Fetch(string url, Dictionary<string, object?> fetchdef)
102
+ {
103
+ lock (_mu)
104
+ {
105
+ var call = new WireCall { Url = url };
106
+
107
+ if (fetchdef.TryGetValue("headers", out var hraw) &&
108
+ hraw is Dictionary<string, object?> headers &&
109
+ headers.TryGetValue("authorization", out var auth))
110
+ {
111
+ call.HasAuth = true;
112
+ call.Auth = auth as string ?? "";
113
+ }
114
+ if (fetchdef.TryGetValue("body", out var braw) && braw is string body)
115
+ {
116
+ call.Body = body;
117
+ }
118
+
119
+ Calls.Add(call);
120
+
121
+ if (url.EndsWith("/" + TokenPath))
122
+ {
123
+ var token = Tokens[Math.Min(_issued, Tokens.Count - 1)];
124
+ _issued++;
125
+ return Response(200, new Dictionary<string, object?> { [RespField] = token });
126
+ }
127
+
128
+ var status = ApiStatus[Math.Min(_apicalls, ApiStatus.Count - 1)];
129
+ _apicalls++;
130
+ return Response(status,
131
+ new Dictionary<string, object?> { ["ok"] = status < 400 });
132
+ }
133
+ }
134
+
135
+ private static Dictionary<string, object?> Response(int status, object? payload)
136
+ {
137
+ return new Dictionary<string, object?>
138
+ {
139
+ ["status"] = status,
140
+ ["statusText"] = "X",
141
+ ["headers"] = new Dictionary<string, object?>(),
142
+ ["json"] = (Func<object?>)(() => payload),
143
+ };
144
+ }
145
+
146
+ // The calls that did NOT go to the token endpoint.
147
+ public List<WireCall> Api()
148
+ {
149
+ lock (_mu)
150
+ {
151
+ return Calls.FindAll(c => !c.Url.EndsWith("/" + TokenPath));
152
+ }
153
+ }
154
+
155
+ public List<WireCall> Token()
156
+ {
157
+ lock (_mu)
158
+ {
159
+ return Calls.FindAll(c => c.Url.EndsWith("/" + TokenPath));
160
+ }
161
+ }
162
+
163
+ // What went out, for a failure message that names the leak rather than
164
+ // just its count.
165
+ public string Report()
166
+ {
167
+ lock (_mu)
168
+ {
169
+ return string.Join(", ", Calls.ConvertAll(c => c.Url + " auth=" + c.Auth));
170
+ }
171
+ }
172
+ }
173
+
174
+ public class SecretsFeatureTest
175
+ {
176
+ private const string EnvPrefix = "PROJECTENV_TEST_SECRETS_";
177
+ private const string SecretsBase = "http://secrets.test/api";
178
+
179
+ // The Authorization header carries the SPEC's credential prefix, which a
180
+ // TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives
181
+ // `Bearer <token>`, an apiKey scheme the raw token. So assert on the
182
+ // CREDENTIAL and let the prefix be whatever this SDK's API declares -
183
+ // pinning the whole header value passes only for a prefix-less API, and
184
+ // this file ships to every project that selects the feature.
185
+ private static void CredentialIs(string header, string token)
186
+ {
187
+ var got = header ?? "";
188
+ Assert.True(got == token || got.EndsWith(" " + token),
189
+ "expected the authorization header to carry " + token + ", got: " + got);
190
+ }
191
+
192
+ // Construct the client and ADOPT the feature via `extend` ONLY when the
193
+ // generated config did not already install it. When this SDK was
194
+ // generated with `secrets` model-active the ordinary factory path builds
195
+ // the instance, and adding a second via extend would DOUBLE the feature:
196
+ // two transport wraps, two resolutions, and a token purchase the
197
+ // assertions cannot account for.
198
+ private static ProjectNameSDK WithSecrets(Func<bool, ProjectNameSDK> build)
199
+ {
200
+ var client = build(false);
201
+ if (null == SecretsOf(client))
202
+ {
203
+ client = build(true);
204
+ }
205
+ return client;
206
+ }
207
+
208
+ private static SecretsFeature? SecretsOf(ProjectNameSDK client)
209
+ {
210
+ foreach (var f in client.Features)
211
+ {
212
+ if (f is SecretsFeature sf)
213
+ {
214
+ return sf;
215
+ }
216
+ }
217
+ return null;
218
+ }
219
+
220
+ // A LIVE client carrying the secrets feature, wired to the recording
221
+ // transport. `allow.op` is named explicitly: a project that narrows the
222
+ // default set would otherwise turn the raw-path cases into a false RED
223
+ // (the control leg refused before it reached the transport), and the
224
+ // rule under test lives at the transport, downstream of the allow gate
225
+ // either way.
226
+ private static ProjectNameSDK SecretsClient(Wire w, Dictionary<string, object?> extra)
227
+ {
228
+ return WithSecrets(extend =>
229
+ {
230
+ var opts = new Dictionary<string, object?>
231
+ {
232
+ ["base"] = SecretsBase,
233
+ ["allow"] = new Dictionary<string, object?>
234
+ {
235
+ ["op"] = "create,update,load,list,remove,command,direct,graphql",
236
+ },
237
+ ["system"] = new Dictionary<string, object?>
238
+ {
239
+ ["fetch"] = (Func<string, Dictionary<string, object?>,
240
+ Dictionary<string, object?>>)w.Fetch,
241
+ },
242
+ };
243
+ foreach (var kv in extra)
244
+ {
245
+ opts[kv.Key] = kv.Value;
246
+ }
247
+ if (extend)
248
+ {
249
+ opts["extend"] = new List<object?> { new SecretsFeature() };
250
+ }
251
+ return new ProjectNameSDK(opts);
252
+ });
253
+ }
254
+
255
+ // The env chain, the shape most of these tests use.
256
+ private static Dictionary<string, object?> SecretsOpts(Dictionary<string, object?>? extra)
257
+ {
258
+ var fopts = new Dictionary<string, object?>
259
+ {
260
+ ["active"] = true,
261
+ ["providers"] = new List<object?>
262
+ {
263
+ new Dictionary<string, object?>
264
+ {
265
+ ["kind"] = "env",
266
+ ["prefix"] = EnvPrefix,
267
+ },
268
+ },
269
+ };
270
+ foreach (var kv in extra ?? new Dictionary<string, object?>())
271
+ {
272
+ fopts[kv.Key] = kv.Value;
273
+ }
274
+ return new Dictionary<string, object?> { ["secrets"] = fopts };
275
+ }
276
+
277
+ private static Dictionary<string, object?> ProviderOpts(object provider,
278
+ Dictionary<string, object?>? extra)
279
+ {
280
+ var fopts = new Dictionary<string, object?>
281
+ {
282
+ ["active"] = true,
283
+ ["providers"] = new List<object?> { provider },
284
+ };
285
+ foreach (var kv in extra ?? new Dictionary<string, object?>())
286
+ {
287
+ fopts[kv.Key] = kv.Value;
288
+ }
289
+ return new Dictionary<string, object?> { ["secrets"] = fopts };
290
+ }
291
+
292
+ // Perform real entity operations - which is what runs the PreSpec hook
293
+ // and the ordinary request pipeline - until `stop` reports the
294
+ // observable state a test is waiting for. Each op's own outcome is
295
+ // irrelevant (no seeded data, a scripted response); an op the API does
296
+ // not define fails BEFORE the transport, which is why several may need
297
+ // driving. Entity names come from the SDK's own config, because this
298
+ // file is a TEMPLATE and no project's entity names are known here.
299
+ private static void DriveEntityOpUntil(ProjectNameSDK client, string what, Func<bool> stop)
300
+ {
301
+ var entities = StructUtils.GetProp(client.OptionsMap(), "entity")
302
+ as Dictionary<string, object?> ?? new Dictionary<string, object?>();
303
+
304
+ foreach (var name in entities.Keys)
305
+ {
306
+ if ("" == name)
307
+ {
308
+ continue;
309
+ }
310
+
311
+ var accessor = client.GetType().GetMethod(
312
+ char.ToUpperInvariant(name[0]) + name.Substring(1),
313
+ new[] { typeof(Dictionary<string, object?>) });
314
+
315
+ if (null == accessor)
316
+ {
317
+ continue;
318
+ }
319
+
320
+ object? ent;
321
+ try
322
+ {
323
+ ent = accessor.Invoke(client, new object?[] { null });
324
+ }
325
+ catch (TargetInvocationException)
326
+ {
327
+ continue;
328
+ }
329
+
330
+ if (null == ent)
331
+ {
332
+ continue;
333
+ }
334
+
335
+ foreach (var opname in new[] { "List", "Load" })
336
+ {
337
+ var op = ent.GetType().GetMethod(opname,
338
+ new[]
339
+ {
340
+ typeof(Dictionary<string, object?>),
341
+ typeof(Dictionary<string, object?>),
342
+ });
343
+
344
+ if (null == op)
345
+ {
346
+ continue;
347
+ }
348
+
349
+ try
350
+ {
351
+ op.Invoke(ent, new object?[] { null, null });
352
+ }
353
+ catch (Exception ex)
354
+ {
355
+ // The operation's own outcome is not what is under test,
356
+ // but the fail-closed cases assert on the PROVIDER'S OWN
357
+ // message, so the last failure is kept. Reflection wraps
358
+ // the SDK's throw in a TargetInvocationException; the
359
+ // SDK error is the inner one.
360
+ _lasterr = (ex as TargetInvocationException)?.InnerException ?? ex;
361
+ }
362
+
363
+ if (stop())
364
+ {
365
+ return;
366
+ }
367
+ }
368
+ }
369
+
370
+ Assert.Fail("no entity operation " + what + " - nothing to assert on");
371
+ }
372
+
373
+ // The last error an entity op raised, for the fail-closed cases that
374
+ // assert on the PROVIDER'S OWN message. Per thread: xunit runs test
375
+ // classes in parallel.
376
+ [ThreadStatic]
377
+ private static Exception? _lasterr;
378
+
379
+ // Drive ops until one request reached the recorder.
380
+ private static void DriveEntityOp(ProjectNameSDK client, Wire w)
381
+ {
382
+ var before = w.Api().Count;
383
+ DriveEntityOpUntil(client, "reached the transport", () => before < w.Api().Count);
384
+ }
385
+
386
+
387
+ // --- the feature-inactive baseline: bit-identical behaviour ------------
388
+
389
+ [Fact]
390
+ public void InactiveApikeyOptionBehavesExactlyAsBefore()
391
+ {
392
+ var client = ProjectNameSDK.TestSDK(null,
393
+ new Dictionary<string, object?> { ["apikey"] = "OPTKEY01" });
394
+
395
+ var fetchdef = client.Prepare(new Dictionary<string, object?> { ["path"] = "/" });
396
+ var headers = fetchdef["headers"] as Dictionary<string, object?>;
397
+
398
+ CredentialIs(headers!["authorization"] as string ?? "", "OPTKEY01");
399
+
400
+ Assert.True(null == SecretsOf(client),
401
+ "no model activation and no extend: the feature must not be installed");
402
+ }
403
+
404
+ [Fact]
405
+ public void InactiveNoApikeyMeansNoAuthorizationHeader()
406
+ {
407
+ var client = ProjectNameSDK.TestSDK(null, null);
408
+
409
+ var fetchdef = client.Prepare(new Dictionary<string, object?> { ["path"] = "/" });
410
+ var headers = fetchdef["headers"] as Dictionary<string, object?>;
411
+
412
+ Assert.False(headers!.ContainsKey("authorization"),
413
+ "an SDK with no apikey must send no authorization header");
414
+ }
415
+
416
+
417
+ // --- active: the provider chain, on the wire ---------------------------
418
+
419
+ [Fact]
420
+ public void ApikeyOptionStillWinsOverTheChain()
421
+ {
422
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", "ENVKEY01");
423
+ try
424
+ {
425
+ var w = new Wire();
426
+ var client = SecretsClient(w, new Dictionary<string, object?>
427
+ {
428
+ ["apikey"] = "OPTKEY01",
429
+ ["feature"] = SecretsOpts(null),
430
+ });
431
+
432
+ DriveEntityOp(client, w);
433
+ CredentialIs(w.Api()[0].Auth, "OPTKEY01");
434
+
435
+ // The explicit option is a real store, not a special case: a
436
+ // directed read names it like any other.
437
+ var sf = SecretsOf(client);
438
+ Assert.True(null != sf, "the extend seam did not install the feature");
439
+ Assert.Equal("OPTKEY01", sf!.GetSekreto()!.GetFrom("options", "apikey"));
440
+ }
441
+ finally
442
+ {
443
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", null);
444
+ }
445
+ }
446
+
447
+ [Fact]
448
+ public void AnOmittedApikeyDefersToTheChainAtTheTransportSeam()
449
+ {
450
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", "ENVKEY02");
451
+ try
452
+ {
453
+ var w = new Wire();
454
+ var client = SecretsClient(w, new Dictionary<string, object?>
455
+ {
456
+ ["feature"] = SecretsOpts(null),
457
+ });
458
+
459
+ // Before any op, nothing has been resolved.
460
+ Assert.Equal("", SecretsOf(client)!.Credential());
461
+
462
+ DriveEntityOp(client, w);
463
+
464
+ // Resolution happens AT THE TRANSPORT - the one seam every wire
465
+ // path crosses - so the credential is ON THE WIRE, not merely
466
+ // resolved.
467
+ CredentialIs(w.Api()[0].Auth, "ENVKEY02");
468
+ Assert.Equal("ENVKEY02", SecretsOf(client)!.Credential());
469
+
470
+ // csharp holds the credential in FEATURE STATE and injects it at
471
+ // the transport; the shared options map is never written, which
472
+ // is what keeps every concurrent operation's raw read safe.
473
+ Assert.Equal("", StructUtils.GetProp(client.OptionsMap(), "apikey") as string ?? "");
474
+ }
475
+ finally
476
+ {
477
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", null);
478
+ }
479
+ }
480
+
481
+ [Fact]
482
+ public void CustomProviderObjectsAreAcceptedVerbatim()
483
+ {
484
+ var probe = new ProbeProvider { Fn = _ => "CUSTOM01" };
485
+
486
+ var w = new Wire();
487
+ var client = SecretsClient(w, new Dictionary<string, object?>
488
+ {
489
+ ["feature"] = ProviderOpts(probe, null),
490
+ });
491
+
492
+ DriveEntityOp(client, w);
493
+
494
+ CredentialIs(w.Api()[0].Auth, "CUSTOM01");
495
+ Assert.Equal("apikey", probe.Asked[0]);
496
+ }
497
+
498
+ [Fact]
499
+ public void AMissEverywhereLeavesTheHeaderOff()
500
+ {
501
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", null);
502
+
503
+ var w = new Wire();
504
+ var client = SecretsClient(w, new Dictionary<string, object?>
505
+ {
506
+ ["feature"] = SecretsOpts(null),
507
+ });
508
+
509
+ DriveEntityOp(client, w);
510
+
511
+ Assert.False(w.Api()[0].HasAuth,
512
+ "a chain MISS must fall through to an unauthenticated request, got header " +
513
+ w.Api()[0].Auth);
514
+ }
515
+
516
+ // sekreto's miss-vs-error invariant: a MISS falls through to the next
517
+ // provider, an ERROR does not. A broken vault must never degrade into an
518
+ // unauthenticated request.
519
+ [Fact]
520
+ public void AProviderErrorFailsTheEntityOpAndNothingReachesTheWire()
521
+ {
522
+ var broken = new ProbeProvider
523
+ {
524
+ Fn = _ => throw new SekretoError("vault unreachable"),
525
+ };
526
+
527
+ var w = new Wire();
528
+ var client = SecretsClient(w, new Dictionary<string, object?>
529
+ {
530
+ ["feature"] = ProviderOpts(broken, null),
531
+ });
532
+
533
+ DriveEntityOpUntil(client, "consulted the chain", () => 0 < broken.Asked.Count);
534
+
535
+ Assert.True(0 == w.Api().Count,
536
+ "a broken vault must never yield a request, but the transport saw: " +
537
+ w.Report());
538
+
539
+ // CONTROL, which makes that zero mean REFUSED rather than UNWIRED:
540
+ // the same construction with a WORKING provider must reach the same
541
+ // transport, once, carrying the credential.
542
+ var control = new Wire();
543
+ var ok = SecretsClient(control, new Dictionary<string, object?>
544
+ {
545
+ ["feature"] = ProviderOpts(
546
+ new ProbeProvider { Fn = _ => "CONTROL01" }, null),
547
+ });
548
+
549
+ DriveEntityOp(ok, control);
550
+
551
+ Assert.True(1 == control.Api().Count,
552
+ "the control request did not reach system.fetch exactly once, so this " +
553
+ "test cannot observe a request going out at all: " + control.Report());
554
+ CredentialIs(control.Api()[0].Auth, "CONTROL01");
555
+ }
556
+
557
+ // A settled failure must not latch. Holding one meant a transient vault
558
+ // outage poisoned the client permanently: every later operation kept
559
+ // failing long after the vault recovered.
560
+ [Fact]
561
+ public void AProviderRecoversAfterATransientFailure()
562
+ {
563
+ var calls = 0;
564
+ var flaky = new ProbeProvider
565
+ {
566
+ Fn = _ =>
567
+ {
568
+ calls++;
569
+ if (1 == calls)
570
+ {
571
+ throw new SekretoError("vault unreachable");
572
+ }
573
+ return "RECOVERED01";
574
+ },
575
+ };
576
+
577
+ var w = new Wire();
578
+ var client = SecretsClient(w, new Dictionary<string, object?>
579
+ {
580
+ ["feature"] = ProviderOpts(flaky, null),
581
+ });
582
+
583
+ DriveEntityOpUntil(client, "consulted the chain", () => 0 < calls);
584
+ Assert.True(0 == w.Api().Count, "the first op must not reach the wire");
585
+
586
+ DriveEntityOp(client, w);
587
+ CredentialIs(w.Api()[0].Auth, "RECOVERED01");
588
+ }
589
+
590
+ // `auth: null` is the documented way to disable auth outright, and
591
+ // PrepareAuth honours it before it ever reads the apikey. csharp needs a
592
+ // TWO-BRANCH check (key absent OR key present-and-null), because
593
+ // MakeOptions deliberately keeps a supplied null PRESENT - unlike go,
594
+ // where one nil test covers both. Getting this wrong re-transmits
595
+ // exactly the credential the caller suppressed.
596
+ [Fact]
597
+ public void AuthNullSuppressesTheCredentialChainOrNoChain()
598
+ {
599
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", "ENVKEY03");
600
+ try
601
+ {
602
+ var w = new Wire();
603
+ var client = SecretsClient(w, new Dictionary<string, object?>
604
+ {
605
+ ["auth"] = null,
606
+ ["apikey"] = "OPTKEY01",
607
+ ["feature"] = SecretsOpts(null),
608
+ });
609
+
610
+ DriveEntityOp(client, w);
611
+
612
+ Assert.False(w.Api()[0].HasAuth,
613
+ "auth null must suppress the credential, got header " + w.Api()[0].Auth);
614
+
615
+ // The suppression survives option validation rather than being
616
+ // replaced by the optspec's default auth map.
617
+ var opts = client.OptionsMap();
618
+ Assert.True(opts.TryGetValue("auth", out var authval) && null == authval,
619
+ "options.auth must stay a PRESENT null");
620
+ }
621
+ finally
622
+ {
623
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", null);
624
+ }
625
+ }
626
+
627
+ // With `cache: false`, a provider that answered once and then reports a
628
+ // MISS (a revoked secret) must RETRACT the credential: the next request
629
+ // must go out with no authorization header.
630
+ [Fact]
631
+ public void UncachedMissRetractsTheCredential()
632
+ {
633
+ var have = true;
634
+ var revocable = new ProbeProvider { Fn = _ => have ? "REVOCABLE01" : null };
635
+
636
+ var w = new Wire();
637
+ var client = SecretsClient(w, new Dictionary<string, object?>
638
+ {
639
+ ["feature"] = ProviderOpts(revocable,
640
+ new Dictionary<string, object?> { ["cache"] = false }),
641
+ });
642
+
643
+ DriveEntityOp(client, w);
644
+ CredentialIs(w.Api()[0].Auth, "REVOCABLE01");
645
+
646
+ have = false;
647
+
648
+ DriveEntityOp(client, w);
649
+ var last = w.Api()[w.Api().Count - 1];
650
+ Assert.True(!last.HasAuth || "" == last.Auth,
651
+ "after the chain reports a miss, the retracted credential must not go " +
652
+ "out; the wire saw " + last.Auth);
653
+ }
654
+
655
+ [Fact]
656
+ public void CacheFalseAsksTheChainOnEveryResolve()
657
+ {
658
+ var calls = 0;
659
+ var counting = new ProbeProvider
660
+ {
661
+ Fn = _ =>
662
+ {
663
+ calls++;
664
+ return "KEY" + calls;
665
+ },
666
+ };
667
+
668
+ var w = new Wire();
669
+ var client = SecretsClient(w, new Dictionary<string, object?>
670
+ {
671
+ ["feature"] = ProviderOpts(counting,
672
+ new Dictionary<string, object?> { ["cache"] = false }),
673
+ });
674
+
675
+ DriveEntityOp(client, w);
676
+ DriveEntityOp(client, w);
677
+
678
+ Assert.True(1 < calls,
679
+ "the chain was asked once and cached, despite cache: false");
680
+ }
681
+
682
+ [Fact]
683
+ public void SecretNameIsConfigurable()
684
+ {
685
+ Environment.SetEnvironmentVariable(EnvPrefix + "API_TOKEN", "TOKKEY01");
686
+ try
687
+ {
688
+ var w = new Wire();
689
+ var client = SecretsClient(w, new Dictionary<string, object?>
690
+ {
691
+ ["feature"] = SecretsOpts(
692
+ new Dictionary<string, object?> { ["name"] = "api.token" }),
693
+ });
694
+
695
+ DriveEntityOp(client, w);
696
+ CredentialIs(w.Api()[0].Auth, "TOKKEY01");
697
+ }
698
+ finally
699
+ {
700
+ Environment.SetEnvironmentVariable(EnvPrefix + "API_TOKEN", null);
701
+ }
702
+ }
703
+
704
+ // The Sekreto instance is LIVE, for callers who want arbitrary secrets
705
+ // or redaction. Never a clone: sekreto holds provider state that has to
706
+ // stay live to be worth anything.
707
+ [Fact]
708
+ public void SekretoIsLiveForArbitrarySecretsAndRedaction()
709
+ {
710
+ var w = new Wire();
711
+ var client = SecretsClient(w, new Dictionary<string, object?>
712
+ {
713
+ ["feature"] = new Dictionary<string, object?>
714
+ {
715
+ ["secrets"] = new Dictionary<string, object?>
716
+ {
717
+ ["active"] = true,
718
+ ["providers"] = new List<object?>
719
+ {
720
+ new Dictionary<string, object?>
721
+ {
722
+ ["kind"] = "memory",
723
+ ["values"] = new Dictionary<string, object?>
724
+ {
725
+ ["DB_PASSWORD"] = "dbpass01",
726
+ },
727
+ },
728
+ },
729
+ },
730
+ },
731
+ });
732
+
733
+ var secrets = SecretsOf(client)!.GetSekreto()!;
734
+
735
+ // The nested `values` map arrives in the SDK's loose object model
736
+ // and sekreto reads it as Dictionary<string, object>: a converter
737
+ // that dropped the nested block would leave the store EMPTY and this
738
+ // read would miss.
739
+ Assert.Equal("dbpass01", secrets.Get("db.password"));
740
+ Assert.Equal("the password is [redacted], keep it safe",
741
+ secrets.Redact("the password is dbpass01, keep it safe"));
742
+ }
743
+
744
+ // THE PROVIDER VOCABULARY IS NON-EMPTY, and it matches what the SDK
745
+ // actually carries.
746
+ //
747
+ // A provider kind the model did NOT select is unknown to this Sekreto -
748
+ // upstream's contract since the registry was retired, and the reason
749
+ // Config emits the plugin definitions at all. The failure this exists to
750
+ // catch is the SILENT one: a Config that emits an EMPTY vocabulary while
751
+ // the SDK still ships every plugin file its model selected. Every
752
+ // builtin-only test above stays green through that, and the SDK then
753
+ // refuses each of those kinds at runtime as "unknown provider kind".
754
+ //
755
+ // So the expected set is read off the ASSEMBLY, not off the config: the
756
+ // vendored plugin classes compile into this SDK exactly when the model
757
+ // selected their group, so what they export is an independent witness of
758
+ // what the model asked for. Conditioning on the config instead would let
759
+ // an empty vocabulary make this test pass by returning early - which is
760
+ // the whole defect.
761
+ [Fact]
762
+ public void ASelectedPluginKindIsInTheSdkVocabulary()
763
+ {
764
+ // Every Definition the generated tree carries, discovered rather
765
+ // than listed: this file ships to projects with any subset of the
766
+ // plugin groups, and upstream is free to add a kind.
767
+ var carried = new List<string>();
768
+ foreach (var t in typeof(SecretsFeature).Assembly.GetTypes())
769
+ {
770
+ if ("Voxgig.Sekreto.Plugins" != t.Namespace)
771
+ {
772
+ continue;
773
+ }
774
+ foreach (var f in t.GetFields(BindingFlags.Public | BindingFlags.Static))
775
+ {
776
+ if (typeof(Voxgig.Plugin.Definition) == f.FieldType)
777
+ {
778
+ carried.Add(t.Name + "." + f.Name);
779
+ }
780
+ }
781
+ }
782
+
783
+ if (0 == carried.Count)
784
+ {
785
+ // No plugin groups in this project's model: nothing to assert.
786
+ return;
787
+ }
788
+
789
+ var vocabulary = SdkConfig.FeaturePlugins("secrets");
790
+
791
+ var kinds = new List<string>();
792
+ foreach (var d in vocabulary)
793
+ {
794
+ if (d is Voxgig.Plugin.Definition def)
795
+ {
796
+ kinds.Add(def.Name);
797
+ }
798
+ }
799
+
800
+ Assert.True(carried.Count == kinds.Count,
801
+ "the SDK carries " + carried.Count + " plugin definitions (" +
802
+ string.Join(", ", carried) + ") but the config's vocabulary holds " +
803
+ kinds.Count + " (" + string.Join(", ", kinds) + ") - every kind the " +
804
+ "model selected must be passed to Sekreto, or the SDK refuses it at " +
805
+ "runtime as an unknown provider kind");
806
+
807
+ // Construction is where an unknown kind is refused, so the Sekreto
808
+ // being built at all IS the second half of the check. The memory
809
+ // store comes FIRST so sekreto's first-hit rule answers from it and
810
+ // the vault is never contacted - the kind has to be DECLARABLE, not
811
+ // reachable.
812
+
813
+ var w = new Wire();
814
+ var client = SecretsClient(w, new Dictionary<string, object?>
815
+ {
816
+ ["feature"] = new Dictionary<string, object?>
817
+ {
818
+ ["secrets"] = new Dictionary<string, object?>
819
+ {
820
+ ["active"] = true,
821
+ ["providers"] = new List<object?>
822
+ {
823
+ new Dictionary<string, object?>
824
+ {
825
+ ["kind"] = "memory",
826
+ ["values"] = new Dictionary<string, object?>
827
+ {
828
+ ["APIKEY"] = "VOCAB01",
829
+ },
830
+ },
831
+ new Dictionary<string, object?>
832
+ {
833
+ ["kind"] = kinds[0],
834
+ ["addr"] = "https://vault.test",
835
+ ["token"] = "x",
836
+ ["command"] = "true",
837
+ ["project"] = "p",
838
+ ["region"] = "eu-west-1",
839
+ ["vault"] = "v",
840
+ ["account"] = "a",
841
+ },
842
+ },
843
+ },
844
+ },
845
+ });
846
+
847
+ DriveEntityOp(client, w);
848
+ CredentialIs(w.Api()[0].Auth, "VOCAB01");
849
+ }
850
+
851
+
852
+ // --- THE RAW PATHS ----------------------------------------------------
853
+ //
854
+ // Direct and Graphql run NO feature hooks at all - the client fragment
855
+ // says so itself ("like Direct, this bypasses the feature pipeline") -
856
+ // so for them the transport seam is the ONLY place resolution can
857
+ // happen. These are the cases that would pass vacuously against a
858
+ // PreSpec-only implementation, and the ones that pin the seam choice.
859
+
860
+ [Fact]
861
+ public void DirectCarriesTheChainCredential()
862
+ {
863
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", "DIRECTKEY01");
864
+ try
865
+ {
866
+ var w = new Wire();
867
+ var client = SecretsClient(w, new Dictionary<string, object?>
868
+ {
869
+ ["feature"] = SecretsOpts(null),
870
+ });
871
+
872
+ var res = client.Direct(new Dictionary<string, object?> { ["path"] = "/probe" });
873
+
874
+ Assert.True(Equals(res["ok"], true), "direct refused: " + res.GetValueOrDefault("err"));
875
+ Assert.True(1 == w.Api().Count,
876
+ "expected one direct call on the wire, got " + w.Api().Count);
877
+ CredentialIs(w.Api()[0].Auth, "DIRECTKEY01");
878
+ }
879
+ finally
880
+ {
881
+ Environment.SetEnvironmentVariable(EnvPrefix + "APIKEY", null);
882
+ }
883
+ }
884
+
885
+ [Fact]
886
+ public void AProviderErrorFailsDirectRatherThanSending()
887
+ {
888
+ var w = new Wire();
889
+ var broken = SecretsClient(w, new Dictionary<string, object?>
890
+ {
891
+ ["feature"] = ProviderOpts(
892
+ new ProbeProvider { Fn = _ => throw new SekretoError("vault unreachable") },
893
+ null),
894
+ });
895
+
896
+ var res = broken.Direct(new Dictionary<string, object?> { ["path"] = "/probe" });
897
+
898
+ Assert.True(0 == w.Calls.Count,
899
+ "a request must not go out unauthenticated because a provider broke, " +
900
+ "but one reached the transport: " + w.Report());
901
+ Assert.True(Equals(res["ok"], false), "a broken chain must refuse the raw path");
902
+
903
+ // The PROVIDER'S OWN message, so an unrelated failure cannot stand
904
+ // in for fail-closed.
905
+ var err = res.GetValueOrDefault("err") as Exception;
906
+ Assert.True(null != err, "expected the provider error in-band, got: " +
907
+ res.GetValueOrDefault("err"));
908
+ Assert.Contains("vault unreachable", err!.Message);
909
+
910
+ // CONTROL: the same construction with a WORKING provider must reach
911
+ // the same transport exactly once, carrying the credential.
912
+ var control = new Wire();
913
+ var ok = SecretsClient(control, new Dictionary<string, object?>
914
+ {
915
+ ["feature"] = ProviderOpts(new ProbeProvider { Fn = _ => "RAWKEY01" }, null),
916
+ });
917
+
918
+ var good = ok.Direct(new Dictionary<string, object?> { ["path"] = "/probe" });
919
+
920
+ Assert.True(Equals(good["ok"], true),
921
+ "the control request failed: " + good.GetValueOrDefault("err"));
922
+ Assert.True(1 == control.Calls.Count,
923
+ "the control request never reached system.fetch, so this test cannot " +
924
+ "observe a request going out at all");
925
+ CredentialIs(control.Calls[0].Auth, "RAWKEY01");
926
+ }
927
+
928
+ [Fact]
929
+ public void AProviderErrorFailsGraphqlRatherThanSending()
930
+ {
931
+ var w = new Wire();
932
+ var broken = SecretsClient(w, new Dictionary<string, object?>
933
+ {
934
+ ["feature"] = ProviderOpts(
935
+ new ProbeProvider { Fn = _ => throw new SekretoError("vault unreachable") },
936
+ null),
937
+ });
938
+
939
+ var res = broken.Graphql("{ thing }", null);
940
+
941
+ Assert.True(0 == w.Calls.Count,
942
+ "a graphql request must not go out unauthenticated, but one reached " +
943
+ "the transport: " + w.Report());
944
+ Assert.True(Equals(res["ok"], false), "a broken chain must refuse graphql");
945
+
946
+ var err = res.GetValueOrDefault("err") as Exception;
947
+ Assert.True(null != err, "expected the provider error in-band, got: " +
948
+ res.GetValueOrDefault("err"));
949
+ Assert.Contains("vault unreachable", err!.Message);
950
+
951
+ var control = new Wire();
952
+ var ok = SecretsClient(control, new Dictionary<string, object?>
953
+ {
954
+ ["feature"] = ProviderOpts(new ProbeProvider { Fn = _ => "RAWKEY01" }, null),
955
+ });
956
+
957
+ var good = ok.Graphql("{ thing }", null);
958
+
959
+ Assert.True(Equals(good["ok"], true),
960
+ "the control request failed: " + good.GetValueOrDefault("err"));
961
+ Assert.True(1 == control.Calls.Count,
962
+ "the control graphql request never reached system.fetch, so this test " +
963
+ "cannot observe a request going out at all");
964
+ CredentialIs(control.Calls[0].Auth, "RAWKEY01");
965
+ }
966
+
967
+
968
+ // --- FAIL CLOSED ON A CONSTRUCTION FAILURE ----------------------------
969
+ //
970
+ // The chain a project configures can be wrong before a single lookup
971
+ // happens: a provider kind that does not exist (or one whose plugin
972
+ // group the model did not select), and sekreto's constructor refuses
973
+ // it; or a secret name Names.EnvKey rejects. Init is void and cannot
974
+ // fail the client construction the way ts's throwing init does, so it
975
+ // HOLDS that error in `_initerr` and the transport gate refuses to send.
976
+ //
977
+ // That gate is worth exactly as much as the seam it lives behind, which
978
+ // is why Init wraps FIRST and builds SECOND: an Init that returns early
979
+ // on the construction failure before installing the wrapper leaves no
980
+ // gate at all, and a misconfigured chain then sends ordinary
981
+ // UNAUTHENTICATED requests - or, with an explicit apikey and a bad
982
+ // secret name, the credential itself - while the held error is read by
983
+ // nothing. Every other case in this file passes with the gate deleted
984
+ // and with the wrap moved last; these four are the ones that go RED.
985
+ // The three wire paths - the entity pipeline, Direct and Graphql - each
986
+ // carry their own CONTROL leg, so a zero means REFUSED and not UNWIRED.
987
+
988
+ // A provider kind sekreto has never heard of: its constructor throws
989
+ // before this feature has a Sekreto at all. Matched on sekreto's OWN
990
+ // message, so an unrelated failure cannot stand in for fail-closed.
991
+ private const string UnknownKind = "unknown provider kind: nosuchkind";
992
+
993
+ private static Dictionary<string, object?> MisconfiguredChain()
994
+ {
995
+ return ProviderOpts(new Dictionary<string, object?>
996
+ {
997
+ ["kind"] = "nosuchkind",
998
+ ["name"] = "broken",
999
+ }, null);
1000
+ }
1001
+
1002
+ private static bool SaysUnknownKind(object? err)
1003
+ {
1004
+ var msg = err is Exception ex ? ex.Message : (err?.ToString() ?? "");
1005
+ return msg.Contains(UnknownKind);
1006
+ }
1007
+
1008
+ private static string ErrMessage(Dictionary<string, object?> res)
1009
+ {
1010
+ var err = res.GetValueOrDefault("err");
1011
+ return err is Exception ex ? ex.Message : (err?.ToString() ?? "");
1012
+ }
1013
+
1014
+ [Fact]
1015
+ public void AConstructionFailureFailsTheEntityOpAndNothingReachesTheWire()
1016
+ {
1017
+ // THE RULE.
1018
+ var w = new Wire();
1019
+ var client = SecretsClient(w, new Dictionary<string, object?>
1020
+ {
1021
+ ["feature"] = MisconfiguredChain(),
1022
+ });
1023
+
1024
+ // The feature must still be INSTALLED: a construction failure that
1025
+ // silently uninstalls the feature is the same fail-open by another
1026
+ // route, and nothing downstream would be gating anything.
1027
+ Assert.True(null != SecretsOf(client),
1028
+ "a chain that failed to build must leave the feature installed and gating");
1029
+
1030
+ _lasterr = null;
1031
+ // Stop on EITHER outcome - the refusal we want, or a request going
1032
+ // out, which is the failure this test exists to catch. Stopping only
1033
+ // on the refusal would report "nothing to assert on" for the leak.
1034
+ DriveEntityOpUntil(client, "refused the operation or sent one",
1035
+ () => 0 < w.Api().Count || SaysUnknownKind(_lasterr));
1036
+
1037
+ Assert.True(0 == w.Api().Count,
1038
+ "a chain that failed to BUILD sent an UNAUTHENTICATED request: " + w.Report());
1039
+
1040
+ Assert.True(null != _lasterr, "the entity op must fail when the chain cannot be built");
1041
+ Assert.True(SaysUnknownKind(_lasterr),
1042
+ "the refusal must carry sekreto's own message (" + UnknownKind + "), got: " +
1043
+ _lasterr!.Message);
1044
+
1045
+ // CONTROL, which makes that zero mean REFUSED rather than UNWIRED:
1046
+ // the same construction with a WORKING provider must reach the same
1047
+ // transport, once, carrying the credential.
1048
+ var control = new Wire();
1049
+ var ok = SecretsClient(control, new Dictionary<string, object?>
1050
+ {
1051
+ ["feature"] = ProviderOpts(new ProbeProvider { Fn = _ => "INITKEY01" }, null),
1052
+ });
1053
+
1054
+ DriveEntityOp(ok, control);
1055
+
1056
+ Assert.True(1 == control.Api().Count,
1057
+ "the control request did not reach system.fetch exactly once, so this " +
1058
+ "test cannot observe a request going out at all: " + control.Report());
1059
+ CredentialIs(control.Api()[0].Auth, "INITKEY01");
1060
+ }
1061
+
1062
+ [Fact]
1063
+ public void AConstructionFailureFailsDirectRatherThanSending()
1064
+ {
1065
+ // THE RULE. Direct runs no feature hook at all, so the ONLY thing
1066
+ // that can refuse it is the transport wrapper - the one a
1067
+ // build-first Init never installs on a construction failure.
1068
+ var w = new Wire();
1069
+ var client = SecretsClient(w, new Dictionary<string, object?>
1070
+ {
1071
+ ["feature"] = MisconfiguredChain(),
1072
+ });
1073
+
1074
+ var res = client.Direct(new Dictionary<string, object?> { ["path"] = "/probe" });
1075
+
1076
+ Assert.True(0 == w.Calls.Count,
1077
+ "a chain that failed to BUILD sent an UNAUTHENTICATED direct request: " +
1078
+ w.Report());
1079
+ Assert.True(Equals(res["ok"], false),
1080
+ "a chain that could not be built must refuse the raw path fail-closed");
1081
+ Assert.True(SaysUnknownKind(res.GetValueOrDefault("err")),
1082
+ "the refusal must carry sekreto's own message (" + UnknownKind + "), got: " +
1083
+ ErrMessage(res));
1084
+
1085
+ // CONTROL.
1086
+ var control = new Wire();
1087
+ var ok = SecretsClient(control, new Dictionary<string, object?>
1088
+ {
1089
+ ["feature"] = ProviderOpts(new ProbeProvider { Fn = _ => "INITKEY01" }, null),
1090
+ });
1091
+
1092
+ var good = ok.Direct(new Dictionary<string, object?> { ["path"] = "/probe" });
1093
+
1094
+ Assert.True(Equals(good["ok"], true),
1095
+ "the control request failed: " + good.GetValueOrDefault("err"));
1096
+ Assert.True(1 == control.Calls.Count,
1097
+ "the control request never reached system.fetch, so this test cannot " +
1098
+ "observe a request going out at all");
1099
+ CredentialIs(control.Calls[0].Auth, "INITKEY01");
1100
+ }
1101
+
1102
+ [Fact]
1103
+ public void AConstructionFailureFailsGraphqlRatherThanSending()
1104
+ {
1105
+ // THE RULE.
1106
+ var w = new Wire();
1107
+ var client = SecretsClient(w, new Dictionary<string, object?>
1108
+ {
1109
+ ["feature"] = MisconfiguredChain(),
1110
+ });
1111
+
1112
+ var res = client.Graphql("{ thing }", null);
1113
+
1114
+ Assert.True(0 == w.Calls.Count,
1115
+ "a chain that failed to BUILD sent an UNAUTHENTICATED graphql request: " +
1116
+ w.Report());
1117
+ Assert.True(Equals(res["ok"], false),
1118
+ "a chain that could not be built must refuse graphql fail-closed");
1119
+ Assert.True(SaysUnknownKind(res.GetValueOrDefault("err")),
1120
+ "the refusal must carry sekreto's own message (" + UnknownKind + "), got: " +
1121
+ ErrMessage(res));
1122
+
1123
+ // CONTROL.
1124
+ var control = new Wire();
1125
+ var ok = SecretsClient(control, new Dictionary<string, object?>
1126
+ {
1127
+ ["feature"] = ProviderOpts(new ProbeProvider { Fn = _ => "INITKEY01" }, null),
1128
+ });
1129
+
1130
+ var good = ok.Graphql("{ thing }", null);
1131
+
1132
+ Assert.True(Equals(good["ok"], true),
1133
+ "the control request failed: " + good.GetValueOrDefault("err"));
1134
+ Assert.True(1 == control.Calls.Count,
1135
+ "the control graphql request never reached system.fetch, so this test " +
1136
+ "cannot observe a request going out at all");
1137
+ CredentialIs(control.Calls[0].Auth, "INITKEY01");
1138
+ }
1139
+
1140
+ // The OTHER construction failure, and the one that tells wrap-first
1141
+ // from wrap-last: an explicit apikey with a secret name Names.EnvKey
1142
+ // refuses. Init holds that error and returns before it ever builds a
1143
+ // Sekreto, so an Init that wraps at the END has installed nothing -
1144
+ // and the credential goes out on the wire through the ordinary
1145
+ // PrepareAuth path, EXPLICIT and unresolved, exactly as if the feature
1146
+ // had never been configured. The unknown-kind cases above cannot see
1147
+ // this: their failure lands in a catch that falls through to the wrap.
1148
+ private const string InvalidName = "sekreto: invalid name: Not Valid!";
1149
+
1150
+ [Fact]
1151
+ public void AnInvalidSecretNameFailsDirectRatherThanSending()
1152
+ {
1153
+ // THE RULE.
1154
+ var w = new Wire();
1155
+ var client = SecretsClient(w, new Dictionary<string, object?>
1156
+ {
1157
+ ["apikey"] = "EXPLICIT01",
1158
+ ["feature"] = new Dictionary<string, object?>
1159
+ {
1160
+ ["secrets"] = new Dictionary<string, object?>
1161
+ {
1162
+ ["active"] = true,
1163
+ ["name"] = "Not Valid!",
1164
+ },
1165
+ },
1166
+ });
1167
+
1168
+ Assert.True(null != SecretsOf(client),
1169
+ "an invalid secret name must leave the feature installed and gating");
1170
+
1171
+ var res = client.Direct(new Dictionary<string, object?> { ["path"] = "/probe" });
1172
+
1173
+ Assert.True(0 == w.Calls.Count,
1174
+ "an invalid secret name still let a request out, carrying the explicit " +
1175
+ "credential: " + w.Report());
1176
+ Assert.True(Equals(res["ok"], false),
1177
+ "an invalid secret name must refuse the raw path fail-closed");
1178
+ Assert.Contains(InvalidName, ErrMessage(res));
1179
+
1180
+ // CONTROL: the same construction with a VALID name must reach the
1181
+ // transport once, carrying that same explicit credential.
1182
+ var control = new Wire();
1183
+ var ok = SecretsClient(control, new Dictionary<string, object?>
1184
+ {
1185
+ ["apikey"] = "EXPLICIT01",
1186
+ ["feature"] = new Dictionary<string, object?>
1187
+ {
1188
+ ["secrets"] = new Dictionary<string, object?>
1189
+ {
1190
+ ["active"] = true,
1191
+ ["name"] = "apikey",
1192
+ },
1193
+ },
1194
+ });
1195
+
1196
+ var good = ok.Direct(new Dictionary<string, object?> { ["path"] = "/probe" });
1197
+
1198
+ Assert.True(Equals(good["ok"], true),
1199
+ "the control request failed: " + good.GetValueOrDefault("err"));
1200
+ Assert.True(1 == control.Calls.Count,
1201
+ "the control request never reached system.fetch, so this test cannot " +
1202
+ "observe a request going out at all");
1203
+ CredentialIs(control.Calls[0].Auth, "EXPLICIT01");
1204
+ }
1205
+
1206
+
1207
+ // --- the access-token exchange ----------------------------------------
1208
+
1209
+ private static Dictionary<string, object?> ExchangeOpts(Dictionary<string, object?>? xextra)
1210
+ {
1211
+ var x = new Dictionary<string, object?> { ["active"] = true };
1212
+ foreach (var kv in xextra ?? new Dictionary<string, object?>())
1213
+ {
1214
+ x[kv.Key] = kv.Value;
1215
+ }
1216
+ return SecretsOpts(new Dictionary<string, object?>
1217
+ {
1218
+ ["name"] = "refresh_token",
1219
+ ["exchange"] = x,
1220
+ });
1221
+ }
1222
+
1223
+ [Fact]
1224
+ public void TheRefreshTokenBuysAnAccessTokenAndASpentOneIsReboughtOnce()
1225
+ {
1226
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1227
+ try
1228
+ {
1229
+ // First API call is refused, the retry succeeds.
1230
+ var w = new Wire { ApiStatus = new List<int> { 401, 200 } };
1231
+ var client = SecretsClient(w, new Dictionary<string, object?>
1232
+ {
1233
+ ["feature"] = ExchangeOpts(null),
1234
+ });
1235
+
1236
+ var res = client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1237
+
1238
+ Assert.True(2 == w.Token().Count,
1239
+ "expected the initial purchase plus one rebuy, got " + w.Token().Count);
1240
+ Assert.Contains("REFRESH01", w.Token()[0].Body);
1241
+
1242
+ Assert.True(2 == w.Api().Count,
1243
+ "expected the request to be retried exactly once, got " + w.Api().Count);
1244
+ CredentialIs(w.Api()[0].Auth, "ACCESS01");
1245
+ // The retry must carry the NEW token, not the spent one.
1246
+ CredentialIs(w.Api()[1].Auth, "ACCESS02");
1247
+
1248
+ Assert.True(Equals(res["ok"], true), "the caller sees the successful retry");
1249
+ }
1250
+ finally
1251
+ {
1252
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1253
+ }
1254
+ }
1255
+
1256
+ [Fact]
1257
+ public void AnExplicitExchangeRefreshWinsOverTheChain()
1258
+ {
1259
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "FROMCHAIN");
1260
+ try
1261
+ {
1262
+ var w = new Wire();
1263
+ var client = SecretsClient(w, new Dictionary<string, object?>
1264
+ {
1265
+ ["feature"] = ExchangeOpts(
1266
+ new Dictionary<string, object?> { ["refresh"] = "EXPLICIT01" }),
1267
+ });
1268
+
1269
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1270
+
1271
+ Assert.Contains("EXPLICIT01", w.Token()[0].Body);
1272
+ Assert.DoesNotContain("FROMCHAIN", w.Token()[0].Body);
1273
+ }
1274
+ finally
1275
+ {
1276
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1277
+ }
1278
+ }
1279
+
1280
+ [Fact]
1281
+ public void OnePurchaseServesManyRequests()
1282
+ {
1283
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1284
+ try
1285
+ {
1286
+ var w = new Wire();
1287
+ var client = SecretsClient(w, new Dictionary<string, object?>
1288
+ {
1289
+ ["feature"] = ExchangeOpts(null),
1290
+ });
1291
+
1292
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/one" });
1293
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/two" });
1294
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/three" });
1295
+
1296
+ Assert.True(1 == w.Token().Count,
1297
+ "a token still working must not be re-bought, saw " + w.Token().Count);
1298
+ Assert.True(3 == w.Api().Count);
1299
+ }
1300
+ finally
1301
+ {
1302
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1303
+ }
1304
+ }
1305
+
1306
+ [Fact]
1307
+ public void ConcurrentFirstRequestsShareOnePurchase()
1308
+ {
1309
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1310
+ try
1311
+ {
1312
+ var w = new Wire();
1313
+ var client = SecretsClient(w, new Dictionary<string, object?>
1314
+ {
1315
+ ["feature"] = ExchangeOpts(null),
1316
+ });
1317
+
1318
+ Parallel.For(0, 4, i =>
1319
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/p" + i }));
1320
+
1321
+ Assert.True(1 == w.Token().Count,
1322
+ "four operations at once must not open four token requests, saw " +
1323
+ w.Token().Count);
1324
+ }
1325
+ finally
1326
+ {
1327
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1328
+ }
1329
+ }
1330
+
1331
+ [Fact]
1332
+ public void AStatusOutsideExchangeStatusesIsNotAnExpiry()
1333
+ {
1334
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1335
+ try
1336
+ {
1337
+ var w = new Wire { ApiStatus = new List<int> { 403 } };
1338
+ var client = SecretsClient(w, new Dictionary<string, object?>
1339
+ {
1340
+ ["feature"] = ExchangeOpts(null),
1341
+ });
1342
+
1343
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1344
+
1345
+ Assert.True(1 == w.Api().Count, "403 is not in the default statuses");
1346
+ Assert.True(1 == w.Token().Count);
1347
+ }
1348
+ finally
1349
+ {
1350
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1351
+ }
1352
+ }
1353
+
1354
+ [Fact]
1355
+ public void ExchangeStatusesAndFieldNamesAreConfigurable()
1356
+ {
1357
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1358
+ try
1359
+ {
1360
+ var w = new Wire
1361
+ {
1362
+ ApiStatus = new List<int> { 403, 200 },
1363
+ TokenPath = "oauth/grant",
1364
+ RespField = "token",
1365
+ };
1366
+ var client = SecretsClient(w, new Dictionary<string, object?>
1367
+ {
1368
+ ["feature"] = ExchangeOpts(new Dictionary<string, object?>
1369
+ {
1370
+ ["path"] = "oauth/grant",
1371
+ ["request"] = "grant",
1372
+ ["response"] = "token",
1373
+ ["statuses"] = new List<object?> { 403 },
1374
+ }),
1375
+ });
1376
+
1377
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1378
+
1379
+ Assert.True(2 == w.Api().Count, "403 was declared an expiry");
1380
+ Assert.True(w.Token()[0].Url.EndsWith("/oauth/grant"),
1381
+ "the token endpoint is relative to base: " + w.Token()[0].Url);
1382
+ Assert.Contains("\"grant\"", w.Token()[0].Body);
1383
+ CredentialIs(w.Api()[1].Auth, "ACCESS02");
1384
+ }
1385
+ finally
1386
+ {
1387
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1388
+ }
1389
+ }
1390
+
1391
+ [Fact]
1392
+ public void AnExplicitApikeyIsSpentBeforeAnythingIsBought()
1393
+ {
1394
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1395
+ try
1396
+ {
1397
+ var w = new Wire();
1398
+ var client = SecretsClient(w, new Dictionary<string, object?>
1399
+ {
1400
+ ["apikey"] = "HELDTOKEN01",
1401
+ ["feature"] = ExchangeOpts(null),
1402
+ });
1403
+
1404
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1405
+
1406
+ Assert.True(0 == w.Token().Count, "nothing needed buying");
1407
+ CredentialIs(w.Api()[0].Auth, "HELDTOKEN01");
1408
+ }
1409
+ finally
1410
+ {
1411
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1412
+ }
1413
+ }
1414
+
1415
+ [Fact]
1416
+ public void NoRefreshTokenAnywhereIsAnErrorNotAnUnauthenticatedCall()
1417
+ {
1418
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1419
+
1420
+ var w = new Wire();
1421
+ var client = SecretsClient(w, new Dictionary<string, object?>
1422
+ {
1423
+ ["feature"] = ExchangeOpts(null),
1424
+ });
1425
+
1426
+ var res = client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1427
+
1428
+ Assert.True(Equals(res["ok"], false),
1429
+ "expected a failure, got: " + res.GetValueOrDefault("ok"));
1430
+ Assert.True(0 == w.Api().Count,
1431
+ "a request must not go out unauthenticated because the chain was empty: " +
1432
+ w.Report());
1433
+ }
1434
+
1435
+ [Fact]
1436
+ public void ExchangeAuthNullSuppressesTheCredentialRefusalOrNot()
1437
+ {
1438
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1439
+ try
1440
+ {
1441
+ // `auth: null` is the documented way to send no credential at
1442
+ // all. A refusal of a deliberately unauthenticated request is
1443
+ // not an expired token: buying one and retrying would transmit
1444
+ // exactly the credential the caller suppressed.
1445
+ var w = new Wire { ApiStatus = new List<int> { 401 } };
1446
+ var client = SecretsClient(w, new Dictionary<string, object?>
1447
+ {
1448
+ ["auth"] = null,
1449
+ ["feature"] = ExchangeOpts(null),
1450
+ });
1451
+
1452
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1453
+
1454
+ Assert.True(1 == w.Api().Count, "a suppressed request must not be retried");
1455
+ Assert.False(w.Api()[0].HasAuth,
1456
+ "no credential may be sent when auth is suppressed, got " +
1457
+ w.Api()[0].Auth);
1458
+ }
1459
+ finally
1460
+ {
1461
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1462
+ }
1463
+ }
1464
+
1465
+ // Test mode buys nothing and needs no token endpoint: the test feature
1466
+ // replaces the transport so no request leaves the process, and an
1467
+ // exchange would be the one HTTP call it could not stop.
1468
+ [Fact]
1469
+ public void TestModeBuysNothingAndNeedsNoTokenEndpoint()
1470
+ {
1471
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", "REFRESH01");
1472
+ try
1473
+ {
1474
+ var w = new Wire();
1475
+ var client = WithSecrets(extend =>
1476
+ {
1477
+ var opts = new Dictionary<string, object?>
1478
+ {
1479
+ ["base"] = SecretsBase,
1480
+ ["system"] = new Dictionary<string, object?>
1481
+ {
1482
+ ["fetch"] = (Func<string, Dictionary<string, object?>,
1483
+ Dictionary<string, object?>>)w.Fetch,
1484
+ },
1485
+ ["feature"] = ExchangeOpts(null),
1486
+ };
1487
+ if (extend)
1488
+ {
1489
+ opts["extend"] = new List<object?> { new SecretsFeature() };
1490
+ }
1491
+ return ProjectNameSDK.TestSDK(null, opts);
1492
+ });
1493
+
1494
+ DriveEntityOpUntil(client, "resolved the fake token",
1495
+ () => "" != SecretsOf(client)!.Credential());
1496
+
1497
+ Assert.True(0 == w.Calls.Count,
1498
+ "test mode must not do IO, saw " + w.Calls.Count + " calls");
1499
+ // A deterministic placeholder, so offline suites need no
1500
+ // configuration.
1501
+ Assert.Equal("test-access_token", SecretsOf(client)!.Credential());
1502
+ }
1503
+ finally
1504
+ {
1505
+ Environment.SetEnvironmentVariable(EnvPrefix + "REFRESH_TOKEN", null);
1506
+ }
1507
+ }
1508
+
1509
+ // THE EXCHANGE WITH NO system.fetch, end to end over a real socket.
1510
+ //
1511
+ // The ordinary case: MakeOptions leaves system.fetch unset, so the API
1512
+ // call takes the SDK's default HttpClient transport and the token
1513
+ // purchase takes SdkUtility.DefaultHttpFetch. The refresh token is full
1514
+ // of JSON-hostile characters, which proves the body is SERIALISED and
1515
+ // not concatenated - a token carrying a quote, a backslash or a newline
1516
+ // must arrive as that literal value.
1517
+ [Fact]
1518
+ public void ExchangeOverARealSocketWithNoSystemFetch()
1519
+ {
1520
+ const string tricky = "re\"fresh\\to\nken";
1521
+
1522
+ var listener = new HttpListener();
1523
+ var port = FreePort();
1524
+ var prefix = "http://127.0.0.1:" + port + "/";
1525
+ listener.Prefixes.Add(prefix);
1526
+ listener.Start();
1527
+
1528
+ var gotrefresh = "";
1529
+ var gotauth = "";
1530
+ var served = new ManualResetEventSlim(false);
1531
+
1532
+ // A THREAD, not Task.Run: a test method that blocks on a Task is
1533
+ // xUnit1031, and the listener loop is not async work anyway.
1534
+ var serving = new Thread(() =>
1535
+ {
1536
+ try
1537
+ {
1538
+ while (listener.IsListening)
1539
+ {
1540
+ var ctx = listener.GetContext();
1541
+ var body = new StreamReader(ctx.Request.InputStream, Encoding.UTF8)
1542
+ .ReadToEnd();
1543
+
1544
+ string payload;
1545
+ if (ctx.Request.Url!.AbsolutePath.EndsWith("/auth/token"))
1546
+ {
1547
+ var parsed = JsonSerializer.Deserialize<Dictionary<string, string>>(body);
1548
+ gotrefresh = parsed != null && parsed.TryGetValue("refresh_token", out var r)
1549
+ ? r : "";
1550
+ payload = "{\"access_token\": \"RAWTOK01\"}";
1551
+ }
1552
+ else
1553
+ {
1554
+ gotauth = ctx.Request.Headers["authorization"] ?? "";
1555
+ payload = "{}";
1556
+ served.Set();
1557
+ }
1558
+
1559
+ var bytes = Encoding.UTF8.GetBytes(payload);
1560
+ ctx.Response.ContentType = "application/json";
1561
+ ctx.Response.ContentLength64 = bytes.Length;
1562
+ ctx.Response.OutputStream.Write(bytes, 0, bytes.Length);
1563
+ ctx.Response.OutputStream.Close();
1564
+ }
1565
+ }
1566
+ catch (Exception)
1567
+ {
1568
+ // Teardown closes the listener out from under GetContext.
1569
+ }
1570
+ })
1571
+ { IsBackground = true };
1572
+ serving.Start();
1573
+
1574
+ try
1575
+ {
1576
+ // No system.fetch ANYWHERE.
1577
+ var client = WithSecrets(extend =>
1578
+ {
1579
+ var opts = new Dictionary<string, object?>
1580
+ {
1581
+ ["base"] = "http://127.0.0.1:" + port + "/api",
1582
+ ["allow"] = new Dictionary<string, object?>
1583
+ {
1584
+ ["op"] = "create,update,load,list,remove,command,direct,graphql",
1585
+ },
1586
+ ["feature"] = new Dictionary<string, object?>
1587
+ {
1588
+ ["secrets"] = new Dictionary<string, object?>
1589
+ {
1590
+ ["active"] = true,
1591
+ ["name"] = "refresh_token",
1592
+ ["exchange"] = new Dictionary<string, object?>
1593
+ {
1594
+ ["active"] = true,
1595
+ ["refresh"] = tricky,
1596
+ },
1597
+ },
1598
+ },
1599
+ };
1600
+ if (extend)
1601
+ {
1602
+ opts["extend"] = new List<object?> { new SecretsFeature() };
1603
+ }
1604
+ return new ProjectNameSDK(opts);
1605
+ });
1606
+
1607
+ var res = client.Direct(new Dictionary<string, object?> { ["path"] = "/thing" });
1608
+
1609
+ Assert.True(Equals(res["ok"], true),
1610
+ "the raw exchange call failed: " + res.GetValueOrDefault("err"));
1611
+ Assert.True(served.Wait(TimeSpan.FromSeconds(5)),
1612
+ "the API request never reached the socket");
1613
+
1614
+ Assert.Equal(tricky, gotrefresh);
1615
+ CredentialIs(gotauth, "RAWTOK01");
1616
+ }
1617
+ finally
1618
+ {
1619
+ listener.Stop();
1620
+ listener.Close();
1621
+ serving.Join(TimeSpan.FromSeconds(5));
1622
+ }
1623
+ }
1624
+
1625
+ private static int FreePort()
1626
+ {
1627
+ var probe = new System.Net.Sockets.TcpListener(IPAddress.Loopback, 0);
1628
+ probe.Start();
1629
+ var port = ((IPEndPoint)probe.LocalEndpoint).Port;
1630
+ probe.Stop();
1631
+ return port;
1632
+ }
1633
+
1634
+
1635
+ // --- concurrency -------------------------------------------------------
1636
+
1637
+ // A provider failure closes the transport gate; a later retry that
1638
+ // SUCCEEDS reopens it and every waiting operation goes out with the
1639
+ // FRESH credential - never the stale pre-failure header, and never
1640
+ // nothing. This is also the lane that would expose an unlocked Sekreto
1641
+ // cache (a concurrently-mutated List<T> corrupts silently) or a mutated
1642
+ // shared options map.
1643
+ [Fact]
1644
+ public void TheGateRecoversUnderConcurrency()
1645
+ {
1646
+ var mode = "fail";
1647
+ var release = new ManualResetEventSlim(false);
1648
+
1649
+ var flaky = new ProbeProvider
1650
+ {
1651
+ Fn = _ =>
1652
+ {
1653
+ var m = Volatile.Read(ref mode);
1654
+ if ("fail" == m)
1655
+ {
1656
+ throw new SekretoError("vault unreachable");
1657
+ }
1658
+ if ("slow" == m)
1659
+ {
1660
+ release.Wait(TimeSpan.FromSeconds(5));
1661
+ }
1662
+ return "FRESH01";
1663
+ },
1664
+ };
1665
+
1666
+ var w = new Wire();
1667
+ var client = SecretsClient(w, new Dictionary<string, object?>
1668
+ {
1669
+ ["feature"] = ProviderOpts(flaky,
1670
+ new Dictionary<string, object?> { ["cache"] = false }),
1671
+ });
1672
+
1673
+ // 1. The failure closes the gate: nothing reaches the wire.
1674
+ var res = client.Direct(new Dictionary<string, object?> { ["path"] = "/gated" });
1675
+ Assert.True(Equals(res["ok"], false), "a failed resolution must refuse the request");
1676
+ Assert.True(0 == w.Calls.Count,
1677
+ "a failed resolution must keep the wire silent, saw " + w.Report());
1678
+
1679
+ // 2. Recovery under concurrency: eight operations race the slow
1680
+ // retry; all of them must come out carrying the fresh credential.
1681
+ Volatile.Write(ref mode, "slow");
1682
+
1683
+ var opening = new Thread(() =>
1684
+ {
1685
+ Thread.Sleep(20);
1686
+ release.Set();
1687
+ })
1688
+ { IsBackground = true };
1689
+ opening.Start();
1690
+
1691
+ Parallel.For(0, 8, i =>
1692
+ client.Direct(new Dictionary<string, object?> { ["path"] = "/c" + i }));
1693
+
1694
+ opening.Join(TimeSpan.FromSeconds(5));
1695
+
1696
+ Assert.True(0 < w.Api().Count, "recovery must let the operations out");
1697
+ foreach (var call in w.Api())
1698
+ {
1699
+ CredentialIs(call.Auth, "FRESH01");
1700
+ }
1701
+ }
1702
+ }