@misofm/platform 0.26.2 → 0.28.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 (428) hide show
  1. package/README.md +309 -204
  2. package/dist/Miso.d.ts +403 -0
  3. package/dist/Miso.d.ts.map +1 -0
  4. package/dist/Miso.js +455 -0
  5. package/dist/Miso.js.map +1 -0
  6. package/dist/auth.d.ts +11 -1
  7. package/dist/auth.d.ts.map +1 -1
  8. package/dist/auth.js +16 -3
  9. package/dist/auth.js.map +1 -1
  10. package/dist/catalog.d.ts +8 -5
  11. package/dist/catalog.d.ts.map +1 -1
  12. package/dist/catalog.js +36 -19
  13. package/dist/catalog.js.map +1 -1
  14. package/dist/client.d.ts +52 -443
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +58 -775
  17. package/dist/client.js.map +1 -1
  18. package/dist/contracts/composition_credits/composition_credits.d.ts +38 -48
  19. package/dist/contracts/composition_credits/composition_credits.d.ts.map +1 -1
  20. package/dist/contracts/composition_credits/composition_credits.js +20 -4
  21. package/dist/contracts/composition_credits/composition_credits.js.map +1 -1
  22. package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts +64 -1
  23. package/dist/contracts/composition_routed_stake/composition_routed_stake.d.ts.map +1 -1
  24. package/dist/contracts/composition_routed_stake/composition_routed_stake.js +66 -1
  25. package/dist/contracts/composition_routed_stake/composition_routed_stake.js.map +1 -1
  26. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts +52 -4
  27. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.d.ts.map +1 -1
  28. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js +52 -4
  29. package/dist/contracts/composition_royalty_pool/composition_royalty_pool.js.map +1 -1
  30. package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.d.ts +63 -1
  31. package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.d.ts.map +1 -1
  32. package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.js +63 -1
  33. package/dist/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.js.map +1 -1
  34. package/dist/contracts/genre/genre.d.ts +10 -1
  35. package/dist/contracts/genre/genre.d.ts.map +1 -1
  36. package/dist/contracts/genre/genre.js +8 -1
  37. package/dist/contracts/genre/genre.js.map +1 -1
  38. package/dist/contracts/miso_pay/deps/std/type_name.d.ts.map +1 -0
  39. package/dist/contracts/miso_pay/deps/std/type_name.js.map +1 -0
  40. package/dist/contracts/miso_pay/pay.d.ts +209 -0
  41. package/dist/contracts/miso_pay/pay.d.ts.map +1 -0
  42. package/dist/contracts/miso_pay/pay.js +195 -0
  43. package/dist/contracts/miso_pay/pay.js.map +1 -0
  44. package/dist/contracts/party_cta/party_cta.d.ts +49 -3
  45. package/dist/contracts/party_cta/party_cta.d.ts.map +1 -1
  46. package/dist/contracts/party_cta/party_cta.js +27 -5
  47. package/dist/contracts/party_cta/party_cta.js.map +1 -1
  48. package/dist/contracts/party_genre/party_genre.d.ts +25 -0
  49. package/dist/contracts/party_genre/party_genre.d.ts.map +1 -1
  50. package/dist/contracts/party_genre/party_genre.js +14 -3
  51. package/dist/contracts/party_genre/party_genre.js.map +1 -1
  52. package/dist/contracts/party_media/party_media.d.ts +19 -3
  53. package/dist/contracts/party_media/party_media.d.ts.map +1 -1
  54. package/dist/contracts/party_media/party_media.js +20 -4
  55. package/dist/contracts/party_media/party_media.js.map +1 -1
  56. package/dist/contracts/party_platform_link/party_platform_link.d.ts +15 -7
  57. package/dist/contracts/party_platform_link/party_platform_link.d.ts.map +1 -1
  58. package/dist/contracts/party_platform_link/party_platform_link.js +15 -7
  59. package/dist/contracts/party_platform_link/party_platform_link.js.map +1 -1
  60. package/dist/contracts/party_profile/party_profile.d.ts +63 -8
  61. package/dist/contracts/party_profile/party_profile.d.ts.map +1 -1
  62. package/dist/contracts/party_profile/party_profile.js +33 -8
  63. package/dist/contracts/party_profile/party_profile.js.map +1 -1
  64. package/dist/contracts/party_roles/party_roles.d.ts +28 -3
  65. package/dist/contracts/party_roles/party_roles.d.ts.map +1 -1
  66. package/dist/contracts/party_roles/party_roles.js +19 -4
  67. package/dist/contracts/party_roles/party_roles.js.map +1 -1
  68. package/dist/contracts/party_tags/party_tags.d.ts +23 -3
  69. package/dist/contracts/party_tags/party_tags.d.ts.map +1 -1
  70. package/dist/contracts/party_tags/party_tags.js +16 -4
  71. package/dist/contracts/party_tags/party_tags.js.map +1 -1
  72. package/dist/contracts/party_wallet/party_wallet.d.ts +4 -1
  73. package/dist/contracts/party_wallet/party_wallet.d.ts.map +1 -1
  74. package/dist/contracts/party_wallet/party_wallet.js +2 -1
  75. package/dist/contracts/party_wallet/party_wallet.js.map +1 -1
  76. package/dist/contracts/platform_link/platform_link.d.ts +207 -0
  77. package/dist/contracts/platform_link/platform_link.d.ts.map +1 -0
  78. package/dist/contracts/platform_link/platform_link.js +209 -0
  79. package/dist/contracts/platform_link/platform_link.js.map +1 -0
  80. package/dist/contracts/record/pressing.d.ts +53 -7
  81. package/dist/contracts/record/pressing.d.ts.map +1 -1
  82. package/dist/contracts/record/pressing.js +50 -4
  83. package/dist/contracts/record/pressing.js.map +1 -1
  84. package/dist/contracts/record/record.d.ts +14 -0
  85. package/dist/contracts/record/record.d.ts.map +1 -1
  86. package/dist/contracts/record/record.js +15 -1
  87. package/dist/contracts/record/record.js.map +1 -1
  88. package/dist/contracts/record_shop/listing.d.ts +80 -35
  89. package/dist/contracts/record_shop/listing.d.ts.map +1 -1
  90. package/dist/contracts/record_shop/listing.js +76 -13
  91. package/dist/contracts/record_shop/listing.js.map +1 -1
  92. package/dist/contracts/recording_advisory/recording_advisory.d.ts +15 -15
  93. package/dist/contracts/recording_advisory/recording_advisory.d.ts.map +1 -1
  94. package/dist/contracts/recording_advisory/recording_advisory.js +15 -8
  95. package/dist/contracts/recording_advisory/recording_advisory.js.map +1 -1
  96. package/dist/contracts/recording_credits/recording_credits.d.ts +95 -1350
  97. package/dist/contracts/recording_credits/recording_credits.d.ts.map +1 -1
  98. package/dist/contracts/recording_credits/recording_credits.js +63 -12
  99. package/dist/contracts/recording_credits/recording_credits.js.map +1 -1
  100. package/dist/contracts/recording_engine_session/recording_engine_session.d.ts +30 -49
  101. package/dist/contracts/recording_engine_session/recording_engine_session.d.ts.map +1 -1
  102. package/dist/contracts/recording_engine_session/recording_engine_session.js +19 -4
  103. package/dist/contracts/recording_engine_session/recording_engine_session.js.map +1 -1
  104. package/dist/contracts/recording_genre/recording_genre.d.ts +67 -9
  105. package/dist/contracts/recording_genre/recording_genre.d.ts.map +1 -1
  106. package/dist/contracts/recording_genre/recording_genre.js +53 -9
  107. package/dist/contracts/recording_genre/recording_genre.js.map +1 -1
  108. package/dist/contracts/recording_language/recording_language.d.ts +29 -5
  109. package/dist/contracts/recording_language/recording_language.d.ts.map +1 -1
  110. package/dist/contracts/recording_language/recording_language.js +18 -5
  111. package/dist/contracts/recording_language/recording_language.js.map +1 -1
  112. package/dist/contracts/recording_master_reference/recording_master_reference.d.ts +25 -15
  113. package/dist/contracts/recording_master_reference/recording_master_reference.d.ts.map +1 -1
  114. package/dist/contracts/recording_master_reference/recording_master_reference.js +18 -5
  115. package/dist/contracts/recording_master_reference/recording_master_reference.js.map +1 -1
  116. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts +55 -4
  117. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.d.ts.map +1 -1
  118. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js +55 -4
  119. package/dist/contracts/recording_royalty_pool/recording_royalty_pool.js.map +1 -1
  120. package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.d.ts +66 -1
  121. package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.d.ts.map +1 -1
  122. package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.js +66 -1
  123. package/dist/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.js.map +1 -1
  124. package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.d.ts +12 -9
  125. package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.d.ts.map +1 -1
  126. package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.js +11 -4
  127. package/dist/contracts/recording_streaming_transcode/recording_streaming_transcode.js.map +1 -1
  128. package/dist/contracts/release_cover_art/release_cover_art.d.ts +168 -74
  129. package/dist/contracts/release_cover_art/release_cover_art.d.ts.map +1 -1
  130. package/dist/contracts/release_cover_art/release_cover_art.js +126 -10
  131. package/dist/contracts/release_cover_art/release_cover_art.js.map +1 -1
  132. package/dist/contracts/release_credits/release_credits.d.ts +24 -28
  133. package/dist/contracts/release_credits/release_credits.d.ts.map +1 -1
  134. package/dist/contracts/release_credits/release_credits.js +18 -4
  135. package/dist/contracts/release_credits/release_credits.js.map +1 -1
  136. package/dist/contracts/release_description/release_description.d.ts +16 -5
  137. package/dist/contracts/release_description/release_description.d.ts.map +1 -1
  138. package/dist/contracts/release_description/release_description.js +9 -4
  139. package/dist/contracts/release_description/release_description.js.map +1 -1
  140. package/dist/contracts/release_dsp_link/release_dsp_link.d.ts +130 -160
  141. package/dist/contracts/release_dsp_link/release_dsp_link.d.ts.map +1 -1
  142. package/dist/contracts/release_dsp_link/release_dsp_link.js +74 -19
  143. package/dist/contracts/release_dsp_link/release_dsp_link.js.map +1 -1
  144. package/dist/contracts/release_genre/release_genre.d.ts +66 -11
  145. package/dist/contracts/release_genre/release_genre.d.ts.map +1 -1
  146. package/dist/contracts/release_genre/release_genre.js +52 -11
  147. package/dist/contracts/release_genre/release_genre.js.map +1 -1
  148. package/dist/contracts/release_kind/release_kind.d.ts +28 -5
  149. package/dist/contracts/release_kind/release_kind.d.ts.map +1 -1
  150. package/dist/contracts/release_kind/release_kind.js +19 -4
  151. package/dist/contracts/release_kind/release_kind.js.map +1 -1
  152. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts +17 -0
  153. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.d.ts.map +1 -1
  154. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js +15 -0
  155. package/dist/contracts/release_revenue_distributor/release_revenue_distributor.js.map +1 -1
  156. package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.d.ts +37 -1
  157. package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.d.ts.map +1 -1
  158. package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.js +37 -1
  159. package/dist/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.js.map +1 -1
  160. package/dist/contracts/routed_stake/routed_stake.d.ts +78 -6
  161. package/dist/contracts/routed_stake/routed_stake.d.ts.map +1 -1
  162. package/dist/contracts/routed_stake/routed_stake.js +79 -7
  163. package/dist/contracts/routed_stake/routed_stake.js.map +1 -1
  164. package/dist/contracts/royalty_pool/pool.d.ts +117 -27
  165. package/dist/contracts/royalty_pool/pool.d.ts.map +1 -1
  166. package/dist/contracts/royalty_pool/pool.js +117 -28
  167. package/dist/contracts/royalty_pool/pool.js.map +1 -1
  168. package/dist/contracts/royalty_pool/stake.d.ts +3 -0
  169. package/dist/contracts/royalty_pool/stake.d.ts.map +1 -1
  170. package/dist/contracts/royalty_pool/stake.js +5 -2
  171. package/dist/contracts/royalty_pool/stake.js.map +1 -1
  172. package/dist/contracts/share/share.d.ts +80 -0
  173. package/dist/contracts/share/share.d.ts.map +1 -0
  174. package/dist/contracts/share/share.js +72 -0
  175. package/dist/contracts/share/share.js.map +1 -0
  176. package/dist/contracts/vault/vault.d.ts +51 -0
  177. package/dist/contracts/vault/vault.d.ts.map +1 -1
  178. package/dist/contracts/vault/vault.js +55 -4
  179. package/dist/contracts/vault/vault.js.map +1 -1
  180. package/dist/contracts.d.ts +60 -0
  181. package/dist/contracts.d.ts.map +1 -1
  182. package/dist/contracts.js +17 -0
  183. package/dist/contracts.js.map +1 -1
  184. package/dist/cover.d.ts +5 -6
  185. package/dist/cover.d.ts.map +1 -1
  186. package/dist/cover.js +10 -10
  187. package/dist/cover.js.map +1 -1
  188. package/dist/credits.d.ts +12 -13
  189. package/dist/credits.d.ts.map +1 -1
  190. package/dist/credits.js +16 -10
  191. package/dist/credits.js.map +1 -1
  192. package/dist/deployments.d.ts +3 -3
  193. package/dist/deployments.d.ts.map +1 -1
  194. package/dist/deployments.js +2 -3
  195. package/dist/deployments.js.map +1 -1
  196. package/dist/errors.d.ts +32 -9
  197. package/dist/errors.d.ts.map +1 -1
  198. package/dist/errors.js +52 -16
  199. package/dist/errors.js.map +1 -1
  200. package/dist/events.d.ts +1687 -835
  201. package/dist/events.d.ts.map +1 -1
  202. package/dist/events.js +258 -39
  203. package/dist/events.js.map +1 -1
  204. package/dist/genre.d.ts +11 -12
  205. package/dist/genre.d.ts.map +1 -1
  206. package/dist/genre.js +5 -3
  207. package/dist/genre.js.map +1 -1
  208. package/dist/index.d.ts +3 -3
  209. package/dist/index.d.ts.map +1 -1
  210. package/dist/index.js +7 -2
  211. package/dist/index.js.map +1 -1
  212. package/dist/packages.d.ts +1047 -1695
  213. package/dist/packages.d.ts.map +1 -1
  214. package/dist/party/client.d.ts +113 -296
  215. package/dist/party/client.d.ts.map +1 -1
  216. package/dist/party/client.js +93 -178
  217. package/dist/party/client.js.map +1 -1
  218. package/dist/party/extensions/ctas.d.ts +3 -3
  219. package/dist/party/extensions/ctas.d.ts.map +1 -1
  220. package/dist/party/extensions/genres.d.ts +4 -4
  221. package/dist/party/extensions/genres.d.ts.map +1 -1
  222. package/dist/party/extensions/links.d.ts +5 -5
  223. package/dist/party/extensions/links.d.ts.map +1 -1
  224. package/dist/party/extensions/links.js.map +1 -1
  225. package/dist/party/extensions/media.d.ts +3 -3
  226. package/dist/party/extensions/media.d.ts.map +1 -1
  227. package/dist/party/extensions/profile.d.ts +3 -3
  228. package/dist/party/extensions/profile.d.ts.map +1 -1
  229. package/dist/party/extensions/roles.d.ts +4 -4
  230. package/dist/party/extensions/roles.d.ts.map +1 -1
  231. package/dist/party/extensions/roles.js.map +1 -1
  232. package/dist/party/extensions/tags.d.ts +4 -4
  233. package/dist/party/extensions/tags.d.ts.map +1 -1
  234. package/dist/party/index.d.ts +1 -1
  235. package/dist/party/index.d.ts.map +1 -1
  236. package/dist/party/index.js.map +1 -1
  237. package/dist/party/queries.d.ts +8 -8
  238. package/dist/party/queries.d.ts.map +1 -1
  239. package/dist/party/queries.js +83 -56
  240. package/dist/party/queries.js.map +1 -1
  241. package/dist/pressing.d.ts +13 -15
  242. package/dist/pressing.d.ts.map +1 -1
  243. package/dist/pressing.js +99 -29
  244. package/dist/pressing.js.map +1 -1
  245. package/dist/publication.d.ts +13 -6
  246. package/dist/publication.d.ts.map +1 -1
  247. package/dist/publication.js +26 -21
  248. package/dist/publication.js.map +1 -1
  249. package/dist/queries.js +3 -3
  250. package/dist/queries.js.map +1 -1
  251. package/dist/read/artist.d.ts +4 -3
  252. package/dist/read/artist.d.ts.map +1 -1
  253. package/dist/read/artist.js +24 -8
  254. package/dist/read/artist.js.map +1 -1
  255. package/dist/read/catalog.d.ts +17 -16
  256. package/dist/read/catalog.d.ts.map +1 -1
  257. package/dist/read/catalog.js +25 -11
  258. package/dist/read/catalog.js.map +1 -1
  259. package/dist/read/client.d.ts +41 -20
  260. package/dist/read/client.d.ts.map +1 -1
  261. package/dist/read/client.js +20 -12
  262. package/dist/read/client.js.map +1 -1
  263. package/dist/read/config.d.ts +27 -3
  264. package/dist/read/config.d.ts.map +1 -1
  265. package/dist/read/config.js +42 -24
  266. package/dist/read/config.js.map +1 -1
  267. package/dist/read/genres.d.ts +8 -3
  268. package/dist/read/genres.d.ts.map +1 -1
  269. package/dist/read/genres.js +23 -17
  270. package/dist/read/genres.js.map +1 -1
  271. package/dist/read/index.d.ts +3 -1
  272. package/dist/read/index.d.ts.map +1 -1
  273. package/dist/read/index.js +9 -6
  274. package/dist/read/index.js.map +1 -1
  275. package/dist/read/receipts.d.ts +5 -4
  276. package/dist/read/receipts.d.ts.map +1 -1
  277. package/dist/read/receipts.js +94 -46
  278. package/dist/read/receipts.js.map +1 -1
  279. package/dist/read/royalties.d.ts +25 -0
  280. package/dist/read/royalties.d.ts.map +1 -0
  281. package/dist/read/royalties.js +168 -0
  282. package/dist/read/royalties.js.map +1 -0
  283. package/dist/read/types.d.ts +27 -0
  284. package/dist/read/types.d.ts.map +1 -1
  285. package/dist/read/wallet.d.ts +23 -12
  286. package/dist/read/wallet.d.ts.map +1 -1
  287. package/dist/read/wallet.js +158 -177
  288. package/dist/read/wallet.js.map +1 -1
  289. package/dist/read/works.d.ts +6 -6
  290. package/dist/read/works.d.ts.map +1 -1
  291. package/dist/read/works.js +40 -26
  292. package/dist/read/works.js.map +1 -1
  293. package/dist/recording-extensions.d.ts +15 -16
  294. package/dist/recording-extensions.d.ts.map +1 -1
  295. package/dist/recording-extensions.js +12 -8
  296. package/dist/recording-extensions.js.map +1 -1
  297. package/dist/release-extensions.d.ts +5 -6
  298. package/dist/release-extensions.d.ts.map +1 -1
  299. package/dist/release-extensions.js +3 -2
  300. package/dist/release-extensions.js.map +1 -1
  301. package/dist/release-graph.d.ts +2 -2
  302. package/dist/release-graph.d.ts.map +1 -1
  303. package/dist/release-graph.js.map +1 -1
  304. package/dist/royalty.d.ts +4 -4
  305. package/dist/royalty.d.ts.map +1 -1
  306. package/dist/royalty.js +16 -7
  307. package/dist/royalty.js.map +1 -1
  308. package/dist/share.d.ts +58 -24
  309. package/dist/share.d.ts.map +1 -1
  310. package/dist/share.js +167 -92
  311. package/dist/share.js.map +1 -1
  312. package/dist/transactions.d.ts +15 -6
  313. package/dist/transactions.d.ts.map +1 -1
  314. package/dist/transactions.js +1 -0
  315. package/dist/transactions.js.map +1 -1
  316. package/dist/vault.d.ts +13 -3
  317. package/dist/vault.d.ts.map +1 -1
  318. package/dist/vault.js +22 -16
  319. package/dist/vault.js.map +1 -1
  320. package/package.json +9 -8
  321. package/src/Miso.ts +951 -0
  322. package/src/auth.ts +16 -3
  323. package/src/catalog.ts +58 -25
  324. package/src/client.ts +98 -1359
  325. package/src/contracts/composition_credits/composition_credits.ts +20 -4
  326. package/src/contracts/composition_routed_stake/composition_routed_stake.ts +67 -1
  327. package/src/contracts/composition_royalty_pool/composition_royalty_pool.ts +53 -4
  328. package/src/contracts/composition_royalty_pool_plugin/composition_royalty_pool_plugin.ts +64 -1
  329. package/src/contracts/genre/genre.ts +8 -1
  330. package/src/contracts/miso_pay/pay.ts +356 -0
  331. package/src/contracts/party_cta/party_cta.ts +27 -5
  332. package/src/contracts/party_genre/party_genre.ts +14 -3
  333. package/src/contracts/party_media/party_media.ts +20 -4
  334. package/src/contracts/party_platform_link/party_platform_link.ts +15 -7
  335. package/src/contracts/party_profile/party_profile.ts +33 -8
  336. package/src/contracts/party_roles/party_roles.ts +19 -4
  337. package/src/contracts/party_tags/party_tags.ts +16 -4
  338. package/src/contracts/party_wallet/party_wallet.ts +2 -1
  339. package/src/contracts/platform_link/platform_link.ts +322 -0
  340. package/src/contracts/record/pressing.ts +50 -4
  341. package/src/contracts/record/record.ts +15 -1
  342. package/src/contracts/record_shop/listing.ts +76 -13
  343. package/src/contracts/recording_advisory/recording_advisory.ts +15 -8
  344. package/src/contracts/recording_credits/recording_credits.ts +63 -12
  345. package/src/contracts/recording_engine_session/recording_engine_session.ts +19 -4
  346. package/src/contracts/recording_genre/recording_genre.ts +53 -9
  347. package/src/contracts/recording_language/recording_language.ts +18 -5
  348. package/src/contracts/recording_master_reference/recording_master_reference.ts +18 -5
  349. package/src/contracts/recording_royalty_pool/recording_royalty_pool.ts +56 -4
  350. package/src/contracts/recording_royalty_pool_plugin/recording_royalty_pool_plugin.ts +67 -1
  351. package/src/contracts/recording_streaming_transcode/recording_streaming_transcode.ts +11 -4
  352. package/src/contracts/release_cover_art/release_cover_art.ts +126 -10
  353. package/src/contracts/release_credits/release_credits.ts +18 -4
  354. package/src/contracts/release_description/release_description.ts +9 -4
  355. package/src/contracts/release_dsp_link/release_dsp_link.ts +74 -19
  356. package/src/contracts/release_genre/release_genre.ts +52 -11
  357. package/src/contracts/release_kind/release_kind.ts +19 -4
  358. package/src/contracts/release_revenue_distributor/release_revenue_distributor.ts +15 -0
  359. package/src/contracts/release_revenue_distributor_plugin/release_revenue_distributor_plugin.ts +38 -1
  360. package/src/contracts/routed_stake/routed_stake.ts +79 -7
  361. package/src/contracts/royalty_pool/pool.ts +140 -38
  362. package/src/contracts/royalty_pool/stake.ts +5 -2
  363. package/src/contracts/share/share.ts +97 -0
  364. package/src/contracts/vault/vault.ts +55 -4
  365. package/src/contracts.ts +18 -0
  366. package/src/cover.ts +14 -15
  367. package/src/credits.ts +27 -22
  368. package/src/deployments.ts +3 -4
  369. package/src/errors.ts +77 -34
  370. package/src/events.ts +260 -39
  371. package/src/genre.ts +15 -14
  372. package/src/index.ts +19 -10
  373. package/src/party/client.ts +217 -208
  374. package/src/party/extensions/ctas.ts +3 -3
  375. package/src/party/extensions/genres.ts +4 -4
  376. package/src/party/extensions/links.ts +7 -7
  377. package/src/party/extensions/media.ts +3 -3
  378. package/src/party/extensions/profile.ts +3 -3
  379. package/src/party/extensions/roles.ts +5 -5
  380. package/src/party/extensions/tags.ts +4 -4
  381. package/src/party/index.ts +0 -1
  382. package/src/party/queries.ts +90 -87
  383. package/src/pressing.ts +132 -89
  384. package/src/publication.ts +33 -32
  385. package/src/queries.ts +3 -3
  386. package/src/read/artist.ts +36 -17
  387. package/src/read/catalog.ts +68 -36
  388. package/src/read/client.ts +55 -30
  389. package/src/read/config.ts +57 -29
  390. package/src/read/genres.ts +22 -18
  391. package/src/read/index.ts +15 -6
  392. package/src/read/receipts.ts +130 -67
  393. package/src/read/royalties.ts +212 -0
  394. package/src/read/types.ts +30 -0
  395. package/src/read/wallet.ts +226 -216
  396. package/src/read/works.ts +51 -44
  397. package/src/recording-extensions.ts +27 -24
  398. package/src/release-extensions.ts +7 -7
  399. package/src/release-graph.ts +2 -1
  400. package/src/royalty.ts +19 -25
  401. package/src/share.ts +197 -128
  402. package/src/transactions.ts +15 -8
  403. package/src/vault.ts +24 -31
  404. package/dist/contracts/record_shop/deps/std/type_name.d.ts.map +0 -1
  405. package/dist/contracts/record_shop/deps/std/type_name.js.map +0 -1
  406. package/dist/contracts/recording_language/deps/language_code/language_code.d.ts +0 -6
  407. package/dist/contracts/recording_language/deps/language_code/language_code.d.ts.map +0 -1
  408. package/dist/contracts/recording_language/deps/language_code/language_code.js +0 -8
  409. package/dist/contracts/recording_language/deps/language_code/language_code.js.map +0 -1
  410. package/dist/contracts/recording_master_reference/deps/ori/confidentiality.d.ts +0 -24
  411. package/dist/contracts/recording_master_reference/deps/ori/confidentiality.d.ts.map +0 -1
  412. package/dist/contracts/recording_master_reference/deps/ori/confidentiality.js +0 -24
  413. package/dist/contracts/recording_master_reference/deps/ori/confidentiality.js.map +0 -1
  414. package/dist/contracts/recording_master_reference/deps/ori/data.d.ts +0 -16
  415. package/dist/contracts/recording_master_reference/deps/ori/data.d.ts.map +0 -1
  416. package/dist/contracts/recording_master_reference/deps/ori/data.js +0 -12
  417. package/dist/contracts/recording_master_reference/deps/ori/data.js.map +0 -1
  418. package/dist/execute.d.ts +0 -32
  419. package/dist/execute.d.ts.map +0 -1
  420. package/dist/execute.js +0 -36
  421. package/dist/execute.js.map +0 -1
  422. package/src/contracts/recording_language/deps/language_code/language_code.ts +0 -8
  423. package/src/contracts/recording_master_reference/deps/ori/confidentiality.ts +0 -24
  424. package/src/contracts/recording_master_reference/deps/ori/data.ts +0 -12
  425. package/src/execute.ts +0 -56
  426. /package/dist/contracts/{record_shop → miso_pay}/deps/std/type_name.d.ts +0 -0
  427. /package/dist/contracts/{record_shop → miso_pay}/deps/std/type_name.js +0 -0
  428. /package/src/contracts/{record_shop → miso_pay}/deps/std/type_name.ts +0 -0
