@voxgig/sdkgen 4.20.0 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (966) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/helpers/applicability.js +11 -6
  3. package/dist/helpers/applicability.js.map +1 -1
  4. package/dist/helpers/collectDeps.js +31 -6
  5. package/dist/helpers/collectDeps.js.map +1 -1
  6. package/dist/helpers/naming.js +2 -2
  7. package/dist/helpers/naming.js.map +1 -1
  8. package/dist/tsconfig.tsbuildinfo +1 -1
  9. package/model/sdkgen.aon +49 -3
  10. package/package.json +1 -1
  11. package/project/.sdk/model/feature/secrets.aon +128 -0
  12. package/project/.sdk/model/feature/validate.aon +3 -2
  13. package/project/.sdk/model/target/c.aon +1 -1
  14. package/project/.sdk/model/target/clojure.aon +1 -1
  15. package/project/.sdk/model/target/cpp.aon +1 -1
  16. package/project/.sdk/model/target/csharp.aon +1 -1
  17. package/project/.sdk/model/target/elixir.aon +1 -1
  18. package/project/.sdk/model/target/go.aon +1 -1
  19. package/project/.sdk/model/target/java.aon +1 -1
  20. package/project/.sdk/model/target/kotlin.aon +1 -1
  21. package/project/.sdk/model/target/lua.aon +1 -1
  22. package/project/.sdk/model/target/ocaml.aon +1 -1
  23. package/project/.sdk/model/target/perl.aon +1 -1
  24. package/project/.sdk/model/target/php.aon +1 -1
  25. package/project/.sdk/model/target/py.aon +1 -1
  26. package/project/.sdk/model/target/rb.aon +1 -1
  27. package/project/.sdk/model/target/rust.aon +1 -1
  28. package/project/.sdk/model/target/scala.aon +1 -1
  29. package/project/.sdk/model/target/swift.aon +1 -1
  30. package/project/.sdk/model/target/zig.aon +1 -1
  31. package/project/.sdk/src/cmp/c/Main_c.ts +3 -0
  32. package/project/.sdk/src/cmp/c/Schema_c.ts +106 -0
  33. package/project/.sdk/src/cmp/clojure/Main_clojure.ts +2 -0
  34. package/project/.sdk/src/cmp/clojure/ReadmeExplanation_clojure.ts +1 -0
  35. package/project/.sdk/src/cmp/clojure/Schema_clojure.ts +73 -0
  36. package/project/.sdk/src/cmp/cpp/Main_cpp.ts +3 -0
  37. package/project/.sdk/src/cmp/cpp/Schema_cpp.ts +105 -0
  38. package/project/.sdk/src/cmp/csharp/Main_csharp.ts +3 -0
  39. package/project/.sdk/src/cmp/csharp/Schema_csharp.ts +85 -0
  40. package/project/.sdk/src/cmp/elixir/Main_elixir.ts +2 -0
  41. package/project/.sdk/src/cmp/elixir/ReadmeExplanation_elixir.ts +1 -0
  42. package/project/.sdk/src/cmp/elixir/Schema_elixir.ts +88 -0
  43. package/project/.sdk/src/cmp/go/Main_go.ts +2 -0
  44. package/project/.sdk/src/cmp/go/Schema_go.ts +93 -0
  45. package/project/.sdk/src/cmp/java/Main_java.ts +2 -0
  46. package/project/.sdk/src/cmp/java/Schema_java.ts +125 -0
  47. package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +2 -0
  48. package/project/.sdk/src/cmp/kotlin/Schema_kotlin.ts +111 -0
  49. package/project/.sdk/src/cmp/lua/Main_lua.ts +46 -9
  50. package/project/.sdk/src/cmp/lua/Package_lua.ts +1 -0
  51. package/project/.sdk/src/cmp/lua/ReadmeExplanation_lua.ts +1 -0
  52. package/project/.sdk/src/cmp/lua/Schema_lua.ts +72 -0
  53. package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +24 -1
  54. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +34 -13
  55. package/project/.sdk/src/cmp/ocaml/ReadmeExplanation_ocaml.ts +1 -0
  56. package/project/.sdk/src/cmp/ocaml/Schema_ocaml.ts +99 -0
  57. package/project/.sdk/src/cmp/perl/Main_perl.ts +2 -0
  58. package/project/.sdk/src/cmp/perl/ReadmeExplanation_perl.ts +1 -0
  59. package/project/.sdk/src/cmp/perl/Schema_perl.ts +107 -0
  60. package/project/.sdk/src/cmp/php/Main_php.ts +2 -0
  61. package/project/.sdk/src/cmp/php/Package_php.ts +1 -1
  62. package/project/.sdk/src/cmp/php/ReadmeExplanation_php.ts +1 -0
  63. package/project/.sdk/src/cmp/php/Schema_php.ts +129 -0
  64. package/project/.sdk/src/cmp/py/Main_py.ts +2 -0
  65. package/project/.sdk/src/cmp/py/ReadmeExplanation_py.ts +1 -0
  66. package/project/.sdk/src/cmp/py/Schema_py.ts +72 -0
  67. package/project/.sdk/src/cmp/rb/Main_rb.ts +2 -0
  68. package/project/.sdk/src/cmp/rb/ReadmeExplanation_rb.ts +1 -0
  69. package/project/.sdk/src/cmp/rb/Schema_rb.ts +70 -0
  70. package/project/.sdk/src/cmp/rust/Main_rust.ts +3 -0
  71. package/project/.sdk/src/cmp/rust/Schema_rust.ts +107 -0
  72. package/project/.sdk/src/cmp/scala/Main_scala.ts +3 -0
  73. package/project/.sdk/src/cmp/scala/Schema_scala.ts +108 -0
  74. package/project/.sdk/src/cmp/swift/Main_swift.ts +3 -0
  75. package/project/.sdk/src/cmp/swift/Schema_swift.ts +92 -0
  76. package/project/.sdk/src/cmp/zig/Main_zig.ts +3 -0
  77. package/project/.sdk/src/cmp/zig/Schema_zig.ts +114 -0
  78. package/project/.sdk/tm/c/core/context.c +3 -0
  79. package/project/.sdk/tm/c/core/sdk.h +14 -0
  80. package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +2 -2
  81. package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +2 -2
  82. package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +2 -2
  83. package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +2 -2
  84. package/project/.sdk/tm/c/feature/secrets/plugin/config.c +2 -2
  85. package/project/.sdk/tm/c/feature/secrets/plugin/config.h +2 -2
  86. package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +2 -2
  87. package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +2 -2
  88. package/project/.sdk/tm/c/feature/secrets/plugin/env.c +2 -2
  89. package/project/.sdk/tm/c/feature/secrets/plugin/env.h +2 -2
  90. package/project/.sdk/tm/c/feature/secrets/plugin/export.c +3 -3
  91. package/project/.sdk/tm/c/feature/secrets/plugin/export.h +2 -2
  92. package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +2 -2
  93. package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +2 -2
  94. package/project/.sdk/tm/c/feature/secrets/plugin/host.c +25 -2
  95. package/project/.sdk/tm/c/feature/secrets/plugin/host.h +3 -2
  96. package/project/.sdk/tm/c/feature/secrets/plugin/order.c +2 -2
  97. package/project/.sdk/tm/c/feature/secrets/plugin/order.h +2 -2
  98. package/project/.sdk/tm/c/feature/secrets/plugin/point.c +2 -2
  99. package/project/.sdk/tm/c/feature/secrets/plugin/point.h +2 -2
  100. package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +2 -2
  101. package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +2 -2
  102. package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +2 -2
  103. package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +2 -2
  104. package/project/.sdk/tm/c/feature/secrets/plugin/types.c +2 -2
  105. package/project/.sdk/tm/c/feature/secrets/plugin/types.h +2 -2
  106. package/project/.sdk/tm/c/feature/secrets/plugin/value.c +2 -2
  107. package/project/.sdk/tm/c/feature/secrets/plugin/value.h +2 -2
  108. package/project/.sdk/tm/c/feature/secrets/plugin/version.c +2 -2
  109. package/project/.sdk/tm/c/feature/secrets/plugin/version.h +2 -2
  110. package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +2 -2
  111. package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +2 -2
  112. package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +2 -2
  113. package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +2 -2
  114. package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +2 -2
  115. package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +2 -2
  116. package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +2 -2
  117. package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +2 -2
  118. package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +2 -2
  119. package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +2 -2
  120. package/project/.sdk/tm/c/feature/secrets/plugins/minivault.c +2072 -0
  121. package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +2 -2
  122. package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +2 -2
  123. package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +2 -2
  124. package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +151 -10
  125. package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +16 -10
  126. package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +2 -2
  127. package/project/.sdk/tm/c/feature/secrets/plugins/support.h +12 -8
  128. package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +2 -2
  129. package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +17 -2
  130. package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +5 -5
  131. package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +37 -9
  132. package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +2 -2
  133. package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +17 -2
  134. package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +16 -2
  135. package/project/.sdk/tm/c/feature/validate.c +364 -0
  136. package/project/.sdk/tm/c/feature/validate.h +29 -0
  137. package/project/.sdk/tm/c/src/feature/validate/.gitkeep +0 -0
  138. package/project/.sdk/tm/c/tests/vendor/omni/json.c +2 -2
  139. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +2 -2
  140. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +2 -2
  141. package/project/.sdk/tm/c/tests/vendor/omni/util.c +2 -2
  142. package/project/.sdk/tm/c/utility/make_options.c +12 -24
  143. package/project/.sdk/tm/c/utility/make_spec.c +8 -0
  144. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +2 -2
  145. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +2 -2
  146. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +2 -2
  147. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +2 -2
  148. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +2 -2
  149. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +3 -3
  150. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +2 -2
  151. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +17 -2
  152. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +2 -2
  153. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +2 -2
  154. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +2 -2
  155. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +2 -2
  156. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +2 -2
  157. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +2 -2
  158. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +2 -2
  159. package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +2 -2
  160. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +2 -2
  161. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +2 -2
  162. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +2 -2
  163. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +2 -2
  164. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +2 -2
  165. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +2 -2
  166. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +2 -2
  167. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +2 -2
  168. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +2 -2
  169. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +2 -2
  170. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +2 -2
  171. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +2 -2
  172. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/minivault.clj +837 -0
  173. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +2 -2
  174. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +2 -2
  175. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +2 -2
  176. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +2 -2
  177. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +2 -2
  178. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +6 -4
  179. package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +2 -2
  180. package/project/.sdk/tm/clojure/src/feature/validate/.gitkeep +0 -0
  181. package/project/.sdk/tm/clojure/src/sdk/core.clj +31 -41
  182. package/project/.sdk/tm/clojure/src/sdk/features.clj +202 -0
  183. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +2 -2
  184. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +2 -2
  185. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +2 -2
  186. package/project/.sdk/tm/cpp/core/types.hpp +4 -0
  187. package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +2 -2
  188. package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +2 -2
  189. package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +2 -2
  190. package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +2 -2
  191. package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +2 -2
  192. package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +2 -2
  193. package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +2 -2
  194. package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +2 -2
  195. package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +2 -2
  196. package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +2 -2
  197. package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +3 -3
  198. package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +2 -2
  199. package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +2 -2
  200. package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +2 -2
  201. package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +21 -2
  202. package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +3 -2
  203. package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +2 -2
  204. package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +2 -2
  205. package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +2 -2
  206. package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +2 -2
  207. package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +2 -2
  208. package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +2 -2
  209. package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +2 -2
  210. package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +2 -2
  211. package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +2 -2
  212. package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +2 -2
  213. package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +2 -2
  214. package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +2 -2
  215. package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +2 -2
  216. package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +2 -2
  217. package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +2 -2
  218. package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +2 -2
  219. package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +2 -2
  220. package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +2 -2
  221. package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +2 -2
  222. package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +2 -2
  223. package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +2 -2
  224. package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +9 -7
  225. package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +2 -2
  226. package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +2 -2
  227. package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +2 -2
  228. package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +2 -2
  229. package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +2 -2
  230. package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +2 -2
  231. package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +2 -2
  232. package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +2 -2
  233. package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +2 -2
  234. package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +2 -2
  235. package/project/.sdk/tm/cpp/feature/secrets/plugins/Minivault.cpp +1345 -0
  236. package/project/.sdk/tm/cpp/feature/secrets/plugins/Minivault.hpp +219 -0
  237. package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +2 -2
  238. package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +2 -2
  239. package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +2 -2
  240. package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +2 -2
  241. package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +2 -2
  242. package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +2 -2
  243. package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +2 -2
  244. package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +2 -2
  245. package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +2 -2
  246. package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +2 -2
  247. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +2 -2
  248. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +2 -2
  249. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +22 -2
  250. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +12 -2
  251. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +3 -3
  252. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +2 -2
  253. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +2 -2
  254. package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +2 -2
  255. package/project/.sdk/tm/cpp/feature/validate.hpp +301 -0
  256. package/project/.sdk/tm/cpp/src/feature/validate/.gitkeep +0 -0
  257. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +2 -2
  258. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +2 -2
  259. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +2 -2
  260. package/project/.sdk/tm/cpp/utility/pipeline.hpp +24 -41
  261. package/project/.sdk/tm/csharp/feature/ValidateFeature.cs +343 -0
  262. package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +2 -2
  263. package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +2 -2
  264. package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +2 -2
  265. package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +2 -2
  266. package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +2 -2
  267. package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +2 -2
  268. package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +2 -2
  269. package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +3 -3
  270. package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +2 -2
  271. package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +9 -2
  272. package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +21 -2
  273. package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +2 -2
  274. package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +2 -2
  275. package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +2 -2
  276. package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +2 -2
  277. package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +2 -2
  278. package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +2 -2
  279. package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +2 -2
  280. package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +2 -2
  281. package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +2 -2
  282. package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +2 -2
  283. package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +2 -2
  284. package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +2 -2
  285. package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +2 -2
  286. package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +2 -2
  287. package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +2 -2
  288. package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +2 -2
  289. package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +2 -2
  290. package/project/.sdk/tm/csharp/feature/secrets/plugins/MiniVault.cs +1572 -0
  291. package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +2 -2
  292. package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +2 -2
  293. package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +2 -2
  294. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +2 -2
  295. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +3 -2
  296. package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +2 -2
  297. package/project/.sdk/tm/csharp/src/feature/validate/.gitkeep +0 -0
  298. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +2 -2
  299. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +2 -2
  300. package/project/.sdk/tm/csharp/utility/MakeOptions.cs +12 -85
  301. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +24 -3
  302. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +2 -2
  303. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +2 -2
  304. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +2 -2
  305. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +2 -2
  306. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +2 -2
  307. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +2 -2
  308. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +7 -4
  309. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +2 -2
  310. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +13 -2
  311. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +15 -2
  312. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +2 -2
  313. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +2 -2
  314. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +2 -2
  315. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +2 -2
  316. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +2 -2
  317. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +2 -2
  318. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +2 -2
  319. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +2 -2
  320. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +2 -2
  321. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +2 -2
  322. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +2 -2
  323. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +2 -2
  324. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +2 -2
  325. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +2 -2
  326. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +2 -2
  327. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +3 -3
  328. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +3 -3
  329. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +2 -2
  330. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/minivault.ex +1033 -0
  331. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +2 -2
  332. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +2 -2
  333. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +2 -2
  334. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +2 -2
  335. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +2 -2
  336. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +17 -5
  337. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +2 -2
  338. package/project/.sdk/tm/elixir/lib/projectname/feature/validate.ex +320 -0
  339. package/project/.sdk/tm/elixir/lib/projectname/utility.ex +10 -46
  340. package/project/.sdk/tm/elixir/src/feature/validate/.gitkeep +0 -0
  341. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +2 -2
  342. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +2 -2
  343. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +2 -2
  344. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +1 -1
  345. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +1 -1
  346. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +1 -1
  347. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +1 -1
  348. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +1 -1
  349. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +2 -2
  350. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
  351. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +25 -1
  352. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +1 -1
  353. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +1 -1
  354. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +1 -1
  355. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +1 -1
  356. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +1 -1
  357. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +1 -1
  358. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +1 -1
  359. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +2 -2
  360. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +2 -2
  361. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +2 -2
  362. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +2 -2
  363. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +2 -2
  364. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +2 -2
  365. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +2 -2
  366. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +2 -2
  367. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +2 -2
  368. package/project/.sdk/tm/go/feature/secrets/plugins/minivault/format.go +493 -0
  369. package/project/.sdk/tm/go/feature/secrets/plugins/minivault/minivault.go +1131 -0
  370. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +2 -2
  371. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +2 -2
  372. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +2 -2
  373. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +14 -2
  374. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +2 -2
  375. package/project/.sdk/tm/go/feature/validate_feature.go +346 -0
  376. package/project/.sdk/tm/go/src/feature/validate/.gitkeep +0 -0
  377. package/project/.sdk/tm/go/test/omni/omni.go +2 -2
  378. package/project/.sdk/tm/go/test/omni/util.go +2 -2
  379. package/project/.sdk/tm/go/utility/make_options.go +13 -54
  380. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +24 -8
  381. package/project/.sdk/tm/java/feature/ValidateFeature.java +330 -0
  382. package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +2 -2
  383. package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +2 -2
  384. package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +2 -2
  385. package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +2 -2
  386. package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +2 -2
  387. package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +2 -2
  388. package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +2 -2
  389. package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +3 -3
  390. package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +2 -2
  391. package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +3 -3
  392. package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +21 -2
  393. package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +2 -2
  394. package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +2 -2
  395. package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +2 -2
  396. package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +2 -2
  397. package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +2 -2
  398. package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +2 -2
  399. package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +2 -2
  400. package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +2 -2
  401. package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +2 -2
  402. package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +2 -2
  403. package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +4 -3
  404. package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +2 -2
  405. package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +2 -2
  406. package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +2 -2
  407. package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +2 -2
  408. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +2 -2
  409. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +2 -2
  410. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +2 -2
  411. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +2 -2
  412. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +2 -2
  413. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +2 -2
  414. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +2 -2
  415. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +2 -2
  416. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Minivault.java +1448 -0
  417. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +2 -2
  418. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +2 -2
  419. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +2 -2
  420. package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +2 -2
  421. package/project/.sdk/tm/java/src/feature/validate/.gitkeep +0 -0
  422. package/project/.sdk/tm/java/test/vendor/omni/Json.java +2 -2
  423. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +2 -2
  424. package/project/.sdk/tm/java/test/vendor/omni/Util.java +2 -2
  425. package/project/.sdk/tm/java/utility/MakeOptions.java +13 -45
  426. package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
  427. package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +2 -2
  428. package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +2 -2
  429. package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +2 -2
  430. package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +2 -2
  431. package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +2 -2
  432. package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +3 -3
  433. package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +2 -2
  434. package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +17 -2
  435. package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +2 -2
  436. package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +2 -2
  437. package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +2 -2
  438. package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +2 -2
  439. package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +2 -2
  440. package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +2 -2
  441. package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +2 -2
  442. package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +2 -2
  443. package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +2 -2
  444. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +2 -2
  445. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +2 -2
  446. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +2 -2
  447. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +2 -2
  448. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +2 -2
  449. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +2 -2
  450. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +2 -2
  451. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +2 -2
  452. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/minivault.js +866 -0
  453. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +2 -2
  454. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +2 -2
  455. package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +2 -2
  456. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +2 -2
  457. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +3 -2
  458. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +2 -2
  459. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +2 -2
  460. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +2 -2
  461. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +2 -2
  462. package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +2 -2
  463. package/project/.sdk/tm/js/src/utility/StructUtility.js +1 -1
  464. package/project/.sdk/tm/js/test/vendor/omni/index.js +1 -1
  465. package/project/.sdk/tm/js/test/vendor/omni/runner.js +1 -1
  466. package/project/.sdk/tm/js/test/vendor/omni/util.js +1 -1
  467. package/project/.sdk/tm/kotlin/feature/ValidateFeature.kt +297 -0
  468. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +2 -2
  469. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +2 -2
  470. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +2 -2
  471. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +2 -2
  472. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +2 -2
  473. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +3 -3
  474. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +2 -2
  475. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +21 -2
  476. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +2 -2
  477. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +2 -2
  478. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +2 -2
  479. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +2 -2
  480. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +2 -2
  481. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +2 -2
  482. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +2 -2
  483. package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +2 -2
  484. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +2 -2
  485. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +2 -2
  486. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +3 -2
  487. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +2 -2
  488. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +14 -2
  489. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +10 -2
  490. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +2 -2
  491. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +2 -2
  492. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +2 -2
  493. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +2 -2
  494. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +2 -2
  495. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +2 -2
  496. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +2 -2
  497. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +2 -2
  498. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Minivault.kt +1095 -0
  499. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +2 -2
  500. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +2 -2
  501. package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +2 -2
  502. package/project/.sdk/tm/kotlin/src/feature/validate/.gitkeep +0 -0
  503. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +2 -2
  504. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +2 -2
  505. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +2 -2
  506. package/project/.sdk/tm/kotlin/utility/MakeOptions.kt +13 -35
  507. package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -0
  508. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
  509. package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +2 -2
  510. package/project/.sdk/tm/lua/feature/secrets/native/sekretovault.c +240 -0
  511. package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +2 -2
  512. package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +2 -2
  513. package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +2 -2
  514. package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +2 -2
  515. package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +2 -2
  516. package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +12 -3
  517. package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +2 -2
  518. package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +18 -2
  519. package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +2 -2
  520. package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +2 -2
  521. package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +2 -2
  522. package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +2 -2
  523. package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +2 -2
  524. package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +2 -2
  525. package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +2 -2
  526. package/project/.sdk/tm/lua/feature/secrets/plugin.lua +2 -2
  527. package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +2 -2
  528. package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +2 -2
  529. package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +2 -2
  530. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +2 -2
  531. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +2 -2
  532. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +2 -2
  533. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +2 -2
  534. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +2 -2
  535. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +2 -2
  536. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +2 -2
  537. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +2 -2
  538. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +2 -2
  539. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +2 -2
  540. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/minivault.lua +1227 -0
  541. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +2 -2
  542. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +2 -2
  543. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +2 -2
  544. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +2 -2
  545. package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +2 -2
  546. package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +3 -2
  547. package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +2 -2
  548. package/project/.sdk/tm/lua/feature/validate_feature.lua +333 -0
  549. package/project/.sdk/tm/lua/src/feature/validate/.gitkeep +0 -0
  550. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +2 -2
  551. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +2 -2
  552. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +2 -2
  553. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +2 -2
  554. package/project/.sdk/tm/lua/utility/make_options.lua +74 -55
  555. package/project/.sdk/tm/lua/utility/make_spec.lua +8 -1
  556. package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
  557. package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
  558. package/project/.sdk/tm/ocaml/Makefile +12 -7
  559. package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +2 -2
  560. package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +2 -2
  561. package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +2 -2
  562. package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +2 -2
  563. package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +2 -2
  564. package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +2 -2
  565. package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +5 -3
  566. package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +2 -2
  567. package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +18 -2
  568. package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +2 -2
  569. package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +2 -2
  570. package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +2 -2
  571. package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +2 -2
  572. package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +2 -2
  573. package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +2 -2
  574. package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +2 -2
  575. package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +2 -2
  576. package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +2 -2
  577. package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +2 -2
  578. package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +2 -2
  579. package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +2 -2
  580. package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +2 -2
  581. package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +2 -2
  582. package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +2 -2
  583. package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +2 -2
  584. package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +2 -2
  585. package/project/.sdk/tm/ocaml/feature/secrets/plugins/minivault.ml +1086 -0
  586. package/project/.sdk/tm/ocaml/feature/secrets/plugins/minivault_stubs.c +222 -0
  587. package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +2 -2
  588. package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +2 -2
  589. package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +2 -2
  590. package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +2 -2
  591. package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +2 -2
  592. package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +2 -2
  593. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +2 -2
  594. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +33 -3
  595. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +2 -2
  596. package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +4 -3
  597. package/project/.sdk/tm/ocaml/sdk_features.ml +174 -0
  598. package/project/.sdk/tm/ocaml/sdk_runtime.ml +12 -37
  599. package/project/.sdk/tm/ocaml/src/feature/validate/.gitkeep +0 -0
  600. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
  601. package/project/.sdk/tm/perl/core/helpers.pm +64 -16
  602. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +2 -2
  603. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +2 -2
  604. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +2 -2
  605. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +2 -2
  606. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +2 -2
  607. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +3 -3
  608. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +2 -2
  609. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +19 -2
  610. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +2 -2
  611. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +2 -2
  612. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +2 -2
  613. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +2 -2
  614. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +2 -2
  615. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +2 -2
  616. package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +2 -2
  617. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +2 -2
  618. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +2 -2
  619. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +2 -2
  620. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +2 -2
  621. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +2 -2
  622. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +2 -2
  623. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +2 -2
  624. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +2 -2
  625. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Minivault.pm +1380 -0
  626. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +2 -2
  627. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +2 -2
  628. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +2 -2
  629. package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +2 -2
  630. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +2 -2
  631. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +4 -3
  632. package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +2 -2
  633. package/project/.sdk/tm/perl/feature/validate_feature.pm +319 -0
  634. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
  635. package/project/.sdk/tm/perl/src/feature/validate/.gitkeep +0 -0
  636. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +1 -1
  637. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +1 -1
  638. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +1 -1
  639. package/project/.sdk/tm/perl/utility/make_options.pm +25 -43
  640. package/project/.sdk/tm/php/feature/ValidateFeature.php +361 -0
  641. package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +2 -2
  642. package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +2 -2
  643. package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +2 -2
  644. package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +2 -2
  645. package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +2 -2
  646. package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +3 -3
  647. package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +2 -2
  648. package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +26 -2
  649. package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +2 -2
  650. package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +2 -2
  651. package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +2 -2
  652. package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +2 -2
  653. package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +2 -2
  654. package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +2 -2
  655. package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +2 -2
  656. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +2 -2
  657. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +2 -2
  658. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +2 -2
  659. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +2 -2
  660. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +2 -2
  661. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +2 -2
  662. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +2 -2
  663. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +2 -2
  664. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/minivault.php +1250 -0
  665. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +2 -2
  666. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +2 -2
  667. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +2 -2
  668. package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +2 -2
  669. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +2 -2
  670. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +5 -3
  671. package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +2 -2
  672. package/project/.sdk/tm/php/src/feature/validate/.gitkeep +0 -0
  673. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +2 -2
  674. package/project/.sdk/tm/php/test/vendor/omni/Util.php +2 -2
  675. package/project/.sdk/tm/php/utility/MakeOptions.php +15 -31
  676. package/project/.sdk/tm/php/utility/struct/Struct.php +56 -7
  677. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +1 -1
  678. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +1 -1
  679. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +1 -1
  680. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +1 -1
  681. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +1 -1
  682. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +1 -1
  683. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +2 -2
  684. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +1 -1
  685. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +17 -1
  686. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
  687. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
  688. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
  689. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
  690. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
  691. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
  692. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +1 -1
  693. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
  694. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +1 -1
  695. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
  696. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
  697. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
  698. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
  699. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +1 -1
  700. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
  701. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +1 -1
  702. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/minivault.py +1202 -0
  703. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +1 -1
  704. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +1 -1
  705. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +1 -1
  706. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +2 -1
  707. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +1 -1
  708. package/project/.sdk/tm/py/pkg/feature/validate_feature.py +273 -0
  709. package/project/.sdk/tm/py/pkg/utility/make_options.py +14 -53
  710. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
  711. package/project/.sdk/tm/py/src/feature/validate/.gitkeep +0 -0
  712. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
  713. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +1 -1
  714. package/project/.sdk/tm/py/test/voxgig_omni/util.py +1 -1
  715. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +2 -2
  716. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +2 -2
  717. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +2 -2
  718. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +2 -2
  719. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +2 -2
  720. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +3 -3
  721. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +2 -2
  722. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +16 -2
  723. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +2 -2
  724. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +2 -2
  725. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +2 -2
  726. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +2 -2
  727. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +2 -2
  728. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +2 -2
  729. package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +2 -2
  730. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +2 -2
  731. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +2 -2
  732. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +2 -2
  733. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +2 -2
  734. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +2 -2
  735. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +2 -2
  736. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +2 -2
  737. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +2 -2
  738. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +2 -2
  739. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/minivault.rb +979 -0
  740. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +2 -2
  741. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +2 -2
  742. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +2 -2
  743. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +6 -5
  744. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +2 -2
  745. package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +2 -2
  746. package/project/.sdk/tm/rb/feature/validate_feature.rb +265 -0
  747. package/project/.sdk/tm/rb/src/feature/validate/.gitkeep +0 -0
  748. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +2 -2
  749. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +2 -2
  750. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +2 -2
  751. package/project/.sdk/tm/rb/utility/make_options.rb +15 -32
  752. package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +24 -1
  753. package/project/.sdk/tm/rust/core/mod.rs +3 -2
  754. package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +2 -2
  755. package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +2 -2
  756. package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +2 -2
  757. package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +2 -2
  758. package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +2 -2
  759. package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +3 -3
  760. package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +2 -2
  761. package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +24 -2
  762. package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +2 -2
  763. package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +2 -2
  764. package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +2 -2
  765. package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +2 -2
  766. package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +2 -2
  767. package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +2 -2
  768. package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +2 -2
  769. package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +2 -2
  770. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +2 -2
  771. package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +2 -2
  772. package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +2 -2
  773. package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +2 -2
  774. package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +2 -2
  775. package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +2 -2
  776. package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +2 -2
  777. package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +2 -2
  778. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +2 -2
  779. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +2 -2
  780. package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +2 -2
  781. package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +2 -2
  782. package/project/.sdk/tm/rust/feature/secrets/plugins/minivault/format.rs +425 -0
  783. package/project/.sdk/tm/rust/feature/secrets/plugins/minivault.rs +1076 -0
  784. package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +2 -2
  785. package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +2 -2
  786. package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +2 -2
  787. package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +2 -2
  788. package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +30 -4
  789. package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +2 -2
  790. package/project/.sdk/tm/rust/feature/validate.rs +387 -0
  791. package/project/.sdk/tm/rust/src/feature/validate/.gitkeep +0 -0
  792. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +2 -2
  793. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +2 -2
  794. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +2 -2
  795. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +2 -2
  796. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +2 -2
  797. package/project/.sdk/tm/rust/utility/make_options.rs +12 -63
  798. package/project/.sdk/tm/rust/utility/make_spec.rs +10 -3
  799. package/project/.sdk/tm/scala/feature/ValidateFeature.scala +286 -0
  800. package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +2 -2
  801. package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +2 -2
  802. package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +2 -2
  803. package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +2 -2
  804. package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +3 -3
  805. package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +2 -2
  806. package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +19 -2
  807. package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +2 -2
  808. package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +2 -2
  809. package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +2 -2
  810. package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +2 -2
  811. package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +2 -2
  812. package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +2 -2
  813. package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +2 -2
  814. package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +2 -2
  815. package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +2 -2
  816. package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +2 -2
  817. package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +2 -2
  818. package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +3 -2
  819. package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +2 -2
  820. package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +13 -2
  821. package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +11 -2
  822. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +2 -2
  823. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +2 -2
  824. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +2 -2
  825. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +2 -2
  826. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +2 -2
  827. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +2 -2
  828. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +2 -2
  829. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +2 -2
  830. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Minivault.scala +979 -0
  831. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +2 -2
  832. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +2 -2
  833. package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +2 -2
  834. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +2 -2
  835. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +2 -2
  836. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +2 -2
  837. package/project/.sdk/tm/scala/src/feature/validate/.gitkeep +0 -0
  838. package/project/.sdk/tm/scala/utility/Make.scala +12 -41
  839. package/project/.sdk/tm/scala/utility/MakeSpec.scala +8 -1
  840. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/ValidateFeature.swift +273 -0
  841. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +2 -2
  842. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +2 -2
  843. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +2 -2
  844. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +2 -2
  845. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +2 -2
  846. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +3 -3
  847. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +2 -2
  848. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +17 -2
  849. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +2 -2
  850. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +2 -2
  851. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +2 -2
  852. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +2 -2
  853. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +2 -2
  854. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +2 -2
  855. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +2 -2
  856. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +2 -2
  857. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +2 -2
  858. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +2 -2
  859. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +2 -2
  860. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +2 -2
  861. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +2 -2
  862. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +2 -2
  863. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +2 -2
  864. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +2 -2
  865. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +2 -2
  866. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +2 -2
  867. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +2 -2
  868. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +2 -2
  869. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +2 -2
  870. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +2 -2
  871. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +2 -2
  872. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +2 -2
  873. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +2 -2
  874. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +2 -2
  875. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Make.swift +9 -3
  876. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +12 -87
  877. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +3 -3
  878. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +2 -2
  879. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +2 -2
  880. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +2 -2
  881. package/project/.sdk/tm/swift/src/feature/validate/.gitkeep +0 -0
  882. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +1 -1
  883. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +1 -1
  884. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +1 -1
  885. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +1 -1
  886. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +1 -1
  887. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +13 -2
  888. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +1 -1
  889. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +1 -1
  890. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +27 -1
  891. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +1 -1
  892. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +1 -1
  893. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +1 -1
  894. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +1 -1
  895. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +1 -1
  896. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +1 -1
  897. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +1 -1
  898. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +1 -1
  899. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +1 -1
  900. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/aws.ts +1 -1
  901. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/azuresecrets.ts +1 -1
  902. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/boru.ts +1 -1
  903. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/doppler.ts +1 -1
  904. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/gcpsecrets.ts +1 -1
  905. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/hashicorp.ts +1 -1
  906. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +1 -1
  907. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/infisical.ts +1 -1
  908. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/minivault.ts +1034 -0
  909. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/onepassword.ts +1 -1
  910. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +1 -1
  911. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/sigv4.ts +1 -1
  912. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +1 -1
  913. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +2 -1
  914. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +1 -1
  915. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +1 -1
  916. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +1 -1
  917. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +1 -1
  918. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +11 -1
  919. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +1 -1
  920. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +1 -1
  921. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +1 -1
  922. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
  923. package/project/.sdk/tm/zig/core/utility.zig +20 -44
  924. package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +2 -2
  925. package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +2 -2
  926. package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +2 -2
  927. package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +2 -2
  928. package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +2 -2
  929. package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +3 -3
  930. package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +2 -2
  931. package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +18 -2
  932. package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +2 -2
  933. package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +2 -2
  934. package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +2 -2
  935. package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +2 -2
  936. package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +2 -2
  937. package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +2 -2
  938. package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +2 -2
  939. package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +2 -2
  940. package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +2 -2
  941. package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +2 -2
  942. package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +2 -2
  943. package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +2 -2
  944. package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +2 -2
  945. package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +2 -2
  946. package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +2 -2
  947. package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +2 -2
  948. package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +2 -2
  949. package/project/.sdk/tm/zig/feature/secrets/plugins/minivault.zig +1930 -0
  950. package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +2 -2
  951. package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +2 -2
  952. package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +2 -2
  953. package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +2 -2
  954. package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +3 -2
  955. package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +19 -2
  956. package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +2 -2
  957. package/project/.sdk/tm/zig/feature/validate.zig +293 -0
  958. package/project/.sdk/tm/zig/src/feature/validate/.gitkeep +0 -0
  959. package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +2 -2
  960. package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +2 -2
  961. package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +2 -2
  962. package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +2 -2
  963. package/project/sdkgen-package.json +1 -1
  964. package/src/helpers/applicability.ts +11 -6
  965. package/src/helpers/collectDeps.ts +30 -5
  966. package/src/helpers/naming.ts +2 -2
