@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
@@ -1,5 +1,8 @@
1
1
  import { Effect } from "effect";
2
- import { SuiClient, SuiGraphQL, SuiRpcError, type BcsDecodeError, type ObjectNotFoundError, type ObjectTypeMismatchError } from "@misofm/effect";
2
+ import { type MusicosDeploymentInvalid, type MusicosWorkNotFound } from "@misofm/musicos";
3
+ import { type PartyosDeploymentError } from "@misofm/partyos";
4
+ import { DecodeError, Sui, SuiGraphQL, type BatchItemError, type GraphQLUnavailable, type TransportError } from "@unconfirmed/sui-effect";
5
+ import { OperationsUnavailableError } from "../errors.ts";
3
6
  import type { MisoConfig } from "./config.ts";
4
7
  import type { Balance, OwnedParty, OwnedRecord, OwnedWork, Ownership, PendingMembership, WorkDetail } from "./types.ts";
5
8
  type WorkAdminCapType = {
@@ -19,14 +22,14 @@ export declare function classifyVaultedWorkAdminCapType(type: string, vaultPacka
19
22
  * The server-side type filter and exact local check deliberately exclude records
20
23
  * from any retired package namespace.
21
24
  */
22
- export declare const getOwnedRecords: (owner: string, config: MisoConfig) => Effect.Effect<OwnedRecord[], SuiRpcError, SuiClient>;
25
+ export declare const getOwnedRecords: (owner: string, config: MisoConfig) => Effect.Effect<OwnedRecord[], TransportError, Sui>;
23
26
  /**
24
27
  * The parties `owner` administers. A wallet "owns" a party iff it holds the
25
28
  * party's `PartyAdminCap`, so this is one owned-objects listing filtered to the
26
29
  * cap type plus a name resolve. Caps are transferable, which is why this is
27
30
  * authoritative in a way that remembering created parties client-side is not.
28
31
  */
29
- export declare const getOwnedParties: (owner: string, config: MisoConfig) => Effect.Effect<OwnedParty[], BcsDecodeError | ObjectTypeMismatchError | SuiRpcError, SuiClient>;
32
+ export declare const getOwnedParties: (owner: string, config: MisoConfig) => Effect.Effect<OwnedParty[], PartyosDeploymentError | TransportError, Sui>;
30
33
  /**
31
34
  * Pending group invitations for every individual party the wallet administers.
32
35
  *
@@ -35,26 +38,34 @@ export declare const getOwnedParties: (owner: string, config: MisoConfig) => Eff
35
38
  * names are resolved in one batch so the API can render an inbox without extra
36
39
  * browser reads.
37
40
  */
38
- export declare const getPendingMemberships: (owner: string, config: MisoConfig) => Effect.Effect<PendingMembership[], BcsDecodeError | ObjectTypeMismatchError | SuiRpcError, SuiClient>;
41
+ export declare const getPendingMemberships: (owner: string, config: MisoConfig) => Effect.Effect<PendingMembership[], DecodeError | PartyosDeploymentError | TransportError, Sui>;
39
42
  /**
40
43
  * Every work the wallet administers, keyed by its ADMIN CAP id (the studio
41
44
  * catalog's routing unit — caps are what control means here).
42
45
  *
43
- * Three transports, one answer: direct or vaulted cap discovery is gRPC; one aliased GraphQL
44
- * request maps every share type to its work address (gRPC cannot ask "which
45
- * object has type X"); one gRPC batch loads all the work contents. Releases skip
46
+ * Three transports, one answer: direct or vaulted cap discovery is Core; one aliased GraphQL
47
+ * request maps every share type to its work address (Core cannot ask "which
48
+ * object has type X"); one Core batch loads all the work contents. Releases skip
46
49
  * the GraphQL hop entirely — `ReleaseAdminCap` is not generic and carries
47
50
  * `release_id` directly.
48
51
  */
49
- export declare const getOwnedWorks: (owner: string, config: MisoConfig) => Effect.Effect<OwnedWork[], BcsDecodeError | SuiRpcError, SuiClient | SuiGraphQL>;
52
+ export declare const getOwnedWorks: (owner: string, config: MisoConfig) => Effect.Effect<OwnedWork[], GraphQLUnavailable | MusicosDeploymentInvalid | OperationsUnavailableError | TransportError | BatchItemError, Sui | SuiGraphQL>;
50
53
  /** Classify a direct or vaulted cap by its on-chain type, then resolve its work. */
51
- export declare const getWorkByCap: (capId: string, config: MisoConfig) => Effect.Effect<WorkDetail | null, BcsDecodeError | ObjectNotFoundError | SuiRpcError, SuiClient | SuiGraphQL>;
54
+ export declare const getWorkByCap: (capId: string, config: MisoConfig) => Effect.Effect<WorkDetail | null, GraphQLUnavailable | MusicosDeploymentInvalid | MusicosWorkNotFound | OperationsUnavailableError | TransportError | BatchItemError, Sui | SuiGraphQL>;
52
55
  /**
53
56
  * A wallet's balance in one currency. Keep the aggregate and both Sui storage
54
57
  * classes: callers using a `FundsWithdrawal` must never mistake coin-object
55
58
  * value for immediately withdrawable address balance.
59
+ *
60
+ * TODO(stage 2/3): the predecessor cached `getCoinMetadata` per (transport
61
+ * client, coin type) in a module-level `WeakMap`. This standalone function has
62
+ * no layer to hold an `Effect.cachedWithTTL`-backed cache in (the issue's own
63
+ * target design for this); dropped rather than reintroducing a module-level
64
+ * cache keyed on a raw client object, which `Sui`'s per-call service instance
65
+ * makes awkward to key by. Revisit once this becomes a `Miso.read.getBalance`
66
+ * service member with a layer to hold the cache.
56
67
  */
57
- export declare const getBalance: (address: string, config: MisoConfig, coinType?: string | undefined) => Effect.Effect<Balance, SuiRpcError, SuiClient>;
68
+ export declare const getBalance: (address: string, config: MisoConfig, coinType?: string | undefined) => Effect.Effect<Balance, DecodeError | TransportError, Sui>;
58
69
  /**
59
70
  * Whether `address` controls a party — i.e. holds its `PartyAdminCap`. The cap is
60
71
  * a DERIVED object of the party, so this is one `getObject` on a computed id, no
@@ -64,13 +75,13 @@ export declare const getBalance: (address: string, config: MisoConfig, coinType?
64
75
  * A failed read means "can't confirm", which resolves to `false` — the editor
65
76
  * stays hidden rather than being offered and then rejected on submit.
66
77
  */
67
- export declare const ownsParty: (address: string, partyId: string, config: MisoConfig) => Effect.Effect<Ownership, never, SuiClient>;
78
+ export declare const ownsParty: (address: string, partyId: string, config: MisoConfig) => Effect.Effect<Ownership, never, Sui>;
68
79
  /**
69
80
  * Whether `address` owns a record. Records are address-owned objects, so this is
70
81
  * one `getObject` and an owner compare. Presentation gating only — it decides
71
82
  * whether the Snapshots tab appears, and a non-owner has no snapshot content to
72
83
  * fetch regardless.
73
84
  */
74
- export declare const ownsRecord: (address: string, recordId: string) => Effect.Effect<Ownership, never, SuiClient>;
85
+ export declare const ownsRecord: (address: string, recordId: string) => Effect.Effect<Ownership, never, Sui>;
75
86
  export {};
76
87
  //# sourceMappingURL=wallet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/read/wallet.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAUxC,OAAO,EAGL,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAUpB,KAAK,gBAAgB,GACjB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAsDxB,mFAAmF;AACnF,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GACpB,gBAAgB,GAAG,IAAI,CAmBzB;AA4DD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,6FA0C1B,CAAC;AAIH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,uIA4B1B,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,8IA0BhC,CAAC;AA8GH;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,yHAwDxB,CAAC;AAEH,oFAAoF;AACpF,eAAO,MAAM,YAAY,qJAoGvB,CAAC;AAkCH;;;;GAIG;AACH,eAAO,MAAM,UAAU,wHAyBrB,CAAC;AAWH;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,sGAepB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,mFAarB,CAAC"}
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/read/wallet.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAA0B,MAAM,QAAQ,CAAC;AACxD,OAAO,EAKL,KAAK,wBAAwB,EAE7B,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAkC,KAAK,sBAAsB,EAAuB,MAAM,iBAAiB,CAAC;AACnH,OAAO,EAEL,WAAW,EAEX,GAAG,EAEH,UAAU,EAEV,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAoCpB,KAAK,gBAAgB,GACjB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAsDxB,mFAAmF;AACnF,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GACpB,gBAAgB,GAAG,IAAI,CAmBzB;AA+BD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,0FAqC1B,CAAC;AAIH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,kHA+B1B,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,uIA8BhC,CAAC;AAqHH;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,mMA4DxB,CAAC;AAEH,oFAAoF;AACpF,eAAO,MAAM,YAAY,+NAyHvB,CAAC;AAIH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,mIAwBrB,CAAC;AAWH;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,gGAYpB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,6EAUrB,CAAC"}
@@ -10,11 +10,12 @@
10
10
  // gRPC) is exactly the sort of thing that should exist once in the SDK rather
11
11
  // than be reimplemented by every browser, Worker, server, or native client.
12
12
  import { normalizeStructTag, normalizeSuiAddress, parseStructTag } from "@mysten/sui/utils";
13
- import { Effect, Option } from "effect";
14
- import { contracts as networkContracts, getCompositionByShareType, getOwnedReleaseAdminCaps, getRecordingByShareType, getReleaseById, } from "@misofm/musicos";
13
+ import { Effect, Option, Result, Stream } from "effect";
14
+ import { contracts as networkContracts, getCompositionByShareType, getRecordingByShareType, Musicos, } from "@misofm/musicos";
15
15
  import { party as partyContracts } from "@misofm/partyos/contracts";
16
- import { derivePartyAdminCapId, getPartiesByIds, getPendingMemberships as getPartyPendingMemberships } from "@misofm/partyos";
17
- import { getObjectsContent, getOptionalObjectContent, SuiClient, SuiGraphQL, SuiRpcError, } from "@misofm/effect";
16
+ import { derivePartyAdminCapId, Partyos } from "@misofm/partyos";
17
+ import { CoinType, DecodeError, ObjectId, Sui, SuiAddress, SuiGraphQL, StructTag, } from "@unconfirmed/sui-effect";
18
+ import { OperationsUnavailableError } from "../errors.js";
18
19
  import { int, u64 } from "./internal/scalars.js";
19
20
  import * as vaultContract from "../contracts/vault/vault.js";
20
21
  import * as recordContract from "../contracts/record/record.js";
@@ -26,7 +27,25 @@ import { getRecordingTitles, getWorkAddressesByShareTypes, getWorksByIds } from
26
27
  * set can't spin forever. 50/page × 20 = 1000 objects — far beyond any realistic
27
28
  * library.
28
29
  */
29
- const MAX_PAGES = 20;
30
+ const MAX_OWNED_OBJECTS = 1000;
31
+ /**
32
+ * Builds `Musicos.layer({ deployment: { packageId } })` / `Partyos.layer({
33
+ * deployment })`, provides it, and hands back the effect it wraps — see
34
+ * `../catalog.ts`'s `withMusicos` for the same idiom (kept file-local; see
35
+ * `docs/CONVERSION-STATUS.md`).
36
+ */
37
+ function withMusicos(packageId, effect) {
38
+ return Effect.gen(function* () {
39
+ const musicos = yield* Musicos;
40
+ return yield* effect(musicos);
41
+ }).pipe(Effect.provide(Musicos.layer({ deployment: { packageId } })));
42
+ }
43
+ function withPartyos(partyosPackageId, effect) {
44
+ return Effect.gen(function* () {
45
+ const partyos = yield* Partyos;
46
+ return yield* effect(partyos);
47
+ }).pipe(Effect.provide(Partyos.layer({ deployment: { partyos: partyosPackageId } })));
48
+ }
30
49
  function classifyWorkAdminCapType(type, misoPackageId) {
31
50
  let tag;
32
51
  try {
@@ -104,21 +123,6 @@ function isCanonicalRecordType(type, recordPackageId) {
104
123
  }
105
124
  return true;
106
125
  }
107
- /** One page of `client.core.listOwnedObjects`, requesting `content` when `withContent` is set. */
108
- const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (owner, type, cursor, withContent) {
109
- const client = yield* SuiClient;
110
- return yield* Effect.tryPromise({
111
- try: (signal) => client.core.listOwnedObjects({
112
- owner,
113
- type,
114
- cursor,
115
- limit: 50,
116
- ...(withContent ? { include: { content: true } } : {}),
117
- signal,
118
- }),
119
- catch: (cause) => new SuiRpcError({ operation: "listOwnedObjects", cause }),
120
- });
121
- });
122
126
  /**
123
127
  * The records `owner` holds. Ownership is DIRECT — a record is an address-owned
124
128
  * `<record>::record::Record` with no pressing/license/receipt intermediary.
@@ -126,44 +130,35 @@ const listOwnedObjectsPage = Effect.fn("listOwnedObjectsPage")(function* (owner,
126
130
  * from any retired package namespace.
127
131
  */
128
132
  export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (owner, config) {
129
- const out = [];
130
- let cursor = null;
133
+ const sui = yield* Sui;
131
134
  const sales = requireRecordSalesDeployment(config.recordSales);
132
- const recordType = `${sales.recordPackageId}::record::Record`;
133
- for (let page = 0; page < MAX_PAGES; page++) {
134
- const res = (yield* listOwnedObjectsPage(owner, recordType, cursor, true));
135
- for (const obj of res.objects) {
136
- if (!isCanonicalRecordType(obj.type, sales.recordPackageId)) {
137
- continue;
138
- }
139
- if (!obj.content)
140
- throw new Error(`Record ${obj.objectId} has no BCS content`);
141
- const record = recordContract.Record.parse(obj.content);
142
- if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.objectId)) {
143
- throw new Error(`Record ${obj.objectId} has mismatched embedded UID ${record.id}`);
144
- }
145
- const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
146
- if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.objectId)) {
147
- throw new Error(`Record ${obj.objectId} is not derived from its Pressing and number`);
148
- }
149
- out.push({
150
- id: obj.objectId,
151
- type: obj.type,
152
- releaseId: record.release_id,
153
- pressingId: record.pressing_id,
154
- edition: record.edition,
155
- number: record.number,
156
- purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
157
- purchasePrice: record.purchase_price,
158
- purchasedBy: record.purchased_by,
159
- purchasedTimestampMs: record.purchased_timestamp_ms,
160
- });
135
+ const recordType = StructTag.make(`${sales.recordPackageId}::record::Record`);
136
+ const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: recordType }).pipe(Stream.take(MAX_OWNED_OBJECTS)));
137
+ const out = [];
138
+ for (const obj of objects) {
139
+ if (!isCanonicalRecordType(obj.type, sales.recordPackageId)) {
140
+ continue;
141
+ }
142
+ const record = recordContract.Record.parse(obj.content);
143
+ if (normalizeSuiAddress(record.id) !== normalizeSuiAddress(obj.id)) {
144
+ throw new Error(`Record ${obj.id} has mismatched embedded UID ${record.id}`);
161
145
  }
162
- if (!res.hasNextPage)
163
- break;
164
- cursor = res.cursor;
165
- if (!cursor)
166
- break;
146
+ const derived = deriveRecordId(record.pressing_id, record.number, sales.recordPackageId);
147
+ if (normalizeSuiAddress(derived) !== normalizeSuiAddress(obj.id)) {
148
+ throw new Error(`Record ${obj.id} is not derived from its Pressing and number`);
149
+ }
150
+ out.push({
151
+ id: obj.id,
152
+ type: obj.type,
153
+ releaseId: record.release_id,
154
+ pressingId: record.pressing_id,
155
+ edition: record.edition,
156
+ number: record.number,
157
+ purchaseCurrency: normalizeStructTag(record.purchase_currency.name),
158
+ purchasePrice: record.purchase_price,
159
+ purchasedBy: record.purchased_by,
160
+ purchasedTimestampMs: record.purchased_timestamp_ms,
161
+ });
167
162
  }