@@ -11,26 +11,34 @@
11
11
  // than be reimplemented by every browser, Worker, server, or native client.
12
12
 
13
13
  import { normalizeStructTag, normalizeSuiAddress, parseStructTag } from "@mysten/sui/utils";
14
- import { Effect, Option } from "effect";
14
+ import { Effect, Option, Result, Stream } from "effect";
15
15
  import {
16
16
  contracts as networkContracts,
17
17
  getCompositionByShareType,
18
- getOwnedReleaseAdminCaps,
19
18
  getRecordingByShareType,
20
- getReleaseById,
19
+ Musicos,
20
+ type MusicosDeploymentInvalid,
21
+ type MusicosService,
22
+ type MusicosWorkNotFound,
21
23
  } from "@misofm/musicos";
22
24
  import { party as partyContracts } from "@misofm/partyos/contracts";
23
- import { derivePartyAdminCapId, getPartiesByIds, getPendingMemberships as getPartyPendingMemberships } from "@misofm/partyos";
25
+ import { derivePartyAdminCapId, Partyos, type PartyosDeploymentError, type PartyosService } from "@misofm/partyos";
24
26
  import {
25
- getObjectsContent,
26
- getOptionalObjectContent,
27
- SuiClient,
27
+ CoinType,
28
+ DecodeError,
29
+ ObjectId,
30
+ Sui,
31
+ SuiAddress,
28
32
  SuiGraphQL,
29
- SuiRpcError,
30
- type BcsDecodeError,
31
- type ObjectNotFoundError,
32
- type ObjectTypeMismatchError,
33
- } from "@misofm/effect";
33
+ StructTag,
34
+ type BatchItemError,
35
+ type GraphQLUnavailable,
36
+ type ObjectDeleted,
37
+ type ObjectNotFound,
38
+ type ObjectUnavailable,
39
+ type TransportError,
40
+ } from "@unconfirmed/sui-effect";
41
+ import { OperationsUnavailableError } from "../errors.ts";
34
42
  import type { MisoConfig } from "./config.ts";