@@ -0,0 +1,1380 @@
1
+ # VENDORED: @voxgig/sekreto sdk-20260917-1242-0 (perl/plugins/Voxgig/Sekreto/Plugins/Minivault.pm)
2
+ # Source: https://github.com/voxgig/sekreto @ 108c4a914bee7b6534c30d1c68c25cd1b9377696 [tag: sdk-20260917-1242-0]
3
+ # License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ package Voxgig::Sekreto::Plugins::Minivault;
5
+
6
+ # The mini vault: every secret a project owns, encrypted, in one file.
7
+ #
8
+ # A store this library owns outright rather than a client for a server
9
+ # somebody else runs. It has a master key and restricted keys, and it is
10
+ # the port's worked example of a definition publishing an API beside its
11
+ # provider: a chain READS, and writing is a deliberate act with an
12
+ # interface of its own.
13
+ #
14
+ # use Voxgig::Sekreto::Plugins::Minivault qw(createvault minivault vaultof);
15
+ #
16
+ # my $vault = createvault( { file => 'app.skmv', passphrase => $master } );
17
+ # $vault->set( 'api.token', 'tok01' );
18
+ # $vault->grant( { key => 'ci', passphrase => $ci, names => ['api.token'] } );
19
+ #
20
+ # my $secrets = Voxgig::Sekreto->new({
21
+ # plugins => [ minivault() ],
22
+ # providers => [ { kind => 'minivault', file => 'app.skmv',
23
+ # vaultkey => 'ci', passphrase => $ci } ],
24
+ # });
25
+ #
26
+ # $secrets->get('api.token'); # the chain reads
27
+ # vaultof($secrets)->list; # the API writes
28
+ #
29
+ # THE FILE FORMAT IS THE CONTRACT, and the vaults committed under
30
+ # test/fixture/ pin it: a vault written by any port is read by every other.
31
+ #
32
+ # magic 4 'SKMV'
33
+ # version 1 FORMAT
34
+ # kdf 1 1 = PBKDF2-HMAC-SHA256
35
+ # cipher 1 1 = AES-256-GCM
36
+ # reserved 1 0
37
+ # keycount 4 uint32
38
+ # per key:
39
+ # id 1 + bytes the key id, PLAINTEXT
40
+ # salt 1 + bytes
41
+ # iters 4 PBKDF2 rounds for this key
42
+ # ring 1 + iv, 4 + bytes sealed under the passphrase
43
+ # meta 1 + iv, 4 + bytes sealed under the vault's meta key
44
+ # entrycount 4 uint32
45
+ # per entry:
46
+ # id 1 + bytes the blinded lookup id
47
+ # name 1 + iv, 4 + bytes sealed under the vault's name key
48
+ # value 1 + iv, 4 + bytes sealed under that secret's own key
49
+ #
50
+ # Integers are big-endian and every length precedes its bytes, so the file
51
+ # is written with the same two primitives it is read with.
52
+ #
53
+ # NOTHING OUTSIDE A KEY RECORD IS PLAINTEXT. Secret names are sealed, and
54
+ # an entry is addressed by a blinded id derived from its own key, so a
55
+ # restricted key finds what it was granted without the file ever naming
56
+ # the rest. What the file does show anyone is the key ids and how many
57
+ # secrets there are.
58
+ #
59
+ # A port of typescript/plugins/minivault.ts, which is canonical.
60
+
61
+ use strict;
62
+ use warnings;
63
+
64
+ use Exporter 'import';
65
+
66
+ use Fcntl ();
67
+ use JSON::PP ();
68
+ use MIME::Base64 ();
69
+ use Scalar::Util ();
70
+
71
+ use Voxgig::Plugin::Types ();
72
+
73
+ use Voxgig::Sekreto ();
74
+ use Voxgig::Sekreto::Providers qw(PROVIDER_EXPORT ERROR_CODE);
75
+
76
+ our @EXPORT_OK = qw(minivault openvault createvault vaultof minivaultoptions);
77
+
78
+ sub MAGIC { return 'SKMV' }
79
+ sub FORMAT { return 1 }
80
+
81
+ sub KDF_PBKDF2 { return 1 }
82
+ sub CIPHER_AESGCM { return 1 }
83
+
84
+ # AES-256-GCM: 32-byte keys, 12-byte nonces, 16-byte tags.
85
+ sub KEYLEN { return 32 }
86
+ sub IVLEN { return 12 }
87
+ sub TAGLEN { return 16 }
88
+ sub SALTLEN { return 16 }
89
+
90
+ # The PBKDF2-HMAC-SHA256 round count when a caller names none.
91
+ sub ITERATIONS { return 210_000 }
92
+
93
+ # The key id a vault gets when a caller names none.
94
+ sub MASTERKEY { return 'master' }
95
+
96
+ # The export key the vault API is published under, beside the provider.
97
+ sub VAULT_EXPORT { return 'vault' }
98
+
99
+ # Additional authenticated data. Every blob is bound to its PLACE in the
100
+ # file, so no ciphertext can be moved: a restricted key's ring cannot be
101
+ # relabelled as the master's, and one secret's value cannot be served
102
+ # under a name it was never written for.
103
+ sub AAD_RING { return 'skmv1:ring:' }
104
+ sub AAD_META { return 'skmv1:meta:' }
105
+ sub AAD_NAME { return 'skmv1:name' }
106
+ sub AAD_SECRET { return 'skmv1:secret:' }
107
+
108
+ # Everything a master reaches is derived from the root key, so rotating is
109
+ # one new random value rather than a re-wrap of each part.
110
+ sub LABEL_NAMES { return 'skmv1:names' }
111
+ sub LABEL_META { return 'skmv1:meta' }
112
+ sub LABEL_ID { return 'skmv1:id' }
113
+
114
+ # The largest key id the format can record.
115
+ #
116
+ # A length is written in ONE byte. A longer id wraps that byte and the
117
+ # writer then appends the whole thing, so every field after it shifts: a
118
+ # grant with a 300-character id would replace a working vault with an
119
+ # unreadable one, and say nothing. Checked where an id is ACCEPTED, so the
120
+ # refusal names the id rather than the file.
121
+ sub IDMAX { return 255 }
122
+
123
+ sub fail { return Voxgig::Sekreto::fail( 'sekreto: minivault: ' . $_[0] ) }
124
+
125
+ # --- characters in, UTF-8 bytes on disk --------------------------------
126
+ #
127
+ # THE VAULT TAKES TEXT, and the format stores its UTF-8 encoding, because
128
+ # that is what the other twenty ports store: a passphrase, a key id or a
129
+ # value that reaches a KDF or a cipher as anything else produces a vault
130
+ # none of them can open.
131
+ #
132
+ # UNCONDITIONALLY, AND NOT ON `utf8::is_utf8`. That flag is an internal
133
+ # representation, not a meaning: perl holds the same string of characters
134
+ # as Latin-1 bytes or as UTF-8 depending on what has happened to it, and
135
+ # `utf8::upgrade` changes it without changing the string. A conversion
136
+ # that reads the flag therefore hashes one passphrase two ways, which is
137
+ # the defect this replaced. Encoding a copy every time is
138
+ # representation-neutral, which is the property that matters, and ASCII -
139
+ # every passphrase in the fixtures, and most in the world - is unchanged
140
+ # by it.
141
+ #
142
+ # The cost is the other direction: a scalar that is ALREADY UTF-8 bytes,
143
+ # which is what `%ENV` and a file hand back, is encoded twice. So the
144
+ # boundary decodes - `cli/sekreto-cli.pl` does it for the three vault
145
+ # environment variables - and the library works in characters throughout,
146
+ # which is the layering perl asks for anyway.
147
+
148
+ sub bytesof {
149
+ my ($text) = @_;
150
+
151
+ return $text if !defined $text;
152
+
153
+ my $copy = $text;
154
+ utf8::encode($copy);
155
+
156
+ return $copy;
157
+ }
158
+
159
+ # ...and the other way, for what comes back out of the vault: a decoded
160
+ # string, as JSON::PP hands a provider its values. Bytes that are not
161
+ # UTF-8 are handed back as they are rather than mangled into replacement
162
+ # characters - the vault stored them, so it returns them.
163
+ sub textof {
164
+ my ($raw) = @_;
165
+
166
+ return $raw if !defined $raw;
167
+
168
+ my $copy = $raw;
169
+ return $copy if utf8::decode($copy);
170
+
171
+ return $raw;
172
+ }
173
+
174
+ sub checkid {
175
+ my ( $id, $what ) = @_;
176
+
177
+ fail($what) if !defined $id || ref($id) || '' eq $id;
178
+
179
+ # BYTES, because that is what the one length byte counts.
180
+ fail( 'key id is longer than ' . IDMAX() . ' bytes: ' . substr( $id, 0, 32 ) . '...' )
181
+ if IDMAX() < length( bytesof($id) );
182
+
183
+ return $id;
184
+ }
185
+
186
+ # ---------------------------------------------------------- the primitives
187
+ #
188
+ # CryptX, AND NOTHING WRITTEN HERE. Perl's core has SHA-256 in
189
+ # `Digest::SHA` and nothing else the format needs: no AES, no AEAD, no
190
+ # PBKDF2, no CSPRNG. So the whole of the cryptography comes from one
191
+ # audited module rather than three of them plus a block cipher written in
192
+ # this file - which is the thing the dependency rule exists to forbid: a
193
+ # table-driven AES passes every known-answer test in the world and still
194
+ # hands its key to anyone who can time a cache.
195
+ #
196
+ # It is the same posture this port already takes for https, and for the
197
+ # same reason. `HTTP::Tiny` reaches an https store only where
198
+ # `IO::Socket::SSL` is installed; this kind opens a vault only where
199
+ # `CryptX` is. Both are stated in README.md, both fail CLOSED with the
200
+ # package to install, and neither is ever worked around.
201
+ #
202
+ # LOADED ON FIRST USE, not at compile time. A consumer that has this
203
+ # module on @INC and configures no vault must not be stopped by a missing
204
+ # package, and `allplugins` loads every kind whether or not the chain
205
+ # names them.
206
+
207
+ my $CRYPTX;
208
+
209
+ sub cryptx {
210
+ return $CRYPTX if $CRYPTX;
211
+
212
+ my $ok = eval {
213
+ require Crypt::AuthEnc::GCM;
214
+ require Crypt::KeyDerivation;
215
+ require Crypt::Mac::HMAC;
216
+ require Crypt::PRNG;
217
+ 1;
218
+ };
219
+
220
+ fail( 'no AES-256-GCM available: CryptX must be installed for the mini vault'
221
+ . ' (Debian and Ubuntu call it libcryptx-perl)' )
222
+ if !$ok;
223
+
224
+ $CRYPTX = 1;
225
+
226
+ return $CRYPTX;
227
+ }
228
+
229
+ sub mac {
230
+ my ( $key, $text ) = @_;
231
+ cryptx();
232
+ return Crypt::Mac::HMAC::hmac( 'SHA256', $key, bytesof($text) );
233
+ }
234
+
235
+ # The key-encryption key a passphrase unwraps a ring with.
236
+ sub kek {
237
+ my ( $passphrase, $salt, $iters ) = @_;
238
+
239
+ fail( 'unusable round count: ' . $iters ) if 1 > $iters;
240
+ cryptx();
241
+
242
+ return Crypt::KeyDerivation::pbkdf2( bytesof($passphrase), $salt, $iters, 'SHA256',
243
+ KEYLEN() );
244
+ }
245
+
246
+ # The key one named secret's value is encrypted with.
247
+ #
248
+ # DERIVED, never stored, for a master: it holds the root key and so
249
+ # reaches every name, including ones written after it was made. A
250
+ # restricted key holds the derived keys it was granted and nothing that
251
+ # produces another, so every other name is ciphertext to it in exactly the
252
+ # way it is to a stranger.
253
+ sub secretkey {
254
+ my ( $root, $name ) = @_;
255
+ return mac( $root, AAD_SECRET() . $name );
256
+ }
257
+
258
+ # Where a secret lives in the file, derived from its own key so that
259
+ # finding it needs no plaintext name. One-way: an id yields nothing about
260
+ # the key that produced it.
261
+ sub entryid {
262
+ my ($key) = @_;
263
+ return mac( $key, LABEL_ID() );
264
+ }
265
+
266
+ sub randombytes {
267
+ my ($len) = @_;
268
+ cryptx();
269
+ return Crypt::PRNG::random_bytes($len);
270
+ }
271
+
272
+ # Ciphertext followed by the 16-byte tag, which is where every other
273
+ # port's AEAD leaves it and therefore what the format records.
274
+ sub seal {
275
+ my ( $key, $plain, $aad ) = @_;
276
+
277
+ fail('bad key') if KEYLEN() != length($key);
278
+ cryptx();
279
+
280
+ my $iv = randombytes( IVLEN() );
281
+ my ( $body, $tag ) =
282
+ Crypt::AuthEnc::GCM::gcm_encrypt_authenticate( 'AES', $key, $iv, bytesof($aad),
283
+ bytesof($plain) );
284
+
285
+ fail('cannot seal') if !defined $body || !defined $tag || TAGLEN() != length($tag);
286
+
287
+ return { iv => $iv, blob => $body . $tag };
288
+ }
289
+
290
+ # The plaintext, or a refusal.
291
+ #
292
+ # A GCM tag that fails to verify is the only evidence there is, and it
293
+ # cannot tell a wrong passphrase from a damaged file, so `what` names the
294
+ # attempt and the message admits both.
295
+ sub unseal {
296
+ my ( $key, $sealed, $aad, $what ) = @_;
297
+
298
+ fail( $what . ': truncated' )
299
+ if length( $sealed->{blob} ) < TAGLEN() || IVLEN() != length( $sealed->{iv} );
300
+ fail('bad key') if KEYLEN() != length($key);
301
+ cryptx();
302
+
303
+ my $body = substr( $sealed->{blob}, 0, length( $sealed->{blob} ) - TAGLEN() );
304
+ my $tag = substr( $sealed->{blob}, -TAGLEN() );
305
+
306
+ my $plain = Crypt::AuthEnc::GCM::gcm_decrypt_verify( 'AES', $key, $sealed->{iv},
307
+ bytesof($aad), $body, $tag );
308
+
309
+ fail($what) if !defined $plain;
310
+
311
+ return $plain;
312
+ }
313
+
314
+ # THE COMPACT JSON EVERY PORT WRITES, with its keys in a fixed order.
315
+ #
316
+ # Perl hash order is randomised per process, so an encoder left to itself
317
+ # would write the same ring differently on every run - which is not a
318
+ # correctness problem, because a ring is read as an object, and IS a
319
+ # reproducibility one. `canonical` sorts the keys, and the sort changes no
320
+ # byte count: the ring is SEALED, so the length is what the fixtures pin.
321
+ sub jsonof {
322
+ return JSON::PP->new->canonical->utf8->encode( $_[0] );
323
+ }
324
+
325
+ sub parsejson {
326
+ my ( $plain, $what ) = @_;
327
+
328
+ my $out = eval { JSON::PP->new->utf8->decode($plain) };
329
+
330
+ fail( 'unreadable ' . $what ) if !defined $out || 'HASH' ne ref($out);
331
+
332
+ return $out;
333
+ }
334
+
335
+ sub b64 {
336
+ return MIME::Base64::encode_base64( $_[0], '' );
337
+ }
338
+
339
+ # STRICT. A lenient decoder hands back plausible bytes for a corrupted
340
+ # payload, and those bytes are then used AS A KEY.
341
+ sub unb64 {
342
+ my ( $text, $what ) = @_;
343
+
344
+ fail( 'missing ' . $what )
345
+ if !defined $text || ref($text) || $text =~ m{[^A-Za-z0-9+/=]};
346
+
347
+ return MIME::Base64::decode_base64($text);
348
+ }
349
+
350
+ # ---------------------------------------------------------------- the file
351
+
352
+ {
353
+ # A cursor, so that every length check is in one place: a truncated
354
+ # vault is refused rather than read as a short one.
355
+ package Voxgig::Sekreto::Plugins::Minivault::Reader;
356
+
357
+ use strict;
358
+ use warnings;
359
+
360
+ sub new {
361
+ my ( $class, $raw ) = @_;
362
+ return bless { raw => $raw, at => 0 }, $class;
363
+ }
364
+
365
+ # Reads `len` bytes, or refuses.
366
+ #
367
+ # The bound is checked AGAINST WHAT IS LEFT, never by adding the
368
+ # length to the cursor: perl's integers would not wrap here, but the
369
+ # check reads the same in every port and is the one that is right
370
+ # everywhere.
371
+ sub take {
372
+ my ( $self, $len ) = @_;
373
+
374
+ Voxgig::Sekreto::Plugins::Minivault::fail('the vault file is truncated')
375
+ if length( $self->{raw} ) - $self->{at} < $len;
376
+
377
+ my $out = substr( $self->{raw}, $self->{at}, $len );
378
+ $self->{at} += $len;
379
+
380
+ return $out;
381
+ }
382
+
383
+ sub u8 { return unpack( 'C', $_[0]->take(1) ) }
384
+ sub u32 { return unpack( 'N', $_[0]->take(4) ) }
385
+
386
+ sub small { my ($self) = @_; return $self->take( $self->u8 ) }
387
+ sub large { my ($self) = @_; return $self->take( $self->u32 ) }
388
+
389
+ sub sealed {
390
+ my ($self) = @_;
391
+ return { iv => $self->small, blob => $self->large };
392
+ }
393
+
394
+ sub left { my ($self) = @_; return length( $self->{raw} ) - $self->{at} }
395
+ }
396
+
397
+ sub readfile {
398
+ my ($raw) = @_;
399
+
400
+ my $read = Voxgig::Sekreto::Plugins::Minivault::Reader->new($raw);
401
+
402
+ fail('not a vault file') if MAGIC() ne $read->take(4);
403
+
404
+ my $version = $read->u8;
405
+ fail( 'unsupported format version: ' . $version ) if FORMAT() != $version;
406
+
407
+ my $kdf = $read->u8;
408
+ my $cipher = $read->u8;
409
+ fail( 'unsupported kdf or cipher: ' . $kdf . '/' . $cipher )
410
+ if KDF_PBKDF2() != $kdf || CIPHER_AESGCM() != $cipher;
411
+ $read->u8;
412
+
413
+ my $vault = { keys => [], entries => [] };
414
+
415
+ # A COUNT IS BOUNDED BY WHAT IS LEFT. Each record carries at least a
416
+ # few bytes, so a file claiming four billion of them is damaged; the
417
+ # loop would find that out one truncation at a time, and a caller that
418
+ # preallocated would not.
419
+ my $keycount = $read->u32;
420
+ fail('the vault file is truncated') if $read->left < $keycount;
421
+
422
+ for ( 1 .. $keycount ) {
423
+ push @{ $vault->{keys} },
424
+ {
425
+ id => textof( $read->small ),
426
+ salt => $read->small,
427
+ iters => $read->u32,
428
+ ring => $read->sealed,
429
+ meta => $read->sealed,
430
+ };
431
+ }
432
+
433
+ my $entrycount = $read->u32;
434
+ fail('the vault file is truncated') if $read->left < $entrycount;
435
+
436
+ for ( 1 .. $entrycount ) {
437
+ push @{ $vault->{entries} },
438
+ {
439
+ id => $read->small,
440
+ name => $read->sealed,
441
+ value => $read->sealed,
442
+ };
443
+ }
444
+
445
+ fail('the vault file has trailing bytes') if 0 != $read->left;
446
+
447
+ return $vault;
448
+ }
449
+
450
+ sub writefile {
451
+ my ($vault) = @_;
452
+
453
+ my $out = MAGIC() . pack( 'CCCC', FORMAT(), KDF_PBKDF2(), CIPHER_AESGCM(), 0 );
454
+
455
+ my $small = sub { return pack( 'C', length( $_[0] ) ) . $_[0] };
456
+ my $large = sub { return pack( 'N', length( $_[0] ) ) . $_[0] };
457
+ my $sealed = sub { return $small->( $_[0]->{iv} ) . $large->( $_[0]->{blob} ) };
458
+
459
+ $out .= pack( 'N', scalar @{ $vault->{keys} } );
460
+
461
+ for my $record ( @{ $vault->{keys} } ) {
462
+ $out .= $small->( bytesof( $record->{id} ) );
463
+ $out .= $small->( $record->{salt} );
464
+ $out .= pack( 'N', $record->{iters} );
465
+ $out .= $sealed->( $record->{ring} );
466
+ $out .= $sealed->( $record->{meta} );
467
+ }
468
+
469
+ # SORTED BY ID, which is a blinded value: the file therefore records
470
+ # nothing about the order secrets were written in.
471
+ my @entries = sort { $a->{id} cmp $b->{id} } @{ $vault->{entries} };
472
+
473
+ $out .= pack( 'N', scalar @entries );
474
+
475
+ for my $record (@entries) {
476
+ $out .= $small->( $record->{id} );
477
+ $out .= $sealed->( $record->{name} );
478
+ $out .= $sealed->( $record->{value} );
479
+ }
480
+
481
+ return $out;
482
+ }
483
+
484
+ sub keyrecord {
485
+ my ( $vault, $id ) = @_;
486
+
487
+ for my $record ( @{ $vault->{keys} } ) {
488
+ return $record if $id eq $record->{id};
489
+ }
490
+
491
+ return undef;
492
+ }
493
+
494
+ sub entryrecord {
495
+ my ( $vault, $id ) = @_;
496
+
497
+ for my $record ( @{ $vault->{entries} } ) {
498
+ return $record if $id eq $record->{id};
499
+ }
500
+
501
+ return undef;
502
+ }
503
+
504
+ # Is this the same sealed blob, byte for byte?
505
+ sub sameseal {
506
+ my ( $left, $right ) = @_;
507
+ return $left->{iv} eq $right->{iv} && $left->{blob} eq $right->{blob};
508
+ }
509
+
510
+ # ------------------------------------------------------- the file on disk
511
+
512
+ # Writes bytes to a path that is not there yet, and REFUSES one that is.
513
+ #
514
+ # `O_EXCL` refuses an existing path in ONE syscall and will not follow a
515
+ # symlink to make one, and the mode goes on AT CREATION rather than after:
516
+ # a chmod once the bytes are written leaves the file readable for as long
517
+ # as it takes to write them.
518
+ #
519
+ # Returns the errno string on failure, so that both callers can name the
520
+ # VAULT file - the path a caller configured, not the temporary one of them
521
+ # happens to be writing.
522
+ sub spill {
523
+ my ( $path, $raw ) = @_;
524
+
525
+ my $handle;
526
+ if (
527
+ !sysopen( $handle, $path,
528
+ Fcntl::O_WRONLY() | Fcntl::O_CREAT() | Fcntl::O_EXCL(), oct('600') )
529
+ )
530
+ {
531
+ return "$!";
532
+ }
533
+
534
+ binmode($handle);
535
+
536
+ my $written = syswrite( $handle, $raw );
537
+ my $why = defined $written && length($raw) == $written ? undef : "$!";
538
+
539
+ close($handle) or $why ||= "$!";
540
+
541
+ return $why;
542
+ }
543
+
544
+ # Writes a vault file that is not there yet, and REFUSES one that is.
545
+ sub putnew {
546
+ my ( $path, $vault ) = @_;
547
+
548
+ my $why = spill( $path, writefile($vault) );
549
+ return if !defined $why;
550
+
551
+ fail( 'vault file already exists: ' . $path ) if -e $path;
552
+ fail( 'cannot write ' . $path . ': ' . $why );
553
+
554
+ return;
555
+ }
556
+
557
+ sub readmaybe {
558
+ my ($path) = @_;
559
+
560
+ my $handle;
561
+ if ( !open( $handle, '<', $path ) ) {
562
+ return undef if !-e $path;
563
+ fail( 'cannot read ' . $path . ': ' . $! );
564
+ }
565
+
566
+ binmode($handle);
567
+ local $/ = undef;
568
+ my $raw = <$handle>;
569
+ close($handle);
570
+
571
+ return defined $raw ? $raw : '';
572
+ }
573
+
574
+ # ------------------------------------------------------------- creating
575
+
576
+ # A new vault: one master key, no secrets.
577
+ sub newvault {
578
+ my ( $keyid, $passphrase, $iterations ) = @_;
579
+
580
+ my $root = randombytes( KEYLEN() );
581
+ my $salt = randombytes( SALTLEN() );
582
+
583
+ my $ring = { v => FORMAT(), write => JSON::PP::true, root => b64($root) };
584
+ my $meta = {
585
+ v => FORMAT(),
586
+ master => JSON::PP::true,
587
+ write => JSON::PP::true,
588
+ grants => [],
589
+ };
590
+
591
+ return {
592
+ keys => [
593
+ {
594
+ id => $keyid,
595
+ salt => $salt,
596
+ iters => $iterations,
597
+ ring => seal( kek( $passphrase, $salt, $iterations ),
598
+ jsonof($ring), AAD_RING() . $keyid ),
599
+ meta => seal( mac( $root, LABEL_META() ),
600
+ jsonof($meta), AAD_META() . $keyid ),
601
+ }
602
+ ],
603
+ entries => [],
604
+ };
605
+ }
606
+
607
+ # One key record: the ring sealed under the passphrase, the metadata
608
+ # sealed under the vault's meta key.
609
+ sub sealkey {
610
+ my ( $root, $keyid, $passphrase, $iters, $ring, $meta ) = @_;
611
+
612
+ my $salt = randombytes( SALTLEN() );
613
+
614
+ return {
615
+ id => $keyid,
616
+ salt => $salt,
617
+ iters => $iters,
618
+ ring => seal( kek( $passphrase, $salt, $iters ), jsonof($ring),
619
+ AAD_RING() . $keyid ),
620
+ meta => seal( mac( $root, LABEL_META() ), jsonof($meta), AAD_META() . $keyid ),
621
+ };
622
+ }
623
+
624
+ # AN EMPTY KEY IS NO KEY, so it means `master`.
625
+ #
626
+ # A CLI reaches here with SEKRETO_VAULT_KEY set and empty, which is what
627
+ # an unset shell variable expands to, and an empty id is not a key anyone
628
+ # could have granted.
629
+ sub wantkey {
630
+ my ($held) = @_;
631
+ return ( !defined $held || ref($held) || '' eq $held ) ? MASTERKEY() : $held;
632
+ }
633
+
634
+ # A detached copy, so that what a caller is handed cannot become what this
635
+ # vault believes.
636
+ sub copyinfo {
637
+ my ($info) = @_;
638
+
639
+ return {
640
+ key => $info->{key},
641
+ master => $info->{master},
642
+ write => $info->{write},
643
+ grants => [ @{ $info->{grants} } ],
644
+ };
645
+ }
646
+
647
+ # --------------------------------------------------------------- the vault
648
+
649
+ {
650
+ # A handle on one vault file, opened as ONE key.
651
+ #
652
+ # Every method answers as that key: `list` shows the names it may
653
+ # read, `get` answers for those and misses on the rest, and the
654
+ # master-only methods refuse for any other key. Nothing is read or
655
+ # derived until the first call that needs the file.
656
+ #
657
+ # `master` and `write` are 1/0, as Perl truth goes, which is what
658
+ # `validname` in the core does with the same question.
659
+ package Voxgig::Sekreto::Plugins::Minivault::Vault;
660
+
661
+ use strict;
662
+ use warnings;
663
+
664
+ use File::Spec ();
665
+
666
+ my $MV = 'Voxgig::Sekreto::Plugins::Minivault';
667
+
668
+ sub new {
669
+ my ( $class, $options ) = @_;
670
+
671
+ my $opts = $options || {};
672
+
673
+ my $self = bless {
674
+ file => $opts->{file},
675
+ keyid => $MV->can('wantkey')->( $opts->{key} ),
676
+ passphrase => $opts->{passphrase},
677
+ iterations => $opts->{iterations} || $MV->can('ITERATIONS')->(),
678
+ create => ( defined $opts->{create} && $opts->{create} ) ? 1 : 0,
679
+ opened => undef,
680
+ }, $class;
681
+
682
+ Voxgig::Sekreto::Plugins::Minivault::fail('a vault needs a file')
683
+ if !defined $self->{file} || ref( $self->{file} ) || '' eq $self->{file};
684
+
685
+ Voxgig::Sekreto::Plugins::Minivault::fail('a vault needs a passphrase')
686
+ if !defined $self->{passphrase}
687
+ || ref( $self->{passphrase} )
688
+ || '' eq $self->{passphrase};
689
+
690
+ Voxgig::Sekreto::Plugins::Minivault::checkid( $self->{keyid},
691
+ 'a vault needs a key id' );
692
+
693
+ return $self;
694
+ }
695
+
696
+ # The file this handle reads.
697
+ sub file { return $_[0]->{file} }
698
+
699
+ # The key id this handle opens with.
700
+ sub key { return $_[0]->{keyid} }
701
+
702
+ # Derive the key and read the file NOW rather than at first use.
703
+ sub open {
704
+ my ($self) = @_;
705
+ my ( undef, $opened ) = $self->load;
706
+ return Voxgig::Sekreto::Plugins::Minivault::copyinfo( $opened->{info} );
707
+ }
708
+
709
+ # Forget the derived keys. The next call opens again.
710
+ sub close {
711
+ my ($self) = @_;
712
+ $self->{opened} = undef;
713
+ return;
714
+ }
715
+
716
+ # The names this key can read, sorted.
717
+ sub list {
718
+ my ($self) = @_;
719
+ my ( $vault, $opened ) = $self->load;
720
+
721
+ if ( defined $opened->{root} ) {
722
+ my $namekey = Voxgig::Sekreto::Plugins::Minivault::mac( $opened->{root},
723
+ Voxgig::Sekreto::Plugins::Minivault::LABEL_NAMES() );
724
+
725
+ return [
726
+ sort map {
727
+ Voxgig::Sekreto::Plugins::Minivault::textof(
728
+ Voxgig::Sekreto::Plugins::Minivault::unseal(
729
+ $namekey, $_->{name},
730
+ Voxgig::Sekreto::Plugins::Minivault::AAD_NAME(),
731
+ 'a secret name is damaged'
732
+ )
733
+ )
734
+ } @{ $vault->{entries} }
735
+ ];
736
+ }
737
+
738
+ # A restricted key has no name key, so it reports the grants it
739
+ # can actually find: the vault never tells it what else is in
740
+ # there.
741
+ return [
742
+ sort grep { defined $self->findentry( $vault, $opened->{grants}{$_} ) }
743
+ @{ $opened->{info}{grants} }
744
+ ];
745
+ }
746
+
747
+ sub has {
748
+ my ( $self, $name ) = @_;
749
+ return defined $self->get($name) ? 1 : 0;
750
+ }
751
+
752
+ # The value, or undef when the vault does not hold that name or this
753
+ # key was not granted it.
754
+ sub get {
755
+ my ( $self, $name ) = @_;
756
+
757
+ Voxgig::Sekreto::checkname($name);
758
+ my ( $vault, $opened ) = $self->load;
759
+
760
+ my $key = $self->keyfor( $opened, $name );
761
+
762
+ # OUTSIDE THE GRANT IS A MISS, deliberately. The vault answers as
763
+ # the key that opened it, so a name this key cannot read is a name
764
+ # this store does not hold for this caller.
765
+ return undef if !defined $key;
766
+
767
+ my $entry = $self->findentry( $vault, $key );
768
+ return undef if !defined $entry;
769
+
770
+ return Voxgig::Sekreto::Plugins::Minivault::textof(
771
+ Voxgig::Sekreto::Plugins::Minivault::unseal(
772
+ $key, $entry->{value},
773
+ Voxgig::Sekreto::Plugins::Minivault::AAD_SECRET() . $name,
774
+ 'the value of ' . $name . ' is damaged'
775
+ )
776
+ );
777
+ }
778
+
779
+ # Write a value. A master writes any name; a restricted key holding
780
+ # `write` overwrites the names it was granted, and creates none.
781
+ sub set {
782
+ my ( $self, $name, $value ) = @_;
783
+
784
+ Voxgig::Sekreto::checkname($name);
785
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'a secret value must be text: ' . $name )
786
+ if !defined $value || ref($value);
787
+
788
+ my ( $vault, $opened ) = $self->load;
789
+
790
+ Voxgig::Sekreto::Plugins::Minivault::fail(
791
+ 'key ' . $opened->{info}{key} . ' is read-only' )
792
+ if !$opened->{info}{write};
793
+
794
+ my $key = $self->keyfor( $opened, $name );
795
+ Voxgig::Sekreto::Plugins::Minivault::fail(
796
+ 'key ' . $opened->{info}{key} . ' was not granted ' . $name )
797
+ if !defined $key;
798
+
799
+ my $sealedvalue = Voxgig::Sekreto::Plugins::Minivault::seal( $key, $value,
800
+ Voxgig::Sekreto::Plugins::Minivault::AAD_SECRET() . $name );
801
+
802
+ my $id = Voxgig::Sekreto::Plugins::Minivault::entryid($key);
803
+ my $entry = Voxgig::Sekreto::Plugins::Minivault::entryrecord( $vault, $id );
804
+
805
+ if ( defined $entry ) {
806
+ $entry->{value} = $sealedvalue;
807
+ }
808
+ else {
809
+ # A NEW NAME NEEDS THE NAME KEY, which only a master holds. So
810
+ # a restricted key with `write` updates what it was granted
811
+ # and cannot grow the vault.
812
+ my $root = $self->rootof( $opened, 'creating the secret ' . $name );
813
+
814
+ push @{ $vault->{entries} },
815
+ {
816
+ id => $id,
817
+ name => Voxgig::Sekreto::Plugins::Minivault::seal(
818
+ Voxgig::Sekreto::Plugins::Minivault::mac(
819
+ $root, Voxgig::Sekreto::Plugins::Minivault::LABEL_NAMES()
820
+ ),
821
+ $name,
822
+ Voxgig::Sekreto::Plugins::Minivault::AAD_NAME()
823
+ ),
824
+ value => $sealedvalue,
825
+ };
826
+ }
827
+
828
+ $self->save($vault);
829
+
830
+ return;
831
+ }
832
+
833
+ # Drop a name. Master only.
834
+ sub remove {
835
+ my ( $self, $name ) = @_;
836
+
837
+ Voxgig::Sekreto::checkname($name);
838
+ my ( $vault, $opened ) = $self->load;
839
+ my $root = $self->rootof( $opened, 'removing a secret' );
840
+
841
+ my $wanted = Voxgig::Sekreto::Plugins::Minivault::entryid(
842
+ Voxgig::Sekreto::Plugins::Minivault::secretkey( $root, $name ) );
843
+
844
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'no such secret: ' . $name )
845
+ if !defined Voxgig::Sekreto::Plugins::Minivault::entryrecord( $vault, $wanted );
846
+
847
+ $vault->{entries} = [ grep { $wanted ne $_->{id} } @{ $vault->{entries} } ];
848
+ $self->save($vault);
849
+
850
+ return;
851
+ }
852
+
853
+ # Every key in the file, with what it may do. Master only.
854
+ sub keys {
855
+ my ($self) = @_;
856
+ my ( $vault, $opened ) = $self->load;
857
+ $self->rootof( $opened, 'listing the keys' );
858
+
859
+ my @out;
860
+
861
+ for my $record ( @{ $vault->{keys} } ) {
862
+ my $meta = $self->metaof( $opened, $record );
863
+
864
+ my $id = $record->{id};
865
+
866
+ if ( !defined $meta ) {
867
+ push @out,
868
+ { key => $id, master => 0, write => 0, grants => [] };
869
+ }
870
+ else {
871
+ push @out,
872
+ {
873
+ key => $id,
874
+ master => $meta->{master} ? 1 : 0,
875
+ write => $meta->{write} ? 1 : 0,
876
+ grants => [ sort @{ $meta->{grants} || [] } ],
877
+ };
878
+ }
879
+ }
880
+
881
+ return \@out;
882
+ }
883
+
884
+ # Mint a restricted key. Master only.
885
+ sub grant {
886
+ my ( $self, $spec ) = @_;
887
+
888
+ my ( $vault, $opened ) = $self->load;
889
+ my $root = $self->rootof( $opened, 'granting a key' );
890
+
891
+ $spec ||= {};
892
+ Voxgig::Sekreto::Plugins::Minivault::checkid( $spec->{key},
893
+ 'a grant needs a key id' );
894
+
895
+
896
+ Voxgig::Sekreto::Plugins::Minivault::fail('a grant needs a passphrase')
897
+ if !defined $spec->{passphrase}
898
+ || ref( $spec->{passphrase} )
899
+ || '' eq $spec->{passphrase};
900
+
901
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'key already exists: ' . $spec->{key} )
902
+ if defined Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $spec->{key} );
903
+
904
+ my @names = sort @{ $spec->{names} || [] };
905
+ my %grants;
906
+
907
+ for my $name (@names) {
908
+ Voxgig::Sekreto::checkname($name);
909
+ $grants{$name} = Voxgig::Sekreto::Plugins::Minivault::b64(
910
+ Voxgig::Sekreto::Plugins::Minivault::secretkey( $root, $name ) );
911
+ }
912
+
913
+ my $write = ( defined $spec->{write} && $spec->{write} ) ? 1 : 0;
914
+
915
+ push @{ $vault->{keys} },
916
+ Voxgig::Sekreto::Plugins::Minivault::sealkey(
917
+ $root,
918
+ $spec->{key},
919
+ $spec->{passphrase},
920
+ $spec->{iterations} || $self->{iterations},
921
+
922
+ # GRANTS IS ALWAYS THERE, even granted nothing. A ring without
923
+ # it is a MASTER's ring in every port's reader, so dropping the
924
+ # empty map would be a key that reads the whole vault.
925
+ {
926
+ v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
927
+ write => $write ? JSON::PP::true : JSON::PP::false,
928
+ grants => \%grants,
929
+ },
930
+ {
931
+ v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
932
+ master => JSON::PP::false,
933
+ write => $write ? JSON::PP::true : JSON::PP::false,
934
+ grants => \@names,
935
+ }
936
+ );
937
+
938
+ $self->save($vault);
939
+
940
+ return;
941
+ }
942
+
943
+ # Drop a key. Master only.
944
+ #
945
+ # Anyone who already copied the file keeps whatever that key could
946
+ # read, so revoking bars future reads of the LIVE file and `rotate` is
947
+ # what takes a secret back.
948
+ sub revoke {
949
+ my ( $self, $key ) = @_;
950
+
951
+ my ( $vault, $opened ) = $self->load;
952
+ $self->rootof( $opened, 'revoking a key' );
953
+
954
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'a key cannot revoke itself: ' . $key )
955
+ if $key eq $opened->{info}{key};
956
+
957
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'no such key: ' . $key )
958
+ if !defined Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $key );
959
+
960
+ $vault->{keys} = [ grep { $key ne $_->{id} } @{ $vault->{keys} } ];
961
+ $self->save($vault);
962
+
963
+ return;
964
+ }
965
+
966
+ # A new root key, every value re-encrypted under it, and EVERY OTHER
967
+ # KEY DROPPED. Master only.
968
+ #
969
+ # The other keys go because they must: their rings are sealed under
970
+ # passphrases this process does not have. Re-grant afterwards.
971
+ sub rotate {
972
+ my ($self) = @_;
973
+
974
+ my ( $vault, $opened ) = $self->load;
975
+ $self->rootof( $opened, 'rotating the vault' );
976
+
977
+ # Read everything out under the old root before anything changes:
978
+ # once the root is replaced the old derived keys are unreachable.
979
+ my @plain = map { [ $_, $self->get($_) ] } @{ $self->list };
980
+
981
+ my $root = Voxgig::Sekreto::Plugins::Minivault::randombytes(
982
+ Voxgig::Sekreto::Plugins::Minivault::KEYLEN() );
983
+ my $namekey = Voxgig::Sekreto::Plugins::Minivault::mac( $root,
984
+ Voxgig::Sekreto::Plugins::Minivault::LABEL_NAMES() );
985
+
986
+ my @entries;
987
+
988
+ for my $pair (@plain) {
989
+ my ( $name, $value ) = @{$pair};
990
+ my $key = Voxgig::Sekreto::Plugins::Minivault::secretkey( $root, $name );
991
+
992
+ push @entries,
993
+ {
994
+ id => Voxgig::Sekreto::Plugins::Minivault::entryid($key),
995
+ name => Voxgig::Sekreto::Plugins::Minivault::seal(
996
+ $namekey, $name, Voxgig::Sekreto::Plugins::Minivault::AAD_NAME()
997
+ ),
998
+ value => Voxgig::Sekreto::Plugins::Minivault::seal(
999
+ $key, $value,
1000
+ Voxgig::Sekreto::Plugins::Minivault::AAD_SECRET() . $name
1001
+ ),
1002
+ };
1003
+ }
1004
+
1005
+ my $record =
1006
+ Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $self->{keyid} );
1007
+
1008
+ my $fresh = Voxgig::Sekreto::Plugins::Minivault::sealkey(
1009
+ $root, $self->{keyid}, $self->{passphrase}, $record->{iters},
1010
+ {
1011
+ v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
1012
+ write => JSON::PP::true,
1013
+ root => Voxgig::Sekreto::Plugins::Minivault::b64($root),
1014
+ },
1015
+ {
1016
+ v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
1017
+ master => JSON::PP::true,
1018
+ write => JSON::PP::true,
1019
+ grants => [],
1020
+ }
1021
+ );
1022
+
1023
+ # SAVE FIRST, adopt second. A handle holding the new root over a
1024
+ # file that still holds the old one reads nothing and says the
1025
+ # vault is damaged, which is the wrong story about a failed write.
1026
+ $self->save( { keys => [$fresh], entries => \@entries } );
1027
+
1028
+ $self->{opened} = {
1029
+ info => {
1030
+ key => $self->{keyid},
1031
+ master => 1,
1032
+ write => 1,
1033
+ grants => [],
1034
+ },
1035
+ root => $root,
1036
+ grants => {},
1037
+ ring => $fresh->{ring},
1038
+ };
1039
+
1040
+ return;
1041
+ }
1042
+
1043
+ # ------------------------------------------------------------ inside
1044
+
1045
+ sub bytes {
1046
+ my ($self) = @_;
1047
+
1048
+ my $raw = Voxgig::Sekreto::Plugins::Minivault::readmaybe( $self->{file} );
1049
+ return $raw if defined $raw;
1050
+
1051
+ # A vault is configured deliberately, with a key. Its absence is a
1052
+ # broken deployment and never "no secrets here": answering a miss
1053
+ # would send the chain on to a weaker store.
1054
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'no vault file: ' . $self->{file} )
1055
+ if !$self->{create};
1056
+
1057
+ Voxgig::Sekreto::Plugins::Minivault::putnew(
1058
+ $self->{file},
1059
+ Voxgig::Sekreto::Plugins::Minivault::newvault(
1060
+ $self->{keyid}, $self->{passphrase}, $self->{iterations}
1061
+ )
1062
+ );
1063
+
1064
+ $raw = Voxgig::Sekreto::Plugins::Minivault::readmaybe( $self->{file} );
1065
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'cannot read ' . $self->{file} )
1066
+ if !defined $raw;
1067
+
1068
+ return $raw;
1069
+ }
1070
+
1071
+ sub load {
1072
+ my ($self) = @_;
1073
+
1074
+ my $vault = Voxgig::Sekreto::Plugins::Minivault::readfile( $self->bytes );
1075
+ my $record =
1076
+ Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $self->{keyid} );
1077
+
1078
+ if ( !defined $record ) {
1079
+ # REVOKED, or never there. Either way this handle is finished,
1080
+ # and dropping what it derived is what stops the next call
1081
+ # answering from memory.
1082
+ $self->{opened} = undef;
1083
+ Voxgig::Sekreto::Plugins::Minivault::fail( 'no such key: ' . $self->{keyid} );
1084
+ }
1085
+
1086
+ # The file still holds this key, and holds the SAME ring: a key
1087
+ # revoked and re-granted under another passphrase is a different
1088
+ # key wearing the id, and re-deriving is what refuses it.
1089
+ return ( $vault, $self->{opened} )
1090
+ if defined $self->{opened}
1091
+ && Voxgig::Sekreto::Plugins::Minivault::sameseal( $self->{opened}{ring},
1092
+ $record->{ring} );
1093
+
1094
+ $self->{opened} = undef;
1095
+
1096
+ my $plain = Voxgig::Sekreto::Plugins::Minivault::unseal(
1097
+ Voxgig::Sekreto::Plugins::Minivault::kek(
1098
+ $self->{passphrase}, $record->{salt}, $record->{iters}
1099
+ ),
1100
+ $record->{ring},
1101
+ Voxgig::Sekreto::Plugins::Minivault::AAD_RING() . $self->{keyid},
1102
+ 'wrong passphrase for key ' . $self->{keyid} . ', or a damaged vault'
1103
+ );
1104
+
1105
+ my $ring = Voxgig::Sekreto::Plugins::Minivault::parsejson( $plain,
1106
+ 'key ring for ' . $self->{keyid} );
1107
+
1108
+ my %grants;
1109
+ my $held = $ring->{grants} || {};
1110
+
1111
+ for my $name ( CORE::keys %{$held} ) {
1112
+ $grants{$name} =
1113
+ Voxgig::Sekreto::Plugins::Minivault::unb64( $held->{$name}, 'a granted key' );
1114
+ }
1115
+
1116
+ my $root = $ring->{root};
1117
+
1118
+ $self->{opened} = {
1119
+ info => {
1120
+ key => $self->{keyid},
1121
+ master => defined $root ? 1 : 0,
1122
+ write => ( defined $root || $ring->{write} ) ? 1 : 0,
1123
+ grants => [ sort CORE::keys %grants ],
1124
+ },
1125
+ root => defined $root
1126
+ ? Voxgig::Sekreto::Plugins::Minivault::unb64( $root, 'the root key' )
1127
+ : undef,
1128
+ grants => \%grants,
1129
+ ring => $record->{ring},
1130
+ };
1131
+
1132
+ return ( $vault, $self->{opened} );
1133
+ }
1134
+
1135
+ sub rootof {
1136
+ my ( $self, $opened, $what ) = @_;
1137
+
1138
+ Voxgig::Sekreto::Plugins::Minivault::fail( $what
1139
+ . ' needs a master key, and '
1140
+ . $opened->{info}{key}
1141
+ . ' is restricted' )
1142
+ if !defined $opened->{root};
1143
+
1144
+ return $opened->{root};
1145
+ }
1146
+
1147
+ # The key for one name, or undef when this key cannot reach it.
1148
+ sub keyfor {
1149
+ my ( $self, $opened, $name ) = @_;
1150
+
1151
+ return Voxgig::Sekreto::Plugins::Minivault::secretkey( $opened->{root}, $name )
1152
+ if defined $opened->{root};
1153
+
1154
+ return $opened->{grants}{$name};
1155
+ }
1156
+
1157
+ sub findentry {
1158
+ my ( $self, $vault, $key ) = @_;
1159
+
1160
+ return undef if !defined $key;
1161
+
1162
+ return Voxgig::Sekreto::Plugins::Minivault::entryrecord( $vault,
1163
+ Voxgig::Sekreto::Plugins::Minivault::entryid($key) );
1164
+ }
1165
+
1166
+ sub metaof {
1167
+ my ( $self, $opened, $record ) = @_;
1168
+
1169
+ my $root = $self->rootof( $opened, 'reading key metadata' );
1170
+ my $what = 'metadata for key ' . $record->{id};
1171
+
1172
+ my $meta;
1173
+ my $ok = eval {
1174
+ $meta = Voxgig::Sekreto::Plugins::Minivault::parsejson(
1175
+ Voxgig::Sekreto::Plugins::Minivault::unseal(
1176
+ Voxgig::Sekreto::Plugins::Minivault::mac(
1177
+ $root, Voxgig::Sekreto::Plugins::Minivault::LABEL_META()
1178
+ ),
1179
+ $record->{meta},
1180
+ Voxgig::Sekreto::Plugins::Minivault::AAD_META() . $record->{id},
1181
+ $what
1182
+ ),
1183
+ $what
1184
+ );
1185
+ 1;
1186
+ };
1187
+
1188
+ # A record written under a root key this one has replaced. The key
1189
+ # is still in the file and still opens with its own passphrase, so
1190
+ # it is reported rather than hidden - with what it can do unknown.
1191
+ return undef if !$ok;
1192
+
1193
+ return $meta;
1194
+ }
1195
+
1196
+ # Read, change, and REPLACE - never edit in place.
1197
+ #
1198
+ # THE TEMPORARY IS RANDOM AND EXCLUSIVE. `<vault>.<pid>.tmp` is a name
1199
+ # anyone can predict, so anyone who can write the vault's directory
1200
+ # could put a symlink there and have the next save truncate whatever
1201
+ # it pointed at.
1202
+ sub save {
1203
+ my ( $self, $vault ) = @_;
1204
+
1205
+ my $temp = $self->{file} . '.'
1206
+ . unpack( 'H*', Voxgig::Sekreto::Plugins::Minivault::randombytes(8) ) . '.tmp';
1207
+
1208
+ my $why = Voxgig::Sekreto::Plugins::Minivault::spill( $temp,
1209
+ Voxgig::Sekreto::Plugins::Minivault::writefile($vault) );
1210
+
1211
+ if ( !defined $why && !rename( $temp, $self->{file} ) ) {
1212
+ $why = "$!";
1213
+ }
1214
+
1215
+ if ( defined $why ) {
1216
+ # The vault is unchanged either way, and the write error is
1217
+ # what the caller needs to be told about.
1218
+ unlink($temp);
1219
+ Voxgig::Sekreto::Plugins::Minivault::fail(
1220
+ 'cannot write ' . $self->{file} . ': ' . $why );
1221
+ }
1222
+
1223
+ return;
1224
+ }
1225
+ }
1226
+
1227
+ # Open a vault file as one key.
1228
+ #
1229
+ # The handle is lazy. Nothing is read, and no passphrase is stretched,
1230
+ # until a method needs the file.
1231
+ sub openvault {
1232
+ return Voxgig::Sekreto::Plugins::Minivault::Vault->new( $_[0] );
1233
+ }
1234
+
1235
+ # Make a vault file and return a handle on its master key.
1236
+ #
1237
+ # Refuses a file that is already there: a vault is created once, and
1238
+ # overwriting one discards every secret in it.
1239
+ sub createvault {
1240
+ my ($options) = @_;
1241
+
1242
+ my $opts = $options || {};
1243
+
1244
+ fail('a vault needs a file')
1245
+ if !defined $opts->{file} || ref( $opts->{file} ) || '' eq $opts->{file};
1246
+
1247
+ fail('a vault needs a passphrase')
1248
+ if !defined $opts->{passphrase}
1249
+ || ref( $opts->{passphrase} )
1250
+ || '' eq $opts->{passphrase};
1251
+
1252
+ my $keyid = checkid( wantkey( $opts->{key} ), 'a vault needs a key id' );
1253
+
1254
+ # No existence check first: the check and the write would be two
1255
+ # steps, and `putnew` refuses an existing file in ONE.
1256
+ putnew( $opts->{file},
1257
+ newvault( $keyid, $opts->{passphrase}, $opts->{iterations} || ITERATIONS() ) );
1258
+
1259
+ return openvault($opts);
1260
+ }
1261
+
1262
+ # ------------------------------------------------------------ the provider
1263
+
1264
+ {
1265
+ # Read a vault as one store in a chain.
1266
+ #
1267
+ # The provider is the READ half and nothing more: a chain resolves
1268
+ # secrets, and writing one is a deliberate act with an API of its own.
1269
+ package Voxgig::Sekreto::Plugins::Minivault::Provider;
1270
+
1271
+ use strict;
1272
+ use warnings;
1273
+
1274
+ sub new {
1275
+ my ( $class, $vault ) = @_;
1276
+ return bless { vault => $vault }, $class;
1277
+ }
1278
+
1279
+ sub lookup {
1280
+ my ( $self, $name ) = @_;
1281
+ return $self->{vault}->get($name);
1282
+ }
1283
+
1284
+ sub describe {
1285
+ my ($self) = @_;
1286
+ return 'minivault:' . $self->{vault}->file;
1287
+ }
1288
+ }
1289
+
1290
+ sub providerof {
1291
+ return Voxgig::Sekreto::Plugins::Minivault::Provider->new( $_[0] );
1292
+ }
1293
+
1294
+ # A vault provider from options, for a chain built by hand.
1295
+ sub minivaultprovider {
1296
+ return providerof( openvault( $_[0] ) );
1297
+ }
1298
+
1299
+ # The vault options a provider spec describes.
1300
+ sub minivaultoptions {
1301
+ my ($spec) = @_;
1302
+
1303
+ return {
1304
+ file => defined $spec->{file} ? $spec->{file} : '',
1305
+ key => $spec->{vaultkey},
1306
+ passphrase => defined $spec->{passphrase} ? $spec->{passphrase} : '',
1307
+ iterations => $spec->{iterations},
1308
+ create => ( defined $spec->{create} && $spec->{create} ) ? 1 : 0,
1309
+ };
1310
+ }
1311
+
1312
+ # The vault behind a store in a chain, as its programmatic API.
1313
+ #
1314
+ # With no store named, the unqualified alias answers: one vault in the
1315
+ # chain resolves whatever it is called, and two raise rather than picking
1316
+ # one.
1317
+ sub vaultof {
1318
+ my ( $secrets, $store ) = @_;
1319
+
1320
+ if ( !defined $store ) {
1321
+ my $found = $secrets->host->exports( 'minivault/' . VAULT_EXPORT() );
1322
+ fail('no minivault store in this chain') if !defined $found;
1323
+ return $found;
1324
+ }
1325
+
1326
+ # A NAMED STORE MUST EXIST, and the alias must not stand in for it.
1327
+ # `exports` falls back to the alias when the exact ref misses, so
1328
+ # asking for `minivault` in a chain whose only vault is named `app`
1329
+ # used to hand back the `app` vault - and then write to it. Naming a
1330
+ # store that is not there raises, which is the rule the whole library
1331
+ # follows: `try` already means "may not have it", so it cannot also
1332
+ # mean "may not exist".
1333
+ my $ref = 'minivault' eq $store ? 'minivault' : 'minivault$' . $store;
1334
+
1335
+ fail( 'no minivault store named ' . $store . ' in this chain' )
1336
+ if !defined $secrets->host->instance($ref);
1337
+
1338
+ return $secrets->host->exports( $ref . '/' . VAULT_EXPORT() );
1339
+ }
1340
+
1341
+ # The plugin: the `minivault` provider kind, as a voxgig/plugin definition.
1342
+ #
1343
+ # Written out rather than built by `providerplugin`, because this
1344
+ # definition publishes TWO exports: `provider`, the read half every kind
1345
+ # publishes, and `vault`, the programmatic API.
1346
+ sub minivault {
1347
+ return {
1348
+ name => 'minivault',
1349
+ define => sub {
1350
+ my ($inst) = @_;
1351
+
1352
+ my $options = minivaultoptions( $inst->options || {} );
1353
+
1354
+ my $vault;
1355
+
1356
+ # `openvault` refuses bad configuration HERE, so a mistyped
1357
+ # chain fails at construction. Reaching the FILE is not
1358
+ # configuration: the handle is lazy.
1359
+ my $ok = eval { $vault = openvault($options); 1 };
1360
+
1361
+ if ( !$ok ) {
1362
+ my $err = $@;
1363
+
1364
+ die $err
1365
+ if !( Scalar::Util::blessed($err)
1366
+ && $err->isa('Voxgig::Sekreto::SekretoError') );
1367
+
1368
+ Voxgig::Plugin::Types::fail_with( ERROR_CODE(), "$err",
1369
+ { ref => $inst->ref, cause => "$err" } );
1370
+ }
1371
+
1372
+ $inst->export( PROVIDER_EXPORT(), providerof($vault) );
1373
+ $inst->export( VAULT_EXPORT(), $vault );
1374
+
1375
+ return;
1376
+ },
1377
+ };
1378
+ }
1379
+
1380
+ 1;