@nodaro/sdk 2.29.0 → 2.31.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.
- package/README.md +31 -0
- package/dist/chunk-2DZWWIJ4.cjs +32 -0
- package/dist/chunk-2DZWWIJ4.cjs.map +1 -0
- package/dist/chunk-34PU2DAT.cjs +118 -0
- package/dist/chunk-34PU2DAT.cjs.map +1 -0
- package/dist/chunk-37Y5QAVA.js +3 -0
- package/dist/chunk-37Y5QAVA.js.map +1 -0
- package/dist/chunk-37YCKZX4.cjs +4 -0
- package/dist/chunk-37YCKZX4.cjs.map +1 -0
- package/dist/chunk-3B47IHB3.cjs +65 -0
- package/dist/chunk-3B47IHB3.cjs.map +1 -0
- package/dist/chunk-3BELHJBN.cjs +4 -0
- package/dist/chunk-3BELHJBN.cjs.map +1 -0
- package/dist/chunk-3PPSGM5X.js +3 -0
- package/dist/chunk-3PPSGM5X.js.map +1 -0
- package/dist/chunk-3QBH2VE2.cjs +80 -0
- package/dist/chunk-3QBH2VE2.cjs.map +1 -0
- package/dist/chunk-3QFTP5P5.js +102 -0
- package/dist/chunk-3QFTP5P5.js.map +1 -0
- package/dist/chunk-43FVH6LJ.cjs +123 -0
- package/dist/chunk-43FVH6LJ.cjs.map +1 -0
- package/dist/chunk-43NO4SGC.cjs +4 -0
- package/dist/chunk-43NO4SGC.cjs.map +1 -0
- package/dist/chunk-45CK55BH.cjs +4 -0
- package/dist/chunk-45CK55BH.cjs.map +1 -0
- package/dist/chunk-4NLVBYMW.js +280 -0
- package/dist/chunk-4NLVBYMW.js.map +1 -0
- package/dist/chunk-4WRDR4GN.js +102 -0
- package/dist/chunk-4WRDR4GN.js.map +1 -0
- package/dist/chunk-4WWSHV5G.cjs +4 -0
- package/dist/chunk-4WWSHV5G.cjs.map +1 -0
- package/dist/chunk-53SXNN3A.js +80 -0
- package/dist/chunk-53SXNN3A.js.map +1 -0
- package/dist/chunk-5ALNFATQ.cjs +27 -0
- package/dist/chunk-5ALNFATQ.cjs.map +1 -0
- package/dist/chunk-5UQNMNUE.cjs +4 -0
- package/dist/chunk-5UQNMNUE.cjs.map +1 -0
- package/dist/chunk-5WAI7VGO.js +184 -0
- package/dist/chunk-5WAI7VGO.js.map +1 -0
- package/dist/chunk-65E3JBFZ.js +52 -0
- package/dist/chunk-65E3JBFZ.js.map +1 -0
- package/dist/chunk-6JFNBAKV.js +3 -0
- package/dist/chunk-6JFNBAKV.js.map +1 -0
- package/dist/chunk-6OC6OKLY.cjs +4 -0
- package/dist/chunk-6OC6OKLY.cjs.map +1 -0
- package/dist/chunk-6OGGJQVA.js +25 -0
- package/dist/chunk-6OGGJQVA.js.map +1 -0
- package/dist/chunk-7A7HYFGM.js +3 -0
- package/dist/chunk-7A7HYFGM.js.map +1 -0
- package/dist/chunk-7ISSKQ6S.cjs +106 -0
- package/dist/chunk-7ISSKQ6S.cjs.map +1 -0
- package/dist/chunk-7LSFG2AF.js +194 -0
- package/dist/chunk-7LSFG2AF.js.map +1 -0
- package/dist/chunk-7MYKT2L4.cjs +4 -0
- package/dist/chunk-7MYKT2L4.cjs.map +1 -0
- package/dist/chunk-7QOCWJKD.cjs +25 -0
- package/dist/chunk-7QOCWJKD.cjs.map +1 -0
- package/dist/chunk-A2ZAFAWC.cjs +4 -0
- package/dist/chunk-A2ZAFAWC.cjs.map +1 -0
- package/dist/chunk-A3S55XGF.cjs +54 -0
- package/dist/chunk-A3S55XGF.cjs.map +1 -0
- package/dist/chunk-A3THLBFG.js +3 -0
- package/dist/chunk-A3THLBFG.js.map +1 -0
- package/dist/chunk-AJVSMNPZ.js +78 -0
- package/dist/chunk-AJVSMNPZ.js.map +1 -0
- package/dist/chunk-ALSLZG3U.js +124 -0
- package/dist/chunk-ALSLZG3U.js.map +1 -0
- package/dist/chunk-ALUUBPDG.cjs +4 -0
- package/dist/chunk-ALUUBPDG.cjs.map +1 -0
- package/dist/chunk-AO3W45LT.cjs +4 -0
- package/dist/chunk-AO3W45LT.cjs.map +1 -0
- package/dist/chunk-AUDHV3OE.js +3 -0
- package/dist/chunk-AUDHV3OE.js.map +1 -0
- package/dist/chunk-BAL576G2.cjs +4 -0
- package/dist/chunk-BAL576G2.cjs.map +1 -0
- package/dist/chunk-BFMKPELU.cjs +212 -0
- package/dist/chunk-BFMKPELU.cjs.map +1 -0
- package/dist/chunk-BKP6F2IX.js +3 -0
- package/dist/chunk-BKP6F2IX.js.map +1 -0
- package/dist/chunk-BLA44UCM.js +32 -0
- package/dist/chunk-BLA44UCM.js.map +1 -0
- package/dist/chunk-BPWUWUZ3.cjs +20 -0
- package/dist/chunk-BPWUWUZ3.cjs.map +1 -0
- package/dist/chunk-BRV7Z4GD.cjs +17 -0
- package/dist/chunk-BRV7Z4GD.cjs.map +1 -0
- package/dist/chunk-BU5A6K4C.js +122 -0
- package/dist/chunk-BU5A6K4C.js.map +1 -0
- package/dist/chunk-C22RJDW3.js +3 -0
- package/dist/chunk-C22RJDW3.js.map +1 -0
- package/dist/chunk-CGNVHN4V.js +3 -0
- package/dist/chunk-CGNVHN4V.js.map +1 -0
- package/dist/chunk-CJFIOVBA.js +3 -0
- package/dist/chunk-CJFIOVBA.js.map +1 -0
- package/dist/chunk-CJLLIVSB.cjs +4 -0
- package/dist/chunk-CJLLIVSB.cjs.map +1 -0
- package/dist/chunk-CK3AMMSC.js +194 -0
- package/dist/chunk-CK3AMMSC.js.map +1 -0
- package/dist/chunk-COCKKMNP.cjs +205 -0
- package/dist/chunk-COCKKMNP.cjs.map +1 -0
- package/dist/chunk-CR5E2SF3.cjs +212 -0
- package/dist/chunk-CR5E2SF3.cjs.map +1 -0
- package/dist/chunk-CRCPRZFN.js +3 -0
- package/dist/chunk-CRCPRZFN.js.map +1 -0
- package/dist/chunk-CYRFD6KR.cjs +4 -0
- package/dist/chunk-CYRFD6KR.cjs.map +1 -0
- package/dist/chunk-D3PW7AHZ.js +3 -0
- package/dist/chunk-D3PW7AHZ.js.map +1 -0
- package/dist/chunk-DKEYSJCE.cjs +82 -0
- package/dist/chunk-DKEYSJCE.cjs.map +1 -0
- package/dist/chunk-DPSMVOM3.js +15 -0
- package/dist/chunk-DPSMVOM3.js.map +1 -0
- package/dist/chunk-E2ZXHS6E.js +20 -0
- package/dist/chunk-E2ZXHS6E.js.map +1 -0
- package/dist/chunk-E37CVHWW.js +33 -0
- package/dist/chunk-E37CVHWW.js.map +1 -0
- package/dist/chunk-E5BM4BLO.js +78 -0
- package/dist/chunk-E5BM4BLO.js.map +1 -0
- package/dist/chunk-EHRWTYGR.cjs +4 -0
- package/dist/chunk-EHRWTYGR.cjs.map +1 -0
- package/dist/chunk-EJSGJDZY.js +212 -0
- package/dist/chunk-EJSGJDZY.js.map +1 -0
- package/dist/chunk-ELSOVJPF.js +3 -0
- package/dist/chunk-ELSOVJPF.js.map +1 -0
- package/dist/chunk-ERLXU47J.js +29 -0
- package/dist/chunk-ERLXU47J.js.map +1 -0
- package/dist/chunk-ES2E65HT.js +3 -0
- package/dist/chunk-ES2E65HT.js.map +1 -0
- package/dist/chunk-EXLAHZKF.js +3 -0
- package/dist/chunk-EXLAHZKF.js.map +1 -0
- package/dist/chunk-FHEYAW5H.js +3 -0
- package/dist/chunk-FHEYAW5H.js.map +1 -0
- package/dist/chunk-GA4LZZKQ.cjs +104 -0
- package/dist/chunk-GA4LZZKQ.cjs.map +1 -0
- package/dist/chunk-GAZJ2PA3.js +3 -0
- package/dist/chunk-GAZJ2PA3.js.map +1 -0
- package/dist/chunk-GB6C5OEZ.cjs +32 -0
- package/dist/chunk-GB6C5OEZ.cjs.map +1 -0
- package/dist/chunk-GD24ZRFD.js +3 -0
- package/dist/chunk-GD24ZRFD.js.map +1 -0
- package/dist/chunk-GI7LROLL.cjs +4 -0
- package/dist/chunk-GI7LROLL.cjs.map +1 -0
- package/dist/chunk-GRFLPEM2.cjs +16 -0
- package/dist/chunk-GRFLPEM2.cjs.map +1 -0
- package/dist/chunk-GVIFLUYZ.cjs +40 -0
- package/dist/chunk-GVIFLUYZ.cjs.map +1 -0
- package/dist/chunk-H7VQTG4M.js +35 -0
- package/dist/chunk-H7VQTG4M.js.map +1 -0
- package/dist/chunk-HAKYPZLB.cjs +242 -0
- package/dist/chunk-HAKYPZLB.cjs.map +1 -0
- package/dist/chunk-HFBR6G36.js +3 -0
- package/dist/chunk-HFBR6G36.js.map +1 -0
- package/dist/chunk-HGCVWOGK.cjs +209 -0
- package/dist/chunk-HGCVWOGK.cjs.map +1 -0
- package/dist/chunk-HLHR3R4P.js +3 -0
- package/dist/chunk-HLHR3R4P.js.map +1 -0
- package/dist/chunk-HRXXGGSJ.js +3 -0
- package/dist/chunk-HRXXGGSJ.js.map +1 -0
- package/dist/chunk-I3TYBAOX.js +3 -0
- package/dist/chunk-I3TYBAOX.js.map +1 -0
- package/dist/chunk-I4A5VJRL.js +352 -0
- package/dist/chunk-I4A5VJRL.js.map +1 -0
- package/dist/chunk-I6CXC345.js +102 -0
- package/dist/chunk-I6CXC345.js.map +1 -0
- package/dist/chunk-IGOPUMEX.cjs +4 -0
- package/dist/chunk-IGOPUMEX.cjs.map +1 -0
- package/dist/chunk-IHKIYVZQ.js +30 -0
- package/dist/chunk-IHKIYVZQ.js.map +1 -0
- package/dist/chunk-IMC2M5YM.cjs +12 -0
- package/dist/chunk-IMC2M5YM.cjs.map +1 -0
- package/dist/chunk-IQ6KWSXP.js +3 -0
- package/dist/chunk-IQ6KWSXP.js.map +1 -0
- package/dist/chunk-IS26FJO7.cjs +4 -0
- package/dist/chunk-IS26FJO7.cjs.map +1 -0
- package/dist/chunk-J4WFSKY6.js +50 -0
- package/dist/chunk-J4WFSKY6.js.map +1 -0
- package/dist/chunk-J5LGGCAS.cjs +126 -0
- package/dist/chunk-J5LGGCAS.cjs.map +1 -0
- package/dist/chunk-JDEZHITT.js +43 -0
- package/dist/chunk-JDEZHITT.js.map +1 -0
- package/dist/chunk-JGS6YBDW.js +260 -0
- package/dist/chunk-JGS6YBDW.js.map +1 -0
- package/dist/chunk-JMOKD6ZP.js +46 -0
- package/dist/chunk-JMOKD6ZP.js.map +1 -0
- package/dist/chunk-JOX5BJ6K.cjs +4 -0
- package/dist/chunk-JOX5BJ6K.cjs.map +1 -0
- package/dist/chunk-JTAW54UM.js +116 -0
- package/dist/chunk-JTAW54UM.js.map +1 -0
- package/dist/chunk-K4RQOSJH.js +203 -0
- package/dist/chunk-K4RQOSJH.js.map +1 -0
- package/dist/chunk-KAIE6WJB.cjs +4 -0
- package/dist/chunk-KAIE6WJB.cjs.map +1 -0
- package/dist/chunk-KEDPGWIK.cjs +4 -0
- package/dist/chunk-KEDPGWIK.cjs.map +1 -0
- package/dist/chunk-KG4R454Z.js +18 -0
- package/dist/chunk-KG4R454Z.js.map +1 -0
- package/dist/chunk-KGKCAGRD.cjs +22 -0
- package/dist/chunk-KGKCAGRD.cjs.map +1 -0
- package/dist/chunk-KNMW722T.cjs +48 -0
- package/dist/chunk-KNMW722T.cjs.map +1 -0
- package/dist/chunk-KTTL7BND.cjs +4 -0
- package/dist/chunk-KTTL7BND.cjs.map +1 -0
- package/dist/chunk-KXEWTYS4.cjs +80 -0
- package/dist/chunk-KXEWTYS4.cjs.map +1 -0
- package/dist/chunk-KZQKFBRN.js +3 -0
- package/dist/chunk-KZQKFBRN.js.map +1 -0
- package/dist/chunk-LAWYFC4G.cjs +37 -0
- package/dist/chunk-LAWYFC4G.cjs.map +1 -0
- package/dist/chunk-LHP2CWHD.js +228 -0
- package/dist/chunk-LHP2CWHD.js.map +1 -0
- package/dist/chunk-LHRQXWI5.js +3 -0
- package/dist/chunk-LHRQXWI5.js.map +1 -0
- package/dist/chunk-LKH5M44B.cjs +114 -0
- package/dist/chunk-LKH5M44B.cjs.map +1 -0
- package/dist/chunk-LLNNHLCE.cjs +4 -0
- package/dist/chunk-LLNNHLCE.cjs.map +1 -0
- package/dist/chunk-LWZLWSXD.cjs +4 -0
- package/dist/chunk-LWZLWSXD.cjs.map +1 -0
- package/dist/chunk-M6Y5TOYE.js +3 -0
- package/dist/chunk-M6Y5TOYE.js.map +1 -0
- package/dist/chunk-MBFUMWI5.cjs +31 -0
- package/dist/chunk-MBFUMWI5.cjs.map +1 -0
- package/dist/chunk-MEKI37WI.js +3 -0
- package/dist/chunk-MEKI37WI.js.map +1 -0
- package/dist/chunk-MQ74AKA2.cjs +200 -0
- package/dist/chunk-MQ74AKA2.cjs.map +1 -0
- package/dist/chunk-N6GLZOE4.cjs +282 -0
- package/dist/chunk-N6GLZOE4.cjs.map +1 -0
- package/dist/chunk-NBVARNVA.cjs +38 -0
- package/dist/chunk-NBVARNVA.cjs.map +1 -0
- package/dist/chunk-NCCBS6GU.js +42 -0
- package/dist/chunk-NCCBS6GU.js.map +1 -0
- package/dist/chunk-NGKODS3J.cjs +52 -0
- package/dist/chunk-NGKODS3J.cjs.map +1 -0
- package/dist/chunk-NJVSKUL2.cjs +4 -0
- package/dist/chunk-NJVSKUL2.cjs.map +1 -0
- package/dist/chunk-NLQQHJ25.cjs +104 -0
- package/dist/chunk-NLQQHJ25.cjs.map +1 -0
- package/dist/chunk-NNHWH7ER.js +181 -0
- package/dist/chunk-NNHWH7ER.js.map +1 -0
- package/dist/chunk-NX67YIF3.js +3 -0
- package/dist/chunk-NX67YIF3.js.map +1 -0
- package/dist/chunk-OA6FWYZF.cjs +4 -0
- package/dist/chunk-OA6FWYZF.cjs.map +1 -0
- package/dist/chunk-OJDBSKC2.js +3 -0
- package/dist/chunk-OJDBSKC2.js.map +1 -0
- package/dist/chunk-OLPA44QJ.js +3 -0
- package/dist/chunk-OLPA44QJ.js.map +1 -0
- package/dist/chunk-OMH7ATOQ.js +3 -0
- package/dist/chunk-OMH7ATOQ.js.map +1 -0
- package/dist/chunk-OPR4TULG.js +3 -0
- package/dist/chunk-OPR4TULG.js.map +1 -0
- package/dist/chunk-OSX2GVZ2.cjs +34 -0
- package/dist/chunk-OSX2GVZ2.cjs.map +1 -0
- package/dist/chunk-OXQKE5EG.cjs +282 -0
- package/dist/chunk-OXQKE5EG.cjs.map +1 -0
- package/dist/chunk-P6E4QDJN.js +30 -0
- package/dist/chunk-P6E4QDJN.js.map +1 -0
- package/dist/chunk-PEMLIAPZ.cjs +64 -0
- package/dist/chunk-PEMLIAPZ.cjs.map +1 -0
- package/dist/chunk-PGYQ754I.js +3 -0
- package/dist/chunk-PGYQ754I.js.map +1 -0
- package/dist/chunk-PHKYIWE4.cjs +16 -0
- package/dist/chunk-PHKYIWE4.cjs.map +1 -0
- package/dist/chunk-PMTM26LL.js +3 -0
- package/dist/chunk-PMTM26LL.js.map +1 -0
- package/dist/chunk-PY4OEKNX.cjs +4 -0
- package/dist/chunk-PY4OEKNX.cjs.map +1 -0
- package/dist/chunk-PZS2EXDR.cjs +4 -0
- package/dist/chunk-PZS2EXDR.cjs.map +1 -0
- package/dist/chunk-QITJGSFA.js +210 -0
- package/dist/chunk-QITJGSFA.js.map +1 -0
- package/dist/chunk-QRHJEITQ.cjs +4 -0
- package/dist/chunk-QRHJEITQ.cjs.map +1 -0
- package/dist/chunk-QUFU5RJ7.cjs +4 -0
- package/dist/chunk-QUFU5RJ7.cjs.map +1 -0
- package/dist/chunk-QVQCKOBM.js +3 -0
- package/dist/chunk-QVQCKOBM.js.map +1 -0
- package/dist/chunk-R63TTR35.cjs +200 -0
- package/dist/chunk-R63TTR35.cjs.map +1 -0
- package/dist/chunk-RA42NMWV.cjs +4 -0
- package/dist/chunk-RA42NMWV.cjs.map +1 -0
- package/dist/chunk-RAZN6C5R.cjs +12 -0
- package/dist/chunk-RAZN6C5R.cjs.map +1 -0
- package/dist/chunk-REUFPWM7.cjs +233 -0
- package/dist/chunk-REUFPWM7.cjs.map +1 -0
- package/dist/chunk-RHETJOUM.cjs +4 -0
- package/dist/chunk-RHETJOUM.cjs.map +1 -0
- package/dist/chunk-RJIJVVXS.js +3 -0
- package/dist/chunk-RJIJVVXS.js.map +1 -0
- package/dist/chunk-RKVRCNMB.js +3 -0
- package/dist/chunk-RKVRCNMB.js.map +1 -0
- package/dist/chunk-SBV5MWEL.cjs +53 -0
- package/dist/chunk-SBV5MWEL.cjs.map +1 -0
- package/dist/chunk-SFB4YLCS.js +121 -0
- package/dist/chunk-SFB4YLCS.js.map +1 -0
- package/dist/chunk-SLPD47SR.js +3 -0
- package/dist/chunk-SLPD47SR.js.map +1 -0
- package/dist/chunk-SS3B6PHT.cjs +35 -0
- package/dist/chunk-SS3B6PHT.cjs.map +1 -0
- package/dist/chunk-SUCHGNYT.js +3 -0
- package/dist/chunk-SUCHGNYT.js.map +1 -0
- package/dist/chunk-SYVNY3AH.cjs +44 -0
- package/dist/chunk-SYVNY3AH.cjs.map +1 -0
- package/dist/chunk-T3SYREY4.js +29 -0
- package/dist/chunk-T3SYREY4.js.map +1 -0
- package/dist/chunk-T7N7DFQJ.js +198 -0
- package/dist/chunk-T7N7DFQJ.js.map +1 -0
- package/dist/chunk-TRCENAIY.cjs +4 -0
- package/dist/chunk-TRCENAIY.cjs.map +1 -0
- package/dist/chunk-TVENC6PH.js +186 -0
- package/dist/chunk-TVENC6PH.js.map +1 -0
- package/dist/chunk-U4T3Z3K7.cjs +325 -0
- package/dist/chunk-U4T3Z3K7.cjs.map +1 -0
- package/dist/chunk-UI2NXUML.cjs +187 -0
- package/dist/chunk-UI2NXUML.cjs.map +1 -0
- package/dist/chunk-UIFFNTUX.js +3 -0
- package/dist/chunk-UIFFNTUX.js.map +1 -0
- package/dist/chunk-V4GPQ6Y2.js +3 -0
- package/dist/chunk-V4GPQ6Y2.js.map +1 -0
- package/dist/chunk-VGTRKXF2.js +93 -0
- package/dist/chunk-VGTRKXF2.js.map +1 -0
- package/dist/chunk-VGWOIWRQ.cjs +202 -0
- package/dist/chunk-VGWOIWRQ.cjs.map +1 -0
- package/dist/chunk-VLCNNA76.cjs +4 -0
- package/dist/chunk-VLCNNA76.cjs.map +1 -0
- package/dist/chunk-VPAUN75Q.js +3 -0
- package/dist/chunk-VPAUN75Q.js.map +1 -0
- package/dist/chunk-VT237QF2.js +3 -0
- package/dist/chunk-VT237QF2.js.map +1 -0
- package/dist/chunk-VV4TZG5S.js +321 -0
- package/dist/chunk-VV4TZG5S.js.map +1 -0
- package/dist/chunk-VYK6MBL4.cjs +4 -0
- package/dist/chunk-VYK6MBL4.cjs.map +1 -0
- package/dist/chunk-W33CKW6Q.cjs +4 -0
- package/dist/chunk-W33CKW6Q.cjs.map +1 -0
- package/dist/chunk-W5VHATSR.cjs +31 -0
- package/dist/chunk-W5VHATSR.cjs.map +1 -0
- package/dist/chunk-W7YI5UT3.js +3 -0
- package/dist/chunk-W7YI5UT3.js.map +1 -0
- package/dist/chunk-WEQWU2IC.js +34 -0
- package/dist/chunk-WEQWU2IC.js.map +1 -0
- package/dist/chunk-WK4VXPPZ.cjs +104 -0
- package/dist/chunk-WK4VXPPZ.cjs.map +1 -0
- package/dist/chunk-WSA4LMWR.cjs +96 -0
- package/dist/chunk-WSA4LMWR.cjs.map +1 -0
- package/dist/chunk-WUIEZ6Z4.cjs +360 -0
- package/dist/chunk-WUIEZ6Z4.cjs.map +1 -0
- package/dist/chunk-WUKIJJG2.cjs +45 -0
- package/dist/chunk-WUKIJJG2.cjs.map +1 -0
- package/dist/chunk-WVFAQBS7.js +29 -0
- package/dist/chunk-WVFAQBS7.js.map +1 -0
- package/dist/chunk-X7RDNMN7.js +3 -0
- package/dist/chunk-X7RDNMN7.js.map +1 -0
- package/dist/chunk-X7XP5WBP.cjs +4 -0
- package/dist/chunk-X7XP5WBP.cjs.map +1 -0
- package/dist/chunk-XQAIEPAZ.js +104 -0
- package/dist/chunk-XQAIEPAZ.js.map +1 -0
- package/dist/chunk-XWKNE6DH.cjs +4 -0
- package/dist/chunk-XWKNE6DH.cjs.map +1 -0
- package/dist/chunk-Y6V6CBY5.js +23 -0
- package/dist/chunk-Y6V6CBY5.js.map +1 -0
- package/dist/chunk-Y6VDCZPB.js +62 -0
- package/dist/chunk-Y6VDCZPB.js.map +1 -0
- package/dist/chunk-YDRXBRW2.cjs +184 -0
- package/dist/chunk-YDRXBRW2.cjs.map +1 -0
- package/dist/chunk-YFS2LMG4.cjs +124 -0
- package/dist/chunk-YFS2LMG4.cjs.map +1 -0
- package/dist/chunk-YN6CBIIB.js +63 -0
- package/dist/chunk-YN6CBIIB.js.map +1 -0
- package/dist/chunk-YOJ2XNQX.cjs +4 -0
- package/dist/chunk-YOJ2XNQX.cjs.map +1 -0
- package/dist/chunk-YOOZB4RL.js +3 -0
- package/dist/chunk-YOOZB4RL.js.map +1 -0
- package/dist/chunk-YVU2M7MI.js +34 -0
- package/dist/chunk-YVU2M7MI.js.map +1 -0
- package/dist/chunk-YXBZRB5H.cjs +4 -0
- package/dist/chunk-YXBZRB5H.cjs.map +1 -0
- package/dist/chunk-Z3ZKFI2M.js +43 -0
- package/dist/chunk-Z3ZKFI2M.js.map +1 -0
- package/dist/chunk-Z5GLY4R3.js +112 -0
- package/dist/chunk-Z5GLY4R3.js.map +1 -0
- package/dist/chunk-Z5OMWAQX.js +3 -0
- package/dist/chunk-Z5OMWAQX.js.map +1 -0
- package/dist/chunk-Z7LGWNI7.js +38 -0
- package/dist/chunk-Z7LGWNI7.js.map +1 -0
- package/dist/chunk-ZCWKX4V6.cjs +38 -0
- package/dist/chunk-ZCWKX4V6.cjs.map +1 -0
- package/dist/chunk-ZE5RISBZ.cjs +4 -0
- package/dist/chunk-ZE5RISBZ.cjs.map +1 -0
- package/dist/chunk-ZH4F2P2G.js +3 -0
- package/dist/chunk-ZH4F2P2G.js.map +1 -0
- package/dist/chunk-ZJGFLJ2Z.cjs +4 -0
- package/dist/chunk-ZJGFLJ2Z.cjs.map +1 -0
- package/dist/chunk-ZKBHD27K.cjs +4 -0
- package/dist/chunk-ZKBHD27K.cjs.map +1 -0
- package/dist/chunk-ZQPLRNKX.cjs +4 -0
- package/dist/chunk-ZQPLRNKX.cjs.map +1 -0
- package/dist/chunk-ZQQABQMH.cjs +31 -0
- package/dist/chunk-ZQQABQMH.cjs.map +1 -0
- package/dist/chunk-ZXJQSFIA.js +200 -0
- package/dist/chunk-ZXJQSFIA.js.map +1 -0
- package/dist/developer-apps-zSQXWmEG.d.cts +294 -0
- package/dist/developer-apps-zSQXWmEG.d.ts +294 -0
- package/dist/entries/apps.cjs +13 -0
- package/dist/entries/apps.cjs.map +1 -0
- package/dist/entries/apps.d.cts +300 -0
- package/dist/entries/apps.d.ts +300 -0
- package/dist/entries/apps.js +4 -0
- package/dist/entries/apps.js.map +1 -0
- package/dist/entries/audio.cjs +13 -0
- package/dist/entries/audio.cjs.map +1 -0
- package/dist/entries/audio.d.cts +200 -0
- package/dist/entries/audio.d.ts +200 -0
- package/dist/entries/audio.js +4 -0
- package/dist/entries/audio.js.map +1 -0
- package/dist/entries/billing.cjs +13 -0
- package/dist/entries/billing.cjs.map +1 -0
- package/dist/entries/billing.d.cts +208 -0
- package/dist/entries/billing.d.ts +208 -0
- package/dist/entries/billing.js +4 -0
- package/dist/entries/billing.js.map +1 -0
- package/dist/entries/catalogs.cjs +13 -0
- package/dist/entries/catalogs.cjs.map +1 -0
- package/dist/entries/catalogs.d.cts +82 -0
- package/dist/entries/catalogs.d.ts +82 -0
- package/dist/entries/catalogs.js +4 -0
- package/dist/entries/catalogs.js.map +1 -0
- package/dist/entries/characters.cjs +45 -0
- package/dist/entries/characters.cjs.map +1 -0
- package/dist/entries/characters.d.cts +741 -0
- package/dist/entries/characters.d.ts +741 -0
- package/dist/entries/characters.js +4 -0
- package/dist/entries/characters.js.map +1 -0
- package/dist/entries/client.cjs +78 -0
- package/dist/entries/client.cjs.map +1 -0
- package/dist/entries/client.d.cts +147 -0
- package/dist/entries/client.d.ts +147 -0
- package/dist/entries/client.js +53 -0
- package/dist/entries/client.js.map +1 -0
- package/dist/entries/collections.cjs +13 -0
- package/dist/entries/collections.cjs.map +1 -0
- package/dist/entries/collections.d.cts +77 -0
- package/dist/entries/collections.d.ts +77 -0
- package/dist/entries/collections.js +4 -0
- package/dist/entries/collections.js.map +1 -0
- package/dist/entries/community.cjs +13 -0
- package/dist/entries/community.cjs.map +1 -0
- package/dist/entries/community.d.cts +87 -0
- package/dist/entries/community.d.ts +87 -0
- package/dist/entries/community.js +4 -0
- package/dist/entries/community.js.map +1 -0
- package/dist/entries/competitors.cjs +13 -0
- package/dist/entries/competitors.cjs.map +1 -0
- package/dist/entries/competitors.d.cts +96 -0
- package/dist/entries/competitors.d.ts +96 -0
- package/dist/entries/competitors.js +4 -0
- package/dist/entries/competitors.js.map +1 -0
- package/dist/entries/copilot.cjs +15 -0
- package/dist/entries/copilot.cjs.map +1 -0
- package/dist/entries/copilot.d.cts +296 -0
- package/dist/entries/copilot.d.ts +296 -0
- package/dist/entries/copilot.js +6 -0
- package/dist/entries/copilot.js.map +1 -0
- package/dist/entries/core.cjs +26 -0
- package/dist/entries/core.cjs.map +1 -0
- package/dist/entries/core.d.cts +3 -0
- package/dist/entries/core.d.ts +3 -0
- package/dist/entries/core.js +5 -0
- package/dist/entries/core.js.map +1 -0
- package/dist/entries/creatures.cjs +29 -0
- package/dist/entries/creatures.cjs.map +1 -0
- package/dist/entries/creatures.d.cts +594 -0
- package/dist/entries/creatures.d.ts +594 -0
- package/dist/entries/creatures.js +4 -0
- package/dist/entries/creatures.js.map +1 -0
- package/dist/entries/credits.cjs +13 -0
- package/dist/entries/credits.cjs.map +1 -0
- package/dist/entries/credits.d.cts +229 -0
- package/dist/entries/credits.d.ts +229 -0
- package/dist/entries/credits.js +4 -0
- package/dist/entries/credits.js.map +1 -0
- package/dist/entries/developer-apps.cjs +13 -0
- package/dist/entries/developer-apps.cjs.map +1 -0
- package/dist/entries/developer-apps.d.cts +3 -0
- package/dist/entries/developer-apps.d.ts +3 -0
- package/dist/entries/developer-apps.js +4 -0
- package/dist/entries/developer-apps.js.map +1 -0
- package/dist/entries/edit.cjs +34 -0
- package/dist/entries/edit.cjs.map +1 -0
- package/dist/entries/edit.d.cts +705 -0
- package/dist/entries/edit.d.ts +705 -0
- package/dist/entries/edit.js +5 -0
- package/dist/entries/edit.js.map +1 -0
- package/dist/entries/errors.cjs +93 -0
- package/dist/entries/errors.cjs.map +1 -0
- package/dist/entries/errors.d.cts +338 -0
- package/dist/entries/errors.d.ts +338 -0
- package/dist/entries/errors.js +4 -0
- package/dist/entries/errors.js.map +1 -0
- package/dist/entries/executions.cjs +21 -0
- package/dist/entries/executions.cjs.map +1 -0
- package/dist/entries/executions.d.cts +120 -0
- package/dist/entries/executions.d.ts +120 -0
- package/dist/entries/executions.js +4 -0
- package/dist/entries/executions.js.map +1 -0
- package/dist/entries/gallery.cjs +13 -0
- package/dist/entries/gallery.cjs.map +1 -0
- package/dist/entries/gallery.d.cts +85 -0
- package/dist/entries/gallery.d.ts +85 -0
- package/dist/entries/gallery.js +4 -0
- package/dist/entries/gallery.js.map +1 -0
- package/dist/entries/jobs.cjs +13 -0
- package/dist/entries/jobs.cjs.map +1 -0
- package/dist/entries/jobs.d.cts +252 -0
- package/dist/entries/jobs.d.ts +252 -0
- package/dist/entries/jobs.js +4 -0
- package/dist/entries/jobs.js.map +1 -0
- package/dist/entries/library.cjs +13 -0
- package/dist/entries/library.cjs.map +1 -0
- package/dist/entries/library.d.cts +109 -0
- package/dist/entries/library.d.ts +109 -0
- package/dist/entries/library.js +4 -0
- package/dist/entries/library.js.map +1 -0
- package/dist/entries/llm.cjs +13 -0
- package/dist/entries/llm.cjs.map +1 -0
- package/dist/entries/llm.d.cts +98 -0
- package/dist/entries/llm.d.ts +98 -0
- package/dist/entries/llm.js +4 -0
- package/dist/entries/llm.js.map +1 -0
- package/dist/entries/locations.cjs +25 -0
- package/dist/entries/locations.cjs.map +1 -0
- package/dist/entries/locations.d.cts +573 -0
- package/dist/entries/locations.d.ts +573 -0
- package/dist/entries/locations.js +4 -0
- package/dist/entries/locations.js.map +1 -0
- package/dist/entries/media.cjs +15 -0
- package/dist/entries/media.cjs.map +1 -0
- package/dist/entries/media.d.cts +548 -0
- package/dist/entries/media.d.ts +548 -0
- package/dist/entries/media.js +6 -0
- package/dist/entries/media.js.map +1 -0
- package/dist/entries/models.cjs +13 -0
- package/dist/entries/models.cjs.map +1 -0
- package/dist/entries/models.d.cts +92 -0
- package/dist/entries/models.d.ts +92 -0
- package/dist/entries/models.js +4 -0
- package/dist/entries/models.js.map +1 -0
- package/dist/entries/moodboards.cjs +21 -0
- package/dist/entries/moodboards.cjs.map +1 -0
- package/dist/entries/moodboards.d.cts +77 -0
- package/dist/entries/moodboards.d.ts +77 -0
- package/dist/entries/moodboards.js +4 -0
- package/dist/entries/moodboards.js.map +1 -0
- package/dist/entries/node-presets.cjs +13 -0
- package/dist/entries/node-presets.cjs.map +1 -0
- package/dist/entries/node-presets.d.cts +217 -0
- package/dist/entries/node-presets.d.ts +217 -0
- package/dist/entries/node-presets.js +4 -0
- package/dist/entries/node-presets.js.map +1 -0
- package/dist/entries/nodes.cjs +22 -0
- package/dist/entries/nodes.cjs.map +1 -0
- package/dist/entries/nodes.d.cts +18 -0
- package/dist/entries/nodes.d.ts +18 -0
- package/dist/entries/nodes.js +5 -0
- package/dist/entries/nodes.js.map +1 -0
- package/dist/entries/oauth.cjs +13 -0
- package/dist/entries/oauth.cjs.map +1 -0
- package/dist/entries/oauth.d.cts +69 -0
- package/dist/entries/oauth.d.ts +69 -0
- package/dist/entries/oauth.js +4 -0
- package/dist/entries/oauth.js.map +1 -0
- package/dist/entries/objects.cjs +29 -0
- package/dist/entries/objects.cjs.map +1 -0
- package/dist/entries/objects.d.cts +544 -0
- package/dist/entries/objects.d.ts +544 -0
- package/dist/entries/objects.js +4 -0
- package/dist/entries/objects.js.map +1 -0
- package/dist/entries/organizations.cjs +21 -0
- package/dist/entries/organizations.cjs.map +1 -0
- package/dist/entries/organizations.d.cts +164 -0
- package/dist/entries/organizations.d.ts +164 -0
- package/dist/entries/organizations.js +4 -0
- package/dist/entries/organizations.js.map +1 -0
- package/dist/entries/palettes.cjs +21 -0
- package/dist/entries/palettes.cjs.map +1 -0
- package/dist/entries/palettes.d.cts +69 -0
- package/dist/entries/palettes.d.ts +69 -0
- package/dist/entries/palettes.js +4 -0
- package/dist/entries/palettes.js.map +1 -0
- package/dist/entries/picker-catalogs.cjs +13 -0
- package/dist/entries/picker-catalogs.cjs.map +1 -0
- package/dist/entries/picker-catalogs.d.cts +148 -0
- package/dist/entries/picker-catalogs.d.ts +148 -0
- package/dist/entries/picker-catalogs.js +4 -0
- package/dist/entries/picker-catalogs.js.map +1 -0
- package/dist/entries/pipelines.cjs +13 -0
- package/dist/entries/pipelines.cjs.map +1 -0
- package/dist/entries/pipelines.d.cts +255 -0
- package/dist/entries/pipelines.d.ts +255 -0
- package/dist/entries/pipelines.js +4 -0
- package/dist/entries/pipelines.js.map +1 -0
- package/dist/entries/projects.cjs +13 -0
- package/dist/entries/projects.cjs.map +1 -0
- package/dist/entries/projects.d.cts +49 -0
- package/dist/entries/projects.d.ts +49 -0
- package/dist/entries/projects.js +4 -0
- package/dist/entries/projects.js.map +1 -0
- package/dist/entries/prompt-helper.cjs +13 -0
- package/dist/entries/prompt-helper.cjs.map +1 -0
- package/dist/entries/prompt-helper.d.cts +73 -0
- package/dist/entries/prompt-helper.d.ts +73 -0
- package/dist/entries/prompt-helper.js +4 -0
- package/dist/entries/prompt-helper.js.map +1 -0
- package/dist/entries/recast.cjs +17 -0
- package/dist/entries/recast.cjs.map +1 -0
- package/dist/entries/recast.d.cts +229 -0
- package/dist/entries/recast.d.ts +229 -0
- package/dist/entries/recast.js +4 -0
- package/dist/entries/recast.js.map +1 -0
- package/dist/entries/reduce.cjs +13 -0
- package/dist/entries/reduce.cjs.map +1 -0
- package/dist/entries/reduce.d.cts +56 -0
- package/dist/entries/reduce.d.ts +56 -0
- package/dist/entries/reduce.js +4 -0
- package/dist/entries/reduce.js.map +1 -0
- package/dist/entries/saved-posts.cjs +13 -0
- package/dist/entries/saved-posts.cjs.map +1 -0
- package/dist/entries/saved-posts.d.cts +33 -0
- package/dist/entries/saved-posts.d.ts +33 -0
- package/dist/entries/saved-posts.js +4 -0
- package/dist/entries/saved-posts.js.map +1 -0
- package/dist/entries/scene3d.cjs +17 -0
- package/dist/entries/scene3d.cjs.map +1 -0
- package/dist/entries/scene3d.d.cts +131 -0
- package/dist/entries/scene3d.d.ts +131 -0
- package/dist/entries/scene3d.js +4 -0
- package/dist/entries/scene3d.js.map +1 -0
- package/dist/entries/sessions.cjs +13 -0
- package/dist/entries/sessions.cjs.map +1 -0
- package/dist/entries/sessions.d.cts +122 -0
- package/dist/entries/sessions.d.ts +122 -0
- package/dist/entries/sessions.js +4 -0
- package/dist/entries/sessions.js.map +1 -0
- package/dist/entries/shots.cjs +13 -0
- package/dist/entries/shots.cjs.map +1 -0
- package/dist/entries/shots.d.cts +78 -0
- package/dist/entries/shots.d.ts +78 -0
- package/dist/entries/shots.js +4 -0
- package/dist/entries/shots.js.map +1 -0
- package/dist/entries/studio.cjs +22 -0
- package/dist/entries/studio.cjs.map +1 -0
- package/dist/entries/studio.d.cts +281 -0
- package/dist/entries/studio.d.ts +281 -0
- package/dist/entries/studio.js +5 -0
- package/dist/entries/studio.js.map +1 -0
- package/dist/entries/templates.cjs +13 -0
- package/dist/entries/templates.cjs.map +1 -0
- package/dist/entries/templates.d.cts +110 -0
- package/dist/entries/templates.d.ts +110 -0
- package/dist/entries/templates.js +4 -0
- package/dist/entries/templates.js.map +1 -0
- package/dist/entries/tutorials.cjs +13 -0
- package/dist/entries/tutorials.cjs.map +1 -0
- package/dist/entries/tutorials.d.cts +63 -0
- package/dist/entries/tutorials.d.ts +63 -0
- package/dist/entries/tutorials.js +4 -0
- package/dist/entries/tutorials.js.map +1 -0
- package/dist/entries/uploads.cjs +13 -0
- package/dist/entries/uploads.cjs.map +1 -0
- package/dist/entries/uploads.d.cts +44 -0
- package/dist/entries/uploads.d.ts +44 -0
- package/dist/entries/uploads.js +4 -0
- package/dist/entries/uploads.js.map +1 -0
- package/dist/entries/video-pro.cjs +13 -0
- package/dist/entries/video-pro.cjs.map +1 -0
- package/dist/entries/video-pro.d.cts +60 -0
- package/dist/entries/video-pro.d.ts +60 -0
- package/dist/entries/video-pro.js +4 -0
- package/dist/entries/video-pro.js.map +1 -0
- package/dist/entries/voices.cjs +13 -0
- package/dist/entries/voices.cjs.map +1 -0
- package/dist/entries/voices.d.cts +498 -0
- package/dist/entries/voices.d.ts +498 -0
- package/dist/entries/voices.js +4 -0
- package/dist/entries/voices.js.map +1 -0
- package/dist/entries/webhooks.cjs +21 -0
- package/dist/entries/webhooks.cjs.map +1 -0
- package/dist/entries/webhooks.d.cts +64 -0
- package/dist/entries/webhooks.d.ts +64 -0
- package/dist/entries/webhooks.js +4 -0
- package/dist/entries/webhooks.js.map +1 -0
- package/dist/entries/workflows.cjs +13 -0
- package/dist/entries/workflows.cjs.map +1 -0
- package/dist/entries/workflows.d.cts +393 -0
- package/dist/entries/workflows.d.ts +393 -0
- package/dist/entries/workflows.js +4 -0
- package/dist/entries/workflows.js.map +1 -0
- package/dist/entries/workspaces.cjs +13 -0
- package/dist/entries/workspaces.cjs.map +1 -0
- package/dist/entries/workspaces.d.cts +124 -0
- package/dist/entries/workspaces.d.ts +124 -0
- package/dist/entries/workspaces.js +4 -0
- package/dist/entries/workspaces.js.map +1 -0
- package/dist/index.cjs +501 -5192
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +66 -10894
- package/dist/index.d.ts +66 -10894
- package/dist/index.js +100 -5074
- package/dist/index.js.map +1 -1
- package/dist/nodes-BPvrAoUs.d.cts +1264 -0
- package/dist/nodes-C2zu3uqn.d.ts +1264 -0
- package/dist/studio-productions-DUHvdSvk.d.cts +572 -0
- package/dist/studio-productions-vbCNSbtf.d.ts +572 -0
- package/dist/webhooks-BJawEIz8.d.ts +198 -0
- package/dist/webhooks-Dn_DtNTD.d.cts +198 -0
- package/package.json +253 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resources/picker-catalogs.ts"],"names":[],"mappings":";AAiIO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAAoB,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAA3B,MAAA;AAAA;AAAA,EAGpB,IAAA,GAAkD;AAChD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,qBAAqB,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA,EAIA,YAAY,MAAA,EAAyD;AACnE,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAQ,MAAA,EAAQ,sBAAsB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,GAAA,CAAI,QAAA,EAAkB,IAAA,GAAgC,EAAC,EAAqC;AAC1F,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,IAAI,KAAK,MAAA,EAAQ,EAAA,CAAG,GAAA,CAAI,QAAA,EAAU,KAAK,MAAM,CAAA;AAC7C,IAAA,IAAI,KAAK,QAAA,EAAU,EAAA,CAAG,GAAA,CAAI,UAAA,EAAY,KAAK,QAAQ,CAAA;AACnD,IAAA,IAAI,KAAK,KAAA,EAAO,EAAA,CAAG,GAAA,CAAI,OAAA,EAAS,KAAK,KAAK,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,GAAG,QAAA,EAAS;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,KAAA;AAAA,MACA,CAAA,oBAAA,EAAuB,mBAAmB,QAAQ,CAAC,GAAG,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA,KAChF;AAAA,EACF;AACF","file":"chunk-BLA44UCM.js","sourcesContent":["import type { CharacterMotionMetadata } from \"@nodaro/shared/types\"\nimport type { NodaroClientCore } from \"../core.js\"\n\n/**\n * Picker-catalog types. Mirrors `@nodaro/shared`'s `ProjectedPickerCatalog` /\n * `PickerCatalogSummary` so the SDK stays dependency-free (same convention as\n * `NodeDescriptor` mirroring node-registry).\n */\nexport interface PickerOption {\n id: string\n label: string\n description?: string\n category?: string\n /** The prompt fragment this id injects downstream. Present only when detail=\"full\". */\n promptHint?: string\n /**\n * Short professional term injected by compact hint mode; `label` is for\n * display. Present at BOTH detail levels — a thin client renders `label`\n * and injects `term`. Empty for a no-op (\"auto\"/\"none\") entry that injects\n * nothing.\n */\n term?: string\n icon?: string\n /** Authored Character Motion prerequisites and sequence state. Missing means unknown. */\n motion?: CharacterMotionMetadata\n /**\n * Per-option parameters — node-data fields that apply only while THIS option\n * is picked (the Transition catalog's `wipe` → `wipeDirection`). Same shape\n * as a catalog's `dimensions`, at both detail levels; `auto` leads each list\n * and means \"send nothing\". Absent on every other option.\n */\n params?: PickerDimension[]\n /**\n * Absolute URL of the option's picture — a photo, 3D emoji, flag or (Nodaro\n * Cloud only) rendered look preview — on the installation's own host, or the\n * Nodaro CDN for look previews. Absent when the option has no picture. Use it\n * as given: file names carry a content hash, so it can be cached for good.\n */\n imageUrl?: string\n}\n\nexport interface PickerDimension {\n field: string\n label: string\n options: PickerOption[]\n}\n\n/** A topic a multi-dim catalog's settings are grouped under in the editor (person, styling). */\nexport interface PickerCatalogSection {\n /** English topic name, e.g. \"Identity\", \"Beauty & Hair\". */\n label: string\n /** Node-data fields of the settings in this topic, in display order. */\n fields: string[]\n /** Absolute URL of the topic's round picture. Absent when it has none. */\n imageUrl?: string\n}\n\nexport interface PickerCatalog {\n nodeType: string\n label: string\n catalogId: string\n kind: \"single\" | \"multi\"\n /** single only — the node-data field the chosen id writes to. */\n valueField?: string\n defaultValue?: string\n categoryOrder?: string[]\n categoryLabels?: Record<string, string>\n /** single-dim catalogs. */\n options?: PickerOption[]\n /** multi-dim catalogs. */\n fields?: string[]\n /** Per-field option lists. Multi-dim catalogs always carry these; a\n * single-dim catalog carries them when it has secondary parameter\n * fields beside its main picker (transition position/duration/intensity). */\n dimensions?: PickerDimension[]\n detail?: \"compact\" | \"full\"\n /** person and styling: the topics their settings are grouped under, in order, each with its picture. */\n sections?: PickerCatalogSection[]\n}\n\nexport interface PickerCatalogSummary {\n nodeType: string\n label: string\n catalogId: string\n kind: \"single\" | \"multi\"\n valueField?: string\n fields?: string[]\n optionCount: number\n /** How many of those options carry an `imageUrl` (0 = no pictures). Absent from servers that predate pictures. */\n imageCount?: number\n}\n\nexport interface GetPickerCatalogOptions {\n /** \"compact\" (default) = id, label, category, term, icon, imageUrl; \"full\" additionally includes description + promptHint. */\n detail?: \"compact\" | \"full\"\n /** single-dim: filter to one category. */\n category?: string\n /** multi-dim: only this dimension field. */\n field?: string\n}\n\n/** Input for `analyzeText` (POST /v1/text-to-picker). */\nexport interface TextToPickerParams {\n /** Free-text scene/shot description to analyze. */\n text: string\n /** Picker node types to fill. Omit for ALL analyzable pickers (the server\n * fans the analysis out per family and merges). */\n targetPickers?: string[]\n /** Extra guidance appended to the analyzer system prompt. */\n instructions?: string\n /** Originating client app slug (e.g. \"cine\") — attribution only. */\n origin?: string\n llmModel?: string\n reasoningEffort?: string\n}\n\nexport interface TextToPickerResult {\n jobId: string\n /** pickerType → dimension → chosen catalog id(s) — same shape as\n * describe-to-picker; hydrate pickers from it verbatim. */\n pickerJson: Record<string, Record<string, string | string[]>>\n /** Catalog-coverage feedback (attributes the text described that no\n * catalog id represents well). Surface as \"we couldn't infer X\". */\n gaps?: {\n missingItems: Array<{ picker: string; dimension: string; observed: string }>\n missingCategories: Array<{ picker: string; suggestedDimension: string; observed: string }>\n }\n}\n\nexport class PickerCatalogsResource {\n constructor(private client: NodaroClientCore) {}\n\n /** List every parameter-picker node type + its option count. Cached publicly 5 min. */\n list(): Promise<{ data: PickerCatalogSummary[] }> {\n return this.client.request(\"GET\", \"/v1/picker-catalogs\")\n }\n\n /** Fill pickers from a free-text description (Cine \"AI Fill\"): returns the\n * same pickerJson shape as describe-to-picker, keyed by picker node type. */\n analyzeText(params: TextToPickerParams): Promise<TextToPickerResult> {\n return this.client.request(\"POST\", \"/v1/text-to-picker\", { body: params })\n }\n\n /** Get one picker's catalog of valid values. */\n get(nodeType: string, opts: GetPickerCatalogOptions = {}): Promise<{ data: PickerCatalog }> {\n const qs = new URLSearchParams()\n if (opts.detail) qs.set(\"detail\", opts.detail)\n if (opts.category) qs.set(\"category\", opts.category)\n if (opts.field) qs.set(\"field\", opts.field)\n const query = qs.toString()\n return this.client.request(\n \"GET\",\n `/v1/picker-catalogs/${encodeURIComponent(nodeType)}${query ? `?${query}` : \"\"}`,\n )\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/resources/catalogs.ts
|
|
4
|
+
var CatalogsResource = class {
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
}
|
|
8
|
+
client;
|
|
9
|
+
/** Every catalog, projected & pack-composed (honors the deployment's
|
|
10
|
+
* registered vendored packs). Cached publicly 5 min. `data` is absent
|
|
11
|
+
* when the deployment registered no packs (`curated: false`). */
|
|
12
|
+
list(opts = {}) {
|
|
13
|
+
const qs = opts.detail ? `?detail=${opts.detail}` : "";
|
|
14
|
+
return this.client.request("GET", `/v1/catalogs${qs}`);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
exports.CatalogsResource = CatalogsResource;
|
|
19
|
+
//# sourceMappingURL=chunk-BPWUWUZ3.cjs.map
|
|
20
|
+
//# sourceMappingURL=chunk-BPWUWUZ3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resources/catalogs.ts"],"names":[],"mappings":";;;AAuEO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAA3B,MAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,IAAA,CAAK,IAAA,GAAwC,EAAC,EAAkC;AAC9E,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,GAAS,CAAA,QAAA,EAAW,IAAA,CAAK,MAAM,CAAA,CAAA,GAAK,EAAA;AACpD,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,CAAA,YAAA,EAAe,EAAE,CAAA,CAAE,CAAA;AAAA,EACvD;AACF","file":"chunk-BPWUWUZ3.cjs","sourcesContent":["import type { NodaroClientCore } from \"../core.js\"\n\n/**\n * Catalog projection types. Mirror `@nodaro/shared`'s `ProjectedCatalog` so the\n * SDK stays dependency-free (same convention as `picker-catalogs.ts`). Tag-free\n * by design — the deferred `CatalogPolicy` never crosses the wire.\n */\nexport interface ProjectedCatalogOption {\n id: string\n label: string\n description?: string\n category?: string\n /** The prompt fragment this id injects downstream. Present only when detail=\"full\". */\n promptHint?: string\n /**\n * Short professional term injected by compact hint mode; `label` is for\n * display. Present at BOTH detail levels — a thin client renders `label`\n * and injects `term`. Empty for a no-op (\"auto\"/\"none\") entry that injects\n * nothing.\n */\n term?: string\n icon?: string\n /**\n * Absolute URL of the option's picture — a photo, 3D emoji, flag or (Nodaro\n * Cloud only) rendered look preview — on the installation's own host, or the\n * Nodaro CDN for look previews. Absent when the option has no picture. Use it\n * as given: file names carry a content hash, so it can be cached for good.\n */\n imageUrl?: string\n}\nexport interface ProjectedCatalogDimension {\n field: string\n label: string\n options: ProjectedCatalogOption[]\n}\nexport interface ProjectedCatalog {\n nodeType: string\n label: string\n catalogId: string\n kind: \"single\" | \"multi\"\n valueField?: string\n defaultValue?: string\n categoryOrder?: string[]\n categoryLabels?: Record<string, string>\n detail: \"compact\" | \"full\"\n options?: ProjectedCatalogOption[]\n fields?: string[]\n dimensions?: ProjectedCatalogDimension[]\n /** person and styling: the topics their settings are grouped under, in order, each with its picture. */\n sections?: ProjectedCatalogSection[]\n}\n\n/** A topic a multi-dim catalog's settings are grouped under in the editor (person, styling). */\nexport interface ProjectedCatalogSection {\n label: string\n fields: string[]\n imageUrl?: string\n}\n\n/**\n * `GET /v1/catalogs`. `data` is present only when the deployment registered\n * catalog packs (`curated: true`); with none the catalogs are the bundled\n * ones — read them per picker with `client.pickerCatalogs.get(nodeType)`.\n */\nexport interface CatalogsListResponse {\n curated: boolean\n packs: number\n version: number\n data?: ProjectedCatalog[]\n}\n\nexport class CatalogsResource {\n constructor(private client: NodaroClientCore) {}\n\n /** Every catalog, projected & pack-composed (honors the deployment's\n * registered vendored packs). Cached publicly 5 min. `data` is absent\n * when the deployment registered no packs (`curated: false`). */\n list(opts: { detail?: \"compact\" | \"full\" } = {}): Promise<CatalogsListResponse> {\n const qs = opts.detail ? `?detail=${opts.detail}` : \"\"\n return this.client.request(\"GET\", `/v1/catalogs${qs}`)\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/resources/tutorials.ts
|
|
4
|
+
var TutorialsResource = class {
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
}
|
|
8
|
+
client;
|
|
9
|
+
/** All enabled tutorial categories with their videos and flow tutorials. Public. */
|
|
10
|
+
list() {
|
|
11
|
+
return this.client.request("GET", "/v1/tutorials");
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
exports.TutorialsResource = TutorialsResource;
|
|
16
|
+
//# sourceMappingURL=chunk-BRV7Z4GD.cjs.map
|
|
17
|
+
//# sourceMappingURL=chunk-BRV7Z4GD.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resources/tutorials.ts"],"names":[],"mappings":";;;AAuDO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAA3B,MAAA;AAAA;AAAA,EAGpB,IAAA,GAAoD;AAClD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,eAAe,CAAA;AAAA,EACnD;AACF","file":"chunk-BRV7Z4GD.cjs","sourcesContent":["import type { NodaroClientCore } from \"../core.js\"\n\n/**\n * Public tutorials directory (`GET /v1/tutorials`) — video tutorials and\n * flow (template) tutorials, pre-grouped under the shared category taxonomy.\n * Read-only by design; curation is an admin surface outside the public SDK.\n */\n\nexport interface TutorialVideoItem {\n id: string\n type: \"video\"\n title: string\n description: string | null\n videoUrl: string\n thumbnailUrl: string | null\n categoryId: string\n sortOrder: number\n createdAt: string\n updatedAt: string\n}\n\n/** A workflow template surfaced as a tutorial; `slug` feeds `client.templates`. */\nexport interface TutorialFlowItem {\n id: string\n type: \"flow\"\n templateId: string\n slug: string | null\n title: string\n description: string | null\n markdownDescription: string | null\n previewMediaUrl: string | null\n previewMediaType: \"image\" | \"video\" | null\n complexity: string\n /** The listed price; when `estimatedPerMinuteCredits` is above 0, its fixed part. */\n estimatedCredits: number\n /** Credits per minute of the recording the template is given (see `TemplateBrowseCard`); 0 or absent when none. */\n estimatedPerMinuteCredits?: number\n nodeTypesUsed: string[]\n providersUsed: string[]\n nodeCount: number\n categoryId: string\n tutorialSortOrder: number\n workflowId: string\n createdAt: string\n}\n\nexport interface TutorialCategory {\n id: string\n name: string\n slug: string\n sortOrder: number\n videos: TutorialVideoItem[]\n flows: TutorialFlowItem[]\n}\n\nexport class TutorialsResource {\n constructor(private client: NodaroClientCore) {}\n\n /** All enabled tutorial categories with their videos and flow tutorials. Public. */\n list(): Promise<{ categories: TutorialCategory[] }> {\n return this.client.request(\"GET\", \"/v1/tutorials\")\n }\n}\n"]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// src/resources/competitors.ts
|
|
2
|
+
var CompetitorsResource = class {
|
|
3
|
+
constructor(client) {
|
|
4
|
+
this.client = client;
|
|
5
|
+
}
|
|
6
|
+
client;
|
|
7
|
+
/** `GET /v1/competitors` → every tracked brand. */
|
|
8
|
+
async list() {
|
|
9
|
+
const res = await this.listWithPlan();
|
|
10
|
+
return [...res.data];
|
|
11
|
+
}
|
|
12
|
+
/** `GET /v1/competitors` → every tracked brand, with how many months of scans your plan keeps. */
|
|
13
|
+
listWithPlan() {
|
|
14
|
+
return this.client.request("GET", "/v1/competitors");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* `GET /v1/competitors/:id` → one brand with its latest scan (posts and
|
|
18
|
+
* cards) and its scan history; with `scan`, the brand as of that scan.
|
|
19
|
+
*/
|
|
20
|
+
get(id, options = {}) {
|
|
21
|
+
const query = options.scan ? `?scan=${encodeURIComponent(options.scan)}` : "";
|
|
22
|
+
return this.client.request("GET", `/v1/competitors/${encodeURIComponent(id)}${query}`);
|
|
23
|
+
}
|
|
24
|
+
/** `GET /v1/competitors/:id/history` → the brand's scans oldest first, per platform what each found and read (free). */
|
|
25
|
+
history(id) {
|
|
26
|
+
return this.client.request("GET", `/v1/competitors/${encodeURIComponent(id)}/history`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `GET /v1/competitors/:id/compare` → the brand over a period, and over a
|
|
30
|
+
* second one to compare with (free). A post belongs to a period by its
|
|
31
|
+
* publish date; a period is at most a year.
|
|
32
|
+
*/
|
|
33
|
+
compare(id, input) {
|
|
34
|
+
const params = new URLSearchParams({ from: input.from, to: input.to });
|
|
35
|
+
if (input.vsFrom !== void 0 && input.vsTo !== void 0) {
|
|
36
|
+
params.set("vsFrom", input.vsFrom);
|
|
37
|
+
params.set("vsTo", input.vsTo);
|
|
38
|
+
}
|
|
39
|
+
return this.client.request("GET", `/v1/competitors/${encodeURIComponent(id)}/compare?${params.toString()}`);
|
|
40
|
+
}
|
|
41
|
+
/** `POST /v1/competitors` → track a brand. Accounts take handles or links. */
|
|
42
|
+
create(input) {
|
|
43
|
+
return this.client.request("POST", "/v1/competitors", { body: input });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `PATCH /v1/competitors/:id` → change its accounts, platforms, name or schedule.
|
|
47
|
+
* `accounts` replaces the whole set: pass every account to keep. Send
|
|
48
|
+
* `schedule` only to change it (it restarts the brand's schedule). While a
|
|
49
|
+
* scan of the brand runs, a change to its name, accounts, platforms or
|
|
50
|
+
* `isOwn` is refused with `409 scan_running`.
|
|
51
|
+
*/
|
|
52
|
+
update(id, input) {
|
|
53
|
+
return this.client.request("PATCH", `/v1/competitors/${encodeURIComponent(id)}`, { body: input });
|
|
54
|
+
}
|
|
55
|
+
/** `DELETE /v1/competitors/:id` → stop tracking it (its scans go too). */
|
|
56
|
+
async delete(id) {
|
|
57
|
+
await this.client.request("DELETE", `/v1/competitors/${encodeURIComponent(id)}`);
|
|
58
|
+
}
|
|
59
|
+
/** `GET /v1/competitors/cards` → every action card, most urgent first, with the posts they rest on. */
|
|
60
|
+
cards() {
|
|
61
|
+
return this.client.request("GET", "/v1/competitors/cards");
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* `GET /v1/competitors/:id/lessons` → what works for a brand: per platform,
|
|
65
|
+
* what its best posts share, measured on its own posts across every stored
|
|
66
|
+
* scan, with the posts each lesson rests on (free). "What works for you" on
|
|
67
|
+
* the brand marked as yours.
|
|
68
|
+
*/
|
|
69
|
+
lessons(id) {
|
|
70
|
+
return this.client.request("GET", `/v1/competitors/${encodeURIComponent(id)}/lessons`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* `GET /v1/competitors/actions` → the cards you marked "I did this", newest
|
|
74
|
+
* first, each with how it went (`outcome`), and your track record per
|
|
75
|
+
* family of advice (free). Each scan of your own brand judges the post that
|
|
76
|
+
* came of a card once it is a few days old; the first verdict stays.
|
|
77
|
+
*/
|
|
78
|
+
tried() {
|
|
79
|
+
return this.client.request("GET", "/v1/competitors/actions");
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* `POST /v1/competitors/actions` → "I did this" on a card on your wall (its
|
|
83
|
+
* `id` from `cards()`), optionally with the link to your post that came of
|
|
84
|
+
* it. Only cards whose advice ends in a post of yours can be marked
|
|
85
|
+
* (`400 not_measurable`). Marking a marked card returns its mark
|
|
86
|
+
* (`created: false`).
|
|
87
|
+
*/
|
|
88
|
+
markDone(cardId, options = {}) {
|
|
89
|
+
return this.client.request("POST", "/v1/competitors/actions", { body: { cardId, ...options.postUrl ? { postUrl: options.postUrl } : {} } });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* `PATCH /v1/competitors/actions/:id` → link the post that came of a marked
|
|
93
|
+
* card (the post's full link; a short link is refused with `400
|
|
94
|
+
* short_link`), or `null` to remove the link. Another post is judged afresh.
|
|
95
|
+
*/
|
|
96
|
+
linkPost(markId, postUrl) {
|
|
97
|
+
return this.client.request("PATCH", `/v1/competitors/actions/${encodeURIComponent(markId)}`, { body: { postUrl } });
|
|
98
|
+
}
|
|
99
|
+
/** `PATCH /v1/competitors/actions/:id` with `seen: true` → you have seen its verdict (the app stops announcing it). */
|
|
100
|
+
markSeen(markId) {
|
|
101
|
+
return this.client.request("PATCH", `/v1/competitors/actions/${encodeURIComponent(markId)}`, { body: { seen: true } });
|
|
102
|
+
}
|
|
103
|
+
/** `DELETE /v1/competitors/actions/:id` → undo "I did this" (its verdict leaves your track record). */
|
|
104
|
+
async unmark(markId) {
|
|
105
|
+
await this.client.request("DELETE", `/v1/competitors/actions/${encodeURIComponent(markId)}`);
|
|
106
|
+
}
|
|
107
|
+
/** `POST /v1/competitor-discover` → a brand's accounts found from its website (free; guesses are marked). */
|
|
108
|
+
discover(website) {
|
|
109
|
+
return this.client.request("POST", "/v1/competitor-discover", { body: { website } });
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* `POST /v1/competitor-scan` → scan a brand now. Answers with a job id;
|
|
113
|
+
* poll `client.jobs.getStatus(jobId)`, then read `get(id)` or `cards()`.
|
|
114
|
+
*/
|
|
115
|
+
scan(id) {
|
|
116
|
+
return this.client.request("POST", "/v1/competitor-scan", { body: { competitorId: id } });
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export { CompetitorsResource };
|
|
121
|
+
//# sourceMappingURL=chunk-BU5A6K4C.js.map
|
|
122
|
+
//# sourceMappingURL=chunk-BU5A6K4C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resources/competitors.ts"],"names":[],"mappings":";AAyBO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAAoB,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAA3B,MAAA;AAAA;AAAA,EAGpB,MAAM,IAAA,GAAqC;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,OAAO,CAAC,GAAG,GAAA,CAAI,IAAI,CAAA;AAAA,EACrB;AAAA;AAAA,EAGA,YAAA,GAA8C;AAC5C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA8B,KAAA,EAAO,iBAAiB,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAI,EAAA,EAAY,OAAA,GAAsC,EAAC,EAA8B;AACnF,IAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,GAAO,CAAA,MAAA,EAAS,mBAAmB,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AAC3E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA0B,KAAA,EAAO,CAAA,gBAAA,EAAmB,mBAAmB,EAAE,CAAC,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,EACzG;AAAA;AAAA,EAGA,QAAQ,EAAA,EAAwC;AAC9C,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAA2B,KAAA,EAAO,mBAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAU,CAAA;AAAA,EAC1G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,IAAY,KAAA,EAAiE;AACnF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,CAAA;AACrE,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,IAAa,KAAA,CAAM,SAAS,MAAA,EAAW;AAC1D,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA;AACjC,MAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAiC,KAAA,EAAO,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA,EAAY,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,CAAA;AAAA,EACrI;AAAA;AAAA,EAGA,OAAO,KAAA,EAA0D;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAA2B,MAAA,EAAQ,mBAAmB,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,CAAO,IAAY,KAAA,EAA0D;AAC3E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA2B,OAAA,EAAS,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,EACrH;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAA2B,QAAA,EAAU,mBAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACpG;AAAA;AAAA,EAGA,KAAA,GAAwC;AACtC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA+B,KAAA,EAAO,uBAAuB,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,EAAA,EAA8C;AACpD,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAiC,KAAA,EAAO,mBAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAU,CAAA;AAAA,EAChH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAiC,KAAA,EAAO,yBAAyB,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,CAAS,MAAA,EAAgB,OAAA,GAAgC,EAAC,EAA8B;AACtF,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAA0B,MAAA,EAAQ,2BAA2B,EAAE,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC,IAAM,CAAA;AAAA,EAChK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,CAAS,QAAgB,OAAA,EAAmD;AAC1E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA0B,OAAA,EAAS,2BAA2B,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,EAAE,OAAA,IAAW,CAAA;AAAA,EACtI;AAAA;AAAA,EAGA,SAAS,MAAA,EAA2C;AAClD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA0B,OAAA,EAAS,2BAA2B,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,IAAQ,CAAA;AAAA,EACzI;AAAA;AAAA,EAGA,MAAM,OAAO,MAAA,EAA+B;AAC1C,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAA2B,QAAA,EAAU,2BAA2B,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAChH;AAAA;AAAA,EAGA,SAAS,OAAA,EAA+C;AACtD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA6B,MAAA,EAAQ,yBAAA,EAA2B,EAAE,IAAA,EAAM,EAAE,OAAA,EAAQ,EAAG,CAAA;AAAA,EAC1G;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,EAAA,EAAwC;AAC3C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAA2B,MAAA,EAAQ,qBAAA,EAAuB,EAAE,IAAA,EAAM,EAAE,YAAA,EAAc,EAAA,EAAG,EAAG,CAAA;AAAA,EAC7G;AACF","file":"chunk-BU5A6K4C.js","sourcesContent":["import type { NodaroClientCore } from \"../core.js\"\nimport type {\n CardActionResult,\n CompetitorActionsResult,\n CompetitorCardsResult,\n CompetitorCompareInput,\n CompetitorCompareResult,\n CompetitorDetail,\n CompetitorDiscovery,\n CompetitorHistory,\n CompetitorLessonsResult,\n CompetitorListResult,\n CreateCompetitorInput,\n TrackedCompetitor,\n UpdateCompetitorInput,\n} from \"@nodaro/shared/social\"\n\n/**\n * Competitors — brands you track (competitors, or your own), their scans and\n * the action cards read from them. Nodaro Cloud.\n *\n * Adding, reading and website lookups are free. A scan costs one Social\n * Search page per search it runs (`TrackedCompetitor.searches`); searches that\n * fail are not charged.\n */\nexport class CompetitorsResource {\n constructor(private client: NodaroClientCore) {}\n\n /** `GET /v1/competitors` → every tracked brand. */\n async list(): Promise<TrackedCompetitor[]> {\n const res = await this.listWithPlan()\n return [...res.data]\n }\n\n /** `GET /v1/competitors` → every tracked brand, with how many months of scans your plan keeps. */\n listWithPlan(): Promise<CompetitorListResult> {\n return this.client.request<CompetitorListResult>(\"GET\", \"/v1/competitors\")\n }\n\n /**\n * `GET /v1/competitors/:id` → one brand with its latest scan (posts and\n * cards) and its scan history; with `scan`, the brand as of that scan.\n */\n get(id: string, options: { readonly scan?: string } = {}): Promise<CompetitorDetail> {\n const query = options.scan ? `?scan=${encodeURIComponent(options.scan)}` : \"\"\n return this.client.request<CompetitorDetail>(\"GET\", `/v1/competitors/${encodeURIComponent(id)}${query}`)\n }\n\n /** `GET /v1/competitors/:id/history` → the brand's scans oldest first, per platform what each found and read (free). */\n history(id: string): Promise<CompetitorHistory> {\n return this.client.request<CompetitorHistory>(\"GET\", `/v1/competitors/${encodeURIComponent(id)}/history`)\n }\n\n /**\n * `GET /v1/competitors/:id/compare` → the brand over a period, and over a\n * second one to compare with (free). A post belongs to a period by its\n * publish date; a period is at most a year.\n */\n compare(id: string, input: CompetitorCompareInput): Promise<CompetitorCompareResult> {\n const params = new URLSearchParams({ from: input.from, to: input.to })\n if (input.vsFrom !== undefined && input.vsTo !== undefined) {\n params.set(\"vsFrom\", input.vsFrom)\n params.set(\"vsTo\", input.vsTo)\n }\n return this.client.request<CompetitorCompareResult>(\"GET\", `/v1/competitors/${encodeURIComponent(id)}/compare?${params.toString()}`)\n }\n\n /** `POST /v1/competitors` → track a brand. Accounts take handles or links. */\n create(input: CreateCompetitorInput): Promise<TrackedCompetitor> {\n return this.client.request<TrackedCompetitor>(\"POST\", \"/v1/competitors\", { body: input })\n }\n\n /**\n * `PATCH /v1/competitors/:id` → change its accounts, platforms, name or schedule.\n * `accounts` replaces the whole set: pass every account to keep. Send\n * `schedule` only to change it (it restarts the brand's schedule). While a\n * scan of the brand runs, a change to its name, accounts, platforms or\n * `isOwn` is refused with `409 scan_running`.\n */\n update(id: string, input: UpdateCompetitorInput): Promise<TrackedCompetitor> {\n return this.client.request<TrackedCompetitor>(\"PATCH\", `/v1/competitors/${encodeURIComponent(id)}`, { body: input })\n }\n\n /** `DELETE /v1/competitors/:id` → stop tracking it (its scans go too). */\n async delete(id: string): Promise<void> {\n await this.client.request<{ success: true }>(\"DELETE\", `/v1/competitors/${encodeURIComponent(id)}`)\n }\n\n /** `GET /v1/competitors/cards` → every action card, most urgent first, with the posts they rest on. */\n cards(): Promise<CompetitorCardsResult> {\n return this.client.request<CompetitorCardsResult>(\"GET\", \"/v1/competitors/cards\")\n }\n\n /**\n * `GET /v1/competitors/:id/lessons` → what works for a brand: per platform,\n * what its best posts share, measured on its own posts across every stored\n * scan, with the posts each lesson rests on (free). \"What works for you\" on\n * the brand marked as yours.\n */\n lessons(id: string): Promise<CompetitorLessonsResult> {\n return this.client.request<CompetitorLessonsResult>(\"GET\", `/v1/competitors/${encodeURIComponent(id)}/lessons`)\n }\n\n /**\n * `GET /v1/competitors/actions` → the cards you marked \"I did this\", newest\n * first, each with how it went (`outcome`), and your track record per\n * family of advice (free). Each scan of your own brand judges the post that\n * came of a card once it is a few days old; the first verdict stays.\n */\n tried(): Promise<CompetitorActionsResult> {\n return this.client.request<CompetitorActionsResult>(\"GET\", \"/v1/competitors/actions\")\n }\n\n /**\n * `POST /v1/competitors/actions` → \"I did this\" on a card on your wall (its\n * `id` from `cards()`), optionally with the link to your post that came of\n * it. Only cards whose advice ends in a post of yours can be marked\n * (`400 not_measurable`). Marking a marked card returns its mark\n * (`created: false`).\n */\n markDone(cardId: string, options: { postUrl?: string } = {}): Promise<CardActionResult> {\n return this.client.request<CardActionResult>(\"POST\", \"/v1/competitors/actions\", { body: { cardId, ...(options.postUrl ? { postUrl: options.postUrl } : {}) } })\n }\n\n /**\n * `PATCH /v1/competitors/actions/:id` → link the post that came of a marked\n * card (the post's full link; a short link is refused with `400\n * short_link`), or `null` to remove the link. Another post is judged afresh.\n */\n linkPost(markId: string, postUrl: string | null): Promise<CardActionResult> {\n return this.client.request<CardActionResult>(\"PATCH\", `/v1/competitors/actions/${encodeURIComponent(markId)}`, { body: { postUrl } })\n }\n\n /** `PATCH /v1/competitors/actions/:id` with `seen: true` → you have seen its verdict (the app stops announcing it). */\n markSeen(markId: string): Promise<CardActionResult> {\n return this.client.request<CardActionResult>(\"PATCH\", `/v1/competitors/actions/${encodeURIComponent(markId)}`, { body: { seen: true } })\n }\n\n /** `DELETE /v1/competitors/actions/:id` → undo \"I did this\" (its verdict leaves your track record). */\n async unmark(markId: string): Promise<void> {\n await this.client.request<{ success: true }>(\"DELETE\", `/v1/competitors/actions/${encodeURIComponent(markId)}`)\n }\n\n /** `POST /v1/competitor-discover` → a brand's accounts found from its website (free; guesses are marked). */\n discover(website: string): Promise<CompetitorDiscovery> {\n return this.client.request<CompetitorDiscovery>(\"POST\", \"/v1/competitor-discover\", { body: { website } })\n }\n\n /**\n * `POST /v1/competitor-scan` → scan a brand now. Answers with a job id;\n * poll `client.jobs.getStatus(jobId)`, then read `get(id)` or `cards()`.\n */\n scan(id: string): Promise<{ jobId: string }> {\n return this.client.request<{ jobId: string }>(\"POST\", \"/v1/competitor-scan\", { body: { competitorId: id } })\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-C22RJDW3.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CGNVHN4V.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CJFIOVBA.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-CJLLIVSB.cjs"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
export { CREATURE_ATTACH_COLUMNS, OBJECT_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS } from '@nodaro/shared/entities';
|
|
2
|
+
|
|
3
|
+
// src/resources/creatures.ts
|
|
4
|
+
var CREATURE_ASSET_TYPES = ["angles", "poses", "variations", "custom"];
|
|
5
|
+
var CreaturesResource = class {
|
|
6
|
+
constructor(client) {
|
|
7
|
+
this.client = client;
|
|
8
|
+
}
|
|
9
|
+
client;
|
|
10
|
+
/**
|
|
11
|
+
* List the caller's creatures. By default returns active creatures only;
|
|
12
|
+
* pass `archived: true` to fetch soft-deleted rows for an "archive" view.
|
|
13
|
+
* Optional `projectId` scopes the result to a single project; `q` keeps the
|
|
14
|
+
* creatures whose name or description contains it.
|
|
15
|
+
*/
|
|
16
|
+
list(params = {}) {
|
|
17
|
+
const query = {};
|
|
18
|
+
if (params.archived) query.archived = "true";
|
|
19
|
+
if (params.projectId) query.projectId = params.projectId;
|
|
20
|
+
if (params.q) query.q = params.q;
|
|
21
|
+
if (params.limit !== void 0) query.limit = String(params.limit);
|
|
22
|
+
if (params.cursor) query.cursor = params.cursor;
|
|
23
|
+
return this.client.request("GET", "/v1/creatures", { query });
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Convenience wrapper for `list({ archived: true })`. Returns soft-deleted
|
|
27
|
+
* rows so callers can drive a UI "Archived" tab without re-encoding the
|
|
28
|
+
* query param.
|
|
29
|
+
*
|
|
30
|
+
* `archived` is omitted from the param type — it's always set to `true` here.
|
|
31
|
+
*/
|
|
32
|
+
listArchived(params = {}) {
|
|
33
|
+
return this.list({ ...params, archived: true });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Fetch a single creature including in-flight asset job state. Soft-deleted
|
|
37
|
+
* (archived) rows are NOT returned by id — the route enforces
|
|
38
|
+
* `deleted_at IS NULL` so archived creatures 404 (uniform "not_found" — does
|
|
39
|
+
* not leak the deleted vs non-existent distinction).
|
|
40
|
+
*/
|
|
41
|
+
async get(id) {
|
|
42
|
+
const res = await this.client.request(
|
|
43
|
+
"GET",
|
|
44
|
+
`/v1/creatures/${encodeURIComponent(id)}`
|
|
45
|
+
);
|
|
46
|
+
return { ...res, canonicalDescription: res.canonicalDescription || null };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a new creature. `name` + `nodeId` are required — the route 400s
|
|
50
|
+
* otherwise. Returns the new row's id.
|
|
51
|
+
*
|
|
52
|
+
* Note: the underlying route is the same `POST /v1/creatures` upsert that
|
|
53
|
+
* powers `update()`. This convenience wrapper enforces the INSERT-required
|
|
54
|
+
* fields at the type level and never sends an `id`.
|
|
55
|
+
*/
|
|
56
|
+
create(data) {
|
|
57
|
+
return this.client.request("POST", "/v1/creatures", { body: data });
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Update a creature. Only the fields you pass are written — undefined keys
|
|
61
|
+
* are NOT touched on the row. Worker-owned asset buckets are intentionally
|
|
62
|
+
* not exposed on this surface (see `UpdateCreatureInput` for the rationale).
|
|
63
|
+
*
|
|
64
|
+
* Optimistic-concurrency: pass `expectedUpdatedAt` to require the row's
|
|
65
|
+
* `updated_at` still matches; on mismatch the route returns 409
|
|
66
|
+
* `concurrent_modification` carrying the fresh `updatedAt`. The SDK
|
|
67
|
+
* surfaces that as a generic `NodaroError` with the same code.
|
|
68
|
+
*/
|
|
69
|
+
update(id, data) {
|
|
70
|
+
return this.client.request("POST", "/v1/creatures", {
|
|
71
|
+
body: { id, ...data }
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Soft-delete (archive) a creature. The row is hidden from `list()` by
|
|
76
|
+
* default but recoverable via `restore(id)` or visible under
|
|
77
|
+
* `listArchived()`. Idempotent — repeating a delete on an already-archived
|
|
78
|
+
* row is a no-op.
|
|
79
|
+
*/
|
|
80
|
+
delete(id) {
|
|
81
|
+
return this.client.request("DELETE", `/v1/creatures/${encodeURIComponent(id)}`);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Hard-delete (permanent) a creature — the row + every R2 asset it
|
|
85
|
+
* references. Archived rows ONLY: active creatures return 400 `not_archived`.
|
|
86
|
+
* Call `delete()` first to archive, then `permanentDelete()` to destroy.
|
|
87
|
+
*
|
|
88
|
+
* Mirrors the `app_runs` permanent-delete pattern (archive-first) so a
|
|
89
|
+
* stray SDK / curl caller cannot bypass the studio's archive-first UI
|
|
90
|
+
* flow.
|
|
91
|
+
*/
|
|
92
|
+
permanentDelete(id) {
|
|
93
|
+
return this.client.request("DELETE", `/v1/creatures/${encodeURIComponent(id)}`, {
|
|
94
|
+
query: { permanent: "true" }
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Un-archive a creature. If the original name now collides (case-
|
|
99
|
+
* insensitive) with an active row, the server auto-suffixes "(restored)"
|
|
100
|
+
* and returns the effective name.
|
|
101
|
+
*/
|
|
102
|
+
restore(id) {
|
|
103
|
+
return this.client.request("POST", `/v1/creatures/${encodeURIComponent(id)}/restore`);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Fire `POST /v1/generate-creature` to produce one or more candidate main
|
|
107
|
+
* images. With `count > 1`, all jobs are reserved up-front before any
|
|
108
|
+
* is enqueued — mid-batch failures roll back atomically.
|
|
109
|
+
*
|
|
110
|
+
* When `attachToCreatureId` is set AND `count === 1`, the worker writes
|
|
111
|
+
* the result directly to the row's `source_image_url`; otherwise you must
|
|
112
|
+
* call `approveMainImage()` after picking a candidate.
|
|
113
|
+
*/
|
|
114
|
+
async generate(data) {
|
|
115
|
+
const res = await this.client.request(
|
|
116
|
+
"POST",
|
|
117
|
+
"/v1/generate-creature",
|
|
118
|
+
{ body: data }
|
|
119
|
+
);
|
|
120
|
+
const jobIds = res.jobIds ?? (res.jobId ? [res.jobId] : []);
|
|
121
|
+
return res.jobId ? { jobIds, jobId: res.jobId } : { jobIds };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Fire `POST /v1/generate-creature-asset` to produce a single variant.
|
|
125
|
+
* When the studio path is set (`attachToCreatureId` + `attachToColumn` +
|
|
126
|
+
* `attachName`), the worker appends `{ name: attachName, url: <result> }`
|
|
127
|
+
* to the named JSONB array column on completion.
|
|
128
|
+
*
|
|
129
|
+
* Note: `attachToColumn` is REQUIRED for `assetType === "custom"` — the
|
|
130
|
+
* worker can't infer the bucket from the asset type. For canonical asset
|
|
131
|
+
* types (`angles` / `poses` / `variations`), the column is derived
|
|
132
|
+
* automatically by the route.
|
|
133
|
+
*/
|
|
134
|
+
generateAsset(data) {
|
|
135
|
+
return this.client.request("POST", "/v1/generate-creature-asset", { body: data });
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Fire `POST /v1/generate-creature-motion` to animate the creature's main
|
|
139
|
+
* image into a motion clip. Image-to-video, single clip per call; the
|
|
140
|
+
* attach column is hardcoded to `motion_clips` server-side (creatures have a
|
|
141
|
+
* single motion bucket so the caller doesn't supply `attachToColumn`).
|
|
142
|
+
* When the studio path is set (`attachToCreatureId` + `attachName`), the
|
|
143
|
+
* worker appends `{ name: attachName, url: <result> }` to the row's
|
|
144
|
+
* `motion_clips` column on completion.
|
|
145
|
+
*
|
|
146
|
+
* Defaults: `provider` → `"kling-turbo"`, `aspectRatio` → `"1:1"` (set
|
|
147
|
+
* server-side via `resolveObjectAspectRatio({ assetType: "motion" })`).
|
|
148
|
+
*/
|
|
149
|
+
generateMotion(data) {
|
|
150
|
+
return this.client.request("POST", "/v1/generate-creature-motion", { body: data });
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Approve a completed `generate-creature` job as the creature's main image.
|
|
154
|
+
* Sets `source_image_url` and fires the LLM caption (Claude Sonnet vision)
|
|
155
|
+
* inline. Returns the new main-image URL plus the caption.
|
|
156
|
+
*
|
|
157
|
+
* Caption-failure semantics: the route still sends `""` on LLM sub-failure,
|
|
158
|
+
* but the SDK normalizes `""` → `null` here so `canonicalDescription` carries
|
|
159
|
+
* the same `string | null` semantics as characters. The main image is still
|
|
160
|
+
* set; call `recaption()` to retry.
|
|
161
|
+
*
|
|
162
|
+
* Optimistic-concurrency: pass `expectedUpdatedAt` to gate the update on
|
|
163
|
+
* the row's current `updated_at`; on mismatch the route returns 409
|
|
164
|
+
* `concurrent_modification` carrying the fresh token.
|
|
165
|
+
*/
|
|
166
|
+
async approveMainImage(id, candidateJobId, expectedUpdatedAt) {
|
|
167
|
+
const res = await this.client.request(
|
|
168
|
+
"POST",
|
|
169
|
+
`/v1/creatures/${encodeURIComponent(id)}/approve-main-image`,
|
|
170
|
+
{ body: { candidateJobId, expectedUpdatedAt } }
|
|
171
|
+
);
|
|
172
|
+
return { sourceImageUrl: res.sourceImageUrl, canonicalDescription: res.canonicalDescription || null };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Re-fire the LLM caption against the creature's current main image. 502s
|
|
176
|
+
* on LLM failure (unlike `approveMainImage` which preserves the side-effect
|
|
177
|
+
* and returns ""); returns 400 `main_image_required` if no main image is
|
|
178
|
+
* set yet.
|
|
179
|
+
*
|
|
180
|
+
* The route is a pure idempotent retry — it does NOT accept an
|
|
181
|
+
* `expectedUpdatedAt` token (backend route is idempotent retry, not gated on
|
|
182
|
+
* optimistic-concurrency).
|
|
183
|
+
*/
|
|
184
|
+
recaption(id) {
|
|
185
|
+
return this.client.request(
|
|
186
|
+
"POST",
|
|
187
|
+
`/v1/creatures/${encodeURIComponent(id)}/llm-caption`
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
export { CREATURE_ASSET_TYPES, CreaturesResource };
|
|
193
|
+
//# sourceMappingURL=chunk-CK3AMMSC.js.map
|
|
194
|
+
//# sourceMappingURL=chunk-CK3AMMSC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resources/creatures.ts"],"names":[],"mappings":"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","file":"chunk-CK3AMMSC.js","sourcesContent":["import type { ObjectAspectRatio, CreatureAttachColumn } from \"@nodaro/shared/entities\"\nimport type { TtsProvider } from \"@nodaro/shared/models\"\nexport type { CreatureAttachColumn, ObjectAspectRatio as CreatureAspectRatio } from \"@nodaro/shared/entities\"\nexport { CREATURE_ATTACH_COLUMNS, OBJECT_ASPECT_OPTIONS as CREATURE_ASPECT_OPTIONS, OBJECT_ASPECT_DEFAULTS as CREATURE_ASPECT_DEFAULTS } from \"@nodaro/shared/entities\"\nimport type { NodaroClientCore } from \"../core.js\"\nimport type { GenerationSessionParams } from \"./nodes.js\"\n\n/**\n * Creature voice — IDENTICAL shape + semantics to `Character[\"voice\"]` (the\n * \"talking creature\" stack reuses the character voice plumbing verbatim).\n * Render speech via `client.nodes.run(\"text-to-speech\", { text, voice:\n * voiceId, provider: ttsProvider, voiceType })`, then feed the audio + the\n * creature's `sourceImageUrl` to `client.nodes.run(\"lip-sync\", …)` (or\n * speech-to-video) for a talking-creature clip.\n */\nexport interface CreatureVoice {\n voiceId: string\n voiceName: string\n traits: string\n voiceType?: \"premade\" | \"library\" | \"custom\"\n /** Playable preview sample (client-played only). */\n previewUrl?: string\n /** Recommended TTS provider — send as `provider` on text-to-speech. */\n ttsProvider?: TtsProvider\n}\n\n/**\n * Re-export the shared `CreatureAttachColumn` union + its runtime tuple so SDK\n * consumers don't have to add `@nodaro/shared` as a second dependency just to\n * typecheck the `attachToColumn` field. Single source of truth lives in\n * `@nodaro/shared/entity-prompts` (`CREATURE_ATTACH_COLUMNS`).\n *\n * `CreatureAspectRatio` is re-exported as an alias of the shared\n * `ObjectAspectRatio` — `generateMotion`'s `aspectRatio` field is the 5-value\n * object enum (1:1 / 3:4 / 16:9 / 9:16 / 4:3). The creature motion route\n * deliberately REUSES `OBJECT_ASPECT_OPTIONS` server-side (a creature reference\n * clip is centered product-showcase framing, not cinematic 16:9), so the SDK\n * surfaces the same enum under a creature-friendly name. The runtime tuple is\n * re-exported as `CREATURE_ASPECT_OPTIONS` / `CREATURE_ASPECT_DEFAULTS` aliases.\n */\n\n/**\n * Creature asset-type enum — the kinds of variant a user can generate off a\n * creature's anchor main image. Mirrors the literal accepted by\n * `POST /v1/generate-creature-asset` (`backend/src/routes/generate-creature-asset.ts`).\n *\n * Delta vs `ObjectAssetType`: object's `materials` becomes `poses` (a creature\n * has poses, not materials), and there is NO `motion` value — creature motion\n * variants flow through the dedicated `/v1/generate-creature-motion` endpoint\n * (worker-side a different BullMQ job type). `custom` is the free-form bucket;\n * callers must supply `attachToColumn` explicitly since the worker can't infer\n * the destination from the asset type.\n *\n * The shared `@nodaro/shared` package does NOT export a `CREATURE_ASSET_TYPES`\n * tuple (the route validates an inline Zod enum), so the SDK defines its own\n * single-source-of-truth tuple here.\n */\nexport const CREATURE_ASSET_TYPES = [\"angles\", \"poses\", \"variations\", \"custom\"] as const\nexport type CreatureAssetType = (typeof CREATURE_ASSET_TYPES)[number]\n\n/**\n * Reference-photo kind discriminator — the mood-board roles a user can attach\n * to a creature. Mirrors the `reference_photos.kind` field accepted by\n * `backend/src/routes/creatures.ts` (the route accepts open strings; this SDK\n * type narrows to the 6 canonical roles surfaced by the Studio). `other` is\n * the free-form bucket.\n */\nexport type CreatureReferencePhotoKind =\n | \"front\"\n | \"side\"\n | \"detail\"\n | \"context\"\n | \"moodBoard\"\n | \"other\"\n\nexport interface CreatureReferencePhoto {\n url: string\n kind: CreatureReferencePhotoKind\n}\n\n/**\n * A creature record returned by Nodaro's REST API. Mirrors the camelCase\n * shape produced by `backend/src/routes/creatures.ts::toCamel()`.\n *\n * Asset buckets (`angles`, `poses`, `variations`, `motionClips`) are\n * independent JSONB arrays keyed by a human-readable variant name (e.g.\n * `\"front\"`, `\"walking\"`, `\"scarred\"`). Each entry's `url` points at an\n * R2-hosted asset.\n *\n * Creature delta vs object:\n * - `species` — free-text creature type (e.g. `\"dragon\"`, `\"wolf\"`). This is\n * the subject of the establishing-shot prompt and the primary creature\n * differentiator (object has no equivalent).\n * - `poses` (where object has `materials`) — the pose-variant asset bucket.\n * - `category` is free-text (NOT object's fixed 10-value enum) — a creature\n * can be any animal/type.\n *\n * Identity-foundation fields:\n * - `referencePhotos` — caller-supplied mood-board refs (cap 20).\n * - `canonicalDescription` — ~80–120-word LLM-authored visual caption,\n * populated by `approveMainImage()` / `recaption()`. The wire still sends\n * `\"\"` on caption sub-failure, but `get()` normalizes `\"\"` → `null` so\n * consumers see the same `string | null` semantics as characters.\n * - `styleLock` — whether asset gens should anchor to the canonical style\n * captured at approval time. Defaults to `true` on new rows.\n */\nexport interface Creature {\n id: string\n userId: string\n nodeId: string\n projectId: string | null\n name: string\n description: string | null\n /** Free-text creature type/species (e.g. \"dragon\", \"wolf\") — the creature\n * delta vs object. `null` when unset. */\n species: string | null\n category: string | null\n style: string | null\n sourceImageUrl: string | null\n /** MODEL_CATALOG image-model id the main image was generated with (or `null`).\n * Set on create + editable via the update route. */\n imageProvider: string | null\n angles: Array<{ name: string; url: string }>\n poses: Array<{ name: string; url: string }>\n variations: Array<{ name: string; url: string }>\n motionClips: Array<{ name: string; url: string }>\n /** Named Creature Boards — dense reference sheets, one per variant/mood\n * (the `generate-image/creature-board` factory preset rendered from the\n * creature's images). A first-class bucket: community publish snapshots it\n * and clone hands the consumer their own copy to extend. Defaults to `[]`.\n * `type` marks an image-collage `\"identity\"` sheet vs a plain `\"looks\"`\n * board; `sourceImages` are the R2 URLs it was collaged from. Both optional\n * + backward-compatible (legacy boards have neither). */\n boards?: Array<{ name: string; url: string; type?: \"looks\" | \"identity\"; sourceImages?: string[] }> | null\n /** The creature's voice (the \"talking creature\" stack) — same shape and\n * flow as `Character[\"voice\"]`. `null` when no voice is selected. */\n voice?: CreatureVoice | null\n referencePhotos: CreatureReferencePhoto[]\n /** `null` when no caption is set (or the LLM caption sub-failed) — the wire\n * sends `\"\"`, normalized to `null` in `get()` to match character semantics. */\n canonicalDescription: string | null\n styleLock: boolean\n /** The user's chosen DEFAULT asset take per variant (Studio version history).\n * OPAQUE map: key `\"<bucket>:<variant>\"` (e.g. `\"angles:front\"`) → the chosen\n * asset URL (one already present in that bucket). Stored verbatim — keys are\n * NOT normalized; soft-capped server-side at 200 keys / 2048-char values\n * (overflow dropped silently). Defaults to `{}`. */\n selectedAssetByVariant?: Record<string, string> | null\n deletedAt: string | null\n createdAt: string\n updatedAt: string\n}\n\n/**\n * GET /v1/creatures/:id may append a `pendingJobs` bucket the studio uses to\n * rehydrate spinners after a reload. Optional on the SDK surface — it doesn't\n * appear on `list()` rows.\n */\nexport interface CreatureDetail extends Creature {\n pendingJobs?: Array<{\n jobId: string\n assetType: string\n name: string\n status: string\n }>\n}\n\n/**\n * Body for `client.creatures.create()`. Mirrors the INSERT branch of\n * `upsertCreatureBody` in `backend/src/routes/creatures.ts`. `name` + `nodeId`\n * are required on create.\n */\nexport interface CreateCreatureInput {\n nodeId: string\n name: string\n description?: string\n /** Free-text creature type/species (the creature delta vs object). */\n species?: string\n /** Free-text category (NOT object's fixed enum — a creature can be anything). */\n category?: string\n style?: string\n workflowId?: string\n projectId?: string\n sourceImageUrl?: string\n /** Persistent image-model id (a MODEL_CATALOG image model). Validated\n * server-side — unknown / non-image / \"\" is stored as `null`. */\n imageProvider?: string | null\n referencePhotos?: CreatureReferencePhoto[]\n canonicalDescription?: string\n styleLock?: boolean\n /** The user's chosen DEFAULT asset take per variant. OPAQUE\n * `\"<bucket>:<variant>\"` → chosen-URL map; a write REPLACES the whole map.\n * Keys stored verbatim; soft-capped server-side at 200 keys / 2048-char values. */\n selectedAssetByVariant?: Record<string, string>\n /** Initial voice selection (see `CreatureVoice`). Omit for a voiceless creature. */\n voice?: CreatureVoice | null\n}\n\n/**\n * Body for `client.creatures.update()`. Mirrors the UPDATE branch of\n * `upsertCreatureBody` in `backend/src/routes/creatures.ts`.\n *\n * Worker-owned asset buckets (`angles` / `poses` / `variations` /\n * `motionClips`) are deliberately omitted — the route drops them on UPDATE\n * so a Studio auto-save with a stale snapshot cannot clobber the worker's\n * atomic `append_creature_asset()` writes.\n *\n * `expectedUpdatedAt` is the optimistic-concurrency token: when present, the\n * UPDATE only succeeds if the row's `updated_at` still matches; on mismatch\n * the route returns 409 so the studio can re-fetch + merge.\n */\nexport interface UpdateCreatureInput {\n name?: string\n description?: string\n /** Free-text creature type/species (the creature delta vs object). */\n species?: string\n category?: string\n style?: string\n sourceImageUrl?: string\n /** Persistent image-model id (a MODEL_CATALOG image model). Validated\n * server-side — unknown / non-image / \"\" is stored as `null`. */\n imageProvider?: string | null\n referencePhotos?: CreatureReferencePhoto[]\n canonicalDescription?: string\n styleLock?: boolean\n /** The user's chosen DEFAULT asset take per variant. OPAQUE\n * `\"<bucket>:<variant>\"` → chosen-URL map; a write REPLACES the whole map\n * (omit to leave untouched). Keys stored verbatim; soft-capped server-side\n * at 200 keys / 2048-char values. */\n selectedAssetByVariant?: Record<string, string>\n /** Named Creature Boards (see `Creature.boards`) — whole-array replace,\n * USER-owned (unlike the worker-owned buckets it flows through UPDATE).\n * Server caps: 24 boards, 200-char names, 30 sourceImages per board. */\n boards?: Array<{ name: string; url: string; type?: \"looks\" | \"identity\"; sourceImages?: string[] }>\n /** Voice selection (see `CreatureVoice`) — whole-object replace; pass\n * `null` to clear the voice, omit to leave untouched. */\n voice?: CreatureVoice | null\n expectedUpdatedAt?: string\n}\n\nexport interface UpdateCreatureResult {\n id: string\n updatedAt: string\n}\n\n/**\n * Combined create + update body (parameter for both branches). Exported for\n * callers that want to drive a single `upsert` flow without picking between\n * `Create*` and `Update*`. Mirrors the `upsertCreatureBody` Zod schema in\n * `backend/src/routes/creatures.ts`. `nodeId` + `name` are required on INSERT;\n * `id` flips the route into UPDATE mode.\n */\nexport interface UpsertCreatureInput extends CreateCreatureInput {\n id?: string\n expectedUpdatedAt?: string\n}\n\nexport type UpsertCreatureResult = { id: string } | UpdateCreatureResult\n\nexport interface ListCreaturesParams {\n /** When true, return archived creatures instead of active ones. */\n archived?: boolean\n /** Optional project filter — server-scoped to the caller's user. */\n projectId?: string\n /**\n * Search words: only the creatures whose name or description contains\n * every word (split on spaces, the first 5), in any order, ignoring case.\n * Each word is matched as written (`%`, `_` and `*` are not wildcards;\n * punctuation is kept); blank means no search; up to 200 characters.\n * Combines with the other filters and with `cursor` paging.\n */\n q?: string\n /**\n * Max rows to return (cap 500). OPT-IN: omitted, the server returns the\n * full legacy listing with no `nextCursor`; supplied, the response is one\n * page plus `nextCursor` — keep passing it back until it is `null`.\n */\n limit?: number\n /** Opaque cursor from a prior page's `nextCursor` (fetches the next page). */\n cursor?: string\n}\n\n/**\n * Input for `client.creatures.generate()` — fires the\n * `POST /v1/generate-creature` route. Produces 1–10 candidate\n * main images; each lands as one `jobs` row in `pending` state and is then\n * enqueued for the worker.\n *\n * When `attachToCreatureId` is set AND `count === 1`, the worker writes the\n * resulting URL directly to `creatures.source_image_url` on completion —\n * caller doesn't need a separate `approveMainImage` call. Multi-candidate\n * batches MUST go through explicit approval so the user picks the winner.\n *\n * `seedPromptHint` flows the parameter-picker's prompt fragment through to the\n * worker so a catalog selection (e.g. \"armored frost dragon\") gets appended to\n * the generated prompt context.\n */\nexport interface GenerateCreatureInput extends GenerationSessionParams {\n name: string\n description?: string\n userPrompt?: string\n /** Free-text creature type/species (the creature delta vs object). */\n species?: string\n category?: string\n style?: \"realistic\" | \"anime\" | \"3d-pixar\" | \"illustration\"\n sourceImageUrl?: string\n provider?: string\n /** Number of candidate images to generate (1–10; server-validated). */\n count?: number\n /** Auto-attach the result to this creature row (single-candidate only). */\n attachToCreatureId?: string\n /** Parameter-picker prompt-fragment pass-through. */\n seedPromptHint?: string\n /** Optional name to set on the attached row alongside the main image. */\n attachName?: string\n /** Optimistic-concurrency token for the single-candidate auto-attach path. */\n expectedUpdatedAt?: string\n}\n\n/**\n * `generate()` response — `jobIds` is ALWAYS present (the harmonized contract,\n * matching characters). `jobId` is a deprecated back-compat alias populated only\n * on `count === 1`; prefer `jobIds`. (Will be removed on the next major.)\n */\nexport interface GenerateCreatureResult {\n jobIds: string[]\n /** @deprecated count===1 back-compat alias — use `jobIds`. */\n jobId?: string\n}\n\n/**\n * Input for `client.creatures.generateAsset()` — fires the\n * `POST /v1/generate-creature-asset` route. Produces a single\n * angles / poses / variations / custom variant.\n *\n * When all three studio-path fields are set (`attachToCreatureId` +\n * `attachToColumn` + `attachName`), the worker appends\n * `{ name: attachName, url: <result> }` to the named JSONB array column on\n * the user's creature row on completion. `attachToColumn` is REQUIRED for\n * `assetType === \"custom\"` — the worker can't infer the bucket from the\n * asset type.\n */\nexport interface GenerateCreatureAssetInput extends GenerationSessionParams {\n assetType: CreatureAssetType\n variant: string\n name: string\n description?: string\n userPrompt?: string\n category?: string\n style?: string\n sourceImageUrl?: string\n provider?: string\n attachToCreatureId?: string\n attachToColumn?: CreatureAttachColumn\n attachName?: string\n /** Parameter-picker prompt-fragment pass-through. */\n seedPromptHint?: string\n}\n\nexport interface GenerateCreatureAssetResult {\n jobId: string\n}\n\n/**\n * Input for `client.creatures.generateMotion()` — fires the\n * `POST /v1/generate-creature-motion` route. Produces a single motion clip\n * (idle, prowl, attack, etc.) animated FROM a static creature-shot image.\n *\n * Mirrors `client.objects.generateMotion()` — the creature motion route reuses\n * the entity-agnostic object motion helpers server-side. The route hardcodes\n * the attach column to `motion_clips` — callers supply `attachToCreatureId` +\n * `attachName` only.\n *\n * `sourceImageUrl` is REQUIRED — image-to-video needs a source frame and the\n * route has no fallback (the studio path supplies the canonical creature-shot\n * URL explicitly).\n *\n * Defaults vs location:\n * - `provider` defaults to `\"kling-turbo\"` (not location's `\"kling\"`)\n * - `aspectRatio` defaults to `\"1:1\"` server-side via\n * `resolveObjectAspectRatio({ assetType: \"motion\" })` — creatures use\n * centered reference framing, not cinematic establishing shots.\n *\n * When the studio path is set (`attachToCreatureId` + `attachName`), the\n * worker appends `{ name: attachName, url: <result> }` to the creature row's\n * `motion_clips` JSONB column on completion.\n */\nexport interface GenerateCreatureMotionInput extends GenerationSessionParams {\n motionPrompt: string\n sourceImageUrl: string\n provider?: string\n name: string\n /** Source clip URL — when set, worker routes to video-to-video refine. */\n refineFromVideoUrl?: string\n category?: string\n style?: \"realistic\" | \"anime\" | \"3d-pixar\" | \"illustration\"\n canonicalDescription?: string\n /** Parameter-picker prompt-fragment pass-through. */\n seedPromptHint?: string\n attachToCreatureId?: string\n attachName?: string\n /**\n * Optional aspect ratio override. Defaults to 1:1 server-side. One of the\n * 5-value `CreatureAspectRatio` union (1:1 / 3:4 / 16:9 / 9:16 / 4:3) — the\n * creature route reuses the object aspect enum.\n */\n aspectRatio?: ObjectAspectRatio\n /**\n * Optional clip duration in seconds. Validated server-side against the chosen\n * provider's allowed durations (e.g. kling 5/10, wan-i2v 5/10/15); omitted →\n * the model's own default (no behavior change). Mirrors generate-video's\n * per-model i2v duration lever.\n */\n duration?: number\n}\n\nexport interface GenerateCreatureMotionResult {\n jobId: string\n}\n\nexport interface ApproveCreatureMainImageResult {\n sourceImageUrl: string\n /**\n * LLM-authored caption. `null` when the LLM caption sub-failed — the wire\n * sends `\"\"`, normalized to `null` here so consumers see the same\n * `string | null` semantics as characters. The main image is still set; call\n * `recaption()` to retry.\n */\n canonicalDescription: string | null\n}\n\nexport interface RecaptionCreatureResult {\n canonicalDescription: string\n}\n\nexport class CreaturesResource {\n constructor(private client: NodaroClientCore) {}\n\n /**\n * List the caller's creatures. By default returns active creatures only;\n * pass `archived: true` to fetch soft-deleted rows for an \"archive\" view.\n * Optional `projectId` scopes the result to a single project; `q` keeps the\n * creatures whose name or description contains it.\n */\n list(params: ListCreaturesParams = {}): Promise<{ creatures: Creature[]; nextCursor?: string | null }> {\n const query: Record<string, string | undefined> = {}\n if (params.archived) query.archived = \"true\"\n if (params.projectId) query.projectId = params.projectId\n if (params.q) query.q = params.q\n if (params.limit !== undefined) query.limit = String(params.limit)\n if (params.cursor) query.cursor = params.cursor\n return this.client.request(\"GET\", \"/v1/creatures\", { query })\n }\n\n /**\n * Convenience wrapper for `list({ archived: true })`. Returns soft-deleted\n * rows so callers can drive a UI \"Archived\" tab without re-encoding the\n * query param.\n *\n * `archived` is omitted from the param type — it's always set to `true` here.\n */\n listArchived(params: Omit<ListCreaturesParams, \"archived\"> = {}): Promise<{ creatures: Creature[]; nextCursor?: string | null }> {\n return this.list({ ...params, archived: true })\n }\n\n /**\n * Fetch a single creature including in-flight asset job state. Soft-deleted\n * (archived) rows are NOT returned by id — the route enforces\n * `deleted_at IS NULL` so archived creatures 404 (uniform \"not_found\" — does\n * not leak the deleted vs non-existent distinction).\n */\n async get(id: string): Promise<CreatureDetail> {\n const res = await this.client.request<CreatureDetail>(\n \"GET\",\n `/v1/creatures/${encodeURIComponent(id)}`,\n )\n // Normalize the wire `\"\"` caption (DB null / LLM sub-failure) → null so\n // consumers see the same `string | null` semantics as characters. New\n // object — never mutate the response.\n return { ...res, canonicalDescription: res.canonicalDescription || null }\n }\n\n /**\n * Create a new creature. `name` + `nodeId` are required — the route 400s\n * otherwise. Returns the new row's id.\n *\n * Note: the underlying route is the same `POST /v1/creatures` upsert that\n * powers `update()`. This convenience wrapper enforces the INSERT-required\n * fields at the type level and never sends an `id`.\n */\n create(data: CreateCreatureInput): Promise<{ id: string }> {\n return this.client.request(\"POST\", \"/v1/creatures\", { body: data })\n }\n\n /**\n * Update a creature. Only the fields you pass are written — undefined keys\n * are NOT touched on the row. Worker-owned asset buckets are intentionally\n * not exposed on this surface (see `UpdateCreatureInput` for the rationale).\n *\n * Optimistic-concurrency: pass `expectedUpdatedAt` to require the row's\n * `updated_at` still matches; on mismatch the route returns 409\n * `concurrent_modification` carrying the fresh `updatedAt`. The SDK\n * surfaces that as a generic `NodaroError` with the same code.\n */\n update(id: string, data: UpdateCreatureInput): Promise<UpdateCreatureResult> {\n return this.client.request(\"POST\", \"/v1/creatures\", {\n body: { id, ...data },\n })\n }\n\n /**\n * Soft-delete (archive) a creature. The row is hidden from `list()` by\n * default but recoverable via `restore(id)` or visible under\n * `listArchived()`. Idempotent — repeating a delete on an already-archived\n * row is a no-op.\n */\n delete(id: string): Promise<{ success: true; archived: true }> {\n return this.client.request(\"DELETE\", `/v1/creatures/${encodeURIComponent(id)}`)\n }\n\n /**\n * Hard-delete (permanent) a creature — the row + every R2 asset it\n * references. Archived rows ONLY: active creatures return 400 `not_archived`.\n * Call `delete()` first to archive, then `permanentDelete()` to destroy.\n *\n * Mirrors the `app_runs` permanent-delete pattern (archive-first) so a\n * stray SDK / curl caller cannot bypass the studio's archive-first UI\n * flow.\n */\n permanentDelete(id: string): Promise<{ success: true; permanent: true }> {\n return this.client.request(\"DELETE\", `/v1/creatures/${encodeURIComponent(id)}`, {\n query: { permanent: \"true\" },\n })\n }\n\n /**\n * Un-archive a creature. If the original name now collides (case-\n * insensitive) with an active row, the server auto-suffixes \"(restored)\"\n * and returns the effective name.\n */\n restore(id: string): Promise<{ id: string; name: string }> {\n return this.client.request(\"POST\", `/v1/creatures/${encodeURIComponent(id)}/restore`)\n }\n\n /**\n * Fire `POST /v1/generate-creature` to produce one or more candidate main\n * images. With `count > 1`, all jobs are reserved up-front before any\n * is enqueued — mid-batch failures roll back atomically.\n *\n * When `attachToCreatureId` is set AND `count === 1`, the worker writes\n * the result directly to the row's `source_image_url`; otherwise you must\n * call `approveMainImage()` after picking a candidate.\n */\n async generate(data: GenerateCreatureInput): Promise<GenerateCreatureResult> {\n const res = await this.client.request<{ jobId?: string; jobIds?: string[] }>(\n \"POST\", \"/v1/generate-creature\", { body: data },\n )\n // Tolerate the legacy `{ jobId }`-only shape (older server): synthesize jobIds.\n const jobIds = res.jobIds ?? (res.jobId ? [res.jobId] : [])\n return res.jobId ? { jobIds, jobId: res.jobId } : { jobIds }\n }\n\n /**\n * Fire `POST /v1/generate-creature-asset` to produce a single variant.\n * When the studio path is set (`attachToCreatureId` + `attachToColumn` +\n * `attachName`), the worker appends `{ name: attachName, url: <result> }`\n * to the named JSONB array column on completion.\n *\n * Note: `attachToColumn` is REQUIRED for `assetType === \"custom\"` — the\n * worker can't infer the bucket from the asset type. For canonical asset\n * types (`angles` / `poses` / `variations`), the column is derived\n * automatically by the route.\n */\n generateAsset(\n data: GenerateCreatureAssetInput,\n ): Promise<GenerateCreatureAssetResult> {\n return this.client.request(\"POST\", \"/v1/generate-creature-asset\", { body: data })\n }\n\n /**\n * Fire `POST /v1/generate-creature-motion` to animate the creature's main\n * image into a motion clip. Image-to-video, single clip per call; the\n * attach column is hardcoded to `motion_clips` server-side (creatures have a\n * single motion bucket so the caller doesn't supply `attachToColumn`).\n * When the studio path is set (`attachToCreatureId` + `attachName`), the\n * worker appends `{ name: attachName, url: <result> }` to the row's\n * `motion_clips` column on completion.\n *\n * Defaults: `provider` → `\"kling-turbo\"`, `aspectRatio` → `\"1:1\"` (set\n * server-side via `resolveObjectAspectRatio({ assetType: \"motion\" })`).\n */\n generateMotion(\n data: GenerateCreatureMotionInput,\n ): Promise<GenerateCreatureMotionResult> {\n return this.client.request(\"POST\", \"/v1/generate-creature-motion\", { body: data })\n }\n\n /**\n * Approve a completed `generate-creature` job as the creature's main image.\n * Sets `source_image_url` and fires the LLM caption (Claude Sonnet vision)\n * inline. Returns the new main-image URL plus the caption.\n *\n * Caption-failure semantics: the route still sends `\"\"` on LLM sub-failure,\n * but the SDK normalizes `\"\"` → `null` here so `canonicalDescription` carries\n * the same `string | null` semantics as characters. The main image is still\n * set; call `recaption()` to retry.\n *\n * Optimistic-concurrency: pass `expectedUpdatedAt` to gate the update on\n * the row's current `updated_at`; on mismatch the route returns 409\n * `concurrent_modification` carrying the fresh token.\n */\n async approveMainImage(\n id: string,\n candidateJobId: string,\n expectedUpdatedAt?: string,\n ): Promise<ApproveCreatureMainImageResult> {\n const res = await this.client.request<{ sourceImageUrl: string; canonicalDescription: string | null }>(\n \"POST\",\n `/v1/creatures/${encodeURIComponent(id)}/approve-main-image`,\n { body: { candidateJobId, expectedUpdatedAt } },\n )\n // Normalize the wire `\"\"` (LLM sub-failure) → null; build a new object\n // rather than mutating the response.\n return { sourceImageUrl: res.sourceImageUrl, canonicalDescription: res.canonicalDescription || null }\n }\n\n /**\n * Re-fire the LLM caption against the creature's current main image. 502s\n * on LLM failure (unlike `approveMainImage` which preserves the side-effect\n * and returns \"\"); returns 400 `main_image_required` if no main image is\n * set yet.\n *\n * The route is a pure idempotent retry — it does NOT accept an\n * `expectedUpdatedAt` token (backend route is idempotent retry, not gated on\n * optimistic-concurrency).\n */\n recaption(id: string): Promise<RecaptionCreatureResult> {\n return this.client.request(\n \"POST\",\n `/v1/creatures/${encodeURIComponent(id)}/llm-caption`,\n )\n }\n}\n"]}
|