35
43
  import { int, u64 } from "./internal/scalars.ts";
36
44
  import * as vaultContract from "../contracts/vault/vault.ts";
@@ -53,7 +61,33 @@ import { getRecordingTitles, getWorkAddressesByShareTypes, getWorksByIds } from
53
61
  * set can't spin forever. 50/page × 20 = 1000 objects — far beyond any realistic
54
62
  * library.
55
63
  */
56
- const MAX_PAGES = 20;
64
+ const MAX_OWNED_OBJECTS = 1000;
65
+
66
+ /**
67
+ * Builds `Musicos.layer({ deployment: { packageId } })` / `Partyos.layer({
68
+ * deployment })`, provides it, and hands back the effect it wraps — see
69
+ * `../catalog.ts`'s `withMusicos` for the same idiom (kept file-local; see
70
+ * `docs/CONVERSION-STATUS.md`).
71
+ */
72
+ function withMusicos<A, E>(
73
+ packageId: string,
74
+ effect: (musicos: MusicosService) => Effect.Effect<A, E, Sui>,
75
+ ): Effect.Effect<A, E | MusicosDeploymentInvalid, Sui> {
76
+ return Effect.gen(function* () {
77
+ const musicos = yield* Musicos;
78
+ return yield* effect(musicos);
79
+ }).pipe(Effect.provide(Musicos.layer({ deployment: { packageId } })));
80
+ }
81
+
82
+ function withPartyos<A, E>(
83
+ partyosPackageId: string,
84
+ effect: (partyos: PartyosService) => Effect.Effect<A, E, Sui>,
85
+ ): Effect.Effect<A, E | PartyosDeploymentError, Sui> {
86
+ return Effect.gen(function* () {
87
+ const partyos = yield* Partyos;
88
+ return yield* effect(partyos);
89
+ }).pipe(Effect.provide(Partyos.layer({ deployment: { partyos: partyosPackageId } })));
90
+ }
57
91
 