168
163
  return out;
169
164
  });
@@ -175,14 +170,15 @@ export const getOwnedRecords = Effect.fn("getOwnedRecords")(function* (owner, co
175
170
  * authoritative in a way that remembering created parties client-side is not.
176
171
  */
177
172
  export const getOwnedParties = Effect.fn("getOwnedParties")(function* (owner, config) {
178
- const capType = `${config.partyos.partyos}::party::PartyAdminCap`;
173
+ const sui = yield* Sui;
174
+ const capType = StructTag.make(`${config.partyos.partyos}::party::PartyAdminCap`);
179
175
  // One page of 50 caps is plenty for launch-scale artists; paginate if labels
180
176
  // ever start hitting the cap.
181
- const { objects } = yield* listOwnedObjectsPage(owner, capType, null, true);
177
+ const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(50)));
182
178
  const caps = objects.flatMap((obj) => {
183
179
  try {
184
180
  const cap = partyContracts.PartyAdminCap.parse(obj.content);
185
- return [{ capId: obj.objectId, partyId: cap.party_id }];
181
+ return [{ capId: obj.id, partyId: cap.party_id }];
186
182
  }
187
183
  catch {
188
184
  return [];
@@ -190,9 +186,10 @@ export const getOwnedParties = Effect.fn("getOwnedParties")(function* (owner, co
190
186
  });
191
187
  if (caps.length === 0)
192
188
  return [];
193
- const parties = yield* getPartiesByIds(caps.map((c) => c.partyId), config.partyos.partyos);
189
+ const results = yield* withPartyos(config.partyos.partyos, (partyos) => partyos.getPartiesByIds(caps.map((c) => ObjectId.make(c.partyId))));
190
+ const parties = new Map(results.flatMap((result, index) => (Result.isSuccess(result) ? [[caps[index].partyId, result.success]] : [])));
194
191
  return caps.flatMap(({ capId, partyId }) => {
195
- const p = parties[partyId];
192
+ const p = parties.get(partyId);
196
193
  return p ? [{ partyId, capId, name: p.name, kind: p.kind }] : [];
197
194
  });
198
195
  });
@@ -209,13 +206,14 @@ export const getPendingMemberships = Effect.fn("getPendingMemberships")(function
209
206
  const individuals = controlled.filter((party) => party.kind === "individual");
210
207
  if (individuals.length === 0)
211
208
  return [];
212
- const invitations = yield* Effect.forEach(individuals, (member) => getPartyPendingMemberships(member.partyId).pipe(Effect.map((groupIds) => ({ member, groupIds }))), { concurrency: "unbounded" });
209
+ const invitations = yield* withPartyos(config.partyos.partyos, (partyos) => Effect.forEach(individuals, (member) => partyos.getPendingMemberships(ObjectId.make(member.partyId)).pipe(Effect.map((groupIds) => ({ member, groupIds }))), { concurrency: "unbounded" }));
213
210
  const groupIds = [...new Set(invitations.flatMap(({ groupIds }) => groupIds))];
214
211
  if (groupIds.length === 0)
215
212
  return [];
216
- const groups = yield* getPartiesByIds(groupIds, config.partyos.partyos);
217
- return invitations.flatMap(({ member, groupIds }) => groupIds.flatMap((groupId) => {
218
- const group = groups[groupId];
213
+ const groupResults = yield* withPartyos(config.partyos.partyos, (partyos) => partyos.getPartiesByIds(groupIds));
214
+ const groups = new Map(groupResults.flatMap((result, index) => (Result.isSuccess(result) ? [[groupIds[index], result.success]] : [])));
215
+ return invitations.flatMap(({ member, groupIds: memberGroupIds }) => memberGroupIds.flatMap((groupId) => {
216
+ const group = groups.get(groupId);
219
217
  return group?.kind === "group"
220
218
  ? [{ memberPartyId: member.partyId, memberCapId: member.capId, groupId, groupName: group.name }]
221
219
  : [];
@@ -223,26 +221,19 @@ export const getPendingMemberships = Effect.fn("getPendingMemberships")(function
223
221
  });
224
222
  // ── Works (studio catalog) ───────────────────────────────────────────────────
225
223
  /**
226
- * Owned generic admin caps over gRPC. The bare type filter matches every
227
- * instantiation of `CompositionAdminCap<T>` / `RecordingAdminCap<T>`; the share
228
- * type `T` is parsed back out of each instance's type tag, because the cap does
229
- * not store the work's id — only its share type.
224
+ * Owned generic admin caps. The bare type filter matches every instantiation of
225
+ * `CompositionAdminCap<T>` / `RecordingAdminCap<T>`; the share type `T` is
226
+ * parsed back out of each instance's type tag, because the cap does not store
227
+ * the work's id — only its share type.
230
228
  */
231
229
  const ownedGenericCaps = Effect.fn("ownedGenericCaps")(function* (owner, capType) {
230
+ const sui = yield* Sui;
231
+ const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: StructTag.make(capType) }).pipe(Stream.take(MAX_OWNED_OBJECTS)));
232
232
  const caps = [];
233
- let cursor = null;
234
- for (let page = 0; page < MAX_PAGES; page++) {
235
- const res = (yield* listOwnedObjectsPage(owner, capType, cursor, false));
236
- for (const obj of res.objects) {
237
- const match = /<(.+)>$/.exec(obj.type);
238
- if (match?.[1])
239
- caps.push({ id: obj.objectId, shareType: match[1] });
240
- }
241
- if (!res.hasNextPage)
242
- break;
243
- cursor = res.cursor;
244
- if (!cursor)
245
- break;
233
+ for (const obj of objects) {
234
+ const match = /<(.+)>$/.exec(obj.type);
235
+ if (match?.[1])
236
+ caps.push({ id: obj.id, shareType: match[1] });
246
237
  }
247
238
  return caps;
248
239
  });
@@ -252,41 +243,40 @@ const ownedGenericCaps = Effect.fn("ownedGenericCaps")(function* (owner, capType
252
243
  * surface (composition / recording / release), not a sale-management surface.
253
244
  */
254
245
  const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (owner, config) {
246
+ // No current-or-legacy Vault package id: this deployment has no vaulted
247
+ // works to enumerate at all, so the caller (`getOwnedWorks`) fails typed
248
+ // rather than silently reporting only the direct caps (B1, misofm/sdks#35
249
+ // verification — `MisoConfig` itself always constructs; this is the one
250
+ // member that actually needs the missing field).
251
+ if (config.protocol.vault === null) {
252
+ return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
253
+ }
255
254
  const out = { compositions: [], recordings: [], releases: [] };
256
255
  const vaultPackageId = config.protocol.vault;
257
256
  const misoPackageId = config.deployment.musicos;
258
- const capType = `${vaultPackageId}::vault::VaultAdminCap`;
259
- let cursor = null;
260
- for (let page = 0; page < MAX_PAGES; page++) {
261
- const res = (yield* listOwnedObjectsPage(owner, capType, cursor, true));
262
- for (const object of res.objects) {
263
- if (!object.content)
264
- continue;
265
- const work = classifyVaultedWorkAdminCapType(object.type, vaultPackageId, misoPackageId);
266
- if (!work)
267
- continue;
268
- try {
269
- const { vault_id: vaultId } = vaultContract.VaultAdminCap.parse(object.content);
270
- if (work.kind === "composition") {
271
- out.compositions.push({ id: object.objectId, shareType: work.shareType, vaultId });
272
- }
273
- else if (work.kind === "recording") {
274
- out.recordings.push({ id: object.objectId, shareType: work.shareType, vaultId });
275
- }
276
- else {
277
- out.releases.push({ id: object.objectId, vaultId });
278
- }
257
+ const capType = StructTag.make(`${vaultPackageId}::vault::VaultAdminCap`);
258
+ const sui = yield* Sui;
259
+ const objects = yield* Stream.runCollect(sui.streamOwnedObjects(SuiAddress.make(normalizeSuiAddress(owner)), { type: capType }).pipe(Stream.take(MAX_OWNED_OBJECTS)));
260
+ for (const object of objects) {
261
+ const work = classifyVaultedWorkAdminCapType(object.type, vaultPackageId, misoPackageId);
262
+ if (!work)
263
+ continue;
264
+ try {
265
+ const { vault_id: vaultId } = vaultContract.VaultAdminCap.parse(object.content);
266
+ if (work.kind === "composition") {
267
+ out.compositions.push({ id: object.id, shareType: work.shareType, vaultId });
279
268
  }
280
- catch {
281
- // A malformed object under the configured vault namespace is not usable
282
- // authority and should not hide otherwise valid catalog entries.
269
+ else if (work.kind === "recording") {
270
+ out.recordings.push({ id: object.id, shareType: work.shareType, vaultId });
283
271
  }
272
+ else {
273
+ out.releases.push({ id: object.id, vaultId });
274
+ }
275
+ }
276
+ catch {
277
+ // A malformed object under the configured vault namespace is not usable
278
+ // authority and should not hide otherwise valid catalog entries.
284
279
  }
285
- if (!res.hasNextPage)
286
- break;
287
- cursor = res.cursor;
288
- if (!cursor)
289
- break;
290
280
  }
291
281
  return out;
292
282
  });
@@ -294,24 +284,35 @@ const ownedVaultedWorkCaps = Effect.fn("ownedVaultedWorkCaps")(function* (owner,
294
284
  const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(function* (caps, config) {
295
285
  if (caps.length === 0)
296
286
  return [];
287
+ // Every caller only reaches here with a non-empty `caps` after already
288
+ // establishing `config.protocol.vault` is configured (`ownedVaultedWorkCaps`,
289
+ // `getWorkByCap`'s own guard below) — this is a defensive typed failure,
290
+ // not an expected path, so an interpolated `null` can never reach `vaultType`.
291
+ if (config.protocol.vault === null) {
292
+ return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
293
+ }
297
294
  const releaseCapType = `${config.deployment.musicos}::release::ReleaseAdminCap`;
298
295
  const vaultType = normalizeStructTag(`${config.protocol.vault}::vault::Vault<${releaseCapType}>`);
299
- const contentById = yield* getObjectsContent(caps.map((cap) => cap.vaultId));
296
+ const sui = yield* Sui;
297
+ const results = yield* sui.getObjects(caps.map((cap) => ObjectId.make(cap.vaultId)));
300
298
  const releasesByVault = new Map();
301
- for (const [objectId, object] of contentById) {
299
+ results.forEach((result, index) => {
300
+ if (!Result.isSuccess(result))
301
+ return;
302
+ const object = result.success;
302
303
  try {
303
304
  if (normalizeStructTag(object.type) !== vaultType)
304
- continue;
305
+ return;
305
306
  const vault = vaultContract.Vault(networkContracts.release.ReleaseAdminCap).parse(object.content);
306
307
  const releaseId = vault.cap?.value?.release_id;
307
308
  if (releaseId)
308
- releasesByVault.set(objectId, releaseId);
309
+ releasesByVault.set(caps[index].vaultId, releaseId);
309
310
  }
310
311
  catch {
311
312
  // Batch catalog discovery is best-effort per authority, matching the
312
313
  // existing direct-cap path's treatment of unreadable work objects.
313
314
  }
314
- }
315
+ });
315
316
  return caps.flatMap((cap) => {
316
317
  const releaseId = releasesByVault.get(cap.vaultId);
317
318
  return releaseId ? [{ id: cap.id, releaseId }] : [];
@@ -321,9 +322,9 @@ const resolveVaultedReleaseCaps = Effect.fn("resolveVaultedReleaseCaps")(functio
321
322
  * Every work the wallet administers, keyed by its ADMIN CAP id (the studio
322
323
  * catalog's routing unit — caps are what control means here).
323
324
  *
324
- * Three transports, one answer: direct or vaulted cap discovery is gRPC; one aliased GraphQL
325
- * request maps every share type to its work address (gRPC cannot ask "which
326
- * object has type X"); one gRPC batch loads all the work contents. Releases skip
325
+ * Three transports, one answer: direct or vaulted cap discovery is Core; one aliased GraphQL
326
+ * request maps every share type to its work address (Core cannot ask "which
327
+ * object has type X"); one Core batch loads all the work contents. Releases skip
327
328
  * the GraphQL hop entirely — `ReleaseAdminCap` is not generic and carries
328
329
  * `release_id` directly.
329
330
  */
@@ -332,13 +333,13 @@ export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (owner, config
332
333
  const [directCompCaps, directRecCaps, directRelCaps, vaulted] = yield* Effect.all([
333
334
  ownedGenericCaps(owner, `${miso}::composition::CompositionAdminCap`),
334
335
  ownedGenericCaps(owner, `${miso}::recording::RecordingAdminCap`),
335
- getOwnedReleaseAdminCaps(owner, miso),
336
+ withMusicos(miso, (musicos) => musicos.getOwnedReleaseAdminCaps(SuiAddress.make(normalizeSuiAddress(owner)))),
336
337
  ownedVaultedWorkCaps(owner, config),
337
338
  ]);
338
339
  const vaultedRelCaps = yield* resolveVaultedReleaseCaps(vaulted.releases, config);
339
340
  const compCaps = [...directCompCaps, ...vaulted.compositions];
340
341
  const recCaps = [...directRecCaps, ...vaulted.recordings];
341
- const relCaps = [...directRelCaps, ...vaultedRelCaps];
342
+ const relCaps = [...directRelCaps.map((cap) => ({ id: String(cap.id), releaseId: String(cap.id) })), ...vaultedRelCaps];
342
343
  const addresses = yield* getWorkAddressesByShareTypes({ compositions: compCaps.map((c) => c.shareType), recordings: recCaps.map((c) => c.shareType) }, miso);
343
344
  const works = yield* getWorksByIds({
344
345
  compositions: Object.values(addresses.compositions).filter((id) => id !== undefined),
@@ -377,7 +378,8 @@ export const getOwnedWorks = Effect.fn("getOwnedWorks")(function* (owner, config
377
378
  /** Classify a direct or vaulted cap by its on-chain type, then resolve its work. */
378
379
  export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config) {
379
380
  const miso = config.deployment.musicos;
380
- const found = yield* getOptionalObjectContent(capId);
381
+ const sui = yield* Sui;
382
+ const found = yield* sui.getObjectOption(ObjectId.make(normalizeSuiAddress(capId)));
381
383
  if (Option.isNone(found))
382
384
  return null;
383
385
  const { content, type } = found.value;
@@ -411,7 +413,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
411
413
  if (direct?.kind === "release") {
412
414
  // `ReleaseAdminCap`'s BCS carries `release_id` directly — no `json` include needed.
413
415
  const { release_id: releaseId } = networkContracts.release.ReleaseAdminCap.parse(content);
414
- const r = yield* getReleaseById(releaseId);
416
+ const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseId)));
415
417
  return {
416
418
  capId,
417
419
  kind: "release",
@@ -422,6 +424,13 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
422
424
  trackCount: r.tracks.length,
423
425
  };
424
426
  }
427
+ // Every direct classification above already fell through: this cap can
428
+ // only be a legitimate work authority if it is a vaulted one, which
429
+ // requires the deployment's Vault package id (B1, misofm/sdks#35
430
+ // verification) — fail typed rather than misreport "no such work".
431
+ if (config.protocol.vault === null) {
432
+ return yield* new OperationsUnavailableError({ reason: "no current or legacy Vault package id is configured for this deployment" });
433
+ }
425
434
  const vaulted = classifyVaultedWorkAdminCapType(type, config.protocol.vault, miso);
426
435
  if (!vaulted) {
427
436
  // A real object, but not a supported work authority — "no such work",
@@ -456,7 +465,7 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
456
465
  const [releaseCap] = yield* resolveVaultedReleaseCaps([{ id: capId, vaultId }], config);
457
466
  if (!releaseCap)
458
467
  throw new Error(`Release vault ${vaultId} carries no release admin cap`);
459
- const r = yield* getReleaseById(releaseCap.releaseId);
468
+ const r = yield* withMusicos(miso, (musicos) => musicos.getReleaseById(ObjectId.make(releaseCap.releaseId)));
460
469
  return {
461
470
  capId,
462
471
  kind: "release",
@@ -468,59 +477,37 @@ export const getWorkByCap = Effect.fn("getWorkByCap")(function* (capId, config)
468
477
  };
469
478
  });
470
479
  // ── Balance ──────────────────────────────────────────────────────────────────
471
- const decimalsByClient = new WeakMap();
472
- /**
473
- * Resolve once per (transport client, coin type). Failed lookups are evicted so
474
- * a transient fullnode error cannot poison a long-lived API worker.
475
- */
476
- function coinDecimalsPromise(client, coinType) {
477
- let cache = decimalsByClient.get(client);
478
- if (!cache) {
479
- cache = new Map();
480
- decimalsByClient.set(client, cache);
481
- }
482
- const key = normalizeStructTag(coinType);
483
- const cached = cache.get(key);
484
- if (cached)
485
- return cached;
486
- const pending = client.core.getCoinMetadata({ coinType: key }).then(({ coinMetadata }) => {
487
- const decimals = coinMetadata?.decimals;
488
- if (!Number.isSafeInteger(decimals) || decimals < 0 || decimals > 18) {
489
- throw new Error(`Coin metadata for ${key} has no supported decimal precision`);
490
- }
491
- return decimals;
492
- });
493
- cache.set(key, pending);
494
- pending.catch(() => {
495
- if (cache.get(key) === pending)
496
- cache.delete(key);
497
- });
498
- return pending;
499
- }
500
480
  /**
501
481
  * A wallet's balance in one currency. Keep the aggregate and both Sui storage
502
482
  * classes: callers using a `FundsWithdrawal` must never mistake coin-object
503
483
  * value for immediately withdrawable address balance.
484
+ *
485
+ * TODO(stage 2/3): the predecessor cached `getCoinMetadata` per (transport
486
+ * client, coin type) in a module-level `WeakMap`. This standalone function has
487
+ * no layer to hold an `Effect.cachedWithTTL`-backed cache in (the issue's own
488
+ * target design for this); dropped rather than reintroducing a module-level
489
+ * cache keyed on a raw client object, which `Sui`'s per-call service instance
490
+ * makes awkward to key by. Revisit once this becomes a `Miso.read.getBalance`
491
+ * service member with a layer to hold the cache.
504
492
  */
505
493
  export const getBalance = Effect.fn("getBalance")(function* (address, config, coinType) {
506
- const client = yield* SuiClient;
494
+ const sui = yield* Sui;
507
495
  const type = coinType ?? config.money.usdCoinType;
508
- const [res, decimals] = yield* Effect.all([
509
- Effect.tryPromise({
510
- try: (signal) => client.core.getBalance({ owner: address, coinType: type, signal }),
511
- catch: (cause) => new SuiRpcError({ operation: "getBalance", cause }),
512
- }),
513
- Effect.tryPromise({
514
- try: () => coinDecimalsPromise(client, type),
515
- catch: (cause) => new SuiRpcError({ operation: "getCoinMetadata", cause }),
516
- }),
496
+ const [balance, metadata] = yield* Effect.all([
497
+ sui.getBalance(SuiAddress.make(normalizeSuiAddress(address)), CoinType.make(normalizeStructTag(type))),
498
+ sui.core.getCoinMetadata({ coinType: normalizeStructTag(type) }),
517
499
  ]);
500
+ const rawDecimals = metadata.coinMetadata?.decimals;
501
+ if (!Number.isSafeInteger(rawDecimals) || rawDecimals < 0 || rawDecimals > 18) {
502
+ return yield* new DecodeError({ expectedType: type, issue: `coin metadata for ${type} has no supported decimal precision` });
503
+ }
504
+ const decimals = rawDecimals;
518
505
  return {
519
506
  address: normalizeSuiAddress(address),
520
507
  coinType: type,
521
- balance: u64(res.balance.balance),
522
- coinBalance: u64(res.balance.coinBalance),
523
- addressBalance: u64(res.balance.addressBalance),
508
+ balance: u64(balance.balance),
509
+ coinBalance: u64(balance.coinBalance),
510
+ addressBalance: u64(balance.addressBalance),
524
511
  decimals,
525
512
  };
526
513
  });
@@ -540,12 +527,9 @@ function isAddressOwner(owner, address) {
540
527
  */
541
528
  export const ownsParty = Effect.fn("ownsParty")(function* (address, partyId, config) {
542
529
  const capId = derivePartyAdminCapId(partyId, config.partyos.partyos);
543
- const client = yield* SuiClient;
544
- const isOwner = yield* Effect.tryPromise({
545
- try: (signal) => client.core.getObject({ objectId: capId, signal }),
546
- catch: (cause) => cause,
547
- }).pipe(Effect.map(({ object }) => isAddressOwner(object?.owner, address)), Effect.catch(() => Effect.succeed(false)));
548
- return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId };
530
+ const sui = yield* Sui;
531
+ const isOwner = yield* sui.getObject(ObjectId.make(capId)).pipe(Effect.map((object) => isAddressOwner(object.owner, address)), Effect.catch(() => Effect.succeed(false)));
532
+ return { address: normalizeSuiAddress(address), objectId: partyId, isOwner, capId: String(capId) };
549
533
  });
550
534
  /**
551
535
  * Whether `address` owns a record. Records are address-owned objects, so this is
@@ -554,11 +538,8 @@ export const ownsParty = Effect.fn("ownsParty")(function* (address, partyId, con
554
538
  * fetch regardless.
555
539
  */
556
540
  export const ownsRecord = Effect.fn("ownsRecord")(function* (address, recordId) {
557
- const client = yield* SuiClient;
558
- const isOwner = yield* Effect.tryPromise({
559
- try: (signal) => client.core.getObject({ objectId: recordId, signal }),
560
- catch: (cause) => cause,
561
- }).pipe(Effect.map(({ object }) => isAddressOwner(object?.owner, address)), Effect.catch(() => Effect.succeed(false)));
541
+ const sui = yield* Sui;
542
+ const isOwner = yield* sui.getObject(ObjectId.make(normalizeSuiAddress(recordId))).pipe(Effect.map((object) => isAddressOwner(object.owner, address)), Effect.catch(() => Effect.succeed(false)));
562
543
  return { address: normalizeSuiAddress(address), objectId: recordId, isOwner };
563
544
  });
564
545
  //# sourceMappingURL=wallet.js.map