@voxgig/sdkgen 2.0.2 → 3.0.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 (385) hide show
  1. package/bin/voxgig-sdkgen +22 -2
  2. package/dist/action/doctor.d.ts +14 -0
  3. package/dist/action/doctor.js +296 -0
  4. package/dist/action/doctor.js.map +1 -0
  5. package/dist/action/feature.js +48 -9
  6. package/dist/action/feature.js.map +1 -1
  7. package/dist/action/target.d.ts +6 -1
  8. package/dist/action/target.js +134 -22
  9. package/dist/action/target.js.map +1 -1
  10. package/dist/cmp/Entity.js +5 -0
  11. package/dist/cmp/Entity.js.map +1 -1
  12. package/dist/cmp/Feature.js +2 -1
  13. package/dist/cmp/Feature.js.map +1 -1
  14. package/dist/cmp/Main.js +5 -1
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/ReadmeExplanation.js +1 -1
  17. package/dist/cmp/ReadmeExplanation.js.map +1 -1
  18. package/dist/cmp/ReadmeTop.js +16 -6
  19. package/dist/cmp/ReadmeTop.js.map +1 -1
  20. package/dist/cmp/Registered.d.ts +7 -0
  21. package/dist/cmp/Registered.js +70 -0
  22. package/dist/cmp/Registered.js.map +1 -0
  23. package/dist/cmp/Test.js +3 -1
  24. package/dist/cmp/Test.js.map +1 -1
  25. package/dist/helpers/dryrun.d.ts +10 -0
  26. package/dist/helpers/dryrun.js +35 -0
  27. package/dist/helpers/dryrun.js.map +1 -0
  28. package/dist/helpers/featureSource.d.ts +13 -0
  29. package/dist/helpers/featureSource.js +156 -0
  30. package/dist/helpers/featureSource.js.map +1 -0
  31. package/dist/helpers/naming.d.ts +9 -1
  32. package/dist/helpers/naming.js +66 -2
  33. package/dist/helpers/naming.js.map +1 -1
  34. package/dist/helpers/opExample.js +23 -3
  35. package/dist/helpers/opExample.js.map +1 -1
  36. package/dist/helpers/opShape.d.ts +11 -1
  37. package/dist/helpers/opShape.js +51 -0
  38. package/dist/helpers/opShape.js.map +1 -1
  39. package/dist/helpers/packageMeta.d.ts +8 -1
  40. package/dist/helpers/packageMeta.js +141 -10
  41. package/dist/helpers/packageMeta.js.map +1 -1
  42. package/dist/helpers/stdrep.d.ts +3 -0
  43. package/dist/helpers/stdrep.js +47 -0
  44. package/dist/helpers/stdrep.js.map +1 -0
  45. package/dist/helpers/testPolicy.d.ts +2 -0
  46. package/dist/helpers/testPolicy.js +46 -0
  47. package/dist/helpers/testPolicy.js.map +1 -0
  48. package/dist/sdkgen.d.ts +15 -6
  49. package/dist/sdkgen.js +45 -4
  50. package/dist/sdkgen.js.map +1 -1
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/model/sdkgen.aontu +125 -0
  53. package/package.json +5 -3
  54. package/project/.sdk/model/target/c.aontu +28 -3
  55. package/project/.sdk/model/target/clojure.aontu +24 -3
  56. package/project/.sdk/model/target/cpp.aontu +25 -3
  57. package/project/.sdk/model/target/csharp.aontu +25 -3
  58. package/project/.sdk/model/target/dart.aontu +15 -3
  59. package/project/.sdk/model/target/elixir.aontu +15 -3
  60. package/project/.sdk/model/target/go-cli.aontu +17 -1
  61. package/project/.sdk/model/target/go-mcp.aontu +17 -1
  62. package/project/.sdk/model/target/go.aontu +14 -4
  63. package/project/.sdk/model/target/haskell.aontu +24 -3
  64. package/project/.sdk/model/target/java.aontu +26 -3
  65. package/project/.sdk/model/target/js.aontu +15 -3
  66. package/project/.sdk/model/target/kotlin.aontu +26 -3
  67. package/project/.sdk/model/target/lean.aontu +25 -3
  68. package/project/.sdk/model/target/lua.aontu +15 -3
  69. package/project/.sdk/model/target/ocaml.aontu +24 -3
  70. package/project/.sdk/model/target/perl.aontu +15 -3
  71. package/project/.sdk/model/target/php.aontu +15 -3
  72. package/project/.sdk/model/target/py-data.aontu +16 -3
  73. package/project/.sdk/model/target/py.aontu +15 -3
  74. package/project/.sdk/model/target/rb.aontu +15 -3
  75. package/project/.sdk/model/target/rust.aontu +25 -3
  76. package/project/.sdk/model/target/scala.aontu +25 -3
  77. package/project/.sdk/model/target/swift.aontu +25 -3
  78. package/project/.sdk/model/target/ts.aontu +15 -3
  79. package/project/.sdk/model/target/zig.aontu +26 -3
  80. package/project/.sdk/src/cmp/c/Config_c.ts +10 -11
  81. package/project/.sdk/src/cmp/c/Entity_c.ts +5 -1
  82. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +23 -5
  83. package/project/.sdk/src/cmp/c/fragment/EntityCreateOp.fragment.c +9 -2
  84. package/project/.sdk/src/cmp/c/fragment/EntityListOp.fragment.c +19 -2
  85. package/project/.sdk/src/cmp/c/fragment/EntityLoadOp.fragment.c +9 -2
  86. package/project/.sdk/src/cmp/c/fragment/EntityRemoveOp.fragment.c +12 -2
  87. package/project/.sdk/src/cmp/c/fragment/EntityUpdateOp.fragment.c +9 -2
  88. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -0
  89. package/project/.sdk/src/cmp/clojure/TestEntity_clojure.ts +6 -3
  90. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -1
  91. package/project/.sdk/src/cmp/clojure/fragment/EntityCreateOp.fragment.clj +2 -2
  92. package/project/.sdk/src/cmp/clojure/fragment/EntityLoadOp.fragment.clj +2 -2
  93. package/project/.sdk/src/cmp/clojure/fragment/EntityRemoveOp.fragment.clj +12 -8
  94. package/project/.sdk/src/cmp/clojure/fragment/EntityUpdateOp.fragment.clj +2 -2
  95. package/project/.sdk/src/cmp/cpp/Entity_cpp.ts +5 -1
  96. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +12 -9
  97. package/project/.sdk/src/cmp/cpp/fragment/EntityCreateOp.fragment.cpp +8 -2
  98. package/project/.sdk/src/cmp/cpp/fragment/EntityListOp.fragment.cpp +18 -2
  99. package/project/.sdk/src/cmp/cpp/fragment/EntityLoadOp.fragment.cpp +8 -2
  100. package/project/.sdk/src/cmp/cpp/fragment/EntityRemoveOp.fragment.cpp +11 -2
  101. package/project/.sdk/src/cmp/cpp/fragment/EntityUpdateOp.fragment.cpp +8 -2
  102. package/project/.sdk/src/cmp/csharp/Package_csharp.ts +2 -1
  103. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +3 -3
  104. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +6 -6
  105. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +38 -1
  106. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +42 -33
  107. package/project/.sdk/src/cmp/dart/Package_dart.ts +2 -1
  108. package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +13 -2
  109. package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +2 -1
  110. package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +3 -3
  111. package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +1 -1
  112. package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +17 -6
  113. package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +13 -2
  114. package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +13 -2
  115. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +3 -3
  116. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +8 -8
  117. package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +18 -1
  118. package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +9 -1
  119. package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +9 -1
  120. package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +15 -1
  121. package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +9 -1
  122. package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +8 -0
  123. package/project/.sdk/src/cmp/elixir/Package_elixir.ts +3 -1
  124. package/project/.sdk/src/cmp/elixir/ReadmeInstall_elixir.ts +2 -2
  125. package/project/.sdk/src/cmp/elixir/TestEntity_elixir.ts +11 -2
  126. package/project/.sdk/src/cmp/elixir/fragment/EntityCreateOp.fragment.ex +2 -1
  127. package/project/.sdk/src/cmp/elixir/fragment/EntityListOp.fragment.ex +1 -0
  128. package/project/.sdk/src/cmp/elixir/fragment/EntityLoadOp.fragment.ex +2 -1
  129. package/project/.sdk/src/cmp/elixir/fragment/EntityRemoveOp.fragment.ex +4 -1
  130. package/project/.sdk/src/cmp/elixir/fragment/EntityUpdateOp.fragment.ex +2 -1
  131. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +38 -8
  132. package/project/.sdk/src/cmp/go/Entity_go.ts +2 -2
  133. package/project/.sdk/src/cmp/go/Main_go.ts +4 -5
  134. package/project/.sdk/src/cmp/go/Package_go.ts +8 -5
  135. package/project/.sdk/src/cmp/go/ReadmeExplanation_go.ts +2 -2
  136. package/project/.sdk/src/cmp/go/ReadmeHowto_go.ts +2 -2
  137. package/project/.sdk/src/cmp/go/ReadmeInstall_go.ts +4 -2
  138. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +2 -2
  139. package/project/.sdk/src/cmp/go/ReadmeQuick_go.ts +2 -2
  140. package/project/.sdk/src/cmp/go/ReadmeTopQuick_go.ts +2 -2
  141. package/project/.sdk/src/cmp/go/ReadmeTopTest_go.ts +2 -2
  142. package/project/.sdk/src/cmp/go/TestDirect_go.ts +21 -15
  143. package/project/.sdk/src/cmp/go/TestEntity_go.ts +9 -9
  144. package/project/.sdk/src/cmp/go/Test_go.ts +2 -2
  145. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +42 -1
  146. package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +4 -4
  147. package/project/.sdk/src/cmp/go-mcp/Main_go-mcp.ts +4 -4
  148. package/project/.sdk/src/cmp/haskell/Package_haskell.ts +2 -1
  149. package/project/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +10 -5
  150. package/project/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +10 -8
  151. package/project/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +14 -10
  152. package/project/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +21 -18
  153. package/project/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +4 -4
  154. package/project/.sdk/src/cmp/haskell/Test_haskell.ts +23 -11
  155. package/project/.sdk/src/cmp/java/Package_java.ts +2 -1
  156. package/project/.sdk/src/cmp/java/ReadmeHowto_java.ts +2 -1
  157. package/project/.sdk/src/cmp/java/ReadmeInstall_java.ts +2 -2
  158. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +1 -1
  159. package/project/.sdk/src/cmp/java/ReadmeQuick_java.ts +3 -3
  160. package/project/.sdk/src/cmp/java/TestDirect_java.ts +3 -3
  161. package/project/.sdk/src/cmp/java/TestEntity_java.ts +6 -6
  162. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +34 -1
  163. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +12 -0
  164. package/project/.sdk/src/cmp/js/Main_js.ts +4 -1
  165. package/project/.sdk/src/cmp/js/Package_js.ts +7 -1
  166. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +13 -2
  167. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +2 -1
  168. package/project/.sdk/src/cmp/js/ReadmeQuick_js.ts +13 -2
  169. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +13 -2
  170. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +2 -1
  171. package/project/.sdk/src/cmp/js/TestDirect_js.ts +3 -3
  172. package/project/.sdk/src/cmp/js/TestEntity_js.ts +8 -8
  173. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +22 -1
  174. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +9 -1
  175. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +9 -1
  176. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +15 -1
  177. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +9 -1
  178. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +13 -0
  179. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +2 -1
  180. package/project/.sdk/src/cmp/kotlin/ReadmeHowto_kotlin.ts +2 -1
  181. package/project/.sdk/src/cmp/kotlin/ReadmeInstall_kotlin.ts +2 -2
  182. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +1 -1
  183. package/project/.sdk/src/cmp/kotlin/ReadmeQuick_kotlin.ts +3 -3
  184. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +3 -3
  185. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +6 -6
  186. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +32 -1
  187. package/project/.sdk/src/cmp/lean/Package_lean.ts +3 -1
  188. package/project/.sdk/src/cmp/lua/MainEntity_lua.ts +9 -4
  189. package/project/.sdk/src/cmp/lua/Package_lua.ts +4 -3
  190. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +11 -3
  191. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +1 -1
  192. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +3 -3
  193. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +9 -9
  194. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +37 -1
  195. package/project/.sdk/src/cmp/lua/fragment/SdkError.fragment.lua +12 -0
  196. package/project/.sdk/src/cmp/ocaml/EntityOperation_ocaml.ts +30 -3
  197. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +11 -5
  198. package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +3 -1
  199. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +10 -5
  200. package/project/.sdk/src/cmp/ocaml/ReadmeHowto_ocaml.ts +6 -2
  201. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +10 -8
  202. package/project/.sdk/src/cmp/ocaml/ReadmeQuick_ocaml.ts +14 -13
  203. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +20 -18
  204. package/project/.sdk/src/cmp/ocaml/ReadmeTopQuick_ocaml.ts +4 -4
  205. package/project/.sdk/src/cmp/ocaml/ReadmeTopTest_ocaml.ts +8 -2
  206. package/project/.sdk/src/cmp/ocaml/TestEntity_ocaml.ts +8 -5
  207. package/project/.sdk/src/cmp/perl/ReadmeHowto_perl.ts +2 -1
  208. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +1 -1
  209. package/project/.sdk/src/cmp/perl/ReadmeQuick_perl.ts +3 -3
  210. package/project/.sdk/src/cmp/perl/ReadmeTopQuick_perl.ts +1 -1
  211. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +3 -3
  212. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +6 -6
  213. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +36 -1
  214. package/project/.sdk/src/cmp/php/MainEntity_php.ts +21 -16
  215. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  216. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +6 -6
  217. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +4 -3
  218. package/project/.sdk/src/cmp/php/ReadmeIntro_php.ts +2 -2
  219. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +1 -1
  220. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +12 -12
  221. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +6 -6
  222. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +4 -4
  223. package/project/.sdk/src/cmp/php/ReadmeTopTest_php.ts +2 -2
  224. package/project/.sdk/src/cmp/php/TestDirect_php.ts +3 -3
  225. package/project/.sdk/src/cmp/php/TestEntity_php.ts +17 -15
  226. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +20 -1
  227. package/project/.sdk/src/cmp/php/fragment/SdkError.fragment.php +11 -0
  228. package/project/.sdk/src/cmp/py/Package_py.ts +4 -3
  229. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +13 -2
  230. package/project/.sdk/src/cmp/py/ReadmeHowto_py.ts +2 -1
  231. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +1 -1
  232. package/project/.sdk/src/cmp/py/ReadmeQuick_py.ts +17 -6
  233. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +14 -3
  234. package/project/.sdk/src/cmp/py/ReadmeTopQuick_py.ts +13 -2
  235. package/project/.sdk/src/cmp/py/TestDirect_py.ts +3 -3
  236. package/project/.sdk/src/cmp/py/TestEntity_py.ts +9 -9
  237. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +29 -1
  238. package/project/.sdk/src/cmp/py/fragment/SdkError.fragment.py +11 -0
  239. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +2 -1
  240. package/project/.sdk/src/cmp/rb/Package_rb.ts +4 -3
  241. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +1 -1
  242. package/project/.sdk/src/cmp/rb/ReadmeHowto_rb.ts +2 -1
  243. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +5 -5
  244. package/project/.sdk/src/cmp/rb/ReadmeTopQuick_rb.ts +1 -1
  245. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +3 -3
  246. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +9 -9
  247. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +31 -1
  248. package/project/.sdk/src/cmp/rb/fragment/SdkError.fragment.rb +10 -1
  249. package/project/.sdk/src/cmp/rust/Entity_rust.ts +5 -1
  250. package/project/.sdk/src/cmp/rust/Main_rust.ts +21 -0
  251. package/project/.sdk/src/cmp/rust/Package_rust.ts +2 -1
  252. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +3 -3
  253. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +12 -12
  254. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +18 -0
  255. package/project/.sdk/src/cmp/rust/fragment/EntityCreateOp.fragment.rs +8 -2
  256. package/project/.sdk/src/cmp/rust/fragment/EntityListOp.fragment.rs +20 -3
  257. package/project/.sdk/src/cmp/rust/fragment/EntityLoadOp.fragment.rs +8 -2
  258. package/project/.sdk/src/cmp/rust/fragment/EntityRemoveOp.fragment.rs +10 -2
  259. package/project/.sdk/src/cmp/rust/fragment/EntityUpdateOp.fragment.rs +8 -2
  260. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +10 -0
  261. package/project/.sdk/src/cmp/scala/ReadmeHowto_scala.ts +2 -1
  262. package/project/.sdk/src/cmp/scala/ReadmeInstall_scala.ts +3 -3
  263. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +1 -1
  264. package/project/.sdk/src/cmp/scala/ReadmeQuick_scala.ts +3 -3
  265. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +3 -3
  266. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +27 -1
  267. package/project/.sdk/src/cmp/swift/ReadmeHowto_swift.ts +2 -1
  268. package/project/.sdk/src/cmp/swift/ReadmeInstall_swift.ts +3 -3
  269. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +1 -1
  270. package/project/.sdk/src/cmp/swift/ReadmeQuick_swift.ts +3 -3
  271. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +34 -1
  272. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +9 -1
  273. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +18 -1
  274. package/project/.sdk/src/cmp/ts/Gitignore_ts.ts +5 -2
  275. package/project/.sdk/src/cmp/ts/Main_ts.ts +4 -1
  276. package/project/.sdk/src/cmp/ts/Package_ts.ts +10 -1
  277. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +13 -2
  278. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +2 -1
  279. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +21 -6
  280. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +52 -2
  281. package/project/.sdk/src/cmp/ts/ReadmeTopQuick_ts.ts +14 -3
  282. package/project/.sdk/src/cmp/ts/ReadmeTopTest_ts.ts +34 -2
  283. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +64 -43
  284. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +8 -8
  285. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +2 -2
  286. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -2
  287. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +25 -1
  288. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +10 -2
  289. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +1 -1
  290. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +10 -2
  291. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +27 -3
  292. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +10 -2
  293. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +15 -0
  294. package/project/.sdk/src/cmp/zig/Entity_zig.ts +5 -1
  295. package/project/.sdk/src/cmp/zig/Package_zig.ts +3 -1
  296. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +39 -0
  297. package/project/.sdk/src/cmp/zig/fragment/EntityCreateOp.fragment.zig +2 -2
  298. package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +21 -2
  299. package/project/.sdk/src/cmp/zig/fragment/EntityLoadOp.fragment.zig +2 -2
  300. package/project/.sdk/src/cmp/zig/fragment/EntityRemoveOp.fragment.zig +5 -2
  301. package/project/.sdk/src/cmp/zig/fragment/EntityUpdateOp.fragment.zig +2 -2
  302. package/project/.sdk/tm/c/VERSION +1 -1
  303. package/project/.sdk/tm/c/core/helpers.c +1 -0
  304. package/project/.sdk/tm/c/core/sdk.h +22 -6
  305. package/project/.sdk/tm/c/tests/feature_harness.h +1 -0
  306. package/project/.sdk/tm/c/tests/primary_utility_test.c +4 -1
  307. package/project/.sdk/tm/c/utility/make_url.c +1 -0
  308. package/project/.sdk/tm/c/utility/param.c +1 -0
  309. package/project/.sdk/tm/clojure/VERSION +1 -1
  310. package/project/.sdk/tm/cpp/VERSION +1 -1
  311. package/project/.sdk/tm/cpp/core/types.hpp +33 -8
  312. package/project/.sdk/tm/cpp/test/pipeline_test.cpp +5 -0
  313. package/project/.sdk/tm/cpp/test/runner_support.hpp +4 -4
  314. package/project/.sdk/tm/csharp/VERSION +1 -1
  315. package/project/.sdk/tm/csharp/core/Types.cs +6 -0
  316. package/project/.sdk/tm/csharp/test/FeatureHarness.cs +396 -0
  317. package/project/.sdk/tm/csharp/test/FeatureTest.cs +7 -385
  318. package/project/.sdk/tm/csharp/test/Runner.cs +4 -4
  319. package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +4 -0
  320. package/project/.sdk/tm/dart/test/utility.dart +4 -4
  321. package/project/.sdk/tm/elixir/VERSION +1 -1
  322. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +26 -0
  323. package/project/.sdk/tm/go/VERSION +1 -1
  324. package/project/.sdk/tm/go/core/types.go +6 -0
  325. package/project/.sdk/tm/go/test/feature_harness_test.go +361 -0
  326. package/project/.sdk/tm/go/test/feature_test.go +7 -350
  327. package/project/.sdk/tm/go/test/pipeline_test.go +6 -0
  328. package/project/.sdk/tm/go/test/runner_test.go +16 -4
  329. package/project/.sdk/tm/haskell/VERSION +1 -1
  330. package/project/.sdk/tm/haskell/src/SdkFeatures.hs +28 -5
  331. package/project/.sdk/tm/haskell/src/SdkTypes.hs +14 -5
  332. package/project/.sdk/tm/java/VERSION +1 -1
  333. package/project/.sdk/tm/java/test/RunnerSupport.java +4 -4
  334. package/project/.sdk/tm/java/utility/MakeError.java +4 -0
  335. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +4 -0
  336. package/project/.sdk/tm/js/test/utility.js +3 -3
  337. package/project/.sdk/tm/kotlin/VERSION +1 -1
  338. package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +3 -3
  339. package/project/.sdk/tm/lean/VERSION +1 -1
  340. package/project/.sdk/tm/lean/test/TFeature.lean +27 -14
  341. package/project/.sdk/tm/lua/test/runner.lua +4 -4
  342. package/project/.sdk/tm/lua/utility/make_error.lua +4 -0
  343. package/project/.sdk/tm/ocaml/VERSION +1 -1
  344. package/project/.sdk/tm/ocaml/sdk_types.ml +14 -5
  345. package/project/.sdk/tm/ocaml/test/t_pipeline.ml +5 -2
  346. package/project/.sdk/tm/perl/t/runner.pm +4 -4
  347. package/project/.sdk/tm/php/VERSION +1 -1
  348. package/project/.sdk/tm/php/test/Runner.php +4 -4
  349. package/project/.sdk/tm/php/utility/MakeError.php +5 -0
  350. package/project/.sdk/tm/py/pkg/utility/make_error.py +4 -0
  351. package/project/.sdk/tm/py/test/runner.py +19 -4
  352. package/project/.sdk/tm/rb/test/runner.rb +4 -4
  353. package/project/.sdk/tm/rb/utility/make_error.rb +4 -0
  354. package/project/.sdk/tm/rust/VERSION +1 -1
  355. package/project/.sdk/tm/rust/core/types.rs +22 -6
  356. package/project/.sdk/tm/rust/tests/common/mod.rs +6 -6
  357. package/project/.sdk/tm/rust/tests/pipeline_test.rs +6 -0
  358. package/project/.sdk/tm/rust/utility/make_error.rs +4 -0
  359. package/project/.sdk/tm/scala/VERSION +1 -1
  360. package/project/.sdk/tm/swift/VERSION +1 -1
  361. package/project/.sdk/tm/ts/src/tsconfig.json +1 -0
  362. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +4 -0
  363. package/project/.sdk/tm/ts/test/tsconfig.json +1 -0
  364. package/project/.sdk/tm/ts/test/utility.ts +3 -3
  365. package/project/.sdk/tm/zig/VERSION +1 -1
  366. package/src/action/doctor.ts +410 -0
  367. package/src/action/feature.ts +54 -16
  368. package/src/action/target.ts +174 -25
  369. package/src/cmp/Entity.ts +7 -0
  370. package/src/cmp/Feature.ts +3 -1
  371. package/src/cmp/Main.ts +7 -1
  372. package/src/cmp/ReadmeExplanation.ts +2 -2
  373. package/src/cmp/ReadmeTop.ts +22 -9
  374. package/src/cmp/Registered.ts +100 -0
  375. package/src/cmp/Test.ts +4 -1
  376. package/src/helpers/dryrun.ts +57 -0
  377. package/src/helpers/featureSource.ts +208 -0
  378. package/src/helpers/naming.ts +73 -2
  379. package/src/helpers/opExample.ts +19 -2
  380. package/src/helpers/opShape.ts +65 -0
  381. package/src/helpers/packageMeta.ts +163 -10
  382. package/src/helpers/stdrep.ts +56 -0
  383. package/src/helpers/testPolicy.ts +52 -0
  384. package/src/sdkgen.ts +70 -4
  385. package/project/.sdk/tm/rust/feature/mod.rs +0 -24
