@voxgig/sdkgen 4.8.1 → 4.8.3

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 (376) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/doctor.d.ts +1 -0
  3. package/dist/action/doctor.js +50 -2
  4. package/dist/action/doctor.js.map +1 -1
  5. package/dist/helpers/naming.js +4 -2
  6. package/dist/helpers/naming.js.map +1 -1
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/model/sdkgen.aon +21 -0
  9. package/package.json +2 -2
  10. package/project/.sdk/model/feature/secrets.aon +120 -18
  11. package/project/.sdk/model/target/c.aon +10 -0
  12. package/project/.sdk/model/target/clojure.aon +13 -0
  13. package/project/.sdk/model/target/cpp.aon +10 -0
  14. package/project/.sdk/model/target/csharp.aon +9 -0
  15. package/project/.sdk/model/target/dart.aon +10 -0
  16. package/project/.sdk/model/target/elixir.aon +9 -0
  17. package/project/.sdk/model/target/go.aon +13 -0
  18. package/project/.sdk/model/target/java.aon +9 -0
  19. package/project/.sdk/model/target/js.aon +7 -0
  20. package/project/.sdk/model/target/kotlin.aon +9 -0
  21. package/project/.sdk/model/target/lean.aon +17 -0
  22. package/project/.sdk/model/target/lua.aon +8 -0
  23. package/project/.sdk/model/target/ocaml.aon +9 -0
  24. package/project/.sdk/model/target/perl.aon +8 -0
  25. package/project/.sdk/model/target/php.aon +8 -0
  26. package/project/.sdk/model/target/py.aon +13 -0
  27. package/project/.sdk/model/target/rb.aon +8 -0
  28. package/project/.sdk/model/target/rust.aon +10 -0
  29. package/project/.sdk/model/target/scala.aon +21 -2
  30. package/project/.sdk/model/target/swift.aon +18 -0
  31. package/project/.sdk/model/target/ts.aon +13 -0
  32. package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
  33. package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
  34. package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
  35. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
  36. package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
  37. package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
  38. package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
  39. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
  40. package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
  41. package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
  42. package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
  43. package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
  44. package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
  45. package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
  46. package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
  47. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
  48. package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
  49. package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
  50. package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
  51. package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
  52. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
  53. package/project/.sdk/tm/c/Makefile +38 -3
  54. package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
  55. package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
  56. package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
  57. package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
  58. package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
  59. package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
  60. package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
  61. package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
  62. package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
  63. package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
  64. package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
  65. package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
  66. package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
  67. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
  68. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
  69. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
  70. package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
  71. package/project/.sdk/tm/cpp/Makefile +5 -1
  72. package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
  73. package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
  74. package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
  75. package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
  76. package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
  77. package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
  78. package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
  79. package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
  80. package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
  81. package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
  82. package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
  83. package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
  84. package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
  85. package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
  86. package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
  87. package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
  88. package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
  89. package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
  90. package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
  91. package/project/.sdk/tm/dart/test/omni.dart +520 -0
  92. package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
  93. package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
  94. package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
  95. package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
  96. package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
  97. package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
  98. package/project/.sdk/tm/elixir/Makefile +11 -3
  99. package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
  100. package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
  101. package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
  102. package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
  103. package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
  104. package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
  105. package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
  106. package/project/.sdk/tm/go/core/context.go +32 -16
  107. package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
  108. package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
  109. package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
  110. package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
  111. package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
  112. package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
  113. package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
  114. package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
  115. package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
  116. package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
  117. package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
  118. package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
  119. package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
  120. package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
  121. package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
  122. package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
  123. package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
  124. package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
  125. package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
  126. package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
  127. package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
  128. package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +209 -0
  129. package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
  130. package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +151 -0
  131. package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
  132. package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
  133. package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
  134. package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +439 -0
  135. package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +685 -0
  136. package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
  137. package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
  138. package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
  139. package/project/.sdk/tm/go/test/omni/omni.go +897 -0
  140. package/project/.sdk/tm/go/test/omni/util.go +360 -0
  141. package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
  142. package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
  143. package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
  144. package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
  145. package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
  146. package/project/.sdk/tm/go/utility/make_options.go +8 -1
  147. package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
  148. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
  149. package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
  150. package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
  151. package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
  152. package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
  153. package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
  154. package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
  155. package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
  156. package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
  157. package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
  158. package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
  159. package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
  160. package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
  161. package/project/.sdk/tm/js/test/omni.js +251 -0
  162. package/project/.sdk/tm/js/test/omni.test.js +105 -0
  163. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
  164. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
  165. package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
  166. package/project/.sdk/tm/js/test/vendor/omni/runner.js +613 -0
  167. package/project/.sdk/tm/js/test/vendor/omni/util.js +212 -0
  168. package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
  169. package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
  170. package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
  171. package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
  172. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
  173. package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
  174. package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
  175. package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
  176. package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
  177. package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
  178. package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
  179. package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
  180. package/project/.sdk/tm/lean/Makefile +12 -5
  181. package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
  182. package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
  183. package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
  184. package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
  185. package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
  186. package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
  187. package/project/.sdk/tm/lua/test/omni.lua +456 -0
  188. package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
  189. package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
  190. package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
  191. package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
  192. package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
  193. package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
  194. package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
  195. package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
  196. package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
  197. package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
  198. package/project/.sdk/tm/ocaml/Makefile +37 -12
  199. package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
  200. package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
  201. package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
  202. package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
  203. package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
  204. package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
  205. package/project/.sdk/tm/perl/t/omni.pm +647 -0
  206. package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
  207. package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
  208. package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
  209. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
  210. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
  211. package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
  212. package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
  213. package/project/.sdk/tm/php/test/Omni.php +691 -0
  214. package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
  215. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
  216. package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
  217. package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
  218. package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
  219. package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
  220. package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
  221. package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
  222. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
  223. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
  224. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
  225. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
  226. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
  227. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
  228. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
  229. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
  230. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
  231. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
  232. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
  233. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
  234. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
  235. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
  236. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
  237. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +74 -0
  238. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
  239. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
  240. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
  241. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
  242. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
  243. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
  244. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +152 -0
  245. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
  246. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +92 -0
  247. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
  248. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
  249. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
  250. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
  251. package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +455 -0
  252. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
  253. package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
  254. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
  255. package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
  256. package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
  257. package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
  258. package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
  259. package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
  260. package/project/.sdk/tm/py/test/omni.py +415 -0
  261. package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
  262. package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
  263. package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
  264. package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
  265. package/project/.sdk/tm/py/test/voxgig_omni/runner.py +566 -0
  266. package/project/.sdk/tm/py/test/voxgig_omni/util.py +237 -0
  267. package/project/.sdk/tm/rb/test/omni.rb +505 -0
  268. package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
  269. package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
  270. package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
  271. package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
  272. package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
  273. package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
  274. package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
  275. package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
  276. package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
  277. package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
  278. package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
  279. package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
  280. package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
  281. package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
  282. package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
  283. package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
  284. package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
  285. package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
  286. package/project/.sdk/tm/scala/Makefile +16 -6
  287. package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
  288. package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
  289. package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
  290. package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
  291. package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
  292. package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
  293. package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
  294. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
  295. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
  296. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
  297. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
  298. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
  299. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
  300. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
  301. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
  302. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
  303. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
  304. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
  305. package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
  306. package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
  307. package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
  308. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
  309. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
  310. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
  311. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
  312. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
  313. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
  314. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
  315. package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
  316. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
  317. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
  318. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
  319. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
  320. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
  321. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
  322. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
  323. package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
  324. package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
  325. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
  326. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
  327. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
  328. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
  329. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
  330. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
  331. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
  332. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
  333. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
  334. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
  335. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
  336. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
  337. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
  338. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
  339. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
  340. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
  341. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
  342. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
  343. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
  344. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
  345. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
  346. package/project/.sdk/tm/ts/test/omni.ts +104 -32
  347. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
  348. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
  349. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
  350. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
  351. package/project/.sdk/tm/zig/test/primary_utility_test.zig +1 -1
  352. package/project/.sdk/tm/zig/test/struct_runner.zig +5 -4
  353. package/project/sdkgen-package.json +1 -1
  354. package/src/action/doctor.ts +66 -2
  355. package/src/helpers/naming.ts +4 -2
  356. package/project/.sdk/tm/c/tests/runner.h +0 -274
  357. package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
  358. package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
  359. package/project/.sdk/tm/dart/test/runner.dart +0 -406
  360. package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
  361. package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
  362. package/project/.sdk/tm/go/test/runner_test.go +0 -629
  363. package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
  364. package/project/.sdk/tm/java/test/StructRunner.java +0 -281
  365. package/project/.sdk/tm/js/test/runner.js +0 -387
  366. package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
  367. package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
  368. package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
  369. package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
  370. package/project/.sdk/tm/php/test/StructRunner.php +0 -275
  371. package/project/.sdk/tm/py/test/struct_runner.py +0 -411
  372. package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
  373. package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
  374. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
  375. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
  376. package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
