@voxgig/sdkgen 4.32.1 → 4.34.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 (442) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/action/copies.d.ts +21 -0
  3. package/dist/action/copies.js +146 -0
  4. package/dist/action/copies.js.map +1 -0
  5. package/dist/action/doctor.d.ts +15 -2
  6. package/dist/action/doctor.js +169 -23
  7. package/dist/action/doctor.js.map +1 -1
  8. package/dist/action/edition.js +6 -2
  9. package/dist/action/edition.js.map +1 -1
  10. package/dist/action/feature.js +6 -2
  11. package/dist/action/feature.js.map +1 -1
  12. package/dist/action/package.js +28 -10
  13. package/dist/action/package.js.map +1 -1
  14. package/dist/action/remove.js +2 -0
  15. package/dist/action/remove.js.map +1 -1
  16. package/dist/action/resolve.d.ts +1 -0
  17. package/dist/action/resolve.js +10 -2
  18. package/dist/action/resolve.js.map +1 -1
  19. package/dist/action/target.js +6 -2
  20. package/dist/action/target.js.map +1 -1
  21. package/dist/helpers/naming.js +1 -1
  22. package/dist/helpers/naming.js.map +1 -1
  23. package/dist/sdkgen.d.ts +2 -1
  24. package/dist/sdkgen.js +36 -3
  25. package/dist/sdkgen.js.map +1 -1
  26. package/dist/tsconfig.tsbuildinfo +1 -1
  27. package/model/sdkgen.aontu +7 -1
  28. package/package.json +1 -1
  29. package/project/.sdk/model/feature/debug.aontu +3 -1
  30. package/project/.sdk/src/cmp/c/PrepareAuth_c.ts +8 -28
  31. package/project/.sdk/src/cmp/c/TestClean_c.ts +774 -0
  32. package/project/.sdk/src/cmp/c/Test_c.ts +3 -0
  33. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +16 -5
  34. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -1
  35. package/project/.sdk/src/cmp/clojure/PrepareAuth_clojure.ts +3 -0
  36. package/project/.sdk/src/cmp/clojure/TestClean_clojure.ts +473 -0
  37. package/project/.sdk/src/cmp/clojure/Test_clojure.ts +6 -0
  38. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -8
  39. package/project/.sdk/src/cmp/cpp/PrepareAuth_cpp.ts +3 -0
  40. package/project/.sdk/src/cmp/cpp/TestClean_cpp.ts +782 -0
  41. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +1 -1
  42. package/project/.sdk/src/cmp/cpp/Test_cpp.ts +2 -0
  43. package/project/.sdk/src/cmp/csharp/PrepareAuth_csharp.ts +3 -0
  44. package/project/.sdk/src/cmp/csharp/TestClean_csharp.ts +887 -0
  45. package/project/.sdk/src/cmp/csharp/Test_csharp.ts +2 -0
  46. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +68 -4
  47. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +8 -2
  48. package/project/.sdk/src/cmp/csharp/fragment/SdkError.fragment.cs +49 -0
  49. package/project/.sdk/src/cmp/elixir/PrepareAuth_elixir.ts +3 -0
  50. package/project/.sdk/src/cmp/elixir/Schema_elixir.ts +20 -10
  51. package/project/.sdk/src/cmp/elixir/TestClean_elixir.ts +666 -0
  52. package/project/.sdk/src/cmp/elixir/Test_elixir.ts +4 -0
  53. package/project/.sdk/src/cmp/elixir/fragment/Main.fragment.ex +1 -1
  54. package/project/.sdk/src/cmp/elixir/fragment/Pipeline.fragment.ex +14 -2
  55. package/project/.sdk/src/cmp/go/PrepareAuth_go.ts +3 -0
  56. package/project/.sdk/src/cmp/go/TestClean_go.ts +804 -0
  57. package/project/.sdk/src/cmp/go/Test_go.ts +3 -0
  58. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +54 -4
  59. package/project/.sdk/src/cmp/go/fragment/Main.fragment.go +27 -2
  60. package/project/.sdk/src/cmp/java/PrepareAuth_java.ts +3 -0
  61. package/project/.sdk/src/cmp/java/TestClean_java.ts +884 -0
  62. package/project/.sdk/src/cmp/java/Test_java.ts +2 -0
  63. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +56 -11
  64. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +36 -3
  65. package/project/.sdk/src/cmp/js/PrepareAuth_js.ts +3 -0
  66. package/project/.sdk/src/cmp/js/TestClean_js.ts +458 -0
  67. package/project/.sdk/src/cmp/js/Test_js.ts +2 -0
  68. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +5 -4
  69. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +7 -1
  70. package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +7 -1
  71. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +7 -1
  72. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +7 -1
  73. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +7 -1
  74. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +11 -2
  75. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +17 -1
  76. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +5 -0
  77. package/project/.sdk/src/cmp/kotlin/PrepareAuth_kotlin.ts +3 -0
  78. package/project/.sdk/src/cmp/kotlin/TestClean_kotlin.ts +654 -0
  79. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +3 -0
  80. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +44 -11
  81. package/project/.sdk/src/cmp/kotlin/fragment/SdkError.fragment.kt +31 -0
  82. package/project/.sdk/src/cmp/lua/PrepareAuth_lua.ts +3 -0
  83. package/project/.sdk/src/cmp/lua/TestClean_lua.ts +769 -0
  84. package/project/.sdk/src/cmp/lua/Test_lua.ts +3 -0
  85. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +77 -1
  86. package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +49 -2
  87. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +3 -2
  88. package/project/.sdk/src/cmp/ocaml/PrepareAuth_ocaml.ts +4 -25
  89. package/project/.sdk/src/cmp/ocaml/TestClean_ocaml.ts +538 -0
  90. package/project/.sdk/src/cmp/ocaml/Test_ocaml.ts +5 -0
  91. package/project/.sdk/src/cmp/ocaml/fragment/RunOp.fragment.ml +16 -4
  92. package/project/.sdk/src/cmp/perl/PrepareAuth_perl.ts +3 -0
  93. package/project/.sdk/src/cmp/perl/TestClean_perl.ts +619 -0
  94. package/project/.sdk/src/cmp/perl/Test_perl.ts +3 -0
  95. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +67 -5
  96. package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +13 -1
  97. package/project/.sdk/src/cmp/php/PrepareAuth_php.ts +3 -0
  98. package/project/.sdk/src/cmp/php/TestClean_php.ts +809 -0
  99. package/project/.sdk/src/cmp/php/Test_php.ts +2 -0
  100. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +96 -55
  101. package/project/.sdk/src/cmp/php/fragment/Main.fragment.php +15 -2
  102. package/project/.sdk/src/cmp/py/PrepareAuth_py.ts +3 -0
  103. package/project/.sdk/src/cmp/py/TestClean_py.ts +549 -0
  104. package/project/.sdk/src/cmp/py/Test_py.ts +3 -0
  105. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +83 -55
  106. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +19 -3
  107. package/project/.sdk/src/cmp/rb/PrepareAuth_rb.ts +3 -0
  108. package/project/.sdk/src/cmp/rb/TestClean_rb.ts +535 -0
  109. package/project/.sdk/src/cmp/rb/Test_rb.ts +3 -0
  110. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +108 -46
  111. package/project/.sdk/src/cmp/rb/fragment/Main.fragment.rb +12 -1
  112. package/project/.sdk/src/cmp/rust/PrepareAuth_rust.ts +9 -45
  113. package/project/.sdk/src/cmp/rust/TestClean_rust.ts +881 -0
  114. package/project/.sdk/src/cmp/rust/Test_rust.ts +3 -0
  115. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +14 -6
  116. package/project/.sdk/src/cmp/rust/fragment/Main.fragment.rs +17 -1
  117. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +34 -2
  118. package/project/.sdk/src/cmp/scala/PrepareAuth_scala.ts +3 -0
  119. package/project/.sdk/src/cmp/scala/TestClean_scala.ts +608 -0
  120. package/project/.sdk/src/cmp/scala/Test_scala.ts +3 -0
  121. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +58 -6
  122. package/project/.sdk/src/cmp/swift/PrepareAuth_swift.ts +3 -0
  123. package/project/.sdk/src/cmp/swift/TestClean_swift.ts +671 -0
  124. package/project/.sdk/src/cmp/swift/Test_swift.ts +3 -0
  125. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +10 -0
  126. package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +16 -2
  127. package/project/.sdk/src/cmp/swift/fragment/SdkError.fragment.swift +47 -3
  128. package/project/.sdk/src/cmp/ts/PrepareAuth_ts.ts +3 -0
  129. package/project/.sdk/src/cmp/ts/TestClean_ts.ts +465 -0
  130. package/project/.sdk/src/cmp/ts/Test_ts.ts +2 -0
  131. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +5 -4
  132. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +7 -1
  133. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +7 -1
  134. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +7 -1
  135. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +7 -1
  136. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +7 -1
  137. package/project/.sdk/src/cmp/ts/fragment/Main.fragment.ts +8 -2
  138. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +20 -2
  139. package/project/.sdk/src/cmp/zig/PrepareAuth_zig.ts +3 -0
  140. package/project/.sdk/src/cmp/zig/TestClean_zig.ts +791 -0
  141. package/project/.sdk/src/cmp/zig/Test_zig.ts +5 -0
  142. package/project/.sdk/src/cmp/zig/fragment/Build.fragment.zig +19 -0
  143. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +14 -5
  144. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +1 -1
  145. package/project/.sdk/tm/c/core/context.c +25 -0
  146. package/project/.sdk/tm/c/core/error.c +16 -0
  147. package/project/.sdk/tm/c/core/sdk.h +22 -0
  148. package/project/.sdk/tm/c/feature/audit.c +2 -0
  149. package/project/.sdk/tm/c/feature/cost.c +1 -0
  150. package/project/.sdk/tm/c/feature/debug.c +19 -29
  151. package/project/.sdk/tm/c/feature/log.c +21 -2
  152. package/project/.sdk/tm/c/feature/proxy.c +55 -3
  153. package/project/.sdk/tm/c/feature/secrets.c +7 -0
  154. package/project/.sdk/tm/c/feature/telemetry.c +2 -0
  155. package/project/.sdk/tm/c/tests/feature_test.c +2 -2
  156. package/project/.sdk/tm/c/utility/clean.c +530 -8
  157. package/project/.sdk/tm/c/utility/done.c +28 -12
  158. package/project/.sdk/tm/c/utility/make_error.c +4 -3
  159. package/project/.sdk/tm/c/utility/make_options.c +71 -45
  160. package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +15 -0
  161. package/project/.sdk/tm/clojure/src/sdk/client.clj +20 -4
  162. package/project/.sdk/tm/clojure/src/sdk/core.clj +319 -35
  163. package/project/.sdk/tm/clojure/src/sdk/features.clj +68 -30
  164. package/project/.sdk/tm/clojure/test/sdk/test/feature.clj +4 -2
  165. package/project/.sdk/tm/clojure/test/sdk/test/pipeline.clj +47 -20
  166. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +4 -0
  167. package/project/.sdk/tm/cpp/core/types.hpp +93 -3
  168. package/project/.sdk/tm/cpp/feature/audit.hpp +1 -0
  169. package/project/.sdk/tm/cpp/feature/cost.hpp +1 -0
  170. package/project/.sdk/tm/cpp/feature/debug.hpp +20 -12
  171. package/project/.sdk/tm/cpp/feature/log.hpp +31 -9
  172. package/project/.sdk/tm/cpp/feature/proxy.hpp +52 -6
  173. package/project/.sdk/tm/cpp/feature/secrets.hpp +13 -0
  174. package/project/.sdk/tm/cpp/feature/telemetry.hpp +4 -2
  175. package/project/.sdk/tm/cpp/test/feature_test.cpp +2 -2
  176. package/project/.sdk/tm/cpp/utility/pipeline.hpp +426 -51
  177. package/project/.sdk/tm/csharp/core/Context.cs +32 -0
  178. package/project/.sdk/tm/csharp/core/Utility.cs +2 -0
  179. package/project/.sdk/tm/csharp/feature/AuditFeature.cs +1 -0
  180. package/project/.sdk/tm/csharp/feature/CostFeature.cs +7 -5
  181. package/project/.sdk/tm/csharp/feature/DebugFeature.cs +19 -16
  182. package/project/.sdk/tm/csharp/feature/FeatureOptions.cs +16 -0
  183. package/project/.sdk/tm/csharp/feature/LogFeature.cs +4 -1
  184. package/project/.sdk/tm/csharp/feature/ProxyFeature.cs +26 -5
  185. package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +16 -0
  186. package/project/.sdk/tm/csharp/feature/TelemetryFeature.cs +4 -2
  187. package/project/.sdk/tm/csharp/test/FeatureTest.cs +2 -2
  188. package/project/.sdk/tm/csharp/utility/Clean.cs +440 -2
  189. package/project/.sdk/tm/csharp/utility/Done.cs +27 -11
  190. package/project/.sdk/tm/csharp/utility/MakeError.cs +19 -8
  191. package/project/.sdk/tm/csharp/utility/MakeOptions.cs +119 -29
  192. package/project/.sdk/tm/csharp/utility/MakeResponse.cs +21 -11
  193. package/project/.sdk/tm/csharp/utility/Register.cs +1 -0
  194. package/project/.sdk/tm/elixir/lib/projectname/context.ex +19 -0
  195. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +22 -1
  196. package/project/.sdk/tm/elixir/lib/projectname/error.ex +24 -0
  197. package/project/.sdk/tm/elixir/lib/projectname/feature/audit.ex +2 -2
  198. package/project/.sdk/tm/elixir/lib/projectname/feature/cost.ex +2 -2
  199. package/project/.sdk/tm/elixir/lib/projectname/feature/debug.ex +13 -13
  200. package/project/.sdk/tm/elixir/lib/projectname/feature/log.ex +18 -5
  201. package/project/.sdk/tm/elixir/lib/projectname/feature/proxy.ex +19 -1
  202. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +15 -0
  203. package/project/.sdk/tm/elixir/lib/projectname/feature/telemetry.ex +4 -2
  204. package/project/.sdk/tm/elixir/lib/projectname/feature.ex +22 -0
  205. package/project/.sdk/tm/elixir/lib/projectname/utility.ex +464 -41
  206. package/project/.sdk/tm/elixir/test/feature_test.exs +3 -2
  207. package/project/.sdk/tm/go/core/context.go +42 -0
  208. package/project/.sdk/tm/go/core/error.go +30 -10
  209. package/project/.sdk/tm/go/core/utility_type.go +2 -0
  210. package/project/.sdk/tm/go/feature/audit_feature.go +1 -0
  211. package/project/.sdk/tm/go/feature/base_feature.go +12 -0
  212. package/project/.sdk/tm/go/feature/cost_feature.go +2 -2
  213. package/project/.sdk/tm/go/feature/debug_feature.go +14 -12
  214. package/project/.sdk/tm/go/feature/log_feature.go +13 -8
  215. package/project/.sdk/tm/go/feature/proxy_feature.go +26 -6
  216. package/project/.sdk/tm/go/feature/secrets_feature.go +19 -0
  217. package/project/.sdk/tm/go/feature/telemetry_feature.go +4 -2
  218. package/project/.sdk/tm/go/test/feature_test.go +2 -2
  219. package/project/.sdk/tm/go/utility/clean.go +585 -2
  220. package/project/.sdk/tm/go/utility/done.go +29 -9
  221. package/project/.sdk/tm/go/utility/make_error.go +51 -16
  222. package/project/.sdk/tm/go/utility/make_options.go +77 -36
  223. package/project/.sdk/tm/go/utility/register.go +12 -0
  224. package/project/.sdk/tm/java/core/Context.java +29 -0
  225. package/project/.sdk/tm/java/core/SdkClient.java +4 -2
  226. package/project/.sdk/tm/java/core/Utility.java +7 -0
  227. package/project/.sdk/tm/java/feature/AuditFeature.java +6 -0
  228. package/project/.sdk/tm/java/feature/CostFeature.java +5 -0
  229. package/project/.sdk/tm/java/feature/DebugFeature.java +25 -14
  230. package/project/.sdk/tm/java/feature/LogFeature.java +11 -4
  231. package/project/.sdk/tm/java/feature/ProxyFeature.java +41 -6
  232. package/project/.sdk/tm/java/feature/SecretsFeature.java +18 -0
  233. package/project/.sdk/tm/java/feature/TelemetryFeature.java +8 -2
  234. package/project/.sdk/tm/java/test/FeatureTest.java +2 -2
  235. package/project/.sdk/tm/java/utility/Clean.java +519 -1
  236. package/project/.sdk/tm/java/utility/Done.java +1 -1
  237. package/project/.sdk/tm/java/utility/MakeError.java +5 -1
  238. package/project/.sdk/tm/java/utility/MakeOptions.java +55 -31
  239. package/project/.sdk/tm/java/utility/Register.java +4 -0
  240. package/project/.sdk/tm/js/src/Context.js +5 -1
  241. package/project/.sdk/tm/js/src/feature/audit/AuditFeature.js +2 -2
  242. package/project/.sdk/tm/js/src/feature/cost/CostFeature.js +2 -2
  243. package/project/.sdk/tm/js/src/feature/debug/DebugFeature.js +13 -7
  244. package/project/.sdk/tm/js/src/feature/log/LogFeature.js +9 -5
  245. package/project/.sdk/tm/js/src/feature/proxy/ProxyFeature.js +19 -1
  246. package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +14 -0
  247. package/project/.sdk/tm/js/src/feature/telemetry/TelemetryFeature.js +4 -2
  248. package/project/.sdk/tm/js/src/utility/CleanUtility.js +294 -21
  249. package/project/.sdk/tm/js/src/utility/DoneUtility.js +17 -5
  250. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +18 -2
  251. package/project/.sdk/tm/js/src/utility/MakeOptionsUtility.js +39 -15
  252. package/project/.sdk/tm/js/src/utility/Utility.js +4 -2
  253. package/project/.sdk/tm/js/test/feature/harness.js +11 -1
  254. package/project/.sdk/tm/js/test/feature.test.js +9 -2
  255. package/project/.sdk/tm/kotlin/core/Context.kt +19 -0
  256. package/project/.sdk/tm/kotlin/core/SdkClient.kt +9 -2
  257. package/project/.sdk/tm/kotlin/core/Utility.kt +2 -0
  258. package/project/.sdk/tm/kotlin/feature/AuditFeature.kt +11 -9
  259. package/project/.sdk/tm/kotlin/feature/CostFeature.kt +8 -5
  260. package/project/.sdk/tm/kotlin/feature/DebugFeature.kt +15 -22
  261. package/project/.sdk/tm/kotlin/feature/LogFeature.kt +8 -4
  262. package/project/.sdk/tm/kotlin/feature/ProxyFeature.kt +26 -2
  263. package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +11 -0
  264. package/project/.sdk/tm/kotlin/feature/TelemetryFeature.kt +4 -2
  265. package/project/.sdk/tm/kotlin/test/FeatureTest.kt +2 -2
  266. package/project/.sdk/tm/kotlin/utility/CoreUtil.kt +447 -11
  267. package/project/.sdk/tm/kotlin/utility/MakeOptions.kt +38 -31
  268. package/project/.sdk/tm/kotlin/utility/Register.kt +1 -0
  269. package/project/.sdk/tm/lua/core/context.lua +43 -0
  270. package/project/.sdk/tm/lua/core/error.lua +36 -1
  271. package/project/.sdk/tm/lua/core/utility_type.lua +4 -0
  272. package/project/.sdk/tm/lua/feature/audit_feature.lua +2 -2
  273. package/project/.sdk/tm/lua/feature/cost_feature.lua +2 -2
  274. package/project/.sdk/tm/lua/feature/debug_feature.lua +21 -17
  275. package/project/.sdk/tm/lua/feature/log_feature.lua +2 -1
  276. package/project/.sdk/tm/lua/feature/proxy_feature.lua +23 -1
  277. package/project/.sdk/tm/lua/feature/secrets_feature.lua +18 -0
  278. package/project/.sdk/tm/lua/feature/telemetry_feature.lua +4 -2
  279. package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +3 -2
  280. package/project/.sdk/tm/lua/test/feature_test.lua +10 -3
  281. package/project/.sdk/tm/lua/utility/clean.lua +426 -2
  282. package/project/.sdk/tm/lua/utility/clean_explain.lua +34 -0
  283. package/project/.sdk/tm/lua/utility/done.lua +1 -7
  284. package/project/.sdk/tm/lua/utility/make_error.lua +3 -1
  285. package/project/.sdk/tm/lua/utility/make_options.lua +76 -30
  286. package/project/.sdk/tm/lua/utility/register.lua +4 -1
  287. package/project/.sdk/tm/ocaml/Makefile +5 -1
  288. package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +12 -1
  289. package/project/.sdk/tm/ocaml/sdk_features.ml +78 -18
  290. package/project/.sdk/tm/ocaml/sdk_helpers.ml +27 -0
  291. package/project/.sdk/tm/ocaml/sdk_runtime.ml +304 -26
  292. package/project/.sdk/tm/ocaml/sdk_types.ml +1 -0
  293. package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +3 -1
  294. package/project/.sdk/tm/ocaml/test/t_feature.ml +2 -2
  295. package/project/.sdk/tm/perl/core/context.pm +27 -0
  296. package/project/.sdk/tm/perl/core/error.pm +52 -5
  297. package/project/.sdk/tm/perl/feature/audit_feature.pm +2 -2
  298. package/project/.sdk/tm/perl/feature/cost_feature.pm +2 -2
  299. package/project/.sdk/tm/perl/feature/debug_feature.pm +17 -13
  300. package/project/.sdk/tm/perl/feature/log_feature.pm +3 -1
  301. package/project/.sdk/tm/perl/feature/proxy_feature.pm +21 -1
  302. package/project/.sdk/tm/perl/feature/secrets_feature.pm +20 -1
  303. package/project/.sdk/tm/perl/feature/telemetry_feature.pm +4 -2
  304. package/project/.sdk/tm/perl/t/feature.t +4 -2
  305. package/project/.sdk/tm/perl/utility/clean.pm +345 -1
  306. package/project/.sdk/tm/perl/utility/done.pm +24 -6
  307. package/project/.sdk/tm/perl/utility/make_error.pm +17 -4
  308. package/project/.sdk/tm/perl/utility/make_options.pm +33 -14
  309. package/project/.sdk/tm/php/core/Context.php +24 -1
  310. package/project/.sdk/tm/php/core/Error.php +34 -3
  311. package/project/.sdk/tm/php/core/UtilityType.php +4 -0
  312. package/project/.sdk/tm/php/feature/AuditFeature.php +2 -2
  313. package/project/.sdk/tm/php/feature/CostFeature.php +2 -2
  314. package/project/.sdk/tm/php/feature/DebugFeature.php +18 -9
  315. package/project/.sdk/tm/php/feature/LogFeature.php +5 -2
  316. package/project/.sdk/tm/php/feature/ProxyFeature.php +20 -1
  317. package/project/.sdk/tm/php/feature/SecretsFeature.php +18 -0
  318. package/project/.sdk/tm/php/feature/TelemetryFeature.php +4 -2
  319. package/project/.sdk/tm/php/test/FeatureTest.php +2 -2
  320. package/project/.sdk/tm/php/utility/Clean.php +438 -2
  321. package/project/.sdk/tm/php/utility/Done.php +14 -7
  322. package/project/.sdk/tm/php/utility/MakeError.php +9 -7
  323. package/project/.sdk/tm/php/utility/MakeOptions.php +62 -38
  324. package/project/.sdk/tm/php/utility/Register.php +2 -0
  325. package/project/.sdk/tm/py/pkg/core/context.py +17 -0
  326. package/project/.sdk/tm/py/pkg/core/error.py +42 -1
  327. package/project/.sdk/tm/py/pkg/core/utility_type.py +4 -0
  328. package/project/.sdk/tm/py/pkg/feature/audit_feature.py +2 -2
  329. package/project/.sdk/tm/py/pkg/feature/cost_feature.py +2 -2
  330. package/project/.sdk/tm/py/pkg/feature/debug_feature.py +17 -12
  331. package/project/.sdk/tm/py/pkg/feature/log_feature.py +2 -1
  332. package/project/.sdk/tm/py/pkg/feature/proxy_feature.py +18 -1
  333. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +12 -0
  334. package/project/.sdk/tm/py/pkg/feature/telemetry_feature.py +4 -2
  335. package/project/.sdk/tm/py/pkg/utility/clean.py +311 -1
  336. package/project/.sdk/tm/py/pkg/utility/done.py +18 -5
  337. package/project/.sdk/tm/py/pkg/utility/make_error.py +9 -6
  338. package/project/.sdk/tm/py/pkg/utility/make_options.py +64 -25
  339. package/project/.sdk/tm/py/pkg/utility/make_response.py +19 -13
  340. package/project/.sdk/tm/py/pkg/utility/register.py +4 -2
  341. package/project/.sdk/tm/py/test/feature_harness.py +4 -0
  342. package/project/.sdk/tm/py/test/test_feature.py +2 -2
  343. package/project/.sdk/tm/py/test/test_primary_utility.py +1 -0
  344. package/project/.sdk/tm/rb/core/context.rb +28 -0
  345. package/project/.sdk/tm/rb/core/error.rb +30 -0
  346. package/project/.sdk/tm/rb/core/utility_type.rb +1 -1
  347. package/project/.sdk/tm/rb/feature/audit_feature.rb +2 -2
  348. package/project/.sdk/tm/rb/feature/cost_feature.rb +2 -2
  349. package/project/.sdk/tm/rb/feature/debug_feature.rb +15 -12
  350. package/project/.sdk/tm/rb/feature/log_feature.rb +3 -1
  351. package/project/.sdk/tm/rb/feature/proxy_feature.rb +25 -1
  352. package/project/.sdk/tm/rb/feature/secrets_feature.rb +17 -0
  353. package/project/.sdk/tm/rb/feature/telemetry_feature.rb +4 -2
  354. package/project/.sdk/tm/rb/test/feature_test.rb +4 -2
  355. package/project/.sdk/tm/rb/utility/clean.rb +312 -1
  356. package/project/.sdk/tm/rb/utility/done.rb +15 -5
  357. package/project/.sdk/tm/rb/utility/make_error.rb +13 -4
  358. package/project/.sdk/tm/rb/utility/make_options.rb +31 -12
  359. package/project/.sdk/tm/rb/utility/register.rb +2 -0
  360. package/project/.sdk/tm/rust/core/context.rs +55 -0
  361. package/project/.sdk/tm/rust/core/utility_type.rs +17 -0
  362. package/project/.sdk/tm/rust/feature/audit.rs +2 -0
  363. package/project/.sdk/tm/rust/feature/cost.rs +3 -2
  364. package/project/.sdk/tm/rust/feature/debug.rs +16 -16
  365. package/project/.sdk/tm/rust/feature/log.rs +42 -7
  366. package/project/.sdk/tm/rust/feature/proxy.rs +48 -2
  367. package/project/.sdk/tm/rust/feature/secrets.rs +12 -0
  368. package/project/.sdk/tm/rust/feature/telemetry.rs +2 -0
  369. package/project/.sdk/tm/rust/tests/feature_test.rs +2 -2
  370. package/project/.sdk/tm/rust/utility/clean.rs +446 -5
  371. package/project/.sdk/tm/rust/utility/done.rs +22 -12
  372. package/project/.sdk/tm/rust/utility/make_error.rs +4 -1
  373. package/project/.sdk/tm/rust/utility/make_options.rs +73 -19
  374. package/project/.sdk/tm/scala/Makefile +3 -1
  375. package/project/.sdk/tm/scala/core/Context.scala +16 -0
  376. package/project/.sdk/tm/scala/core/SdkClient.scala +14 -4
  377. package/project/.sdk/tm/scala/core/SdkError.scala +28 -0
  378. package/project/.sdk/tm/scala/core/Types.scala +3 -0
  379. package/project/.sdk/tm/scala/core/Utility.scala +2 -0
  380. package/project/.sdk/tm/scala/feature/AuditFeature.scala +16 -10
  381. package/project/.sdk/tm/scala/feature/CostFeature.scala +10 -5
  382. package/project/.sdk/tm/scala/feature/DebugFeature.scala +24 -21
  383. package/project/.sdk/tm/scala/feature/LogFeature.scala +9 -4
  384. package/project/.sdk/tm/scala/feature/ProxyFeature.scala +23 -2
  385. package/project/.sdk/tm/scala/feature/SecretsFeature.scala +14 -0
  386. package/project/.sdk/tm/scala/feature/TelemetryFeature.scala +9 -2
  387. package/project/.sdk/tm/scala/sdktest/SdkTestMain.scala +2 -2
  388. package/project/.sdk/tm/scala/utility/Make.scala +63 -20
  389. package/project/.sdk/tm/scala/utility/Misc.scala +358 -5
  390. package/project/.sdk/tm/scala/utility/Register.scala +1 -0
  391. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/core/Context.swift +29 -0
  392. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/core/Utility.swift +2 -0
  393. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/AuditFeature.swift +10 -9
  394. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/CostFeature.swift +7 -5
  395. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/DebugFeature.swift +19 -15
  396. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/FeatureOptions.swift +16 -0
  397. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/LogFeature.swift +4 -1
  398. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/ProxyFeature.swift +20 -5
  399. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +13 -0
  400. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/TelemetryFeature.swift +4 -2
  401. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeError.swift +15 -5
  402. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +58 -19
  403. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Register.swift +1 -0
  404. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/ResultUtil.swift +391 -4
  405. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/FeatureTest.swift +2 -2
  406. package/project/.sdk/tm/ts/src/Context.ts +5 -1
  407. package/project/.sdk/tm/ts/src/feature/audit/AuditFeature.ts +2 -2
  408. package/project/.sdk/tm/ts/src/feature/cost/CostFeature.ts +2 -2
  409. package/project/.sdk/tm/ts/src/feature/debug/DebugFeature.ts +13 -7
  410. package/project/.sdk/tm/ts/src/feature/log/LogFeature.ts +9 -5
  411. package/project/.sdk/tm/ts/src/feature/proxy/ProxyFeature.ts +19 -1
  412. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +12 -0
  413. package/project/.sdk/tm/ts/src/feature/telemetry/TelemetryFeature.ts +4 -2
  414. package/project/.sdk/tm/ts/src/utility/CleanUtility.ts +287 -9
  415. package/project/.sdk/tm/ts/src/utility/DoneUtility.ts +18 -5
  416. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +18 -8
  417. package/project/.sdk/tm/ts/src/utility/MakeOptionsUtility.ts +38 -16
  418. package/project/.sdk/tm/ts/src/utility/Utility.ts +4 -2
  419. package/project/.sdk/tm/ts/test/feature/harness.ts +11 -1
  420. package/project/.sdk/tm/ts/test/feature.test.ts +9 -2
  421. package/project/.sdk/tm/zig/core/context.zig +34 -0
  422. package/project/.sdk/tm/zig/core/error.zig +22 -1
  423. package/project/.sdk/tm/zig/core/utility.zig +403 -39
  424. package/project/.sdk/tm/zig/feature/audit.zig +4 -2
  425. package/project/.sdk/tm/zig/feature/cost.zig +3 -2
  426. package/project/.sdk/tm/zig/feature/debug.zig +20 -25
  427. package/project/.sdk/tm/zig/feature/log.zig +3 -1
  428. package/project/.sdk/tm/zig/feature/proxy.zig +47 -6
  429. package/project/.sdk/tm/zig/feature/secrets.zig +7 -0
  430. package/project/.sdk/tm/zig/feature/telemetry.zig +4 -2
  431. package/project/.sdk/tm/zig/test/feature_test.zig +2 -2
  432. package/project/sdkgen-package.json +1 -1
  433. package/src/action/copies.ts +219 -0
  434. package/src/action/doctor.ts +247 -21
  435. package/src/action/edition.ts +10 -2
  436. package/src/action/feature.ts +11 -2
  437. package/src/action/package.ts +31 -10
  438. package/src/action/remove.ts +4 -0
  439. package/src/action/resolve.ts +16 -3
  440. package/src/action/target.ts +10 -2
  441. package/src/helpers/naming.ts +1 -1
  442. package/src/sdkgen.ts +45 -5