58
92
  type WorkAdminCapType =
59
93
  | { kind: "composition"; shareType: string }
@@ -167,35 +201,6 @@ function isCanonicalRecordType(
167
201
  return true;
168
202
  }
169
203
 
170
- /** Page shape this file needs from `client.core.listOwnedObjects` — content is optional per-call, not per-object. */
171
- interface OwnedObjectsPage {
172
- objects: Array<{ objectId: string; type: string; content?: Uint8Array }>;
173
- hasNextPage: boolean;
174
- cursor: string | null;
175
- }
176
-
177
- /** One page of `client.core.listOwnedObjects`, requesting `content` when `withContent` is set. */
178
- const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (
179
- owner: string,
180
- type: string,
181
- cursor: string | null,
182
- withContent: boolean,
183
- ): Effect.fn.Return<OwnedObjectsPage, SuiRpcError, SuiClient> {
184
- const client = yield* SuiClient;
185
- return yield* Effect.tryPromise({
186
- try: (signal) =>
187
- (client.core.listOwnedObjects as (args: unknown) => Promise<OwnedObjectsPage>)({
188
- owner,
189
- type,
190
- cursor,
191
- limit: 50,
192
- ...(withContent ? { include: { content: true } } : {}),
193
- signal,
194
- }),
195
- catch: (cause) => new SuiRpcError({ operation: "listOwnedObjects", cause }),
196
- });
197
- });
198
-
199
204
  /**
200
205
  * The records `owner` holds. Ownership is DIRECT — a record is an address-owned
201
206
  * `<record>::record::Record` with no pressing/license/receipt intermediary.
@@ -205,43 +210,38 @@ const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (
205
210
  export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (
206
211
  owner: string,
207
212
  config: MisoConfig,
208
- ): Effect.fn.Return<OwnedRecord[], SuiRpcError, SuiClient> {
209
- const out: OwnedRecord[] = [];
210
- let cursor: string | null = null;
213
+ ): Effect.fn.Return<OwnedRecord[], TransportError, Sui> {
214
+ const sui = yield* Sui;
211
215
  const sales = requireRecordSalesDeployment(config.recordSales);
212
- const recordType = `${sales.recordPackageId}::record::Record`;
213
-
214
- for (let page = 0; page < MAX_PAGES; page++) {
215
- const res = (yield* listOwnedObjectsPage(owner, recordType, cursor, true)) as OwnedObjectsPage;
216
- for (const obj of res.objects) {
217
- if (!isCanonicalRecordType(obj.type, sales.recordPackageId)) {
218
- continue;
219
- }
220
- if (!obj.content) throw new Error(`Record ${obj.objectId} has no BCS content`);
221
- const record = recordContract.Record.parse(obj.content);
222
- if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.objectId)) {
223
- throw new Error(`Record ${obj.objectId} has mismatched embedded UID ${record.id}`);
224
- }
225
- const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
226
- if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.objectId)) {
227
- throw new Error(`Record ${obj.objectId} is not derived from its Pressing and number`);
228
- }
229
- out.push({
230
- id: obj.objectId,
231
- type: obj.type,
232
- releaseId: record.release_id,
233
- pressingId: record.pressing_id,
234
- edition: record.edition,
235
- number: record.number,
236
- purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
237
- purchasePrice: record.purchase_price,
238
- purchasedBy: record.purchased_by,
239
- purchasedTimestampMs: record.purchased_timestamp_ms,
240
- });
216
+ const recordType = StructTag.make(`${sales.recordPackageId}::record::Record`);
217
+ const objects = yield* Stream.runCollect(
218
+ sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: recordType }).pipe(Stream.take(MAX_OWNED_OBJECTS)),
219
+ );
220
+ const out: OwnedRecord[] = [];
221
+ for (const obj of objects) {
222
+ if (!isCanonicalRecordType(obj.type, sales.recordPackageId)) {
223
+ continue;
241
224
  }
242
- if (!res.hasNextPage) break;
243
- cursor = res.cursor;
244
- if (!cursor) break;
225
+ const record = recordContract.Record.parse(obj.content);
226
+ if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.id)) {
227
+ throw new Error(`Record ${obj.id} has mismatched embedded UID ${record.id}`);
228
+ }
229
+ const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
230
+ if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.id)) {
231
+ throw new Error(`Record ${obj.id} is not derived from its Pressing and number`);
232
+ }
233
+ out.push({
234
+ id: obj.id,
235
+ type: obj.type,
236
+ releaseId: record.release_id,
237
+ pressingId: record.pressing_id,
238
+ edition: record.edition,
239
+ number: record.number,
240
+ purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
241
+ purchasePrice: record.purchase_price,
242
+ purchasedBy: record.purchased_by,
243
+ purchasedTimestampMs: record.purchased_timestamp_ms,
244
+ });
245
245
  }
246
246
  return out;
247
247
  });
@@ -257,29 +257,32 @@ export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (
257
257
  export const getOwnedParties = Effect.fn("getOwnedParties")(function* (
258
258
  owner: string,
259
259
  config: MisoConfig,
260
- ): Effect.fn.Return<OwnedParty[], SuiRpcError | ObjectTypeMismatchError | BcsDecodeError, SuiClient> {
261
- const capType = `${config.partyos.partyos}::party::PartyAdminCap`;
260
+ ): Effect.fn.Return<OwnedParty[], TransportError | PartyosDeploymentError, Sui> {
261
+ const sui = yield* Sui;
262
+ const capType = StructTag.make(`${config.partyos.partyos}::party::PartyAdminCap`);
262
263
 
263
264
  // One page of 50 caps is plenty for launch-scale artists; paginate if labels
264
265
  // ever start hitting the cap.
265
- const { objects } = yield* listOwnedObjectsPage(owner, capType, null, true);
266
+ const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(50)));
266
267
 
267
268
  const caps = objects.flatMap((obj) => {
268
269
  try {
269
- const cap = partyContracts.PartyAdminCap.parse(obj.content!);
270
- return [{ capId: obj.objectId, partyId: cap.party_id }];
270
+ const cap = partyContracts.PartyAdminCap.parse(obj.content);
271
+ return [{ capId: obj.id, partyId: cap.party_id }];
271
272
  } catch {
272
273
  return [];
273
274
  }
274
275
  });
275
276
  if (caps.length === 0) return [];
276
277
 
277
- const parties = yield* getPartiesByIds(
278
- caps.map((c) => c.partyId),
279
- config.partyos.partyos,
278
+ const results = yield* withPartyos(config.partyos.partyos, (partyos) =>
279
+ partyos.getPartiesByIds(caps.map((c) => ObjectId.make(c.partyId))),
280
+ );
281
+ const parties = new Map(
282
+ results.flatMap((result, index) => (Result.isSuccess(result) ? [[caps[index]!.partyId, result.success] as const] : [])),
280
283
  );
281
284
  return caps.flatMap(({ capId, partyId }) => {
282
- const p = parties[partyId];
285
+ const p = parties.get(partyId);
283
286
  return p ? [{ partyId, capId, name: p.name, kind: p.kind }] : [];
284
287
  });
285
288
  });
@@ -295,24 +298,28 @@ export const getOwnedParties = Effect.fn("getOwnedParties")(function* (
295
298
  export const getPendingMemberships = Effect.fn("getPendingMemberships")(function* (
296
299
  owner: string,
297
300
  config: MisoConfig,
298
- ): Effect.fn.Return<PendingMembership[], SuiRpcError | ObjectTypeMismatchError | BcsDecodeError, SuiClient> {
301
+ ): Effect.fn.Return<PendingMembership[], DecodeError | TransportError | PartyosDeploymentError, Sui> {
299
302
  const controlled = yield* getOwnedParties(owner, config);
300
303
  const individuals = controlled.filter((party) => party.kind === "individual");
301
304
  if (individuals.length === 0) return [];
302
305
 
303
- const invitations = yield* Effect.forEach(
304
- individuals,
305
- (member) =>
306
- getPartyPendingMemberships(member.partyId).pipe(Effect.map((groupIds) => ({ member, groupIds }))),
307
- { concurrency: "unbounded" },
306
+ const invitations = yield* withPartyos(config.partyos.partyos, (partyos) =>
307
+ Effect.forEach(
308
+ individuals,
309
+ (member) => partyos.getPendingMemberships(ObjectId.make(member.partyId)).pipe(Effect.map((groupIds) => ({ member, groupIds }))),
310
+ { concurrency: "unbounded" },
311
+ ),
308
312
  );
309
313
  const groupIds = [...new Set(invitations.flatMap(({ groupIds }) => groupIds))];
310
314
  if (groupIds.length === 0) return [];
311
315
 
312
- const groups = yield* getPartiesByIds(groupIds, config.partyos.partyos);
313
- return invitations.flatMap(({ member, groupIds }) =>
314
- groupIds.flatMap((groupId): PendingMembership[] => {
315
- const group = groups[groupId];
316
+ const groupResults = yield* withPartyos(config.partyos.partyos, (partyos) => partyos.getPartiesByIds(groupIds));
317
+ const groups = new Map(
318
+ groupResults.flatMap((result, index) => (Result.isSuccess(result) ? [[groupIds[index]!, result.success] as const] : [])),
319
+ );
320
+ return invitations.flatMap(({ member, groupIds: memberGroupIds }) =>
321
+ memberGroupIds.flatMap((groupId): PendingMembership[] => {
322
+ const group = groups.get(groupId);
316
323
  return group?.kind === "group"
317
324
  ? [{ memberPartyId: member.partyId, memberCapId: member.capId, groupId, groupName: group.name }]
318
325
  : [];
@@ -323,26 +330,23 @@ export const getPendingMemberships = Effect.fn("getPendingMemberships")(function
323
330
  // ── Works (studio catalog) ───────────────────────────────────────────────────
324
331
 
325
332
  /**
326
- * Owned generic admin caps over gRPC. The bare type filter matches every
327
- * instantiation of `CompositionAdminCap<T>` / `RecordingAdminCap<T>`; the share
328
- * type `T` is parsed back out of each instance's type tag, because the cap does
329
- * not store the work's id — only its share type.
333
+ * Owned generic admin caps. The bare type filter matches every instantiation of
334
+ * `CompositionAdminCap<T>` / `RecordingAdminCap<T>`; the share type `T` is
335
+ * parsed back out of each instance's type tag, because the cap does not store
336
+ * the work's id — only its share type.
330
337
  */