@@ -10,7 +10,7 @@ class EntityOperation {
10
10
 
11
11
  // EJECT-START
12
12
 
13
- async create(this: any, reqdata?: EntityNameCreateData, ctrl?: Control): Promise<EntityName> {
13
+ async create(this: any, reqdata?: EntityNameCreateData, ctrl?: Control): Promise<EntyClass> {
14
14
 
15
15
  const utility = this._utility
16
16
  const {
@@ -84,7 +84,15 @@ class EntityOperation {
84
84
  }
85
85
  }
86
86
 
87
- return done(ctx)
87
+ const out = done(ctx)
88
+
89
+ // An operation resolves to the ENTITY, not the raw data — the record
90
+ // has just been absorbed into this instance and is reached through
91
+ // data(). `done` still runs: it completes the pipeline and raises on
92
+ // failure, and when throwing is disabled it hands back the error
93
+ // payload, which passes through unchanged. See AGENTS.md "Entity
94
+ // operations return ENTITIES".
95
+ return (ctx.result && ctx.result.ok) ? this : out
88
96
  }
89
97
  catch (err: any) {
90
98
  // #PreUnexpected-Hook
@@ -10,7 +10,7 @@ class EntityOperation {
10
10
 
11
11
  // EJECT-START
12
12
 
13
- async list(this: any, reqmatch?: EntityNameListMatch, ctrl?: Control): Promise<EntityName[]> {
13
+ async list(this: any, reqmatch?: EntityNameListMatch, ctrl?: Control): Promise<EntyClass[]> {
14
14
 
15
15
  const utility = this._utility
16
16
 
@@ -10,7 +10,7 @@ class EntityOperation {
10
10
 
11
11
  // EJECT-START
12
12
 
13
- async load(this: any, reqmatch?: EntityNameLoadMatch, ctrl?: Control): Promise<EntityName> {
13
+ async load(this: any, reqmatch?: EntityNameLoadMatch, ctrl?: Control): Promise<EntyClass> {
14
14
 
15
15
  const utility = this._utility
16
16
 
@@ -89,7 +89,15 @@ class EntityOperation {
89
89
  }
90
90
  }
91
91
 
92
- return done(ctx)
92
+ const out = done(ctx)
93
+
94
+ // An operation resolves to the ENTITY, not the raw data — the record
95
+ // has just been absorbed into this instance and is reached through
96
+ // data(). `done` still runs: it completes the pipeline and raises on
97
+ // failure, and when throwing is disabled it hands back the error
98
+ // payload, which passes through unchanged. See AGENTS.md "Entity
99
+ // operations return ENTITIES".
100
+ return (ctx.result && ctx.result.ok) ? this : out
93
101
  }
94
102
  catch (err: any) {
95
103
  // #PreUnexpected-Hook
@@ -10,7 +10,17 @@ class EntityOperation {
10
10
 
11
11
  // EJECT-START
12
12
 
13
- async remove(this: any, reqmatch?: EntityNameRemoveMatch, ctrl?: Control): Promise<EntityName> {
13
+ // Resolves to THIS entity, marked as deleted — like every other operation,
14
+ // which resolve to the entity too (see AGENTS.md). The instance keeps the
15
+ // data it held, so a caller can still read what was removed; `deleted()`
16
+ // reports that it is no longer a live record.
17
+ //
18
+ // A DELETE that answers 204 No Content therefore still resolves to
19
+ // something useful, where returning the raw body resolved to `undefined`
20
+ // against a signature that promised a record.
21
+ async remove(
22
+ this: any, reqmatch?: EntityNameRemoveMatch, ctrl?: Control,
23
+ ): Promise<EntyClass> {
14
24
 
15
25
  const utility = this._utility
16
26
 
@@ -90,7 +100,21 @@ class EntityOperation {
90
100
  }
91
101
  }
92
102
 
93
- return done(ctx)
103
+ const out = done(ctx)
104
+
105
+ // An operation resolves to the ENTITY, not the raw data — the record
106
+ // has just been absorbed into this instance and is reached through
107
+ // data(). `done` still runs: it completes the pipeline and raises on
108
+ // failure, and when throwing is disabled it hands back the error
109
+ // payload, which passes through unchanged. See AGENTS.md "Entity
110
+ // operations return ENTITIES".
111
+ if (ctx.result && ctx.result.ok) {
112
+ // A removed entity keeps its data but is no longer a live record.
113
+ this.markDeleted()
114
+ return this
115
+ }
116
+
117
+ return out
94
118
  }
95
119
  catch (err: any) {
96
120
  // #PreUnexpected-Hook
@@ -102,7 +126,7 @@ class EntityOperation {
102
126
  }
103
127
  else {
104
128
  // Off-happy-path (throw disabled): typed as any so the method's
105
- // Promise<EntityName> return stays clean under strict null checks.
129
+ // Promise<EntyClass> return stays clean under strict null checks.
106
130
  return undefined as any
107
131
  }
108
132
  }
@@ -10,7 +10,7 @@ class EntityOperation {
10
10
 
11
11
  // EJECT-START
12
12
 
13
- async update(this: any, reqdata?: EntityNameUpdateData, ctrl?: Control): Promise<EntityName> {
13
+ async update(this: any, reqdata?: EntityNameUpdateData, ctrl?: Control): Promise<EntyClass> {
14
14
 
15
15
  const utility = this._utility
16
16
 
@@ -90,7 +90,15 @@ class EntityOperation {
90
90
  }
91
91
  }
92
92
 
93
- return done(ctx)
93
+ const out = done(ctx)
94
+
95
+ // An operation resolves to the ENTITY, not the raw data — the record
96
+ // has just been absorbed into this instance and is reached through
97
+ // data(). `done` still runs: it completes the pipeline and raises on
98
+ // failure, and when throwing is disabled it hands back the error
99
+ // payload, which passes through unchanged. See AGENTS.md "Entity
100
+ // operations return ENTITIES".
101
+ return (ctx.result && ctx.result.ok) ? this : out
94
102
  }
95
103
  catch (err: any) {
96
104
  // #PreUnexpected-Hook
@@ -11,6 +11,21 @@ class ProjectNameError extends Error {
11
11
  code: string
12
12
  ctx: Context
13
13
 
14
+ // HTTP status of the response that caused this error, or -1 when the
15
+ // request never got one (transport failure, client-side abort).
16
+ //
17
+ // PROMOTED to the top level on purpose. It used to be reachable only at
18
+ // `err.result.status` — two levels into an object that reads as internal —
19
+ // so every consumer of every generated SDK wrote the same
20
+ // `404 === e?.result?.status` branch and coupled itself to the internal
21
+ // shape of `result`. Mapping "not found" to a null result is table stakes
22
+ // for a client integration.
23
+ status: number = -1
24
+
25
+
26
+ // `err.notFound` rather than a magic number at every call site.
27
+ get notFound(): boolean { return 404 === this.status }
28
+
14
29
  constructor(code: string, msg: string, ctx: Context) {
15
30
  super(msg)
16
31
  this.code = code
@@ -48,7 +48,11 @@ const Entity = cmp(function Entity(props: any) {
48
48
  ({ indent }: any) => {
49
49
  const arg = ('create' === opname || 'update' === opname) ?
50
50
  'reqdata' : 'reqmatch'
51
- Content({ indent }, `pub fn ${opname}(self: *${cls}, _${arg}: Value, _ctrl: Value) OpResult {
51
+ // The stub mirrors the real signature: ops resolve to the
52
+ // ENTITY (`list` to a slice of them), so an unsupported op
53
+ // declares the same per-entity result union.
54
+ const ret = 'list' === opname ? 'EntListResult' : 'EntResult'
55
+ Content({ indent }, `pub fn ${opname}(self: *${cls}, _${arg}: Value, _ctrl: Value) ${ret} {
52
56
  _ = _${arg};
53
57
  _ = _ctrl;
54
58
  return .{ .err = h.unsupported_op("${opname}", self.name) };
@@ -3,6 +3,7 @@ import {
3
3
  Content,
4
4
  File,
5
5
  cmp,
6
+ packageVersion,
6
7
  } from '@voxgig/sdkgen'
7
8
 
8
9
 
@@ -35,6 +36,7 @@ import { zigModuleName } from './utility_zig'
35
36
  // pin there.
36
37
  const Package = cmp(async function Package(props: any) {
37
38
  const ctx$ = props.ctx$
39
+ const target = props.target
38
40
  const model: Model = ctx$.model
39
41
 
40
42
  const name = zigModuleName(model)
@@ -42,7 +44,7 @@ const Package = cmp(async function Package(props: any) {
42
44
  File({ name: 'build.zig.zon' }, () => {
43
45
  Content(`.{
44
46
  .name = "${name}",
45
- .version = "0.0.1",
47
+ .version = "${packageVersion(model, target.name)}",
46
48
  .dependencies = .{},
47
49
  .paths = .{
48
50
  "src",
@@ -17,6 +17,23 @@ const OpResult = types.OpResult;
17
17
  const OutVal = types.OutVal;
18
18
  const Entity = types.Entity;
19
19
 
20
+ // Every operation resolves to the ENTITY, not the raw data — `list` to a
21
+ // slice of them, one per record; the record is reached through `data()`.
22
+ // See AGENTS.md "Entity operations return ENTITIES".
23
+ //
24
+ // `Value` cannot carry an entity (it is a closed data union) and the shared
25
+ // `OpResult` cannot name a per-entity type, so each entity declares its own
26
+ // result unions and the CONTRACT lives in those signatures.
27
+ pub const EntResult = union(enum) {
28
+ ok: *EntyClass,
29
+ err: *errmod.ProjectNameError,
30
+ };
31
+
32
+ pub const EntListResult = union(enum) {
33
+ ok: []*EntyClass,
34
+ err: *errmod.ProjectNameError,
35
+ };
36
+
20
37
  pub const EntyClass = struct {
21
38
  name: []const u8 = "entityname",
22
39
  client: *sdk.ProjectNameSDK,
@@ -25,6 +42,8 @@ pub const EntyClass = struct {
25
42
  data: Value,
26
43
  mtch: Value,
27
44
  entctx: ?*Context = null,
45
+ // Set once a successful `remove` resolves on this instance.
46
+ deleted: bool = false,
28
47
 
29
48
  pub fn new(client: *sdk.ProjectNameSDK, entopts_in: Value) *EntyClass {
30
49
  const entopts: Value = switch (entopts_in) {
@@ -73,6 +92,26 @@ pub const EntyClass = struct {
73
92
  return .{ .ok = v };
74
93
  }
75
94
 
95
+ // Runs the pipeline and hands back THIS entity: run_op has just absorbed
96
+ // the result into it. See AGENTS.md "Entity operations return ENTITIES".
97
+ fn run_op_ent(self: *EntyClass, ctx: *Context, post_done: *const fn (*EntyClass, *Context) void) EntResult {
98
+ return switch (self.run_op(ctx, post_done)) {
99
+ .err => |e| EntResult{ .err = e },
100
+ .ok => EntResult{ .ok = self },
101
+ };
102
+ }
103
+
104
+ // `remove` resolves to the entity, marked. The instance KEEPS the data it
105
+ // held — a caller can still read what was deleted — but it is no longer a
106
+ // live record.
107
+ pub fn mark_deleted(self: *EntyClass) void {
108
+ self.deleted = true;
109
+ }
110
+
111
+ pub fn is_deleted(self: *EntyClass) bool {
112
+ return self.deleted;
113
+ }
114
+
76
115
  fn run_op(self: *EntyClass, ctx: *Context, post_done: *const fn (*EntyClass, *Context) void) OpResult {
77
116
  const utility = self.utility;
78
117
 
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- pub fn create(self: *EntyClass, reqdata: Value, ctrl: Value) OpResult {
3
+ pub fn create(self: *EntyClass, reqdata: Value, ctrl: Value) EntResult {
4
4
  const ctx = self.utility.make_context(CtxSpec{
5
5
  .opname = "create",
6
6
  .ctrl = ctrl,
@@ -8,7 +8,7 @@ pub fn create(self: *EntyClass, reqdata: Value, ctrl: Value) OpResult {
8
8
  .data = self.data,
9
9
  .reqdata = reqdata,
10
10
  }, self.ent_ctx());
11
- return self.run_op(ctx, create_post_done);
11
+ return self.run_op_ent(ctx, create_post_done);
12
12
  }
13
13
 
14
14
  fn create_post_done(self: *EntyClass, ctx: *Context) void {
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- pub fn list(self: *EntyClass, reqmatch: Value, ctrl: Value) OpResult {
3
+ pub fn list(self: *EntyClass, reqmatch: Value, ctrl: Value) EntListResult {
4
4
  const ctx = self.utility.make_context(CtxSpec{
5
5
  .opname = "list",
6
6
  .ctrl = ctrl,
@@ -8,7 +8,26 @@ pub fn list(self: *EntyClass, reqmatch: Value, ctrl: Value) OpResult {
8
8
  .data = self.data,
9
9
  .reqmatch = reqmatch,
10
10
  }, self.ent_ctx());
11
- return self.run_op(ctx, list_post_done);
11
+ const out = switch (self.run_op(ctx, list_post_done)) {
12
+ .err => |e| return EntListResult{ .err = e },
13
+ .ok => |v| v,
14
+ };
15
+
16
+ // `list` resolves to one ENTITY per record. make_result cannot build them
17
+ // here — it works in Value, which has no slot for an entity — so the op
18
+ // does, mirroring what the dynamic targets get from make_result.
19
+ var items = std.ArrayList(*EntyClass).init(h.A());
20
+ if (out == .array) {
21
+ for (out.array.data.items) |entry| {
22
+ const ent = EntyClass.new(self.client, h.clone(self.entopts));
23
+ if (entry == .object) {
24
+ _ = ent.data_impl(entry);
25
+ }
26
+ items.append(ent) catch {};
27
+ }
28
+ }
29
+
30
+ return EntListResult{ .ok = items.toOwnedSlice() catch &[_]*EntyClass{} };
12
31
  }
13
32
 
14
33
  fn list_post_done(self: *EntyClass, ctx: *Context) void {
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- pub fn load(self: *EntyClass, reqmatch: Value, ctrl: Value) OpResult {
3
+ pub fn load(self: *EntyClass, reqmatch: Value, ctrl: Value) EntResult {
4
4
  const ctx = self.utility.make_context(CtxSpec{
5
5
  .opname = "load",
6
6
  .ctrl = ctrl,
@@ -8,7 +8,7 @@ pub fn load(self: *EntyClass, reqmatch: Value, ctrl: Value) OpResult {
8
8
  .data = self.data,
9
9
  .reqmatch = reqmatch,
10
10
  }, self.ent_ctx());
11
- return self.run_op(ctx, load_post_done);
11
+ return self.run_op_ent(ctx, load_post_done);
12
12
  }
13
13
 
14
14
  fn load_post_done(self: *EntyClass, ctx: *Context) void {
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- pub fn remove(self: *EntyClass, reqmatch: Value, ctrl: Value) OpResult {
3
+ pub fn remove(self: *EntyClass, reqmatch: Value, ctrl: Value) EntResult {
4
4
  const ctx = self.utility.make_context(CtxSpec{
5
5
  .opname = "remove",
6
6
  .ctrl = ctrl,
@@ -8,7 +8,10 @@ pub fn remove(self: *EntyClass, reqmatch: Value, ctrl: Value) OpResult {
8
8
  .data = self.data,
9
9
  .reqmatch = reqmatch,
10
10
  }, self.ent_ctx());
11
- return self.run_op(ctx, remove_post_done);
11
+ const res = self.run_op_ent(ctx, remove_post_done);
12
+ // A removed entity keeps its data but is no longer a live record.
13
+ if (res == .ok) self.mark_deleted();
14
+ return res;
12
15
  }
13
16
 
14
17
  fn remove_post_done(self: *EntyClass, ctx: *Context) void {
@@ -1,6 +1,6 @@
1
1
  // EJECT-START
2
2
 
3
- pub fn update(self: *EntyClass, reqdata: Value, ctrl: Value) OpResult {
3
+ pub fn update(self: *EntyClass, reqdata: Value, ctrl: Value) EntResult {
4
4
  const ctx = self.utility.make_context(CtxSpec{
5
5
  .opname = "update",
6
6
  .ctrl = ctrl,
@@ -8,7 +8,7 @@ pub fn update(self: *EntyClass, reqdata: Value, ctrl: Value) OpResult {
8
8
  .data = self.data,
9
9
  .reqdata = reqdata,
10
10
  }, self.ent_ctx());
11
- return self.run_op(ctx, update_post_done);
11
+ return self.run_op_ent(ctx, update_post_done);
12
12
  }
13
13
 
14
14
  fn update_post_done(self: *EntyClass, ctx: *Context) void {
@@ -1 +1 @@
1
- 0.0.1
1
+ PROJECTVERSION
@@ -5,6 +5,7 @@
5
5
  #include "sdk.h"
6
6
 
7
7
  #include <stdarg.h>
8
+ #include <stdio.h> // snprintf
8
9
  #include <stdlib.h>
9
10
  #include <string.h>
10
11
  #include <time.h>
@@ -303,17 +303,33 @@ voxgig_value* utility_fetch(Utility* u, Context* ctx, const char* url,
303
303
  // Entity (vtable; mirrors core/types.rs Entity + ProjectNameEntity)
304
304
  // ===========================================================================
305
305
 
306
+ // Every operation resolves to the ENTITY, not the raw data. `list` resolves
307
+ // to a NULL-terminated array of them, one per record; the record is reached
308
+ // through `data`. See AGENTS.md "Entity operations return ENTITIES".
309
+ //
310
+ // `voxgig_value` cannot carry an entity - it is a closed data union
311
+ // (UNDEF|NULL|BOOL|INT|DOUBLE|STRING|LIST|MAP|FUNC|SENTINEL), and adding a
312
+ // variant to a general-purpose struct library to hold SDK objects would be
313
+ // wrong - so the CONTRACT lives in these signatures instead.
306
314
  typedef struct EntityVT {
307
315
  const char* (*get_name)(Entity*);
308
316
  Entity* (*make)(Entity*);
309
317
  voxgig_value* (*data)(Entity*, voxgig_value* args); // args NULL => none
310
318
  voxgig_value* (*matchv)(Entity*, voxgig_value* args); // args NULL => none
311
- // CRUD ops (ProjectNameEntity). On error set *err.
312
- voxgig_value* (*load)(Entity*, voxgig_value* reqmatch, voxgig_value* ctrl, PNError** err);
313
- voxgig_value* (*list)(Entity*, voxgig_value* reqmatch, voxgig_value* ctrl, PNError** err);
314
- voxgig_value* (*create)(Entity*, voxgig_value* reqdata, voxgig_value* ctrl, PNError** err);
315
- voxgig_value* (*update)(Entity*, voxgig_value* reqdata, voxgig_value* ctrl, PNError** err);
316
- voxgig_value* (*remove)(Entity*, voxgig_value* reqmatch, voxgig_value* ctrl, PNError** err);
319
+
320
+ // `remove` resolves to the entity, marked. The instance KEEPS the data it
321
+ // held - a caller can still read what was deleted - but it is no longer a
322
+ // live record.
323
+ void (*mark_deleted)(Entity*);
324
+ bool (*deleted)(Entity*);
325
+
326
+ // CRUD ops (ProjectNameEntity). On error set *err and return NULL.
327
+ Entity* (*load)(Entity*, voxgig_value* reqmatch, voxgig_value* ctrl, PNError** err);
328
+ // Returns a NULL-terminated Entity* array (never NULL on success).
329
+ Entity** (*list)(Entity*, voxgig_value* reqmatch, voxgig_value* ctrl, PNError** err);
330
+ Entity* (*create)(Entity*, voxgig_value* reqdata, voxgig_value* ctrl, PNError** err);
331
+ Entity* (*update)(Entity*, voxgig_value* reqdata, voxgig_value* ctrl, PNError** err);
332
+ Entity* (*remove)(Entity*, voxgig_value* reqmatch, voxgig_value* ctrl, PNError** err);
317
333
  } EntityVT;
318
334
 
319
335
  struct Entity {
@@ -15,6 +15,7 @@
15
15
  #include "ctest.h" // -> api.h -> sdk.h, plus voxgig_struct.h
16
16
 
17
17
  #include <ctype.h>
18
+ #include <stdio.h> // snprintf
18
19
  #include <stdlib.h>
19
20
  #include <string.h>
20
21
 
@@ -241,7 +241,10 @@ static void test_primary_make_fetch_def_basic(void) {
241
241
  static void test_primary_make_fetch_def_with_body(void) {
242
242
  base_client();
243
243
  Context* ctx = full_ctx();
244
- ctx->spec = spec_new(cmap(9, "base", v_str("http://localhost:8080"), "prefix", v_str(""),
244
+ // 8 pairs, not 9 - cmap is variadic and reads exactly npairs, so an
245
+ // overcount walks off the argument list and the trailing entry (method) is
246
+ // whatever the read finds.
247
+ ctx->spec = spec_new(cmap(8, "base", v_str("http://localhost:8080"), "prefix", v_str(""),
245
248
  "path", v_str("items"), "suffix", v_str(""), "params", v_map(),
246
249
  "query", v_map(), "headers", v_map(), "method", v_str("POST")));
247
250
  ctx->spec->body = cmap(1, "name", v_str("test"));
@@ -2,6 +2,7 @@
2
2
 
3
3
  #include "sdk.h"
4
4
 
5
+ #include <stdio.h> // snprintf
5
6
  #include <stdlib.h>
6
7
  #include <string.h>
7
8
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  #include "sdk.h"
4
4
 
5
+ #include <stdio.h> // snprintf
5
6
  #include <string.h>
6
7
 
7
8
  voxgig_value* param_util(Context* ctx, voxgig_value* paramdef) {
@@ -1 +1 @@
1
- 0.0.1
1
+ PROJECTVERSION
@@ -1 +1 @@
1
- 0.0.1
1
+ PROJECTVERSION
@@ -347,6 +347,12 @@ public:
347
347
  virtual EntityPtr make() = 0;
348
348
  virtual Value data(const Value& arg = Value::undef()) = 0;
349
349
  virtual Value match(const Value& arg = Value::undef()) = 0;
350
+
351
+ // `remove` resolves to the entity, marked. The instance KEEPS the data it
352
+ // held - a caller can still read what was deleted - but it is no longer a
353
+ // live record.
354
+ virtual void markDeleted() = 0;
355
+ virtual bool deleted() = 0;
350
356
  };
351
357
 
352
358
  // ---- Feature contract -------------------------------------------------
@@ -575,22 +581,33 @@ public:
575
581
 
576
582
  // ---- SdkEntity contract -----------------------------------------------
577
583
 
584
+ class SdkEntity;
585
+ using SdkEntityPtr = std::shared_ptr<SdkEntity>;
586
+
587
+ // Every operation resolves to the ENTITY, not the raw data - `list` to a
588
+ // vector of them, one per record. The record is reached through `data()`.
589
+ // See AGENTS.md "Entity operations return ENTITIES".
590
+ //
591
+ // `Value` cannot carry an entity: it is a closed data union, and adding a
592
+ // variant to a general-purpose struct library to hold SDK objects would be
593
+ // wrong. So the CONTRACT lives in these signatures instead.
578
594
  class SdkEntity : public Entity {
579
595
  public:
580
- virtual Value load(const Value& reqmatch, const Value& ctrl) = 0;
581
- virtual Value list(const Value& reqmatch, const Value& ctrl) = 0;
582
- virtual Value create(const Value& reqdata, const Value& ctrl) = 0;
583
- virtual Value update(const Value& reqdata, const Value& ctrl) = 0;
584
- virtual Value remove(const Value& reqmatch, const Value& ctrl) = 0;
596
+ virtual SdkEntityPtr load(const Value& reqmatch, const Value& ctrl) = 0;
597
+ virtual std::vector<SdkEntityPtr> list(const Value& reqmatch, const Value& ctrl) = 0;
598
+ virtual SdkEntityPtr create(const Value& reqdata, const Value& ctrl) = 0;
599
+ virtual SdkEntityPtr update(const Value& reqdata, const Value& ctrl) = 0;
600
+ virtual SdkEntityPtr remove(const Value& reqmatch, const Value& ctrl) = 0;
585
601
  };
586
602
 
587
- using SdkEntityPtr = std::shared_ptr<SdkEntity>;
588
-
589
603
  // ---- EntityBase (shared entity runtime + runOp) -----------------------
590
604
 
591
- class EntityBase : public SdkEntity {
605
+ class EntityBase : public SdkEntity,
606
+ public std::enable_shared_from_this<EntityBase> {
592
607
  public:
593
608
  std::string name_ = "";
609
+ // Set once a successful `remove` resolves on this instance.
610
+ bool deleted_ = false;
594
611
  SdkClient* client = nullptr;
595
612
  UtilityPtr utility;
596
613
  Value entopts = Value::undef();
@@ -602,6 +619,14 @@ public:
602
619
 
603
620
  std::string getName() override { return name_; }
604
621
 
622
+ void markDeleted() override { deleted_ = true; }
623
+ bool deleted() override { return deleted_; }
624
+
625
+ // The handle for this instance, as the ops return it.
626
+ SdkEntityPtr self() {
627
+ return std::static_pointer_cast<SdkEntity>(shared_from_this());
628
+ }
629
+
605
630
  Value data(const Value& arg = Value::undef()) override;
606
631
  Value match(const Value& arg = Value::undef()) override;
607
632
 
@@ -43,6 +43,11 @@ struct PlEntity : public Entity {
43
43
  return Value::undef();
44
44
  }
45
45
  Value match(const Value& arg = Value::undef()) override { return Value::undef(); }
46
+
47
+ // Every operation resolves to the entity; `remove` marks it. The fake has
48
+ // to satisfy the same interface the real entities do.
49
+ void markDeleted() override {}
50
+ bool deleted() override { return false; }
46
51
  };
47
52
 
48
53
  static std::string errCodeOf(const std::function<void()>& fn) {
@@ -74,8 +74,8 @@ inline std::string getenv_local(const std::string& key) {
74
74
  }
75
75
 
76
76
  inline Value env_override(Value m) {
77
- std::string live = getenv_local("PROJECTNAME_TEST_LIVE");
78
- std::string over = getenv_local("PROJECTNAME_TEST_OVERRIDE");
77
+ std::string live = getenv_local("PROJECTENV_TEST_LIVE");
78
+ std::string over = getenv_local("PROJECTENV_TEST_OVERRIDE");
79
79
  if (live == "TRUE" || over == "TRUE") {
80
80
  if (m.is_map()) {
81
81
  for (const auto& k : Struct::keysof(m)) {
@@ -92,8 +92,8 @@ inline Value env_override(Value m) {
92
92
  }
93
93
  }
94
94
  }
95
- std::string explain = getenv_local("PROJECTNAME_TEST_EXPLAIN");
96
- if (!explain.empty()) map_put(m, "PROJECTNAME_TEST_EXPLAIN", Value(explain));
95
+ std::string explain = getenv_local("PROJECTENV_TEST_EXPLAIN");
96
+ if (!explain.empty()) map_put(m, "PROJECTENV_TEST_EXPLAIN", Value(explain));
97
97
  return m;
98
98
  }
99
99
 
@@ -1 +1 @@
1
- 0.0.1
1
+ PROJECTVERSION
@@ -11,6 +11,12 @@ public interface IEntity
11
11
  IEntity Make();
12
12
  object? Data(object? data = null);
13
13
  object? Match(object? match = null);
14
+
15
+ // Every operation resolves to the entity; Remove additionally marks it.
16
+ // The instance keeps the data it held - a caller can still read what was
17
+ // deleted - but it is no longer a live record.
18
+ void MarkDeleted();
19
+ bool Deleted();
14
20
  }
15
21
 
16
22
  // Transport function: performs the HTTP (or mock) request. Returns a