@@ -1,11 +1,449 @@
1
- // ProjectName SDK utility: clean.
1
+ // ProjectName SDK utility: clean - the one choke point every egress passes
2
+ // through. Everything that leaves the pipeline is cleaned; inside it data
3
+ // stays raw, so a hook can still read the header it must add to. See
4
+ // docs/explanation/secret-redaction.md.
5
+
6
+ using System.Collections;
7
+ using System.Globalization;
8
+ using System.Reflection;
9
+ using System.Text;
10
+ using System.Text.Json;
11
+
12
+ using Voxgig.Struct;
2
13
 
3
14
  namespace ProjectNameSdk.Util;
4
15
 
16
+ // The derived clean block, MUTABLE after MakeOptions since features register
17
+ // values later. Fields rather than properties: System.Text.Json serialises
18
+ // properties, so a JSON of the options shows this block as {} and never the
19
+ // registry it holds.
20
+ public sealed class CleanConfig
21
+ {
22
+ public bool Active = true;
23
+ public List<string> Keys = new();
24
+ public List<string> Values = new();
25
+ public string Mask = "[redacted]";
26
+ public int Hint;
27
+ public int Min = 4;
28
+ }
29
+
5
30
  public static partial class SdkUtility
6
31
  {
32
+ private const int CleanMaxDepth = 32;
33
+ private const string CleanCircular = "[circular]";
34
+
35
+ // A dropped slot (a delegate): omitted from a map, null in a list.
36
+ private static readonly object CleanDrop = new();
37
+
38
+ private static readonly JsonSerializerOptions CleanJsonOpts = new()
39
+ {
40
+ Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
41
+ };
42
+
43
+ private static string CleanNormKey(string key)
44
+ {
45
+ return key.ToLowerInvariant().Replace("-", "").Replace("_", "");
46
+ }
47
+
48
+ private static List<string> CleanSplitKeys(object? keys)
49
+ {
50
+ return (Convert.ToString(keys) ?? "")
51
+ .Split(',')
52
+ .Select(k => CleanNormKey(k.Trim()))
53
+ .Where(k => k != "")
54
+ .ToList();
55
+ }
56
+
57
+ internal static List<string> CleanSplitValues(object? values)
58
+ {
59
+ if (values is IList list && values is not string)
60
+ {
61
+ return list.OfType<string>().ToList();
62
+ }
63
+ return (Convert.ToString(values) ?? "")
64
+ .Split(',')
65
+ .Select(v => v.Trim())
66
+ .Where(v => v != "")
67
+ .ToList();
68
+ }
69
+
70
+ private static int CleanCount(object? val, int dflt)
71
+ {
72
+ double n;
73
+ if (val is string s)
74
+ {
75
+ if (!double.TryParse(s.Trim(), System.Globalization.NumberStyles.Float,
76
+ System.Globalization.CultureInfo.InvariantCulture, out n))
77
+ {
78
+ return dflt;
79
+ }
80
+ }
81
+ else if (val is int or long or double or float or short or byte or decimal)
82
+ {
83
+ n = Convert.ToDouble(val);
84
+ }
85
+ else
86
+ {
87
+ return dflt;
88
+ }
89
+ n = Math.Floor(n);
90
+ return double.IsFinite(n) && 0 <= n ? (int)n : dflt;
91
+ }
92
+
93
+ internal static CleanConfig MakeCleanConfig(object? cleanopts)
94
+ {
95
+ var opts = cleanopts as Dictionary<string, object?> ?? new Dictionary<string, object?>();
96
+ return new CleanConfig
97
+ {
98
+ Active = !(opts.TryGetValue("active", out var a) && a is bool ab && !ab),
99
+ Keys = CleanSplitKeys(opts.TryGetValue("keys", out var k) ? k : null),
100
+ Values = new List<string>(),
101
+ Mask = opts.TryGetValue("mask", out var m) && m is string ms ? ms : "[redacted]",
102
+ Hint = CleanCount(opts.TryGetValue("hint", out var h) ? h : null, 0),
103
+ Min = Math.Max(1, CleanCount(opts.TryGetValue("min", out var mn) ? mn : null, 4)),
104
+ };
105
+ }
106
+
107
+ // A context without options (MakeError accepts a bare one) still masks by
108
+ // the schema defaults.
109
+ internal static CleanConfig CleanConfigOf(Context? ctx)
110
+ {
111
+ if (ctx?.Options != null &&
112
+ ctx.Options.TryGetValue("__derived__", out var draw) &&
113
+ draw is Dictionary<string, object?> derived &&
114
+ derived.TryGetValue("clean", out var craw) &&
115
+ craw is CleanConfig cfg)
116
+ {
117
+ return cfg;
118
+ }
119
+ return MakeCleanConfig(StructUtils.GetProp(SdkSchema.Optspec, "clean"));
120
+ }
121
+
122
+ // The encoded forms a value travels in.
123
+ private static List<string> CleanForms(string value)
124
+ {
125
+ var out_ = new List<string> { value };
126
+ void Add(string s)
127
+ {
128
+ if (s != "" && !out_.Contains(s))
129
+ {
130
+ out_.Add(s);
131
+ }
132
+ }
133
+ try { Add(Convert.ToBase64String(Encoding.UTF8.GetBytes(value))); } catch (Exception) { }
134
+ try { Add(Uri.EscapeDataString(value)); } catch (Exception) { }
135
+ try
136
+ {
137
+ var quoted = JsonSerializer.Serialize(value, CleanJsonOpts);
138
+ Add(quoted.Substring(1, quoted.Length - 2));
139
+ }
140
+ catch (Exception) { }
141
+ return out_;
142
+ }
143
+
144
+ internal static void CleanAddUtil(Context ctx, object? value)
145
+ {
146
+ CleanRegister(CleanConfigOf(ctx), value);
147
+ }
148
+
149
+ private static void CleanRegister(CleanConfig cfg, object? value)
150
+ {
151
+ if (value is not string s || s.Length < cfg.Min)
152
+ {
153
+ return;
154
+ }
155
+ var changed = false;
156
+ foreach (var form in CleanForms(s))
157
+ {
158
+ if (form.Length >= cfg.Min && !cfg.Values.Contains(form))
159
+ {
160
+ cfg.Values.Add(form);
161
+ changed = true;
162
+ }
163
+ }
164
+ if (changed)
165
+ {
166
+ cfg.Values.Sort((a, b) => b.Length.CompareTo(a.Length));
167
+ }
168
+ }
169
+
170
+ private static string CleanMaskValue(CleanConfig cfg, string value)
171
+ {
172
+ if (0 < cfg.Hint && value.Length > 2 * cfg.Hint)
173
+ {
174
+ return cfg.Mask + value.Substring(value.Length - cfg.Hint);
175
+ }
176
+ return cfg.Mask;
177
+ }
178
+
179
+ private static string CleanString(CleanConfig cfg, string text)
180
+ {
181
+ var out_ = text;
182
+ foreach (var value in cfg.Values)
183
+ {
184
+ if (out_.Contains(value))
185
+ {
186
+ out_ = out_.Replace(value, CleanMaskValue(cfg, value));
187
+ }
188
+ }
189
+ return out_;
190
+ }
191
+
192
+ private static bool CleanSensitiveKey(CleanConfig cfg, object? key)
193
+ {
194
+ if (key is not string ks)
195
+ {
196
+ return false;
197
+ }
198
+ var nk = CleanNormKey(ks);
199
+ foreach (var k in cfg.Keys)
200
+ {
201
+ if (nk.Contains(k))
202
+ {
203
+ return true;
204
+ }
205
+ }
206
+ return false;
207
+ }
208
+
209
+ private static string CleanCamel(string name)
210
+ {
211
+ return name == "" ? name : char.ToLowerInvariant(name[0]) + name.Substring(1);
212
+ }
213
+
214
+ private static bool CleanIsNumber(object val)
215
+ {
216
+ return val is int or long or double or float or short or byte or decimal or
217
+ sbyte or ushort or uint or ulong;
218
+ }
219
+
220
+ // A registered value used as a map key is masked like any other string;
221
+ // keys that mask alike take a counter, so none is lost.
222
+ private static string CleanName(CleanConfig cfg, Dictionary<string, object?> out_, string key)
223
+ {
224
+ var name = CleanString(cfg, key);
225
+ if (name == key || !out_.ContainsKey(name))
226
+ {
227
+ return name;
228
+ }
229
+ var i = 1;
230
+ while (out_.ContainsKey(name + "#" + i))
231
+ {
232
+ i++;
233
+ }
234
+ return name + "#" + i;
235
+ }
236
+
237
+ // A masked plain-data copy: functions dropped, cycles cut, and nothing
238
+ // shared with the live value, whose spec must stay raw. A typed pipeline
239
+ // product (Spec, Result, a feature record) reads through its public
240
+ // fields, the way a structured logger would; the context reads through
241
+ // its own record so its client, options and config never enter.
242
+ private static object? CleanSnapshot(CleanConfig cfg, object? val, object? key,
243
+ int depth, List<object> seen)
244
+ {
245
+ if (val == null || ReferenceEquals(val, StructUtils.NONE))
246
+ {
247
+ return val;
248
+ }
249
+
250
+ if (val is string s)
251
+ {
252
+ return CleanSensitiveKey(cfg, key) ? CleanMaskValue(cfg, s) : CleanString(cfg, s);
253
+ }
254
+
255
+ if (val is Delegate)
256
+ {
257
+ return CleanDrop;
258
+ }
259
+
260
+ if (val is bool || val is int || val is long || val is double || val is float ||
261
+ val is short || val is byte || val is decimal || val is char || val.GetType().IsEnum)
262
+ {
263
+ return CleanSensitiveKey(cfg, key) ? cfg.Mask : val;
264
+ }
265
+
266
+ if (CleanMaxDepth <= depth || seen.Any(o => ReferenceEquals(o, val)))
267
+ {
268
+ return CleanCircular;
269
+ }
270
+
271
+ if (CleanSensitiveKey(cfg, key))
272
+ {
273
+ return cfg.Mask;
274
+ }
275
+
276
+ seen.Add(val);
277
+ try
278
+ {
279
+ if (val is IDictionary dict)
280
+ {
281
+ var out_ = new Dictionary<string, object?>();
282
+ foreach (DictionaryEntry kv in dict)
283
+ {
284
+ var k = Convert.ToString(kv.Key) ?? "";
285
+ var v = CleanSnapshot(cfg, kv.Value, k, depth + 1, seen);
286
+ if (!ReferenceEquals(v, CleanDrop))
287
+ {
288
+ out_[CleanName(cfg, out_, k)] = v;
289
+ }
290
+ }
291
+ return out_;
292
+ }
293
+
294
+ if (val is IList list)
295
+ {
296
+ var out_ = new List<object?>();
297
+ foreach (var item in list)
298
+ {
299
+ var v = CleanSnapshot(cfg, item, null, depth + 1, seen);
300
+ out_.Add(ReferenceEquals(v, CleanDrop) ? null : v);
301
+ }
302
+ return out_;
303
+ }
304
+
305
+ if (val is Exception err)
306
+ {
307
+ var out_ = new Dictionary<string, object?>
308
+ {
309
+ ["message"] = CleanString(cfg, err.Message),
310
+ ["stack"] = CleanString(cfg, err.StackTrace ?? ""),
311
+ };
312
+ if (err is ProjectNameError se)
313
+ {
314
+ out_["sdk"] = se.Sdk;
315
+ out_["code"] = CleanString(cfg, se.Code);
316
+ out_["status"] = se.Status;
317
+ out_["result"] = CleanSnapshot(cfg, se.ResultVal, "result", depth + 1, seen);
318
+ out_["spec"] = CleanSnapshot(cfg, se.SpecVal, "spec", depth + 1, seen);
319
+ }
320
+ return out_;
321
+ }
322
+
323
+ if (val is Context ctx)
324
+ {
325
+ return CleanSnapshot(cfg, ctx.RawRecord(), key, depth, seen);
326
+ }
327
+
328
+ if (val is IEntity ent)
329
+ {
330
+ return ent.GetName();
331
+ }
332
+
333
+ var fields = val.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
334
+ if (0 == fields.Length)
335
+ {
336
+ return CleanString(cfg, Convert.ToString(val) ?? "");
337
+ }
338
+ var rec = new Dictionary<string, object?>();
339
+ foreach (var f in fields)
340
+ {
341
+ var k = CleanCamel(f.Name);
342
+ var v = CleanSnapshot(cfg, f.GetValue(val), k, depth + 1, seen);
343
+ if (!ReferenceEquals(v, CleanDrop))
344
+ {
345
+ rec[k] = v;
346
+ }
347
+ }
348
+ return rec;
349
+ }
350
+ finally
351
+ {
352
+ seen.RemoveAt(seen.Count - 1);
353
+ }
354
+ }
355
+
356
+ // The SDK's own error is cleaned in place, since it is about to be thrown.
7
357
  internal static object? CleanUtil(Context ctx, object? val)
8
358
  {
9
- return val;
359
+ var cfg = CleanConfigOf(ctx);
360
+
361
+ if (!cfg.Active)
362
+ {
363
+ return val;
364
+ }
365
+
366
+ if (val is string s)
367
+ {
368
+ return CleanString(cfg, s);
369
+ }
370
+
371
+ if (val is ProjectNameError err)
372
+ {
373
+ err.SetMessage(CleanString(cfg, err.Message));
374
+ err.Code = CleanString(cfg, err.Code);
375
+ if (err.ResultVal != null && err.ResultVal is not string)
376
+ {
377
+ err.ResultVal = CleanSnapshot(cfg, err.ResultVal, "result", 1, new List<object>());
378
+ }
379
+ if (err.SpecVal != null && err.SpecVal is not string)
380
+ {
381
+ err.SpecVal = CleanSnapshot(cfg, err.SpecVal, "spec", 1, new List<object>());
382
+ }
383
+ return err;
384
+ }
385
+
386
+ // Exception's message is read-only, so a foreign exception leaves as a
387
+ // cleaned copy of the SDK's own error, without the raw one as its cause.
388
+ if (val is Exception ex)
389
+ {
390
+ return new ProjectNameError("", CleanString(cfg, ex.Message), null);
391
+ }
392
+
393
+ var out_ = CleanSnapshot(cfg, val, null, 0, new List<object>());
394
+ return ReferenceEquals(out_, CleanDrop) ? null : out_;
395
+ }
396
+
397
+ internal static bool CleanKeyUtil(Context ctx, object? key)
398
+ {
399
+ return CleanSensitiveKey(CleanConfigOf(ctx), key);
400
+ }
401
+
402
+ // Every scalar under a sensitive name, at any depth and of any shape: a
403
+ // credential mistyped as a map or a number is still a credential, and the
404
+ // validation error that rejects it quotes it.
405
+ internal static void CleanAddSensitive(Context ctx, object? val)
406
+ {
407
+ CleanAddSensitiveIn(CleanConfigOf(ctx), val, false, 0, new List<object>());
408
+ }
409
+
410
+ private static void CleanAddSensitiveIn(CleanConfig cfg, object? val, bool under,
411
+ int depth, List<object> seen)
412
+ {
413
+ if (val == null || CleanMaxDepth <= depth)
414
+ {
415
+ return;
416
+ }
417
+ if (val is string s)
418
+ {
419
+ if (under) CleanRegister(cfg, s);
420
+ return;
421
+ }
422
+ if (CleanIsNumber(val))
423
+ {
424
+ if (under) CleanRegister(cfg, Convert.ToString(val, CultureInfo.InvariantCulture));
425
+ return;
426
+ }
427
+ if (seen.Any(o => ReferenceEquals(o, val)))
428
+ {
429
+ return;
430
+ }
431
+ if (val is IDictionary dict)
432
+ {
433
+ seen.Add(val);
434
+ foreach (DictionaryEntry kv in dict)
435
+ {
436
+ CleanAddSensitiveIn(cfg, kv.Value,
437
+ under || CleanSensitiveKey(cfg, Convert.ToString(kv.Key)), depth + 1, seen);
438
+ }
439
+ }
440
+ else if (val is IList list)
441
+ {
442
+ seen.Add(val);
443
+ foreach (var item in list)
444
+ {
445
+ CleanAddSensitiveIn(cfg, item, under, depth + 1, seen);
446
+ }
447
+ }
10
448
  }
11
449
  }