331
338
  const ownedGenericCaps = Effect.fn("ownedGenericCaps")(function* (
332
339
  owner: string,
333
340
  capType: string,
334
- ): Effect.fn.Return<{ id: string; shareType: string }[], SuiRpcError, SuiClient> {
341
+ ): Effect.fn.Return<{ id: string; shareType: string }[], TransportError, Sui> {
342
+ const sui = yield* Sui;
343
+ const objects = yield* Stream.runCollect(
344
+ sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: StructTag.make(capType) }).pipe(Stream.take(MAX_OWNED_OBJECTS)),
345
+ );
335
346
  const caps: { id: string; shareType: string }[] = [];
336
- let cursor: string | null = null;
337
- for (let page = 0; page < MAX_PAGES; page++) {
338
- const res = (yield* listOwnedObjectsPage(owner, capType, cursor, false)) as OwnedObjectsPage;
339
- for (const obj of res.objects) {
340
- const match = /<(.+)>$/.exec(obj.type);
341
- if (match?.[1]) caps.push({ id: obj.objectId, shareType: match[1] });
342
- }
343
- if (!res.hasNextPage) break;
344
- cursor = res.cursor;
345
- if (!cursor) break;
347
+ for (const obj of objects) {
348
+ const match = /<(.+)>$/.exec(obj.type);
349
+ if (match?.[1]) caps.push({ id: obj.id, shareType: match[1] });
346
350
  }
347
351
  return caps;
348
352
  });