@@ -0,0 +1,333 @@
1
+ # VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/config.py)
2
+ # Source: https://github.com/voxgig/plugin @ 8d8968afc0a2008fbd795b41ab166307d989f02a [tag: sdk-20260904-1610-0]
3
+ # License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ """The declarative document (section 9): normalization, and the ten-level
5
+ precedence ladder.
6
+
7
+ TWO FUNCTIONS, AND THE SPLIT BETWEEN THEM IS FORCED.
8
+
9
+ `normalize_config` normalizes STRUCTURE and ENTRY KEYS. It does not merge
10
+ options, and cannot: section 9.4 makes merge behaviour a property of the
11
+ definition's option SHAPE, which normalization has never seen. A
12
+ normalizer that flattened the option layers would make `$MERGE: append`
13
+ unimplementable at load time, because the layers it must concatenate would
14
+ already be collapsed.
15
+
16
+ `resolve_options` applies the ladder, and it is the only place that knows
17
+ the shape.
18
+ """
19
+
20
+ from .types import fail
21
+ from .ref import canon_ref, parse_ref
22
+
23
+
24
+ # ---------------------------------------------------------------------
25
+ # normalize_config
26
+ # ---------------------------------------------------------------------
27
+
28
+ def normalize_config(spec):
29
+ doc = (spec or {}).get('doc') or {}
30
+ keys = (spec or {}).get('keys') or {}
31
+ ikey = keys.get('instance') or 'instance'
32
+ dkey = keys.get('default') or 'default'
33
+ reserved = (spec or {}).get('reserved') or []
34
+ profile = (spec or {}).get('profile')
35
+
36
+ # The rename is applied at TWO PLACES AND NO OTHERS: the document
37
+ # root, and every profile.<name> overlay root (section 9.1). A rename
38
+ # applied only at the root would leave `profile.prod.sdk` untranslated
39
+ # and silently drop every environment override the host depends on.
40
+ # Recursing further would be worse: option data is the definition's.
41
+ baseinst = doc.get(ikey)
42
+ basedef = doc.get(dkey) or {}
43
+
44
+ overlay = None
45
+ if profile and isinstance(doc.get('profile'), dict):
46
+ overlay = doc['profile'].get(profile)
47
+ overinst = overlay.get(ikey) if isinstance(overlay, dict) else None
48
+ overdef = (overlay.get(dkey) if isinstance(overlay, dict) else None) or {}
49
+
50
+ # Entry layers, base then overlay, each as {ref -> entry} plus the
51
+ # order the form implies.
52
+ base = entries(baseinst)
53
+ over = entries(overinst)
54
+
55
+ for group in (base['map'], over['map'], basedef, overdef):
56
+ for ref in group:
57
+ checkreserved(ref, reserved)
58
+
59
+ # A PARTIAL ARRAY IS NOT A FILTER (section 9.1). sdkgen learned this
60
+ # the hard way: deriving order from a partial array silently dropped
61
+ # config-activated features. Refs in the base but absent from the
62
+ # overlay still load, in sorted position AFTER the listed ones. A
63
+ # profile may also INTRODUCE a ref the base never declared.
64
+ order = []
65
+ for ref in over['order']:
66
+ if ref not in order:
67
+ order.append(ref)
68
+ # The remainder keeps the BASE's own order - array position for the
69
+ # array form, sorted refs for the map form. Re-sorting here would
70
+ # discard an array document's positional order entirely, which is the
71
+ # one thing the array form exists to express.
72
+ for ref in base['order']:
73
+ if ref not in order:
74
+ order.append(ref)
75
+
76
+ instance = {}
77
+ for i, ref in enumerate(order):
78
+ b = base['map'].get(ref)
79
+ o = over['map'].get(ref)
80
+
81
+ # MERGE THE ENTRIES AS AUTHORED, THEN APPLY DEFAULTS TO THE RESULT
82
+ # (section 9.3). A safety rule, not a tidiness one: if the overlay
83
+ # had its defaults filled in before merging it would carry a
84
+ # synthesized active:true and overwrite a base's false - silently
85
+ # re-enabling a deliberately disabled integration in production.
86
+ active = pick(o, 'active', pick(b, 'active', True))
87
+ start = pick(o, 'start', pick(b, 'start', 'eager'))
88
+ block = pick(o, 'order', pick(b, 'order', None))
89
+
90
+ # Option layers, levels 3-6, IN LADDER ORDER. Never merged here.
91
+ layers = []
92
+ name = parse_ref(ref)['name']
93
+ for src in (basedef.get(name), b, overdef.get(name), o):
94
+ if isinstance(src, dict) and 'options' in src:
95
+ layers.append(src['options'])
96
+
97
+ entry = {'pos': i, 'active': active, 'start': start,
98
+ 'optionlayers': layers}
99
+ if None is not block:
100
+ entry['order'] = block
101
+ instance[ref] = entry
102
+
103
+ # `default` DECLARES NOTHING (section 9.3). It is a base for every
104
+ # instance of that definition; it does not create one, and an entry
105
+ # for a name with no instances is inert rather than an error - which
106
+ # is what makes a shared library of defaults shippable.
107
+ defout = {}
108
+ for name in basedef:
109
+ defout[name] = basedef[name]
110
+ for name in overdef:
111
+ defout[name] = overdef[name]
112
+
113
+ return {'instance': instance, 'order': order, 'default': defout}
114
+
115
+
116
+ def entries(src):
117
+ """Both document forms reduce to {ref -> entry} plus the order the
118
+ form implies: array POSITION for the array form, sorted refs for the
119
+ map form."""
120
+ out = {'map': {}, 'order': []}
121
+ if None is src:
122
+ return out
123
+
124
+ if isinstance(src, list):
125
+ for item in src:
126
+ ref = canon_ref(item.get('ref'))
127
+ out['map'][ref] = item
128
+ out['order'].append(ref)
129
+ return out
130
+
131
+ # Map-form refs arrive as KEYS, through a different path than an array
132
+ # element's `ref` field - and must canonicalize the same way.
133
+ for key in src:
134
+ out['map'][canon_ref(key)] = src[key]
135
+ # Byte-wise, NOT locale-aware and NOT case-folded. All-lowercase refs
136
+ # sort identically under all three, so only mixed input discriminates:
137
+ # '@' is 0x40, uppercase 0x41-0x5A, lowercase 0x61-0x7A. Python's
138
+ # `sorted` on str is code-point order, which is exactly that.
139
+ out['order'] = sorted(out['map'])
140
+ return out
141
+
142
+
143
+ def checkreserved(ref, reserved):
144
+ """Section 9.1: reservation is all-or-nothing per NAME, so the tagged
145
+ forms go too. A configuration surface that can disable the thing
146
+ reading it is not a surface, it is a trap."""
147
+ if 0 == len(reserved):
148
+ return
149
+ if parse_ref(ref)['name'] in reserved:
150
+ fail('plugin_ref_reserved', 'ref is reserved by the host: ' + ref,
151
+ {'ref': ref})
152
+
153
+
154
+ def pick(src, key, default):
155
+ """PRESENCE decides, not truthiness and not None. A JSON `null` is a
156
+ present value in JavaScript (`undefined !== null`), so it must be one
157
+ here."""
158
+ if isinstance(src, dict) and key in src:
159
+ return src[key]
160
+ return default
161
+
162
+
163
+ # ---------------------------------------------------------------------
164
+ # resolve_options - section 9.3's ten levels, and 9.4's merge directives
165
+ # ---------------------------------------------------------------------
166
+
167
+ def resolve_options(spec):
168
+ shape = spec.get('shape') or {}
169
+ check_shape(shape)
170
+
171
+ ref = canon_ref(spec['ref'])
172
+ name = parse_ref(ref)['name']
173
+ doc = spec.get('doc') or {}
174
+ profile = spec.get('profile')
175
+
176
+ overlay = None
177
+ if profile and isinstance(doc.get('profile'), dict):
178
+ overlay = doc['profile'].get(profile)
179
+ overlay = overlay if isinstance(overlay, dict) else {}
180
+
181
+ # ONE ordered merge, lowest to highest. Levels 3-6 are not two
182
+ # namespaces collapsed separately and composed afterwards: that
183
+ # inverts the rule that PROFILE SPECIFICITY OUTRANKS DEFINITION
184
+ # SPECIFICITY, so a prod per-definition default would lose to a base
185
+ # instance value.
186
+ layers = [
187
+ defaultsof(shape), # 1
188
+ spec.get('hostdefaults'), # 2
189
+ optsof(doc.get('default'), name), # 3
190
+ optsof(doc.get('instance'), ref), # 4
191
+ optsof(overlay.get('default'), name), # 5
192
+ optsof(overlay.get('instance'), ref), # 6
193
+ spec.get('env'), # 7
194
+ spec.get('hostoptions'), # 8
195
+ spec.get('loadoptions'), # 9
196
+ spec.get('patch'), # 10
197
+ ]
198
+
199
+ out = {}
200
+ for layer in layers:
201
+ if None is layer:
202
+ continue
203
+ out = mergeone(out, layer, shape)
204
+ return out
205
+
206
+
207
+ def defaultsof(shape):
208
+ """The shape's non-directive values are the level-1 defaults."""
209
+ out = {}
210
+ for key in shape:
211
+ value = shape[key]
212
+ if isinstance(value, dict) and '$MERGE' in value:
213
+ continue
214
+ out[key] = value
215
+ return out
216
+
217
+
218
+ def optsof(src, key):
219
+ if None is src:
220
+ return None
221
+ # The array form is equivalent to the map form (section 9.1).
222
+ if isinstance(src, list):
223
+ for item in src:
224
+ if canon_ref(item.get('ref')) == key:
225
+ return item.get('options')
226
+ return None
227
+ for name in src:
228
+ if canon_ref(name) == key:
229
+ entry = src[name]
230
+ return entry.get('options') if isinstance(entry, dict) else None
231
+ return None
232
+
233
+
234
+ def mergeone(base, over, shape):
235
+ """Merge ONE layer onto the accumulator, honouring the shape's
236
+ directives. The directive holds at EVERY precedence level, not only
237
+ between document levels - section 9.4 makes it a property of the
238
+ shape, which does not know which layer a value arrived from."""
239
+ if None is over:
240
+ return base
241
+ if not ismap(base) or not ismap(over):
242
+ return clone(over)
243
+
244
+ out = dict(base)
245
+
246
+ for key in over:
247
+ directive = None
248
+ if isinstance(shape, dict) and isinstance(shape.get(key), dict):
249
+ directive = shape[key].get('$MERGE')
250
+ b = out.get(key)
251
+ o = over[key]
252
+
253
+ if 'replace' == directive:
254
+ out[key] = clone(o)
255
+ elif 'append' == directive:
256
+ bl = b if isinstance(b, list) else []
257
+ ol = o if isinstance(o, list) else [o]
258
+ out[key] = bl + ol
259
+ elif isinstance(directive, dict) and 'deep' in directive:
260
+ out[key] = deepto(b, o, directive['deep'])
261
+ else:
262
+ # Library default: deep for maps, REPLACE for lists.
263
+ # struct.merge is element-wise by index, which for option maps
264
+ # is nearly always wrong - ["a"] over ["x","y","z"] yielding
265
+ # ["a","y","z"] is the defect station hit on
266
+ # secrets.providers.
267
+ out[key] = mergeone(b, o, None) if ismap(b) and ismap(o) else clone(o)
268
+ return out
269
+
270
+
271
+ def deepto(base, over, n):
272
+ """Merge N levels below this key, replace below that."""
273
+ if 0 >= n:
274
+ return clone(over)
275
+ if not ismap(base) or not ismap(over):
276
+ return clone(over)
277
+ out = dict(base)
278
+ for key in over:
279
+ out[key] = deepto(out.get(key), over[key], n - 1)
280
+ return out
281
+
282
+
283
+ # Section 9.4: N is an integer of at least 1, and everything else is an
284
+ # error.
285
+ #
286
+ # `{"deep": 0}` is rejected DESPITE having an obvious reading, because
287
+ # "replace at this key" already has a spelling and two spellings for one
288
+ # behaviour is the defect class this repo exists to avoid. Without the
289
+ # stated domain each port picks its own reading - reject, replace,
290
+ # unlimited merge, or clamp to 1 - and the same document resolves
291
+ # differently per language.
292
+ MERGE_WORDS = ['replace', 'append']
293
+
294
+
295
+ def check_shape(shape):
296
+ if not ismap(shape):
297
+ return
298
+ for key in shape:
299
+ value = shape[key]
300
+ if not ismap(value) or '$MERGE' not in value:
301
+ continue
302
+ directive = value['$MERGE']
303
+
304
+ if isinstance(directive, str):
305
+ if directive not in MERGE_WORDS:
306
+ fail('plugin_shape_invalid',
307
+ 'invalid $MERGE directive at ' + key + ': ' + directive,
308
+ {'key': key, 'directive': directive})
309
+ continue
310
+ if ismap(directive) and 'deep' in directive:
311
+ n = directive['deep']
312
+ # `isinstance(True, int)` is True in Python, so `{"deep":
313
+ # true}` would pass an int check and be read as depth 1.
314
+ if (not isinstance(n, int)) or isinstance(n, bool) or n < 1:
315
+ fail('plugin_shape_invalid',
316
+ 'invalid $MERGE deep at ' + key + ': ' + str(n),
317
+ {'key': key, 'directive': directive})
318
+ continue
319
+ fail('plugin_shape_invalid',
320
+ 'invalid $MERGE directive at ' + key + ': ' + str(directive),
321
+ {'key': key, 'directive': directive})
322
+
323
+
324
+ def ismap(value):
325
+ return isinstance(value, dict)
326
+
327
+
328
+ def clone(value):
329
+ if isinstance(value, list):
330
+ return [clone(v) for v in value]
331
+ if isinstance(value, dict):
332
+ return {k: clone(v) for k, v in value.items()}
333
+ return value
@@ -0,0 +1,198 @@
1
+ # VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/depend.py)
2
+ # Source: https://github.com/voxgig/plugin @ 8d8968afc0a2008fbd795b41ab166307d989f02a [tag: sdk-20260904-1610-0]
3
+ # License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ """Dependency cardinality, policy, and the restart graph (section 11.3).
5
+
6
+ TWO AXES, BOTH DECLARED BY THE DEFINITION THAT HAS THE REQUIREMENT,
7
+ because only it knows what it can cope with:
8
+
9
+ | static (default) | dynamic
10
+ -------------|---------------------------|--------------------------
11
+ mandatory | unmet -> pending; | unmet -> pending;
12
+ (default) | lost -> pending, | lost -> STAYS LIVE,
13
+ | recursively | notified
14
+ -------------|---------------------------|--------------------------
15
+ optional:true| never gates activation; | never gates activation;
16
+ | a change deactivates and | a change is a
17
+ | reactivates | notification, nothing else
18
+
19
+ `dynamic` means the plugin has said, IN WRITING, that it can survive its
20
+ provider being swapped underneath it. It is not the default because most
21
+ plugins cannot, and the cost of wrongly assuming they can is a live
22
+ instance holding a dead reference.
23
+
24
+ The rebinding-preference axis is deliberately omitted. OSGi has reluctant
25
+ vs greedy and it is a knob every author must understand to read anyone
26
+ else's component; we take always-reluctant. Three axes were more than the
27
+ model can carry across twenty ports.
28
+ """
29
+
30
+ from .types import fail
31
+ from .ref import try_ref
32
+
33
+
34
+ def normrequire(raw):
35
+ """A bare string is shorthand for `{name}`."""
36
+ if isinstance(raw, str):
37
+ return {'name': raw}
38
+ return dict(raw or {})
39
+
40
+
41
+ def requirements(options):
42
+ """The requirements a definition declared, normalized.
43
+
44
+ BOTH AXES ARE READ AT TWO LEVELS, AND THE PER-REQUIREMENT ONE WINS.
45
+
46
+ The instance-level `policy` and `optional` list are how a DOCUMENT
47
+ states the axis without editing the definition, and they apply to
48
+ every requirement. The per-requirement form is the one section 11.1's
49
+ object syntax exists for, and it is strictly more expressive: an
50
+ instance that is `static` on its store and `dynamic` on its metrics
51
+ cannot be written at all at the instance level, and that is the
52
+ ordinary case rather than an exotic one.
53
+
54
+ `optional` unions rather than overriding - both spellings are
55
+ statements that this requirement need not gate activation, and there
56
+ is no reading under which one of them means "actually, mandatory".
57
+ """
58
+ options = options or {}
59
+ raw = options.get('requires') or []
60
+ marked = options.get('optional') or []
61
+ fallback = options.get('policy')
62
+
63
+ out = []
64
+ for item in raw:
65
+ req = normrequire(item)
66
+ if req.get('optional') or req.get('name') in marked:
67
+ req['optional'] = True
68
+ if None is req.get('policy') and None is not fallback:
69
+ req['policy'] = fallback
70
+ out.append(req)
71
+ return out
72
+
73
+
74
+ def restartsonloss(req):
75
+ """Does losing this requirement's SELECTED provider restart the
76
+ consumer? The mandatory ones under `static`, and the `static` optional
77
+ ones - both make a capability change deactivate and reactivate.
78
+ `dynamic` never restarts: mandatory-dynamic stays live and is
79
+ notified, optional-dynamic is a notification and nothing else."""
80
+ return 'dynamic' != (req.get('policy') or 'static')
81
+
82
+
83
+ def gatesactivation(req):
84
+ """Does an unmet requirement keep the consumer out of `live`?
85
+
86
+ Cardinality alone decides this, NOT policy. `dynamic` is a statement
87
+ about surviving a SWAP, not about starting without the thing at all -
88
+ a mandatory-dynamic consumer still waits in `pending` for its first
89
+ provider. Conflating the two would let a plugin that declared it can
90
+ cope with replacement activate with nothing to call.
91
+ """
92
+ return True is not req.get('optional')
93
+
94
+
95
+ def restartcausing(req):
96
+ """Edges that can cause a restart, which is exactly the set a cycle
97
+ must be detected over (section 11.3).
98
+
99
+ Those are the mandatory requirements AND THE `static` OPTIONAL ONES,
100
+ because both make a capability change deactivate and reactivate the
101
+ consumer - and a cycle of restarts does not settle: A comes up, B
102
+ restarts, which changes B's capability, which restarts A,
103
+ indefinitely.
104
+
105
+ ONLY `dynamic` OPTIONAL EDGES ARE EXCLUDED, and they are the ones the
106
+ exclusion was for: two plugins that optionally and dynamically consume
107
+ each other's capabilities both activate happily, neither gates on the
108
+ other, and each is merely notified when the other appears. Nothing
109
+ restarts, so nothing oscillates.
110
+
111
+ An earlier draft of section 11.3 excluded EVERY optional edge and
112
+ thereby admitted the non-terminating case it was trying to permit.
113
+ """
114
+ return gatesactivation(req) or restartsonloss(req)
115
+
116
+
117
+ def dependencycycle(nodes):
118
+ """A cycle through restart-causing requirements is
119
+ `plugin_dependency_cycle`, detected AT LOAD - before anything runs,
120
+ because the failure it describes is a non-terminating reconcile and
121
+ the only safe time to report that is before it starts.
122
+
123
+ The graph is over capabilities, not refs: an edge runs from a consumer
124
+ to EVERY node that provides what it needs, because any of them could
125
+ be the one selected and a cycle through any is a cycle. A node also
126
+ satisfies its own name as a ref (section 11.1), which is why the ref
127
+ is a provider of itself here.
128
+ """
129
+ # TWO INDEXES, NOT ONE MERGED MAP. Capability names and refs are
130
+ # matched differently - a capability by its exact name, a ref through
131
+ # the canonical spelling (section 4 rule 5) - and one map keyed by
132
+ # both can only do one of them. Keyed by both and looked up raw, as
133
+ # this was, a cycle spelled `a$`/`b$` found no providers and EVADED
134
+ # the load-time check that exists to catch a non-terminating
135
+ # reconcile.
136
+ bycap = {}
137
+ isref = {}
138
+ for node in nodes:
139
+ isref[node['ref']] = True
140
+ for cap in node['provides']:
141
+ bycap.setdefault(cap, []).append(node['ref'])
142
+
143
+ edges = {}
144
+ for node in nodes:
145
+ out = []
146
+ for req in node['requires']:
147
+ if not restartcausing(req):
148
+ continue
149
+ frm = list(bycap.get(req['name'], []))
150
+ # A node satisfies its own name AS A REF (section 11.1),
151
+ # canonically - exactly what `_providersof` does at runtime.
152
+ asref = try_ref(req['name'])
153
+ if asref is not None and isref.get(asref) and asref not in frm:
154
+ frm.append(asref)
155
+ for p in frm:
156
+ if p != node['ref'] and p not in out:
157
+ out.append(p)
158
+ edges[node['ref']] = sorted(out)
159
+
160
+ # Iterative DFS with an explicit stack: twenty ports, and several of
161
+ # them have no recursion budget worth relying on.
162
+ WHITE, GREY, BLACK = 0, 1, 2
163
+ colour = {node['ref']: WHITE for node in nodes}
164
+
165
+ for start in sorted(edges):
166
+ if WHITE != colour[start]:
167
+ continue
168
+ path = [start]
169
+ stack = [[start, 0]]
170
+ colour[start] = GREY
171
+
172
+ while 0 < len(stack):
173
+ top = stack[-1]
174
+ if top[1] >= len(edges[top[0]]):
175
+ colour[top[0]] = BLACK
176
+ stack.pop()
177
+ path.pop()
178
+ continue
179
+ nxt = edges[top[0]][top[1]]
180
+ top[1] += 1
181
+ if GREY == colour[nxt]:
182
+ # Report the cycle itself, not the walk that found it.
183
+ return path[path.index(nxt):] + [nxt]
184
+ if BLACK == colour[nxt]:
185
+ continue
186
+ colour[nxt] = GREY
187
+ path.append(nxt)
188
+ stack.append([nxt, 0])
189
+ return None
190
+
191
+
192
+ def checkcycle(nodes):
193
+ """Raise on a cycle, naming it. Separate from the detector so the
194
+ detector stays pure and corpus-testable."""
195
+ cycle = dependencycycle(nodes)
196
+ if None is not cycle:
197
+ fail('plugin_dependency_cycle',
198
+ 'requirements cycle: ' + ' -> '.join(cycle), {'cycle': cycle})
@@ -0,0 +1,147 @@
1
+ # VENDORED: @voxgig/plugin 0.1.6 (python/voxgig_plugin/env.py)
2
+ # Source: https://github.com/voxgig/plugin @ 8d8968afc0a2008fbd795b41ab166307d989f02a [tag: sdk-20260904-1610-0]
3
+ # License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
4
+ """Environment overrides (section 9.5) - level 7 of the ladder.
5
+
6
+ One prefix, so nothing drifts: `VOXGIG_PLUGIN_*`.
7
+
8
+ VOXGIG_PLUGIN_PROFILE the profile name
9
+ VOXGIG_PLUGIN_<REF>_<PATH> one option
10
+ VOXGIG_PLUGIN_ACTIVE/INACTIVE comma-separated refs, INACTIVE wins
11
+
12
+ THE ENCODING IS LOSSY, AND THIS SAYS SO RATHER THAN PRETENDING OTHERWISE.
13
+ Ref and path are upper-snake with `$` -> `__` and `.` -> `_`. But `_` is
14
+ legal in a name and in a tag, and the mapping folds case, so `retry$fast`
15
+ and `retry__fast` both encode to `RETRY__FAST`, as do `Retry$fast` and
16
+ `retry$Fast`.
17
+
18
+ Rather than restrict a grammar the rest of the stack already uses, the
19
+ host DETECTS THE COLLISION: it encodes every ref it holds, and a key two
20
+ refs claim is `plugin_env_ambiguous`, naming both. The affected pair stays
21
+ configurable by document and by API, just not by environment - which is
22
+ the honest trade.
23
+
24
+ Pure: a function over a string map and a ref set. The corpus tests it
25
+ without touching a real environment.
26
+ """
27
+
28
+ import json
29
+
30
+ from .types import fail
31
+ from .ref import canon_ref, parse_ref
32
+
33
+ PREFIX = 'VOXGIG_PLUGIN_'
34
+
35
+
36
+ def encode_ref(ref):
37
+ """`retry$fast` -> `RETRY__FAST`."""
38
+ return ref.replace('$', '__').replace('.', '_').upper()
39
+
40
+
41
+ def apply_env(spec):
42
+ env = (spec or {}).get('env') or {}
43
+ refs = [canon_ref(r) for r in ((spec or {}).get('refs') or [])]
44
+ reserved = (spec or {}).get('reserved') or []
45
+ out = {'options': {}, 'active': [], 'inactive': []}
46
+
47
+ # Encode every ref the host holds, and refuse a key that two of them
48
+ # claim. Done up front so the collision is reported even when no
49
+ # environment variable exercises it - a latent ambiguity is still an
50
+ # ambiguity, and finding it at deploy time is the failure this exists
51
+ # to prevent.
52
+ byencoded = {}
53
+ for ref in refs:
54
+ byencoded.setdefault(encode_ref(ref), []).append(ref)
55
+ for encoded in sorted(byencoded):
56
+ if 1 < len(byencoded[encoded]):
57
+ pair = sorted(byencoded[encoded])
58
+ fail('plugin_env_ambiguous',
59
+ 'refs collide in the environment encoding as ' + encoded +
60
+ ': ' + ', '.join(pair),
61
+ {'encoded': encoded, 'refs': pair})
62
+
63
+ # Longest encoded ref first, so `retry$fast` wins over `retry` on
64
+ # `RETRY__FAST_MIN`. Shortest-first would read the tag as a path.
65
+ encoded = sorted(byencoded, key=lambda e: -len(e))
66
+
67
+ for key in sorted(env):
68
+ if not key.startswith(PREFIX):
69
+ continue
70
+ rest = key[len(PREFIX):]
71
+
72
+ if 'PROFILE' == rest:
73
+ out['profile'] = env[key]
74
+ continue
75
+
76
+ if 'ACTIVE' == rest or 'INACTIVE' == rest:
77
+ for raw in split(env[key]):
78
+ ref = canon_ref(raw)
79
+ # The reservation covers EVERY input layer (section 9.1).
80
+ # VOXGIG_PLUGIN_INACTIVE=station is easier to set than
81
+ # editing a config file, and INACTIVE has the final word -
82
+ # so guarding documents alone would leave the one lever
83
+ # this mechanism exists to deny wide open.
84
+ checkreserved(ref, reserved)
85
+ out['active' if 'ACTIVE' == rest else 'inactive'].append(ref)
86
+ continue
87
+
88
+ found = None
89
+ for enc in encoded:
90
+ if rest == enc or rest.startswith(enc + '_'):
91
+ found = enc
92
+ break
93
+ if None is found:
94
+ continue # not for any ref this host holds
95
+ ref = byencoded[found][0]
96
+ checkreserved(ref, reserved)
97
+
98
+ if rest == found:
99
+ continue # a ref with no path sets nothing
100
+ path = rest[len(found) + 1:].lower().split('_')
101
+
102
+ node = out['options'].get(ref)
103
+ if not isinstance(node, dict):
104
+ node = {}
105
+ out['options'][ref] = node
106
+ for step in path[:-1]:
107
+ child = node.get(step)
108
+ if not isinstance(child, dict):
109
+ child = {}
110
+ node[step] = child
111
+ node = child
112
+ node[path[-1]] = parsevalue(env[key])
113
+
114
+ return out
115
+
116
+
117
+ def split(value):
118
+ return [s.strip() for s in str(value).split(',') if 0 < len(s.strip())]
119
+
120
+
121
+ def checkreserved(ref, reserved):
122
+ if 0 == len(reserved):
123
+ return
124
+ if parse_ref(ref)['name'] in reserved:
125
+ fail('plugin_ref_reserved', 'ref is reserved by the host: ' + ref,
126
+ {'ref': ref})
127
+
128
+
129
+ def parsevalue(value):
130
+ """Values parse as JSON, FALLING BACK TO STRING - so `8080` is a
131
+ number, `true` is a boolean, `{"a":1}` is a map, and `hello` is the
132
+ string it looks like rather than a parse error.
133
+
134
+ `parse_constant` REFUSES PYTHON'S JSON EXTENSIONS. `json.loads`
135
+ accepts `NaN`, `Infinity` and `-Infinity`, which are not JSON and
136
+ which `JSON.parse` rejects - so an environment variable spelled
137
+ `NaN` became a float here and stayed the string `'NaN'` in every
138
+ other port. The model has one answer per input; this is not the
139
+ place Python gets to be more generous."""
140
+ try:
141
+ return json.loads(value, parse_constant=_notjson)
142
+ except Exception:
143
+ return value
144
+
145
+
146
+ def _notjson(name):
147
+ raise ValueError('not JSON: ' + name)