@@ -6,17 +6,7 @@ public static partial class SdkUtility
6
6
  {
7
7
  internal static object? DoneUtil(Context ctx)
8
8
  {
9
- if (ctx.Ctrl.Explain != null)
10
- {
11
- ctx.Ctrl.Explain =
12
- CleanUtil(ctx, ctx.Ctrl.Explain) as Dictionary<string, object?>;
13
- if (ctx.Ctrl.Explain != null &&
14
- ctx.Ctrl.Explain.TryGetValue("result", out var explainResult) &&
15
- explainResult is Dictionary<string, object?> rm)
16
- {
17
- rm.Remove("err");
18
- }
19
- }
9
+ CleanExplainUtil(ctx);
20
10
 
21
11
  if (ctx.Result != null && ctx.Result.Ok)
22
12
  {
@@ -25,4 +15,30 @@ public static partial class SdkUtility
25
15
 
26
16
  return MakeErrorUtil(ctx, null);
27
17
  }
18
+
19
+ // Refilled in place: the caller holds this very dictionary (the Context
20
+ // copied it out of the ctrl map), so a replacement would leave them
21
+ // reading the raw one. err is pruned from the cleaned copy of result only.
22
+ internal static void CleanExplainUtil(Context ctx)
23
+ {
24
+ var explain = ctx.Ctrl.Explain;
25
+ if (explain == null)
26
+ {
27
+ return;
28
+ }
29
+ if (CleanUtil(ctx, explain) is Dictionary<string, object?> cleaned &&
30
+ !ReferenceEquals(cleaned, explain))
31
+ {
32
+ explain.Clear();
33
+ foreach (var kv in cleaned)
34
+ {
35
+ explain[kv.Key] = kv.Value;
36
+ }
37
+ }
38
+ if (explain.TryGetValue("result", out var explainResult) &&
39
+ explainResult is Dictionary<string, object?> rm)
40
+ {
41
+ rm.Remove("err");
42
+ }
43
+ }
28
44
  }
@@ -26,26 +26,37 @@ public static partial class SdkUtility
26
26
 
27
27
  var errmsg = err.Message;
28
28
  var msg = "ProjectNameSDK: " + opname + ": " + errmsg;
29
- msg = CleanUtil(ctx, msg) as string ?? msg;
30
29
 
31
30
  result.Err = null;
32
31
 
33
32
  var spec = ctx.Spec;
34
33
 
34
+ // The context stays reachable on the error for a debugger; the error
35
+ // type keeps it out of every serialiser.
36
+ var sdkErr = new ProjectNameError(
37
+ err is ProjectNameError se ? se.Code : "", msg, ctx);
38
+
39
+ CleanUtil(ctx, sdkErr);
40
+
41
+ // Promote the HTTP status to the top level, so a consumer can branch on
42
+ // err.Status instead of reaching into err.ResultVal.
43
+ sdkErr.Status = result.Status;
44
+
45
+ // Reached from RunOp's catch as well as from Done, and a stage that
46
+ // throws never reaches Done's cleaning.
35
47
  if (ctx.Ctrl.Explain != null)
36
48
  {
49
+ CleanExplainUtil(ctx);
37
50
  ctx.Ctrl.Explain["err"] = new Dictionary<string, object?>
38
51
  {
39
- ["message"] = msg,
52
+ ["code"] = sdkErr.Code,
53
+ ["message"] = sdkErr.Message,
54
+ ["status"] = sdkErr.Status,
40
55
  };
41
56
  }
42
57
 
43
- var sdkErr = new ProjectNameError(
44
- err is ProjectNameError se ? se.Code : "", msg, ctx)
45
- {
46
- ResultVal = CleanUtil(ctx, result),
47
- SpecVal = CleanUtil(ctx, spec),
48
- };
58
+ sdkErr.ResultVal = CleanUtil(ctx, result);
59
+ sdkErr.SpecVal = CleanUtil(ctx, spec);
49
60
 
50
61
  ctx.Ctrl.Err = sdkErr;
51
62