@@ -357,9 +361,17 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (
357
361
  config: MisoConfig,
358
362
  ): Effect.fn.Return<
359
363
  { compositions: VaultedGenericCap[]; recordings: VaultedGenericCap[]; releases: VaultedReleaseCap[] },
360
- SuiRpcError,
361
- SuiClient
364
+ TransportError | OperationsUnavailableError,
365
+ Sui
362
366
  > {
367
+ // No current-or-legacy Vault package id: this deployment has no vaulted
368
+ // works to enumerate at all, so the caller (`getOwnedWorks`) fails typed
369
+ // rather than silently reporting only the direct caps (B1, misofm/sdks#35
370
+ // verification — `MisoConfig` itself always constructs; this is the one
371
+ // member that actually needs the missing field).
372
+ if (config.protocol.vault === null) {
373
+ return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
374
+ }
363
375
  const out: {
364
376
  compositions: VaultedGenericCap[];
365
377
  recordings: VaultedGenericCap[];
@@ -367,36 +379,28 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (
367
379
  } = { compositions: [], recordings: [], releases: [] };
368
380
  const vaultPackageId = config.protocol.vault;
369
381
  const misoPackageId = config.deployment.musicos;
370
- const capType = `${vaultPackageId}::vault::VaultAdminCap`;
371
- let cursor: string | null = null;
372
-
373
- for (let page = 0; page < MAX_PAGES; page++) {
374
- const res = (yield* listOwnedObjectsPage(owner, capType, cursor, true)) as OwnedObjectsPage;
375
- for (const object of res.objects) {
376
- if (!object.content) continue;
377
- const work = classifyVaultedWorkAdminCapType(
378
- object.type,
379
- vaultPackageId,
380
- misoPackageId,
381
- );
382
- if (!work) continue;
383
- try {
384
- const { vault_id: vaultId } = vaultContract.VaultAdminCap.parse(object.content);
385
- if (work.kind === "composition") {
386
- out.compositions.push({ id: object.objectId, shareType: work.shareType, vaultId });
387
- } else if (work.kind === "recording") {
388
- out.recordings.push({ id: object.objectId, shareType: work.shareType, vaultId });
389
- } else {
390
- out.releases.push({ id: object.objectId, vaultId });
391
- }
392
- } catch {
393
- // A malformed object under the configured vault namespace is not usable
394
- // authority and should not hide otherwise valid catalog entries.
382
+ const capType = StructTag.make(`${vaultPackageId}::vault::VaultAdminCap`);
383
+
384
+ const sui = yield* Sui;
385
+ const objects = yield* Stream.runCollect(
386
+ sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(MAX_OWNED_OBJECTS)),
387
+ );
388
+ for (const object of objects) {
389
+ const work = classifyVaultedWorkAdminCapType(object.type, vaultPackageId, misoPackageId);
390
+ if (!work) continue;
391
+ try {
392
+ const { vault_id: vaultId } = vaultContract.VaultAdminCap.parse(object.content);
393
+ if (work.kind === "composition") {
394
+ out.compositions.push({ id: object.id, shareType: work.shareType, vaultId });
395
+ } else if (work.kind === "recording") {
396
+ out.recordings.push({ id: object.id, shareType: work.shareType, vaultId });
397
+ } else {
398
+ out.releases.push({ id: object.id, vaultId });
395
399
  }
400
+ } catch {
401
+ // A malformed object under the configured vault namespace is not usable
402
+ // authority and should not hide otherwise valid catalog entries.
396
403
  }
397
- if (!res.hasNextPage) break;
398
- cursor = res.cursor;
399
- if (!cursor) break;
400
404
  }
401
405
  return out;
402
406
  });
@@ -405,23 +409,33 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (
405
409
  const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(function* (
406
410
  caps: readonly VaultedReleaseCap[],
407
411
  config: MisoConfig,
408
- ): Effect.fn.Return<{ id: string; releaseId: string }[], SuiRpcError, SuiClient> {
412
+ ): Effect.fn.Return<{ id: string; releaseId: string }[], TransportError | OperationsUnavailableError, Sui> {
409
413
  if (caps.length === 0) return [];
414
+ // Every caller only reaches here with a non-empty `caps` after already
415
+ // establishing `config.protocol.vault` is configured (`ownedVaultedWorkCaps`,
416
+ // `getWorkByCap`'s own guard below) — this is a defensive typed failure,
417
+ // not an expected path, so an interpolated `null` can never reach `vaultType`.
418
+ if (config.protocol.vault === null) {
419
+ return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
420
+ }
410
421
  const releaseCapType = `${config.deployment.musicos}::release::ReleaseAdminCap`;
411
422
  const vaultType = normalizeStructTag(`${config.protocol.vault}::vault::Vault<${releaseCapType}>`);
412
- const contentById = yield* getObjectsContent(caps.map((cap) => cap.vaultId));
423
+ const sui = yield* Sui;
424
+ const results = yield* sui.getObjects(caps.map((cap) => ObjectId.make(cap.vaultId)));
413
425
  const releasesByVault = new Map<string, string>();
414
- for (const [objectId, object] of contentById) {
426
+ results.forEach((result, index) => {
427
+ if (!Result.isSuccess(result)) return;
428
+ const object = result.success;
415
429
  try {
416
- if (normalizeStructTag(object.type) !== vaultType) continue;
430
+ if (normalizeStructTag(object.type) !== vaultType) return;
417
431
  const vault = vaultContract.Vault(networkContracts.release.ReleaseAdminCap).parse(object.content);
418
432
  const releaseId = vault.cap?.value?.release_id;
419
- if (releaseId) releasesByVault.set(objectId, releaseId);
433
+ if (releaseId) releasesByVault.set(caps[index]!.vaultId, releaseId);
420
434
  } catch {
421
435
  // Batch catalog discovery is best-effort per authority, matching the
422
436
  // existing direct-cap path's treatment of unreadable work objects.
423
437
  }
424
- }
438
+ });
425
439
  return caps.flatMap((cap) => {
426
440
  const releaseId = releasesByVault.get(cap.vaultId);
427
441
  return releaseId ? [{ id: cap.id, releaseId }] : [];
@@ -432,28 +446,32 @@ const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(functio
432
446
  * Every work the wallet administers, keyed by its ADMIN CAP id (the studio
433
447
  * catalog's routing unit — caps are what control means here).
434
448
  *
435
- * Three transports, one answer: direct or vaulted cap discovery is gRPC; one aliased GraphQL
436
- * request maps every share type to its work address (gRPC cannot ask "which
437
- * object has type X"); one gRPC batch loads all the work contents. Releases skip
449
+ * Three transports, one answer: direct or vaulted cap discovery is Core; one aliased GraphQL
450
+ * request maps every share type to its work address (Core cannot ask "which
451
+ * object has type X"); one Core batch loads all the work contents. Releases skip
438
452
  * the GraphQL hop entirely — `ReleaseAdminCap` is not generic and carries
439
453
  * `release_id` directly.
440
454
  */
441
455
  export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (
442
456
  owner: string,
443
457
  config: MisoConfig,
444
- ): Effect.fn.Return<OwnedWork[], SuiRpcError | BcsDecodeError, SuiClient | SuiGraphQL> {
458
+ ): Effect.fn.Return<
459
+ OwnedWork[],
460
+ MusicosDeploymentInvalid | DecodeError | BatchItemError | GraphQLUnavailable | TransportError | OperationsUnavailableError,
461
+ Sui | SuiGraphQL
462
+ > {
445
463
  const miso = config.deployment.musicos;
446
464
 
447
465
  const [directCompCaps, directRecCaps, directRelCaps, vaulted] = yield* Effect.all([
448
466
  ownedGenericCaps(owner, `${miso}::composition::CompositionAdminCap`),
449
467
  ownedGenericCaps(owner, `${miso}::recording::RecordingAdminCap`),
450
- getOwnedReleaseAdminCaps(owner, miso),
468
+ withMusicos(miso, (musicos) => musicos.getOwnedReleaseAdminCaps(SuiAddress.make(normalizeSuiAddress(owner)))),
451
469
  ownedVaultedWorkCaps(owner, config),
452
470
  ]);
453
471
  const vaultedRelCaps = yield* resolveVaultedReleaseCaps(vaulted.releases, config);
454
472
  const compCaps = [...directCompCaps, ...vaulted.compositions];
455
473
  const recCaps = [...directRecCaps, ...vaulted.recordings];
456
- const relCaps = [...directRelCaps, ...vaultedRelCaps];
474
+ const relCaps = [...directRelCaps.map((cap) => ({ id: String(cap.id), releaseId: String(cap.id) })), ...vaultedRelCaps];
457
475
 
458
476
  const addresses = yield* getWorkAddressesByShareTypes(
459
477
  { compositions: compCaps.map((c) => c.shareType), recordings: recCaps.map((c) => c.shareType) },
@@ -500,10 +518,24 @@ export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (
500
518
  export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
501
519
  capId: string,
502
520
  config: MisoConfig,
503
- ): Effect.fn.Return<WorkDetail | null, ObjectNotFoundError | SuiRpcError | BcsDecodeError, SuiClient | SuiGraphQL> {
521
+ ): Effect.fn.Return<
522
+ WorkDetail | null,
523
+ | ObjectNotFound
524
+ | ObjectDeleted
525
+ | ObjectUnavailable
526
+ | DecodeError
527
+ | MusicosDeploymentInvalid
528
+ | MusicosWorkNotFound
529
+ | BatchItemError
530
+ | GraphQLUnavailable
531
+ | TransportError
532
+ | OperationsUnavailableError,
533
+ Sui | SuiGraphQL
534
+ > {
504
535
  const miso = config.deployment.musicos;
505
536
 
506
- const found = yield* getOptionalObjectContent(capId);
537
+ const sui = yield* Sui;
538
+ const found = yield* sui.getObjectOption(ObjectId.make(normalizeSuiAddress(capId)));
507
539
  if (Option.isNone(found)) return null;
508
540
  const { content, type } = found.value;
509
541
 
@@ -539,7 +571,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
539
571
  if (direct?.kind === "release") {
540
572
  // `ReleaseAdminCap`'s BCS carries `release_id` directly — no `json` include needed.
541
573
  const { release_id: releaseId } = networkContracts.release.ReleaseAdminCap.parse(content);
542
- const r = yield* getReleaseById(releaseId);
574
+ const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseId)));
543
575
  return {
544
576
  capId,
545
577
  kind: "release",
@@ -551,6 +583,13 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
551
583
  };
552
584
  }
553
585
 
586
+ // Every direct classification above already fell through: this cap can
587
+ // only be a legitimate work authority if it is a vaulted one, which
588
+ // requires the deployment's Vault package id (B1, misofm/sdks#35
589
+ // verification) — fail typed rather than misreport "no such work".
590
+ if (config.protocol.vault === null) {
591
+ return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
592
+ }
554
593
  const vaulted = classifyVaultedWorkAdminCapType(type, config.protocol.vault, miso);
555
594
  if (!vaulted) {
556
595
  // A real object, but not a supported work authority — "no such work",
@@ -587,7 +626,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
587
626
 
588
627
  const [releaseCap] = yield* resolveVaultedReleaseCaps([{ id: capId, vaultId }], config);
589
628
  if (!releaseCap) throw new Error(`Release vault ${vaultId} carries no release admin cap`);
590
- const r = yield* getReleaseById(releaseCap.releaseId);
629
+ const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseCap.releaseId)));
591
630
  return {
592
631
  capId,
593
632
  kind: "release",
@@ -601,64 +640,41 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (
601
640
 
602
641
  // ── Balance ──────────────────────────────────────────────────────────────────
603
642
 
604
- const decimalsByClient = new WeakMap<object, Map<string, Promise<number>>>();
605
-
606
- /**
607
- * Resolve once per (transport client, coin type). Failed lookups are evicted so
608
- * a transient fullnode error cannot poison a long-lived API worker.
609
- */
610
- function coinDecimalsPromise(client: object & { core: { getCoinMetadata: (args: { coinType: string }) => Promise<{ coinMetadata: { decimals?: number } | null }> } }, coinType: string): Promise<number> {
611
- let cache = decimalsByClient.get(client);
612
- if (!cache) {
613
- cache = new Map();
614
- decimalsByClient.set(client, cache);
615
- }
616
- const key = normalizeStructTag(coinType);
617
- const cached = cache.get(key);
618
- if (cached) return cached;
619
-
620
- const pending = client.core.getCoinMetadata({ coinType: key }).then(({ coinMetadata }) => {
621
- const decimals = coinMetadata?.decimals;
622
- if (!Number.isSafeInteger(decimals) || decimals! < 0 || decimals! > 18) {
623
- throw new Error(`Coin metadata for ${key} has no supported decimal precision`);
624
- }
625
- return decimals!;
626
- });
627
- cache.set(key, pending);
628
- pending.catch(() => {
629
- if (cache!.get(key) === pending) cache!.delete(key);
630
- });
631
- return pending;
632
- }
633
-
634
643
  /**
635
644
  * A wallet's balance in one currency. Keep the aggregate and both Sui storage
636
645
  * classes: callers using a `FundsWithdrawal` must never mistake coin-object
637
646
  * value for immediately withdrawable address balance.
647
+ *
648
+ * TODO(stage 2/3): the predecessor cached `getCoinMetadata` per (transport
649
+ * client, coin type) in a module-level `WeakMap`. This standalone function has
650
+ * no layer to hold an `Effect.cachedWithTTL`-backed cache in (the issue's own
651
+ * target design for this); dropped rather than reintroducing a module-level
652
+ * cache keyed on a raw client object, which `Sui`'s per-call service instance
653
+ * makes awkward to key by. Revisit once this becomes a `Miso.read.getBalance`
654
+ * service member with a layer to hold the cache.
638
655
  */
639
656
  export const getBalance = Effect.fn("getBalance")(function* (
640
657
  address: string,
641
658
  config: MisoConfig,
642
659
  coinType?: string,
643
- ): Effect.fn.Return<Balance, SuiRpcError, SuiClient> {
644
- const client = yield* SuiClient;
660
+ ): Effect.fn.Return<Balance, DecodeError | TransportError, Sui> {
661
+ const sui = yield* Sui;
645
662
  const type = coinType ?? config.money.usdCoinType;
646
- const [res, decimals] = yield* Effect.all([
647
- Effect.tryPromise({
648
- try: (signal) => client.core.getBalance({ owner: address, coinType: type, signal }),
649
- catch: (cause) => new SuiRpcError({ operation: "getBalance", cause }),
650
- }),
651
- Effect.tryPromise({
652
- try: () => coinDecimalsPromise(client, type),
653
- catch: (cause) => new SuiRpcError({ operation: "getCoinMetadata", cause }),
654
- }),
663
+ const [balance, metadata] = yield* Effect.all([
664
+ sui.getBalance(SuiAddress.make(normalizeSuiAddress(address)), CoinType.make(normalizeStructTag(type))),
665
+ sui.core.getCoinMetadata({ coinType: normalizeStructTag(type) }),
655
666
  ]);
667
+ const rawDecimals = metadata.coinMetadata?.decimals;
668
+ if (!Number.isSafeInteger(rawDecimals) || rawDecimals! < 0 || rawDecimals! > 18) {
669
+ return yield* new DecodeError({ expectedType: type, issue: `coin metadata for ${type} has no supported decimal precision` });
670
+ }
671
+ const decimals: number = rawDecimals!;
656
672
  return {
657
673
  address: normalizeSuiAddress(address),
658
674
  coinType: type,
659
- balance: u64(res.balance.balance),
660
- coinBalance: u64(res.balance.coinBalance),
661
- addressBalance: u64(res.balance.addressBalance),
675
+ balance: u64(balance.balance),
676
+ coinBalance: u64(balance.coinBalance),
677
+ addressBalance: u64(balance.addressBalance),
662
678
  decimals,
663
679
  };
664
680
  });
@@ -685,17 +701,14 @@ export const ownsParty = Effect.fn("ownsParty")(function* (
685
701
  address: string,
686
702
  partyId: string,
687
703
  config: MisoConfig,
688
- ): Effect.fn.Return<Ownership, never, SuiClient> {
704
+ ): Effect.fn.Return<Ownership, never, Sui> {
689
705
  const capId = derivePartyAdminCapId(partyId, config.partyos.partyos);
690
- const client = yield* SuiClient;
691
- const isOwner = yield* Effect.tryPromise({
692
- try: (signal) => client.core.getObject({ objectId: capId, signal }),
693
- catch: (cause) => cause,
694
- }).pipe(
695
- Effect.map(({ object }) => isAddressOwner(object?.owner, address)),
706
+ const sui = yield* Sui;
707
+ const isOwner = yield* sui.getObject(ObjectId.make(capId)).pipe(
708
+ Effect.map((object) => isAddressOwner(object.owner, address)),
696
709
  Effect.catch(() => Effect.succeed(false)),
697
710
  );
698
- return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId };
711
+ return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId: String(capId) };
699
712
  });
700
713
 
701
714
  /**
@@ -707,13 +720,10 @@ export const ownsParty = Effect.fn("ownsParty")(function* (
707
720
  export const ownsRecord = Effect.fn("ownsRecord")(function* (
708
721
  address: string,
709
722
  recordId: string,
710
- ): Effect.fn.Return<Ownership, never, SuiClient> {
711
- const client = yield* SuiClient;
712
- const isOwner = yield* Effect.tryPromise({
713
- try: (signal) => client.core.getObject({ objectId: recordId, signal }),
714
- catch: (cause) => cause,
715
- }).pipe(
716
- Effect.map(({ object }) => isAddressOwner(object?.owner, address)),
723
+ ): Effect.fn.Return<Ownership, never, Sui> {
724
+ const sui = yield* Sui;
725
+ const isOwner = yield* sui.getObject(ObjectId.make(normalizeSuiAddress(recordId))).pipe(
726
+ Effect.map((object) => isAddressOwner(object.owner, address)),
717
727
  Effect.catch(() => Effect.succeed(false)),
718
728
  );
719
729
  return { address: normalizeSuiAddress(address), objectId: recordId, isOwner };