@koda-sl/baker-cli 0.489.0 → 0.490.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 +169 -7
- package/dist/{account-Z65CPOWE.js → account-3H6BZO5H.js} +2 -2
- package/dist/account-IKFDY52P.js +138 -0
- package/dist/account-IKFDY52P.js.map +1 -0
- package/dist/account-assets-LKZVWZAR.js +289 -0
- package/dist/account-assets-LKZVWZAR.js.map +1 -0
- package/dist/account-level-UJOZDVXY.js +608 -0
- package/dist/account-level-UJOZDVXY.js.map +1 -0
- package/dist/{account-writes-4N2MA2ZR.js → account-writes-AE5IJGGW.js} +2 -2
- package/dist/{accounts-UA2ZWRN4.js → accounts-K4INATCW.js} +2 -2
- package/dist/{activities-IQPJPP4B.js → activities-T253KK4Q.js} +4 -4
- package/dist/{ad-group-writes-EUTMPBMK.js → ad-group-writes-VRSBI2Z2.js} +2 -2
- package/dist/{ad-groups-OVPAI5RM.js → ad-groups-IEBVEAMS.js} +6 -6
- package/dist/{ad-writes-DACTYFEO.js → ad-writes-ALV4KFPZ.js} +2 -2
- package/dist/{ads-L65JIKCD.js → ads-CQZHD7FC.js} +7 -7
- package/dist/{ads-G6AS5L7G.js → ads-QIKZ6O2N.js} +5 -5
- package/dist/{ads-HXX2IAFF.js → ads-ZEY72UBN.js} +14 -13
- package/dist/ads-ZEY72UBN.js.map +1 -0
- package/dist/{adsets-LPN6WFGF.js → adsets-5H3MOT3D.js} +15 -14
- package/dist/{adsets-LPN6WFGF.js.map → adsets-5H3MOT3D.js.map} +1 -1
- package/dist/{analytics-QKP3A5F3.js → analytics-ALOZ7ZZ4.js} +1 -1
- package/dist/asset-writes-L5TMKIZC.js +47 -0
- package/dist/audience-writes-X52VG35Y.js +324 -0
- package/dist/audience-writes-X52VG35Y.js.map +1 -0
- package/dist/{audiences-RPLVMO4H.js → audiences-AAZH56WD.js} +2 -2
- package/dist/{audiences-XEZHACKH.js → audiences-X3RLGOVM.js} +12 -6
- package/dist/audiences-X3RLGOVM.js.map +1 -0
- package/dist/{avatars-MXTI74VC.js → avatars-YSFFRHDK.js} +1 -1
- package/dist/{brief-BN4UGUXF.js → brief-7S6XCJIA.js} +15 -15
- package/dist/{businesses-PRRYPR7H.js → businesses-H3HIDQX6.js} +2 -2
- package/dist/{campaign-writes-BAFB5E7A.js → campaign-writes-7ZF57KLH.js} +3 -3
- package/dist/campaign-writes-7ZF57KLH.js.map +1 -0
- package/dist/{campaign-writes-U5LTDTYK.js → campaign-writes-U5PUVSMT.js} +2 -2
- package/dist/{campaigns-4SOLY7OR.js → campaigns-AV6G3AUU.js} +32 -15
- package/dist/campaigns-AV6G3AUU.js.map +1 -0
- package/dist/{campaigns-TFEQTSO3.js → campaigns-JEIKY2M4.js} +6 -6
- package/dist/{campaigns-NR6TNQFN.js → campaigns-VTRMKSAT.js} +5 -5
- package/dist/{canvas-GJAQAVS6.js → canvas-SVJEQO4V.js} +13 -13
- package/dist/{catalog-USZL4SGX.js → catalog-S32MX453.js} +5 -5
- package/dist/{catalogs-A7XMEEEP.js → catalogs-OCVXZLIF.js} +2 -2
- package/dist/catalogs-RXJTZTVX.js +778 -0
- package/dist/catalogs-RXJTZTVX.js.map +1 -0
- package/dist/{chatgpt-4PEWDJKP.js → chatgpt-QVF2FD3E.js} +12 -12
- package/dist/{chats-INN2OHSH.js → chats-QG72JB6Y.js} +22 -8
- package/dist/chats-QG72JB6Y.js.map +1 -0
- package/dist/{check-MMJGFFZS.js → check-SLNHVYGS.js} +4 -4
- package/dist/{chunk-7RBJ2Z7Z.js → chunk-2C7AHPM4.js} +25 -6
- package/dist/chunk-2C7AHPM4.js.map +1 -0
- package/dist/{chunk-KPYDTIAI.js → chunk-2WZI36D3.js} +2 -2
- package/dist/{chunk-FUKDI2UK.js → chunk-3W6G6ARX.js} +2 -2
- package/dist/{chunk-JWSEPW7F.js → chunk-46GWHUKN.js} +2 -2
- package/dist/{chunk-3TZVZXM6.js → chunk-4KJMLYCD.js} +6 -6
- package/dist/{chunk-6JWEGFM5.js → chunk-5C35OW7L.js} +38 -7
- package/dist/chunk-5C35OW7L.js.map +1 -0
- package/dist/chunk-5GQCN2QZ.js +391 -0
- package/dist/chunk-5GQCN2QZ.js.map +1 -0
- package/dist/{chunk-KIGGMKAE.js → chunk-65Y3RCWP.js} +4 -2
- package/dist/chunk-65Y3RCWP.js.map +1 -0
- package/dist/{chunk-R3EKM2P2.js → chunk-6NCJGU6I.js} +5 -5
- package/dist/chunk-A4MVVPJ2.js +4204 -0
- package/dist/chunk-A4MVVPJ2.js.map +1 -0
- package/dist/{chunk-LPXSM2DI.js → chunk-AO45BX6Q.js} +3 -3
- package/dist/{chunk-3UXMQ3K2.js → chunk-AQM4JH62.js} +2 -2
- package/dist/chunk-AQM4JH62.js.map +1 -0
- package/dist/{chunk-NPMAATZG.js → chunk-C7NWUCLQ.js} +2 -2
- package/dist/chunk-CP4P6YKM.js +287 -0
- package/dist/chunk-CP4P6YKM.js.map +1 -0
- package/dist/{chunk-OWA7ZLC4.js → chunk-D4CKCNGW.js} +4 -4
- package/dist/{chunk-H5HDZ7IC.js → chunk-DCBZ5CHZ.js} +4 -4
- package/dist/{chunk-C6EYCD5J.js → chunk-FVHJCERJ.js} +5 -5
- package/dist/{chunk-BITS62MF.js → chunk-G6XKD7QE.js} +2 -2
- package/dist/{chunk-QE3JEJXF.js → chunk-GSZZLW5Q.js} +4 -4
- package/dist/chunk-HLVRHBKL.js +1078 -0
- package/dist/chunk-HLVRHBKL.js.map +1 -0
- package/dist/{chunk-TPANP5A2.js → chunk-JKJQWRLO.js} +2 -2
- package/dist/{chunk-62JQQUAU.js → chunk-JQH5VG6F.js} +2 -2
- package/dist/{chunk-6WXV5GTA.js → chunk-JVH5A3XC.js} +2 -2
- package/dist/{chunk-AVNSH2JE.js → chunk-KOXDXSKN.js} +7 -7
- package/dist/{chunk-2XRMPSEV.js → chunk-LXQB4ZGE.js} +2 -2
- package/dist/{chunk-ZL23HA4N.js → chunk-M6PN3VH6.js} +2 -2
- package/dist/{chunk-TZEVD4Q6.js → chunk-P5FRWPG7.js} +2 -2
- package/dist/{chunk-CSZFZKVX.js → chunk-PQJXIY64.js} +5 -5
- package/dist/{chunk-OP7DNHD2.js → chunk-QTOZ32SU.js} +27 -1
- package/dist/chunk-QTOZ32SU.js.map +1 -0
- package/dist/chunk-SVAB6KV5.js +219 -0
- package/dist/chunk-SVAB6KV5.js.map +1 -0
- package/dist/{chunk-LBO2YAZY.js → chunk-UNX6BS4U.js} +15 -15
- package/dist/{chunk-UWXDNVS5.js → chunk-ZJSGGJ5R.js} +2 -2
- package/dist/cli.js +20 -20
- package/dist/{connect-WBGCBBFJ.js → connect-S54TJ6OV.js} +3 -3
- package/dist/{conversion-writes-JU7Q2MUO.js → conversion-writes-ECZBVY7D.js} +2 -2
- package/dist/{conversions-3ISBR3TS.js → conversions-5QCSCRLI.js} +3 -3
- package/dist/copy-writes-D2RTHAL6.js +167 -0
- package/dist/copy-writes-D2RTHAL6.js.map +1 -0
- package/dist/{creatives-VQO2TKE3.js → creatives-5I3G5YP3.js} +2 -2
- package/dist/{creatives-YJ3CXZQC.js → creatives-MZ6ICNSY.js} +5 -4
- package/dist/{creatives-YJ3CXZQC.js.map → creatives-MZ6ICNSY.js.map} +1 -1
- package/dist/{creatives-S5QUWUL6.js → creatives-PCAGWPW3.js} +10 -10
- package/dist/{critique-5LCG5TYF.js → critique-NRHUPIWF.js} +7 -7
- package/dist/{custom-conversions-YRYE65PU.js → custom-conversions-FIP6ZS34.js} +5 -3
- package/dist/{custom-conversions-YRYE65PU.js.map → custom-conversions-FIP6ZS34.js.map} +1 -1
- package/dist/{draft-Y2QJE2NM.js → draft-34CGWUVA.js} +2 -2
- package/dist/{draft-GPN3HOAG.js → draft-4P3YO67N.js} +9 -5
- package/dist/draft-4P3YO67N.js.map +1 -0
- package/dist/{draft-EWDOIXSH.js → draft-L45PGCYZ.js} +7 -3
- package/dist/draft-L45PGCYZ.js.map +1 -0
- package/dist/engine/index.js +4 -4
- package/dist/{experiment-G3FQVAJU.js → experiment-7N4QFRWV.js} +4 -4
- package/dist/{feedback-CAOZPGTT.js → feedback-O3H42V4I.js} +10 -10
- package/dist/{feedback-record-EXV5H6OS.js → feedback-record-FAPN2GBS.js} +12 -12
- package/dist/{find-EVY4XEIQ.js → find-FSQAEGGF.js} +4 -4
- package/dist/{flows-Z7355RMD.js → flows-T22B77J3.js} +3 -3
- package/dist/{funnel-2B3JXJPX.js → funnel-7OA33VRP.js} +5 -5
- package/dist/{ga4-2BL5YAYN.js → ga4-LPDIBNYP.js} +1 -1
- package/dist/{google-7STODZQR.js → google-5ESVO76E.js} +5 -5
- package/dist/{gsc-UU3T2C6B.js → gsc-FIZTQX3N.js} +1 -1
- package/dist/{history-IQ33J5PB.js → history-QKDYBSYM.js} +2 -2
- package/dist/{icon-GB7UH5RF.js → icon-CSVAZ7NE.js} +4 -4
- package/dist/{ideas-F6CIGTVU.js → ideas-JQT422P7.js} +4 -4
- package/dist/{images-WCKTD6Z2.js → images-WBNWK2ZH.js} +6 -6
- package/dist/{insights-4HT2NAYP.js → insights-YWVJMATY.js} +4 -3
- package/dist/{insights-4HT2NAYP.js.map → insights-YWVJMATY.js.map} +1 -1
- package/dist/{inspiration-XQYHBJY2.js → inspiration-IX5N724J.js} +1 -1
- package/dist/instant-experiences-NQ2GWIWL.js +257 -0
- package/dist/instant-experiences-NQ2GWIWL.js.map +1 -0
- package/dist/{landing-WUILAWDS.js → landing-Y6QCTXCZ.js} +2 -2
- package/dist/leads-THI37ZMD.js +537 -0
- package/dist/leads-THI37ZMD.js.map +1 -0
- package/dist/{learn-CC6Q5IK2.js → learn-3BDZUWDT.js} +5 -5
- package/dist/{linkedin-XKVPSCLV.js → linkedin-UGMAFSGO.js} +2 -2
- package/dist/{locations-YA7NZY44.js → locations-HM56X2MK.js} +2 -2
- package/dist/locations-HM56X2MK.js.map +1 -0
- package/dist/{logo-YSNUUT33.js → logo-VHXH4J6A.js} +3 -3
- package/dist/{make-ED7HBLH3.js → make-W2PYZXYF.js} +39 -39
- package/dist/media-H6B7VDON.js +18 -0
- package/dist/media-H6B7VDON.js.map +1 -0
- package/dist/{media-sources-PEHUMH7C.js → media-sources-EZKAJNVD.js} +1 -1
- package/dist/meta-YHDTGJQ6.js +122 -0
- package/dist/meta-YHDTGJQ6.js.map +1 -0
- package/dist/{options-6FCNFWUF.js → options-NSCZSQ5P.js} +3 -3
- package/dist/page-photos-CXRG4AXV.js +115 -0
- package/dist/page-photos-CXRG4AXV.js.map +1 -0
- package/dist/{pages-FTI44OSH.js → pages-PTWRXAZT.js} +2 -2
- package/dist/{pixels-6IUB3Y3H.js → pixels-MYT3TCHZ.js} +2 -2
- package/dist/{pixels-MBKR4XPX.js → pixels-ZZCQUS3J.js} +2 -2
- package/dist/{preview-V4YBD45S.js → preview-XOXAAPMQ.js} +73 -27
- package/dist/preview-XOXAAPMQ.js.map +1 -0
- package/dist/{rerun-A2XHGFZS.js → rerun-5THJLQQJ.js} +18 -18
- package/dist/{research-BLDY5UWH.js → research-JHDWWFL7.js} +1 -1
- package/dist/rule-writes-6ZCAJDYZ.js +522 -0
- package/dist/rule-writes-6ZCAJDYZ.js.map +1 -0
- package/dist/rules-BMYOY2BM.js +216 -0
- package/dist/rules-BMYOY2BM.js.map +1 -0
- package/dist/{rules-SK5DFFPY.js → rules-YLLFDZEM.js} +3 -3
- package/dist/{rules-add-YQNYSME7.js → rules-add-U2GU4AGP.js} +4 -4
- package/dist/{run-KBN5K7LE.js → run-V5YQB6TH.js} +18 -18
- package/dist/{scaffold-ad-6BN5LWQH.js → scaffold-ad-H4GJOKAW.js} +12 -12
- package/dist/{scaffold-static-ad-VVZRAWBR.js → scaffold-static-ad-2YIFHCTL.js} +25 -25
- package/dist/{scaffold-video-LFIYI4GP.js → scaffold-video-3EJLKR2O.js} +14 -14
- package/dist/{select-QBU6ED4K.js → select-I22NPSIW.js} +9 -9
- package/dist/{set-prompt-TL64CRBQ.js → set-prompt-S75OMQ7L.js} +8 -8
- package/dist/{shared-NDRFKAH7.js → shared-3IBNDEFL.js} +2 -2
- package/dist/{sources-RMNFV4CA.js → sources-VA23PDND.js} +1 -1
- package/dist/{stale-ITFCPOER.js → stale-MHTU2NQJ.js} +8 -8
- package/dist/{stats-RCLQE4HJ.js → stats-ZAGJH4AD.js} +1 -1
- package/dist/{stock-ECRBD7RP.js → stock-6SHHLSKG.js} +5 -5
- package/dist/studies-4NIV4D5Y.js +249 -0
- package/dist/studies-4NIV4D5Y.js.map +1 -0
- package/dist/{studio-MARZ22J2.js → studio-ZLCGXFAN.js} +1 -1
- package/dist/study-writes-L2AA2PGL.js +467 -0
- package/dist/study-writes-L2AA2PGL.js.map +1 -0
- package/dist/{sync-definition-C6ROLKJ4.js → sync-definition-2EBSQA6A.js} +11 -11
- package/dist/{tag-manager-G3LBQZUL.js → tag-manager-3CJ66GKJ.js} +1 -1
- package/dist/targeting-LNDQV4EK.js +759 -0
- package/dist/targeting-LNDQV4EK.js.map +1 -0
- package/dist/{testimonials-YMMA5YWL.js → testimonials-GR6TIS5S.js} +2 -2
- package/dist/{translate-OXVIMYHE.js → translate-GEFUP6KQ.js} +18 -18
- package/dist/{validate-ZS2M5Q3V.js → validate-NOWIOAHE.js} +11 -11
- package/dist/{videos-I6YXFBFT.js → videos-XMTDEHEJ.js} +1 -1
- package/dist/{viewer-check-7ZG7KHEN.js → viewer-check-U4XZMMS7.js} +6 -6
- package/dist/viewer-check-U4XZMMS7.js.map +1 -0
- package/dist/{winning-ads-ABN5OULS.js → winning-ads-QOAYIR5U.js} +1 -1
- package/dist/{write-commands-HCQI4Y27.js → write-commands-PEJBTME6.js} +485 -57
- package/dist/write-commands-PEJBTME6.js.map +1 -0
- package/dist/{x-WK2VQDPF.js → x-VCSMV7T5.js} +4 -4
- package/package.json +1 -1
- package/dist/account-7LUQWY6Q.js +0 -49
- package/dist/account-7LUQWY6Q.js.map +0 -1
- package/dist/ads-HXX2IAFF.js.map +0 -1
- package/dist/audiences-XEZHACKH.js.map +0 -1
- package/dist/campaign-writes-BAFB5E7A.js.map +0 -1
- package/dist/campaigns-4SOLY7OR.js.map +0 -1
- package/dist/chats-INN2OHSH.js.map +0 -1
- package/dist/chunk-3UXMQ3K2.js.map +0 -1
- package/dist/chunk-6JWEGFM5.js.map +0 -1
- package/dist/chunk-7RBJ2Z7Z.js.map +0 -1
- package/dist/chunk-GOJXKIFQ.js +0 -1605
- package/dist/chunk-GOJXKIFQ.js.map +0 -1
- package/dist/chunk-KIGGMKAE.js.map +0 -1
- package/dist/chunk-OP7DNHD2.js.map +0 -1
- package/dist/draft-EWDOIXSH.js.map +0 -1
- package/dist/draft-GPN3HOAG.js.map +0 -1
- package/dist/leads-2XOSAYP4.js +0 -293
- package/dist/leads-2XOSAYP4.js.map +0 -1
- package/dist/locations-YA7NZY44.js.map +0 -1
- package/dist/media-ES2UBGYW.js +0 -15
- package/dist/media-ES2UBGYW.js.map +0 -1
- package/dist/meta-AOIPEDV5.js +0 -69
- package/dist/meta-AOIPEDV5.js.map +0 -1
- package/dist/preview-V4YBD45S.js.map +0 -1
- package/dist/write-commands-HCQI4Y27.js.map +0 -1
- /package/dist/{account-Z65CPOWE.js.map → account-3H6BZO5H.js.map} +0 -0
- /package/dist/{account-writes-4N2MA2ZR.js.map → account-writes-AE5IJGGW.js.map} +0 -0
- /package/dist/{accounts-UA2ZWRN4.js.map → accounts-K4INATCW.js.map} +0 -0
- /package/dist/{activities-IQPJPP4B.js.map → activities-T253KK4Q.js.map} +0 -0
- /package/dist/{ad-group-writes-EUTMPBMK.js.map → ad-group-writes-VRSBI2Z2.js.map} +0 -0
- /package/dist/{ad-groups-OVPAI5RM.js.map → ad-groups-IEBVEAMS.js.map} +0 -0
- /package/dist/{ad-writes-DACTYFEO.js.map → ad-writes-ALV4KFPZ.js.map} +0 -0
- /package/dist/{ads-L65JIKCD.js.map → ads-CQZHD7FC.js.map} +0 -0
- /package/dist/{ads-G6AS5L7G.js.map → ads-QIKZ6O2N.js.map} +0 -0
- /package/dist/{analytics-QKP3A5F3.js.map → analytics-ALOZ7ZZ4.js.map} +0 -0
- /package/dist/{connect-WBGCBBFJ.js.map → asset-writes-L5TMKIZC.js.map} +0 -0
- /package/dist/{audiences-RPLVMO4H.js.map → audiences-AAZH56WD.js.map} +0 -0
- /package/dist/{avatars-MXTI74VC.js.map → avatars-YSFFRHDK.js.map} +0 -0
- /package/dist/{brief-BN4UGUXF.js.map → brief-7S6XCJIA.js.map} +0 -0
- /package/dist/{businesses-PRRYPR7H.js.map → businesses-H3HIDQX6.js.map} +0 -0
- /package/dist/{campaign-writes-U5LTDTYK.js.map → campaign-writes-U5PUVSMT.js.map} +0 -0
- /package/dist/{campaigns-TFEQTSO3.js.map → campaigns-JEIKY2M4.js.map} +0 -0
- /package/dist/{campaigns-NR6TNQFN.js.map → campaigns-VTRMKSAT.js.map} +0 -0
- /package/dist/{canvas-GJAQAVS6.js.map → canvas-SVJEQO4V.js.map} +0 -0
- /package/dist/{catalog-USZL4SGX.js.map → catalog-S32MX453.js.map} +0 -0
- /package/dist/{catalogs-A7XMEEEP.js.map → catalogs-OCVXZLIF.js.map} +0 -0
- /package/dist/{chatgpt-4PEWDJKP.js.map → chatgpt-QVF2FD3E.js.map} +0 -0
- /package/dist/{check-MMJGFFZS.js.map → check-SLNHVYGS.js.map} +0 -0
- /package/dist/{chunk-KPYDTIAI.js.map → chunk-2WZI36D3.js.map} +0 -0
- /package/dist/{chunk-FUKDI2UK.js.map → chunk-3W6G6ARX.js.map} +0 -0
- /package/dist/{chunk-JWSEPW7F.js.map → chunk-46GWHUKN.js.map} +0 -0
- /package/dist/{chunk-3TZVZXM6.js.map → chunk-4KJMLYCD.js.map} +0 -0
- /package/dist/{chunk-R3EKM2P2.js.map → chunk-6NCJGU6I.js.map} +0 -0
- /package/dist/{chunk-LPXSM2DI.js.map → chunk-AO45BX6Q.js.map} +0 -0
- /package/dist/{chunk-NPMAATZG.js.map → chunk-C7NWUCLQ.js.map} +0 -0
- /package/dist/{chunk-OWA7ZLC4.js.map → chunk-D4CKCNGW.js.map} +0 -0
- /package/dist/{chunk-H5HDZ7IC.js.map → chunk-DCBZ5CHZ.js.map} +0 -0
- /package/dist/{chunk-C6EYCD5J.js.map → chunk-FVHJCERJ.js.map} +0 -0
- /package/dist/{chunk-BITS62MF.js.map → chunk-G6XKD7QE.js.map} +0 -0
- /package/dist/{chunk-QE3JEJXF.js.map → chunk-GSZZLW5Q.js.map} +0 -0
- /package/dist/{chunk-TPANP5A2.js.map → chunk-JKJQWRLO.js.map} +0 -0
- /package/dist/{chunk-62JQQUAU.js.map → chunk-JQH5VG6F.js.map} +0 -0
- /package/dist/{chunk-6WXV5GTA.js.map → chunk-JVH5A3XC.js.map} +0 -0
- /package/dist/{chunk-AVNSH2JE.js.map → chunk-KOXDXSKN.js.map} +0 -0
- /package/dist/{chunk-2XRMPSEV.js.map → chunk-LXQB4ZGE.js.map} +0 -0
- /package/dist/{chunk-ZL23HA4N.js.map → chunk-M6PN3VH6.js.map} +0 -0
- /package/dist/{chunk-TZEVD4Q6.js.map → chunk-P5FRWPG7.js.map} +0 -0
- /package/dist/{chunk-CSZFZKVX.js.map → chunk-PQJXIY64.js.map} +0 -0
- /package/dist/{chunk-LBO2YAZY.js.map → chunk-UNX6BS4U.js.map} +0 -0
- /package/dist/{chunk-UWXDNVS5.js.map → chunk-ZJSGGJ5R.js.map} +0 -0
- /package/dist/{ideas-F6CIGTVU.js.map → connect-S54TJ6OV.js.map} +0 -0
- /package/dist/{conversion-writes-JU7Q2MUO.js.map → conversion-writes-ECZBVY7D.js.map} +0 -0
- /package/dist/{conversions-3ISBR3TS.js.map → conversions-5QCSCRLI.js.map} +0 -0
- /package/dist/{creatives-VQO2TKE3.js.map → creatives-5I3G5YP3.js.map} +0 -0
- /package/dist/{creatives-S5QUWUL6.js.map → creatives-PCAGWPW3.js.map} +0 -0
- /package/dist/{critique-5LCG5TYF.js.map → critique-NRHUPIWF.js.map} +0 -0
- /package/dist/{draft-Y2QJE2NM.js.map → draft-34CGWUVA.js.map} +0 -0
- /package/dist/{experiment-G3FQVAJU.js.map → experiment-7N4QFRWV.js.map} +0 -0
- /package/dist/{feedback-CAOZPGTT.js.map → feedback-O3H42V4I.js.map} +0 -0
- /package/dist/{feedback-record-EXV5H6OS.js.map → feedback-record-FAPN2GBS.js.map} +0 -0
- /package/dist/{find-EVY4XEIQ.js.map → find-FSQAEGGF.js.map} +0 -0
- /package/dist/{flows-Z7355RMD.js.map → flows-T22B77J3.js.map} +0 -0
- /package/dist/{funnel-2B3JXJPX.js.map → funnel-7OA33VRP.js.map} +0 -0
- /package/dist/{ga4-2BL5YAYN.js.map → ga4-LPDIBNYP.js.map} +0 -0
- /package/dist/{google-7STODZQR.js.map → google-5ESVO76E.js.map} +0 -0
- /package/dist/{gsc-UU3T2C6B.js.map → gsc-FIZTQX3N.js.map} +0 -0
- /package/dist/{history-IQ33J5PB.js.map → history-QKDYBSYM.js.map} +0 -0
- /package/dist/{icon-GB7UH5RF.js.map → icon-CSVAZ7NE.js.map} +0 -0
- /package/dist/{logo-YSNUUT33.js.map → ideas-JQT422P7.js.map} +0 -0
- /package/dist/{images-WCKTD6Z2.js.map → images-WBNWK2ZH.js.map} +0 -0
- /package/dist/{inspiration-XQYHBJY2.js.map → inspiration-IX5N724J.js.map} +0 -0
- /package/dist/{landing-WUILAWDS.js.map → landing-Y6QCTXCZ.js.map} +0 -0
- /package/dist/{learn-CC6Q5IK2.js.map → learn-3BDZUWDT.js.map} +0 -0
- /package/dist/{linkedin-XKVPSCLV.js.map → linkedin-UGMAFSGO.js.map} +0 -0
- /package/dist/{run-KBN5K7LE.js.map → logo-VHXH4J6A.js.map} +0 -0
- /package/dist/{make-ED7HBLH3.js.map → make-W2PYZXYF.js.map} +0 -0
- /package/dist/{media-sources-PEHUMH7C.js.map → media-sources-EZKAJNVD.js.map} +0 -0
- /package/dist/{options-6FCNFWUF.js.map → options-NSCZSQ5P.js.map} +0 -0
- /package/dist/{pages-FTI44OSH.js.map → pages-PTWRXAZT.js.map} +0 -0
- /package/dist/{pixels-6IUB3Y3H.js.map → pixels-MYT3TCHZ.js.map} +0 -0
- /package/dist/{pixels-MBKR4XPX.js.map → pixels-ZZCQUS3J.js.map} +0 -0
- /package/dist/{rerun-A2XHGFZS.js.map → rerun-5THJLQQJ.js.map} +0 -0
- /package/dist/{research-BLDY5UWH.js.map → research-JHDWWFL7.js.map} +0 -0
- /package/dist/{rules-SK5DFFPY.js.map → rules-YLLFDZEM.js.map} +0 -0
- /package/dist/{rules-add-YQNYSME7.js.map → rules-add-U2GU4AGP.js.map} +0 -0
- /package/dist/{shared-NDRFKAH7.js.map → run-V5YQB6TH.js.map} +0 -0
- /package/dist/{scaffold-ad-6BN5LWQH.js.map → scaffold-ad-H4GJOKAW.js.map} +0 -0
- /package/dist/{scaffold-static-ad-VVZRAWBR.js.map → scaffold-static-ad-2YIFHCTL.js.map} +0 -0
- /package/dist/{scaffold-video-LFIYI4GP.js.map → scaffold-video-3EJLKR2O.js.map} +0 -0
- /package/dist/{select-QBU6ED4K.js.map → select-I22NPSIW.js.map} +0 -0
- /package/dist/{set-prompt-TL64CRBQ.js.map → set-prompt-S75OMQ7L.js.map} +0 -0
- /package/dist/{sync-definition-C6ROLKJ4.js.map → shared-3IBNDEFL.js.map} +0 -0
- /package/dist/{sources-RMNFV4CA.js.map → sources-VA23PDND.js.map} +0 -0
- /package/dist/{stale-ITFCPOER.js.map → stale-MHTU2NQJ.js.map} +0 -0
- /package/dist/{stats-RCLQE4HJ.js.map → stats-ZAGJH4AD.js.map} +0 -0
- /package/dist/{stock-ECRBD7RP.js.map → stock-6SHHLSKG.js.map} +0 -0
- /package/dist/{studio-MARZ22J2.js.map → studio-ZLCGXFAN.js.map} +0 -0
- /package/dist/{viewer-check-7ZG7KHEN.js.map → sync-definition-2EBSQA6A.js.map} +0 -0
- /package/dist/{tag-manager-G3LBQZUL.js.map → tag-manager-3CJ66GKJ.js.map} +0 -0
- /package/dist/{testimonials-YMMA5YWL.js.map → testimonials-GR6TIS5S.js.map} +0 -0
- /package/dist/{translate-OXVIMYHE.js.map → translate-GEFUP6KQ.js.map} +0 -0
- /package/dist/{validate-ZS2M5Q3V.js.map → validate-NOWIOAHE.js.map} +0 -0
- /package/dist/{videos-I6YXFBFT.js.map → videos-XMTDEHEJ.js.map} +0 -0
- /package/dist/{winning-ads-ABN5OULS.js.map → winning-ads-QOAYIR5U.js.map} +0 -0
- /package/dist/{x-WK2VQDPF.js.map → x-VCSMV7T5.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/catalogs.ts"],"sourcesContent":["import { retailerIdFilter } from \"@baker/api/ads-meta/catalogs\";\nimport { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { repeatedValues } from \"../../../lib/repeatedFlags.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeAdsJson, writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport { csvOrJson, handleMetaError } from \"./shared.ts\";\nimport {\n bareAccountId,\n failWriteValidation,\n loadJsonFileArg,\n mergePayload,\n numberFlag,\n requireTarget,\n stageOp,\n upper,\n} from \"./write-shared.ts\";\n\n/**\n * Product catalogs and what is in them — products, product sets, feeds — read\n * live and changed through this chat's draft (applied at publish). Changing a\n * catalog needs the Catalog permission for Meta (a per-company switch); Baker\n * changes only catalogs the ad account's own Business owns.\n */\n\ntype Row = Record<string, unknown>;\ntype Args = Record<string, unknown>;\n\nconst STAGED_NOTE = \"Staged until publish — review with `baker ads meta draft`.\";\nconst outputArg = { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" } as const;\nconst accountArg = {\n type: \"string\",\n description: \"Numeric account ID or act_N (whose Business owns the catalog)\",\n} as const;\nconst schemaAccount = { type: \"string\", description: \"Ad account the change is staged under\", required: false };\nconst schemaOutput = { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" };\n\nfunction emit(rows: Row[], args: Args, hints: string[]): void {\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(rows, fmt, undefined, hints);\n return;\n }\n writeJsonEnvelope(hints.length > 0 ? { ok: true, data: rows, hints } : { ok: true, data: rows });\n}\n\nfunction requireCatalogId(args: Args): string {\n const id = args[\"catalog-id\"];\n if (typeof id !== \"string\" || id.length === 0) {\n failWriteValidation(\"pass --catalog-id (from `baker ads meta catalogs --business-id <id>`, or a meta_temp_* ref)\");\n }\n return id;\n}\n\nfunction stringArg(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction jsonArg(value: unknown, flag: string): Record<string, unknown> | undefined {\n if (typeof value !== \"string\" || value.length === 0) return undefined;\n try {\n return JSON.parse(value) as Record<string, unknown>;\n } catch {\n failWriteValidation(`--${flag} takes JSON, e.g. '{\"brand\":{\"eq\":\"Acme\"}}'`);\n }\n}\n\nasync function contents(edge: \"products\" | \"feeds\" | \"diagnostics\", args: Args): Promise<Row[]> {\n const params: Record<string, string> = { \"catalog-id\": requireCatalogId(args), edge };\n if (args.full) params.full = \"true\";\n if (stringArg(args[\"retailer-id\"])) params[\"retailer-id\"] = String(args[\"retailer-id\"]);\n return await apiGet<Row[]>(\"/api/ads/meta/catalog-contents\", params);\n}\n\n// --- Catalogs (list, create, rename, delete) ---\n\nregisterSchema({\n command: \"ads.meta.catalogs\",\n description:\n \"Product catalogs a Business owns (for catalog / Advantage+ catalog ads), or one catalog's product sets with --catalog-id.\",\n args: {\n \"business-id\": { type: \"string\", description: \"Business ID (baker ads meta businesses)\", required: false },\n \"catalog-id\": { type: \"string\", description: \"List this catalog's product sets\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Bypass the cache\", required: false },\n output: schemaOutput,\n },\n});\n\nconst catalogsListCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"Product catalogs on a Business, or a catalog's product sets. Runs by default. Example: baker ads meta catalogs --business-id 601050769212882; --catalog-id <id> for its sets\",\n },\n args: {\n \"business-id\": { type: \"string\", description: \"Business ID — from `baker ads meta businesses`\" },\n \"catalog-id\": { type: \"string\", description: \"List the product sets of this catalog\" },\n \"no-cache\": NO_CACHE_ARG,\n output: outputArg,\n },\n run: async ({ args }) => {\n try {\n const cache: Record<string, string> = args[\"no-cache\"] ? { \"skip-cache\": \"true\" } : {};\n if (args[\"catalog-id\"]) {\n const rows = await apiGet<Row[]>(\"/api/ads/meta/product-sets\", {\n \"catalog-id\": args[\"catalog-id\"] as string,\n ...cache,\n });\n emit(rows, args, [\n 'A catalog ad set promotes one product set: promoted_object {\"product_set_id\":\"<id>\"}; product_count 0 means the set\\'s filter matches nothing yet. Read just after a publish with --no-cache.',\n ]);\n return;\n }\n if (!args[\"business-id\"]) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"pass --business-id (from `baker ads meta businesses`) or --catalog-id\",\n },\n });\n process.exit(1);\n }\n const rows = await apiGet<Row[]>(\"/api/ads/meta/catalogs\", {\n \"business-id\": args[\"business-id\"] as string,\n ...cache,\n });\n emit(\n rows,\n args,\n rows.length === 0\n ? [\n \"This Business owns no product catalogs. Stage one with `baker ads meta catalogs create --name …`, or — for a catalog another Business shares with it — ask for its id and read it with `catalogs --catalog-id <id>` (shared catalogs are read, never changed).\",\n ]\n : [\n \"`catalogs --catalog-id <id>` lists a catalog's product sets; `catalogs products --catalog-id <id>` its products.\",\n ],\n );\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.create\",\n description:\n \"Stage a new product catalog on the ad account's own Business, made at publish. Needs the Catalog permission for Meta.\",\n args: {\n \"account-id\": schemaAccount,\n name: { type: \"string\", description: \"Catalog name\", required: true },\n pixel: { type: \"string\", description: \"Pixel to connect (repeatable) — catalog ads need one\", required: false },\n },\n});\n\nconst catalogCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a new product catalog on the ad account's own Business. ${STAGED_NOTE}\nConnect the account's pixel with --pixel (\\`baker ads meta pixels\\`): Meta runs catalog ads only on a catalog with one.\nThen add products (\\`catalogs products create --catalog-id meta_temp_…\\`) and a product set to advertise.\nExample: baker ads meta catalogs create --account-id act_123 --name \"Spring shop\" --pixel 1275507706837548`,\n },\n args: {\n \"account-id\": accountArg,\n name: { type: \"string\", description: \"Catalog name\" },\n pixel: { type: \"string\", description: \"Pixel to connect once it exists (repeatable) — catalog ads need one\" },\n },\n run: async ({ args, rawArgs }) => {\n const pixels = repeatedValues(rawArgs, \"pixel\", args.pixel);\n await stageOp(\n {\n kind: \"productCatalog.create\",\n accountId: bareAccountId(args as Args),\n payload: { name: args.name, event_sources: pixels.length > 0 ? pixels : undefined },\n },\n [\n \"Add products with `catalogs products create --catalog-id <ref>` and a set with `catalogs sets create --catalog-id <ref>`.\",\n ],\n );\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.update\",\n description:\n \"Stage a change to a product catalog the ad account's Business owns: a new name, pixels to connect (catalog ads need one) or disconnect.\",\n args: {\n id: { type: \"positional\", description: \"Catalog id\", required: true },\n \"account-id\": schemaAccount,\n name: { type: \"string\", description: \"New name\", required: false },\n pixel: { type: \"string\", description: \"Pixel to connect (repeatable)\", required: false },\n \"unlink-pixel\": { type: \"string\", description: \"Pixel to disconnect (repeatable)\", required: false },\n },\n});\n\nconst catalogUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Rename a product catalog, or connect / disconnect pixels. ${STAGED_NOTE}\nExample: baker ads meta catalogs update 1798573158016525 --account-id act_123 --pixel 1275507706837548`,\n },\n args: {\n id: { type: \"positional\", description: \"Catalog id\", required: true },\n \"account-id\": accountArg,\n name: { type: \"string\", description: \"New name\" },\n pixel: { type: \"string\", description: \"Pixel to connect (repeatable) — from `baker ads meta pixels`\" },\n \"unlink-pixel\": { type: \"string\", description: \"Pixel to disconnect (repeatable)\" },\n },\n run: async ({ args, rawArgs }) => {\n const pixels = repeatedValues(rawArgs, \"pixel\", args.pixel);\n const unlink = repeatedValues(rawArgs, \"unlink-pixel\", args[\"unlink-pixel\"]);\n await stageOp({\n kind: \"productCatalog.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"catalog\"),\n payload: {\n name: args.name,\n event_sources: pixels.length > 0 ? pixels : undefined,\n unlink_event_sources: unlink.length > 0 ? unlink : undefined,\n },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.delete\",\n description:\n \"Stage deleting a product catalog with every product, product set and feed in it. Delete the ads, ad sets and campaigns that use it in the same chat.\",\n args: { id: { type: \"positional\", description: \"Catalog id\", required: true }, \"account-id\": schemaAccount },\n});\n\nconst catalogDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: `Delete a product catalog and everything in it — runs after every other change in the publish. ${STAGED_NOTE}\nExample: baker ads meta catalogs delete 1798573158016525 --account-id act_123`,\n },\n args: { id: { type: \"positional\", description: \"Catalog id\", required: true }, \"account-id\": accountArg },\n run: async ({ args }) => {\n await stageOp({\n kind: \"productCatalog.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"catalog\"),\n payload: { status: \"DELETED\" },\n });\n },\n});\n\n// --- Products ---\n\nconst productFieldArgs = {\n name: { type: \"string\", description: \"Title shoppers see\" },\n description: { type: \"string\", description: \"Description\" },\n price: { type: \"string\", description: 'Price in major units, e.g. \"19.99\"' },\n \"sale-price\": { type: \"string\", description: \"Sale price in major units\" },\n currency: { type: \"string\", description: \"Three-letter currency code, e.g. EUR (needed with a price)\" },\n availability: {\n type: \"string\",\n description: '\"in stock\" (default), \"out of stock\", \"preorder\", \"available for order\", \"discontinued\"',\n },\n condition: { type: \"string\", description: \"new (default), refurbished, used\" },\n url: { type: \"string\", description: \"The product's own page (https) — where its ad sends people\" },\n \"image-url\": {\n type: \"string\",\n description: \"Public https picture Meta fetches (a library image's address works)\",\n },\n \"additional-image-url\": { type: \"string\", description: \"More pictures (repeatable)\" },\n brand: { type: \"string\", description: \"Brand\" },\n} as const;\n\nconst productFieldSchema = Object.fromEntries(\n Object.entries(productFieldArgs).map(([key, arg]) => [key, { ...arg, required: false }]),\n);\n\n/** The product fields given on the command line, in Meta's vocabulary. */\nexport function productFieldsFromArgs(args: Args, rawArgs: readonly string[] | undefined): Record<string, unknown> {\n const extra = repeatedValues(rawArgs, \"additional-image-url\", args[\"additional-image-url\"]);\n return {\n name: args.name,\n description: args.description,\n price: stringArg(args.price),\n sale_price: stringArg(args[\"sale-price\"]),\n currency: upper(args.currency),\n availability: stringArg(args.availability)?.toLowerCase(),\n condition: stringArg(args.condition)?.toLowerCase(),\n url: args.url,\n image_url: args[\"image-url\"],\n additional_image_urls: extra.length > 0 ? extra : undefined,\n brand: args.brand,\n };\n}\n\nregisterSchema({\n command: \"ads.meta.catalogs.products\",\n description:\n \"A catalog's products, compact (id, retailer id, name, price, availability, review status); --full for every field and Meta's errors on each.\",\n args: {\n \"catalog-id\": { type: \"string\", description: \"Catalog id\", required: true },\n \"retailer-id\": { type: \"string\", description: \"Only the product with this retailer id\", required: false },\n full: { type: \"boolean\", description: \"Every field, and Meta's errors on each product\", required: false },\n output: schemaOutput,\n },\n});\n\nconst productsListCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"A catalog's products (up to 500). Runs by default. Example: baker ads meta catalogs products --catalog-id 1798573158016525\",\n },\n args: {\n \"catalog-id\": { type: \"string\", description: \"Catalog id\" },\n \"retailer-id\": { type: \"string\", description: \"Only the product with this retailer id\" },\n full: { type: \"boolean\", description: \"Every field, and Meta's errors on each product\" },\n output: outputArg,\n },\n run: async ({ args }) => {\n try {\n const rows = await contents(\"products\", args as Args);\n const rejected = rows.filter((row) => row.review_status === \"rejected\").length;\n emit(rows, args as Args, [\n ...(rows.length === 0 ? [\"No products yet — stage some with `catalogs products create`.\"] : []),\n ...(rejected > 0\n ? [\n `${rejected} product(s) were rejected by Meta's review — \\`--full\\` shows why; a rejected product is never shown in an ad.`,\n ]\n : []),\n ]);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.products.create\",\n description:\n \"Stage a product in a catalog (or one this chat creates), added at publish. Fake or real, every product needs a retailer id, name, description, price + currency, page URL and picture URL.\",\n args: {\n \"account-id\": schemaAccount,\n \"catalog-id\": { type: \"string\", description: \"Catalog id or meta_temp_* ref\", required: true },\n \"retailer-id\": { type: \"string\", description: \"Your own id for the product (SKU)\", required: true },\n ...productFieldSchema,\n file: { type: \"string\", description: \"JSON file with the whole payload\", required: false },\n },\n});\n\nconst productCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a product in a catalog. ${STAGED_NOTE}\nExample: baker ads meta catalogs products create --account-id act_123 --catalog-id meta_temp_… --retailer-id SKU-1 --name \"Solar panel\" --description \"400 W panel\" --price 199.00 --currency EUR --url https://shop.example/panel --image-url https://shop.example/panel.jpg`,\n },\n args: {\n \"account-id\": accountArg,\n \"catalog-id\": { type: \"string\", description: \"Catalog id, or meta_temp_* of a catalog this chat creates\" },\n \"retailer-id\": { type: \"string\", description: \"Your own id for the product (SKU) — what product sets filter on\" },\n ...productFieldArgs,\n file: { type: \"string\", description: \"JSON file with the whole payload\" },\n },\n run: async ({ args, rawArgs }) => {\n const payload = mergePayload(loadJsonFileArg(args.file), {\n catalog_id: args[\"catalog-id\"],\n retailer_id: args[\"retailer-id\"],\n ...productFieldsFromArgs(args as Args, rawArgs),\n });\n await stageOp({ kind: \"product.create\", accountId: bareAccountId(args as Args), payload }, [\n \"Group products for an ad with `catalogs sets create --catalog-id <id> --retailer-id <sku> …`.\",\n ]);\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.products.update\",\n description: \"Stage changes to a product's fields (a price names its currency).\",\n args: {\n id: { type: \"positional\", description: \"Product id\", required: true },\n \"account-id\": schemaAccount,\n ...productFieldSchema,\n },\n});\n\nconst productUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Change a product's fields. ${STAGED_NOTE}\nExample: baker ads meta catalogs products update 39108967418750368 --account-id act_123 --price 179.00 --currency EUR --availability \"out of stock\"`,\n },\n args: {\n id: { type: \"positional\", description: \"Product id\", required: true },\n \"account-id\": accountArg,\n ...productFieldArgs,\n },\n run: async ({ args, rawArgs }) => {\n await stageOp({\n kind: \"product.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"product\"),\n payload: productFieldsFromArgs(args as Args, rawArgs),\n });\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.products.delete\",\n description: \"Stage deleting a product from its catalog.\",\n args: { id: { type: \"positional\", description: \"Product id\", required: true }, \"account-id\": schemaAccount },\n});\n\nconst productDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: `Delete a product from its catalog. ${STAGED_NOTE}\nExample: baker ads meta catalogs products delete 39108967418750368 --account-id act_123`,\n },\n args: { id: { type: \"positional\", description: \"Product id\", required: true }, \"account-id\": accountArg },\n run: async ({ args }) => {\n await stageOp({\n kind: \"product.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"product\"),\n payload: { status: \"DELETED\" },\n });\n },\n});\n\nconst productsCommand = defineCommand({\n meta: {\n name: \"products\",\n description: `A catalog's products.\n baker ads meta catalogs products --catalog-id <id> [--full] — list\n baker ads meta catalogs products create --catalog-id <id> --retailer-id SKU-1 --name … --price 19.99 --currency EUR …\n baker ads meta catalogs products update <id> --price 17.99 --currency EUR\n baker ads meta catalogs products delete <id>`,\n },\n subCommands: {\n list: productsListCommand,\n create: productCreateCommand,\n update: productUpdateCommand,\n delete: productDeleteCommand,\n },\n args: {\n \"catalog-id\": { type: \"string\", description: \"Catalog id\" },\n \"retailer-id\": { type: \"string\", description: \"Only the product with this retailer id\" },\n full: { type: \"boolean\", description: \"Every field, and Meta's errors on each product\" },\n output: outputArg,\n },\n default: \"list\",\n});\n\n// --- Product sets ---\n\n/** A set's rule: --filter JSON, or the products by retailer id. */\nexport function productSetFilterFromArgs(args: Args, rawArgs: readonly string[] | undefined): unknown {\n const retailerIds = repeatedValues(rawArgs, \"retailer-id\", args[\"retailer-id\"])\n .flatMap((value) => value.split(\",\"))\n .map((value) => value.trim())\n .filter(Boolean);\n const filter = jsonArg(args.filter, \"filter\");\n if (filter && retailerIds.length > 0) failWriteValidation(\"pass --filter or --retailer-id, not both\");\n return filter ?? (retailerIds.length > 0 ? retailerIdFilter(retailerIds) : undefined);\n}\n\nconst setRuleArgs = {\n \"retailer-id\": {\n type: \"string\",\n description: \"A product in the set, by retailer id (repeatable, or comma-separated)\",\n },\n filter: {\n type: \"string\",\n description:\n 'Meta\\'s rule as JSON, e.g. \\'{\"and\":[{\"brand\":{\"eq\":\"Acme\"}},{\"price\":{\"lt\":5000}}]}\\' — operators: is_any, is_not_any, eq, neq, contains, not_contains, i_contains, i_not_contains, starts_with, lt, lte, gt, gte (a price in minor units)',\n },\n} as const;\n\nregisterSchema({\n command: \"ads.meta.catalogs.sets\",\n description: \"A catalog's product sets, with how many products each matches.\",\n args: {\n \"catalog-id\": { type: \"string\", description: \"Catalog id\", required: true },\n \"no-cache\": { type: \"boolean\", description: \"Bypass the cache\", required: false },\n output: schemaOutput,\n },\n});\n\nconst setsListCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"A catalog's product sets. Runs by default. Example: baker ads meta catalogs sets --catalog-id 1798573158016525\",\n },\n args: { \"catalog-id\": { type: \"string\", description: \"Catalog id\" }, \"no-cache\": NO_CACHE_ARG, output: outputArg },\n run: async ({ args }) => {\n try {\n const params: Record<string, string> = { \"catalog-id\": requireCatalogId(args as Args) };\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const rows = await apiGet<Row[]>(\"/api/ads/meta/product-sets\", params);\n emit(rows, args as Args, [\n \"An ad set shows one set (`adsets create --product-set-id <id>`); a catalog creative names it too (`creatives create --type catalog --product-set-id <id>`).\",\n ]);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.sets.create\",\n description:\n \"Stage a product set — the products an Advantage+ catalog ad or a collection shows — by retailer id or Meta's filter rule. Without either it holds the whole catalog.\",\n args: {\n \"account-id\": schemaAccount,\n \"catalog-id\": { type: \"string\", description: \"Catalog id or meta_temp_* ref\", required: true },\n name: { type: \"string\", description: \"Set name\", required: true },\n \"retailer-id\": { type: \"string\", description: \"Retailer id of a product (repeatable)\", required: false },\n filter: { type: \"string\", description: \"Meta's filter rule as JSON\", required: false },\n },\n});\n\nconst setCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a product set. ${STAGED_NOTE}\nExample: baker ads meta catalogs sets create --account-id act_123 --catalog-id meta_temp_… --name \"Panels\" --retailer-id SKU-1 --retailer-id SKU-2\nRule: --filter '{\"brand\":{\"eq\":\"Acme\"}}'. Without --retailer-id or --filter the set holds the whole catalog.`,\n },\n args: {\n \"account-id\": accountArg,\n \"catalog-id\": { type: \"string\", description: \"Catalog id, or meta_temp_* of a catalog this chat creates\" },\n name: { type: \"string\", description: \"Set name\" },\n ...setRuleArgs,\n },\n run: async ({ args, rawArgs }) => {\n await stageOp(\n {\n kind: \"productSet.create\",\n accountId: bareAccountId(args as Args),\n payload: {\n catalog_id: args[\"catalog-id\"],\n name: args.name,\n filter: productSetFilterFromArgs(args as Args, rawArgs),\n },\n },\n [\n \"Advertise it: `adsets create --product-set-id <ref>` under a campaign with `--catalog-id`, then `creatives create --type catalog --product-set-id <ref>`.\",\n ],\n );\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.sets.update\",\n description: \"Stage a new name or a new rule for a product set (the whole rule is replaced).\",\n args: {\n id: { type: \"positional\", description: \"Product set id\", required: true },\n \"account-id\": schemaAccount,\n name: { type: \"string\", description: \"New name\", required: false },\n \"retailer-id\": { type: \"string\", description: \"Retailer id of a product (repeatable)\", required: false },\n filter: { type: \"string\", description: \"Meta's filter rule as JSON\", required: false },\n },\n});\n\nconst setUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Rename a product set or replace its rule. ${STAGED_NOTE}\nExample: baker ads meta catalogs sets update 1748674113031942 --account-id act_123 --retailer-id SKU-1 --retailer-id SKU-3`,\n },\n args: {\n id: { type: \"positional\", description: \"Product set id\", required: true },\n \"account-id\": accountArg,\n name: { type: \"string\", description: \"New name\" },\n ...setRuleArgs,\n },\n run: async ({ args, rawArgs }) => {\n await stageOp({\n kind: \"productSet.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"product set\"),\n payload: { name: args.name, filter: productSetFilterFromArgs(args as Args, rawArgs) },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.sets.delete\",\n description:\n \"Stage deleting a product set. Delete or repoint the ad sets and creatives that show it in the same chat.\",\n args: { id: { type: \"positional\", description: \"Product set id\", required: true }, \"account-id\": schemaAccount },\n});\n\nconst setDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: `Delete a product set — after the ads, ad sets and creatives this chat deletes. ${STAGED_NOTE}\nExample: baker ads meta catalogs sets delete 1748674113031942 --account-id act_123`,\n },\n args: { id: { type: \"positional\", description: \"Product set id\", required: true }, \"account-id\": accountArg },\n run: async ({ args }) => {\n await stageOp({\n kind: \"productSet.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"product set\"),\n payload: { status: \"DELETED\" },\n });\n },\n});\n\nconst setsCommand = defineCommand({\n meta: {\n name: \"sets\",\n description: `A catalog's product sets.\n baker ads meta catalogs sets --catalog-id <id> — list\n baker ads meta catalogs sets create --catalog-id <id> --name … --retailer-id SKU-1 [--filter '<json>']\n baker ads meta catalogs sets update <id> --name …\n baker ads meta catalogs sets delete <id>`,\n },\n subCommands: { list: setsListCommand, create: setCreateCommand, update: setUpdateCommand, delete: setDeleteCommand },\n args: { \"catalog-id\": { type: \"string\", description: \"Catalog id\" }, \"no-cache\": NO_CACHE_ARG, output: outputArg },\n default: \"list\",\n});\n\n// --- Feeds ---\n\nconst scheduleArgs = {\n url: { type: \"string\", description: \"https address of the feed file (CSV, TSV, XML) Meta fetches\" },\n interval: { type: \"string\", description: \"HOURLY, DAILY or WEEKLY\" },\n hour: { type: \"string\", description: \"Hour of day 0–23\" },\n day: { type: \"string\", description: \"Day for a WEEKLY schedule, e.g. MONDAY\" },\n} as const;\n\n/** A feed schedule from the flags, or nothing when no flag names one. */\nexport function feedScheduleFromArgs(args: Args): Record<string, unknown> | undefined {\n if (args.url === undefined && args.interval === undefined && args.hour === undefined && args.day === undefined) {\n return undefined;\n }\n return {\n url: args.url,\n interval: upper(args.interval) ?? \"DAILY\",\n hour: numberFlag(args.hour, \"--hour\"),\n day_of_week: upper(args.day),\n };\n}\n\nregisterSchema({\n command: \"ads.meta.catalogs.feeds\",\n description: \"A catalog's data feeds: each one's schedule and its last upload's errors and warnings.\",\n args: { \"catalog-id\": { type: \"string\", description: \"Catalog id\", required: true }, output: schemaOutput },\n});\n\nconst feedsListCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"A catalog's feeds. Runs by default. Example: baker ads meta catalogs feeds --catalog-id 1798573158016525\",\n },\n args: { \"catalog-id\": { type: \"string\", description: \"Catalog id\" }, output: outputArg },\n run: async ({ args }) => {\n try {\n emit(await contents(\"feeds\", args as Args), args as Args, []);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.feeds.create\",\n description:\n \"Stage a data feed in a catalog: a file Meta fetches on a schedule and replaces the catalog's products from. Without --url it waits for uploads.\",\n args: {\n \"account-id\": schemaAccount,\n \"catalog-id\": { type: \"string\", description: \"Catalog id or meta_temp_* ref\", required: true },\n name: { type: \"string\", description: \"Feed name\", required: true },\n url: { type: \"string\", description: \"Feed file address (https)\", required: false },\n interval: { type: \"string\", description: \"HOURLY, DAILY (default) or WEEKLY\", required: false },\n hour: { type: \"string\", description: \"Hour 0–23\", required: false },\n day: { type: \"string\", description: \"Day for WEEKLY\", required: false },\n },\n});\n\nconst feedCreateCommand = defineCommand({\n meta: {\n name: \"create\",\n description: `Stage a scheduled data feed in a catalog. ${STAGED_NOTE}\nExample: baker ads meta catalogs feeds create --account-id act_123 --catalog-id 1798573158016525 --name \"Daily feed\" --url https://shop.example/feed.csv --interval DAILY --hour 3`,\n },\n args: {\n \"account-id\": accountArg,\n \"catalog-id\": { type: \"string\", description: \"Catalog id, or meta_temp_* of a catalog this chat creates\" },\n name: { type: \"string\", description: \"Feed name\" },\n ...scheduleArgs,\n },\n run: async ({ args }) => {\n await stageOp({\n kind: \"productFeed.create\",\n accountId: bareAccountId(args as Args),\n payload: { catalog_id: args[\"catalog-id\"], name: args.name, schedule: feedScheduleFromArgs(args as Args) },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.feeds.update\",\n description: \"Stage a new name or schedule for a feed (the whole schedule is replaced).\",\n args: {\n id: { type: \"positional\", description: \"Feed id\", required: true },\n \"account-id\": schemaAccount,\n name: { type: \"string\", description: \"New name\", required: false },\n url: { type: \"string\", description: \"Feed file address (https)\", required: false },\n interval: { type: \"string\", description: \"HOURLY, DAILY or WEEKLY\", required: false },\n hour: { type: \"string\", description: \"Hour 0–23\", required: false },\n day: { type: \"string\", description: \"Day for WEEKLY\", required: false },\n },\n});\n\nconst feedUpdateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: `Rename a feed or replace its schedule. ${STAGED_NOTE}\nExample: baker ads meta catalogs feeds update 1157910959893469 --account-id act_123 --url https://shop.example/feed.csv --interval WEEKLY --day MONDAY --hour 4`,\n },\n args: {\n id: { type: \"positional\", description: \"Feed id\", required: true },\n \"account-id\": accountArg,\n name: { type: \"string\", description: \"New name\" },\n ...scheduleArgs,\n },\n run: async ({ args }) => {\n await stageOp({\n kind: \"productFeed.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"feed\"),\n payload: { name: args.name, schedule: feedScheduleFromArgs(args as Args) },\n });\n },\n});\n\nregisterSchema({\n command: \"ads.meta.catalogs.feeds.delete\",\n description: \"Stage deleting a feed. Its products stay in the catalog.\",\n args: { id: { type: \"positional\", description: \"Feed id\", required: true }, \"account-id\": schemaAccount },\n});\n\nconst feedDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: `Delete a data feed; its products stay in the catalog. ${STAGED_NOTE}\nExample: baker ads meta catalogs feeds delete 1157910959893469 --account-id act_123`,\n },\n args: { id: { type: \"positional\", description: \"Feed id\", required: true }, \"account-id\": accountArg },\n run: async ({ args }) => {\n await stageOp({\n kind: \"productFeed.update\",\n accountId: bareAccountId(args as Args),\n target: requireTarget(args as Args, \"feed\"),\n payload: { status: \"DELETED\" },\n });\n },\n});\n\nconst feedsCommand = defineCommand({\n meta: {\n name: \"feeds\",\n description: `A catalog's data feeds.\n baker ads meta catalogs feeds --catalog-id <id> — list, with the last upload's errors\n baker ads meta catalogs feeds create --catalog-id <id> --name … --url https://… --interval DAILY\n baker ads meta catalogs feeds update <id> --interval WEEKLY --day MONDAY --url https://…\n baker ads meta catalogs feeds delete <id>`,\n },\n subCommands: {\n list: feedsListCommand,\n create: feedCreateCommand,\n update: feedUpdateCommand,\n delete: feedDeleteCommand,\n },\n args: { \"catalog-id\": { type: \"string\", description: \"Catalog id\" }, output: outputArg },\n default: \"list\",\n});\n\n// --- Diagnostics ---\n\nregisterSchema({\n command: \"ads.meta.catalogs.diagnostics\",\n description:\n \"Meta's diagnostics for a catalog — product problems (missing fields, rejected pictures) and event-matching issues, grouped by type.\",\n args: { \"catalog-id\": { type: \"string\", description: \"Catalog id\", required: true }, output: schemaOutput },\n});\n\nconst diagnosticsCommand = defineCommand({\n meta: {\n name: \"diagnostics\",\n description:\n \"What Meta says is wrong with a catalog. Example: baker ads meta catalogs diagnostics --catalog-id 1798573158016525\",\n },\n args: { \"catalog-id\": { type: \"string\", description: \"Catalog id\" }, output: outputArg },\n run: async ({ args }) => {\n try {\n const rows = await contents(\"diagnostics\", args as Args);\n emit(rows, args as Args, rows.length === 0 ? [\"Meta reports no problems with this catalog.\"] : []);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const catalogsCommand = defineCommand({\n meta: {\n name: \"catalogs\",\n description: `Product catalogs — what Advantage+ catalog and collection ads show. Reading is open; changing needs the Catalog permission for Meta, and Baker changes only catalogs the ad account's own Business owns.\n baker ads meta catalogs --business-id <id> — catalogs; --catalog-id <id> for its product sets\n baker ads meta catalogs create --name … --pixel <id> | update <id> --name … --pixel <id> | delete <id>\n baker ads meta catalogs products … | sets … | feeds … | diagnostics --catalog-id <id>`,\n },\n subCommands: {\n list: catalogsListCommand,\n create: catalogCreateCommand,\n update: catalogUpdateCommand,\n delete: catalogDeleteCommand,\n products: productsCommand,\n sets: setsCommand,\n feeds: feedsCommand,\n diagnostics: diagnosticsCommand,\n },\n args: {\n \"business-id\": { type: \"string\", description: \"Business ID\" },\n \"catalog-id\": { type: \"string\", description: \"Catalog id\" },\n \"no-cache\": NO_CACHE_ARG,\n output: outputArg,\n },\n default: \"list\",\n});\n"],"mappings":"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","names":["rows"]}
|
|
@@ -27,21 +27,21 @@ One company connects one ChatGPT Ads account, so there is no account id to pass.
|
|
|
27
27
|
Full guide: __tooling__/docs/tools/baker/ads-chatgpt.md`
|
|
28
28
|
},
|
|
29
29
|
subCommands: {
|
|
30
|
-
account: () => import("./account-
|
|
31
|
-
campaigns: () => import("./campaigns-
|
|
32
|
-
"ad-groups": () => import("./ad-groups-
|
|
33
|
-
ads: () => import("./ads-
|
|
34
|
-
conversions: () => import("./conversions-
|
|
35
|
-
pixels: () => import("./pixels-
|
|
36
|
-
audiences: () => import("./audiences-
|
|
37
|
-
catalogs: () => import("./catalogs-
|
|
38
|
-
history: () => import("./history-
|
|
30
|
+
account: () => import("./account-3H6BZO5H.js").then((m) => m.accountCommand),
|
|
31
|
+
campaigns: () => import("./campaigns-JEIKY2M4.js").then((m) => m.campaignsCommand),
|
|
32
|
+
"ad-groups": () => import("./ad-groups-IEBVEAMS.js").then((m) => m.adGroupsCommand),
|
|
33
|
+
ads: () => import("./ads-CQZHD7FC.js").then((m) => m.adsCommand),
|
|
34
|
+
conversions: () => import("./conversions-5QCSCRLI.js").then((m) => m.conversionsCommand),
|
|
35
|
+
pixels: () => import("./pixels-MYT3TCHZ.js").then((m) => m.pixelsCommand),
|
|
36
|
+
audiences: () => import("./audiences-AAZH56WD.js").then((m) => m.audiencesCommand),
|
|
37
|
+
catalogs: () => import("./catalogs-OCVXZLIF.js").then((m) => m.catalogsCommand),
|
|
38
|
+
history: () => import("./history-QKDYBSYM.js").then((m) => m.historyCommand),
|
|
39
39
|
insights: () => import("./insights-SQLE5NOJ.js").then((m) => m.insightsCommand),
|
|
40
|
-
locations: () => import("./locations-
|
|
41
|
-
draft: () => import("./draft-
|
|
40
|
+
locations: () => import("./locations-HM56X2MK.js").then((m) => m.locationsCommand),
|
|
41
|
+
draft: () => import("./draft-34CGWUVA.js").then((m) => m.draftCommand)
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
export {
|
|
45
45
|
chatgptCommand
|
|
46
46
|
};
|
|
47
|
-
//# sourceMappingURL=chatgpt-
|
|
47
|
+
//# sourceMappingURL=chatgpt-QVF2FD3E.js.map
|
|
@@ -21,6 +21,26 @@ import "./chunk-YQSBHWOI.js";
|
|
|
21
21
|
|
|
22
22
|
// src/commands/chats/index.ts
|
|
23
23
|
import { defineCommand } from "citty";
|
|
24
|
+
|
|
25
|
+
// src/commands/chats/publish-hints.ts
|
|
26
|
+
function publishHints(publish) {
|
|
27
|
+
const hints = [];
|
|
28
|
+
if (!publish.complete) {
|
|
29
|
+
const failed = publish.failedTotal;
|
|
30
|
+
hints.push(
|
|
31
|
+
`This Session's publish left ${failed} change${failed === 1 ? "" : "s"} behind \u2014 see \`publish.surfaces\` for the platform's own words. Do not report those changes as live.`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
const unconfirmed = publish.unconfirmedTotal ?? 0;
|
|
35
|
+
if (unconfirmed > 0) {
|
|
36
|
+
hints.push(
|
|
37
|
+
`${unconfirmed} change${unconfirmed === 1 ? "" : "s"} went through but could not be confirmed when read back from the platform \u2014 \`publish.surfaces[].unconfirmedChanges\` says what it shows instead. Check before reporting them as done.`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return hints;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/commands/chats/index.ts
|
|
24
44
|
var STATUS_GROUPS = ["active", "archived", "all"];
|
|
25
45
|
var REPO_SURFACES = ["knowledge", "company", "brand", "landings", "flows", "creatives"];
|
|
26
46
|
function parseBoundedInt(raw, name, min, max) {
|
|
@@ -112,13 +132,7 @@ var viewCommand = defineCommand({
|
|
|
112
132
|
chatId: args.id,
|
|
113
133
|
...args.full ? { full: true } : {}
|
|
114
134
|
});
|
|
115
|
-
const hints = [];
|
|
116
|
-
if (response.data.publish && !response.data.publish.complete) {
|
|
117
|
-
const failed = response.data.publish.failedTotal;
|
|
118
|
-
hints.push(
|
|
119
|
-
`This Session's publish left ${failed} change${failed === 1 ? "" : "s"} behind \u2014 see \`publish.surfaces\` for the platform's own words. Do not report those changes as live.`
|
|
120
|
-
);
|
|
121
|
-
}
|
|
135
|
+
const hints = response.data.publish ? publishHints(response.data.publish) : [];
|
|
122
136
|
if (response.data.diffAvailable) {
|
|
123
137
|
hints.push("See the real file-level diff of the git content with `baker chats diff <id> --full`.");
|
|
124
138
|
} else if (response.data.status === "in_progress" || response.data.status === "publishing") {
|
|
@@ -259,4 +273,4 @@ Full guide: __tooling__/docs/tools/baker/chats.md`
|
|
|
259
273
|
export {
|
|
260
274
|
chatsCommand
|
|
261
275
|
};
|
|
262
|
-
//# sourceMappingURL=chats-
|
|
276
|
+
//# sourceMappingURL=chats-QG72JB6Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/chats/index.ts","../src/commands/chats/publish-hints.ts"],"sourcesContent":["import type { ChatsDiffResponse, ChatsListResponse, ChatsTranscriptResponse, ChatsViewResponse } from \"@baker/api\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"../actions/shared.ts\";\nimport { publishHints } from \"./publish-hints.ts\";\n\nconst STATUS_GROUPS = [\"active\", \"archived\", \"all\"] as const;\nconst REPO_SURFACES = [\"knowledge\", \"company\", \"brand\", \"landings\", \"flows\", \"creatives\"] as const;\n\nfunction parseBoundedInt(raw: string | undefined, name: string, min: number, max: number): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const value = Number.parseInt(raw, 10);\n if (Number.isNaN(value) || value < min || value > max) {\n throw new Error(`--${name} must be an integer between ${min} and ${max}`);\n }\n return value;\n}\n\nregisterSchema({\n command: \"chats.list\",\n description:\n \"Start here: list other Sessions on this account (newest first) so you can reuse what was done before. Each row shows the Session id, title, status, and a count of what it produced (creatives, landings, actions, flows, reports…). Then drill in with `baker chats view <id>`, `baker chats transcript <id>`, or `baker chats diff <id>`. Read-only.\",\n args: {\n status: { type: \"string\", description: \"Filter: active|archived|all (default: all)\", required: false },\n limit: { type: \"string\", description: \"Max Sessions to return, 1-100 (default: 20)\", required: false },\n full: { type: \"boolean\", description: \"Include each Session's full change list\", required: false, default: false },\n },\n});\n\nconst listCommand = defineCommand({\n meta: { name: \"list\", description: \"List other Sessions on this account, newest first.\" },\n args: {\n status: { type: \"string\", description: \"Filter: active|archived|all (default: all)\", required: false },\n limit: { type: \"string\", description: \"Max Sessions (1-100, default 20)\", required: false },\n full: { type: \"boolean\", description: \"Include each Session's full change list\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const body: Record<string, unknown> = {};\n if (args.status) {\n if (!(STATUS_GROUPS as readonly string[]).includes(args.status)) {\n throw new Error(`--status must be one of: ${STATUS_GROUPS.join(\"|\")}`);\n }\n body.status = args.status;\n }\n const limit = parseBoundedInt(args.limit, \"limit\", 1, 100);\n if (limit !== undefined) {\n body.limit = limit;\n }\n if (args.full) {\n body.full = true;\n }\n // Exclude our own Session so we never list ourselves as a reusable \"other\".\n const selfChatId = getEnv().BAKER_CHAT_ID;\n if (selfChatId) {\n body.excludeChatId = selfChatId;\n }\n const response = await apiPost<ChatsListResponse>(\"/api/chats/list\", body);\n writeJson({\n ...response,\n meta: { count: response.data.chats.length },\n ...(response.data.chats.length === 0\n ? { hints: [\"No Sessions matched. Widen with --status all or a larger --limit.\"] }\n : {\n hints: [\n \"Drill in: `baker chats view <id>` for outputs, `chats transcript <id>` for the conversation, `chats diff <id>` for the real file changes.\",\n ],\n }),\n });\n } catch (err) {\n failApi(err);\n }\n },\n});\n\nregisterSchema({\n command: \"chats.view\",\n description:\n \"Inspect one Session's FULL picture of what it changed — the unified `effects`: git content (landings, creatives, flows, knowledge, brand), plus DB-only effects that never touch the repo — Actions, Scheduled agents, Tags, Tag Manager, Google Analytics, ad-platform writes, the funnel (`funnel`: which steps it added, changed or removed, and which ways in it added or removed in `triggersAdded`/`triggersRemoved`), what counts as a conversion (`conversions`), conversion sends, event sources, and every other staged or already-applied change (`otherChanges`: A/B tests, recipes, library images) — each resolved to real detail (names, descriptions, priorities, tag types, ad operations) and, once published, its `outcome`. Also `publish` (what each external surface actually did, with the provider's own error), `activity` (the chat's own timeline: status changes, publish start/fail, workspace recoveries, timeouts), `usage` (per-thread cost and the Session's token totals), the kickoff (how it was asked), threads, and commits. Effects are `staged` (in-progress draft) or applied. A completed Session is NOT proof its external changes landed — read `publish`. Use after `baker chats list` to decide whether to reuse it. Read-only.\",\n args: {\n id: { type: \"positional\", description: \"The Session id (from `baker chats list`)\", required: true },\n full: {\n type: \"boolean\",\n description: \"Untruncated effect lists and full activity metadata (compact caps each list at 25)\",\n required: false,\n default: false,\n },\n },\n});\n\nconst viewCommand = defineCommand({\n meta: {\n name: \"view\",\n description: \"Inspect one Session's full effects — git content + actions/tags/ads, kickoff, commits.\",\n },\n args: {\n id: { type: \"positional\", description: \"The Session id\", required: true },\n full: { type: \"boolean\", description: \"Include full detail\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const response = await apiPost<ChatsViewResponse>(\"/api/chats/view\", {\n chatId: args.id,\n ...(args.full ? { full: true } : {}),\n });\n const hints: string[] = response.data.publish ? publishHints(response.data.publish) : [];\n if (response.data.diffAvailable) {\n hints.push(\"See the real file-level diff of the git content with `baker chats diff <id> --full`.\");\n } else if (response.data.status === \"in_progress\" || response.data.status === \"publishing\") {\n hints.push(\n \"This Session is still in progress — read its current file changes with `baker chats diff <id> --live`.\",\n );\n }\n hints.push(\"Read the conversation with `baker chats transcript <id>`.\");\n writeJson({ ...response, hints });\n } catch (err) {\n failApi(err);\n }\n },\n});\n\nregisterSchema({\n command: \"chats.transcript\",\n description:\n \"Read another Session's conversation (user + agent turns), most-recent first-capped. Use to see exactly how a past request was phrased and iterated before replaying it for a new goal. Compact truncates long messages; add --full for verbatim text. Read-only.\",\n args: {\n id: { type: \"positional\", description: \"The Session id\", required: true },\n limit: { type: \"string\", description: \"Max messages to return, 1-1000 (default: 100)\", required: false },\n full: {\n type: \"boolean\",\n description: \"Return verbatim (untruncated) message text\",\n required: false,\n default: false,\n },\n },\n});\n\nconst transcriptCommand = defineCommand({\n meta: { name: \"transcript\", description: \"Read another Session's conversation.\" },\n args: {\n id: { type: \"positional\", description: \"The Session id\", required: true },\n limit: { type: \"string\", description: \"Max messages (1-1000, default 100)\", required: false },\n full: { type: \"boolean\", description: \"Verbatim message text\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const body: Record<string, unknown> = { chatId: args.id };\n const limit = parseBoundedInt(args.limit, \"limit\", 1, 1000);\n if (limit !== undefined) {\n body.limit = limit;\n }\n if (args.full) {\n body.full = true;\n }\n const response = await apiPost<ChatsTranscriptResponse>(\"/api/chats/transcript\", body);\n writeJson({\n ...response,\n meta: { count: response.data.entries.length },\n ...(response.data.truncated\n ? { hints: [\"Older messages were dropped to fit --limit. Raise --limit to see more.\"] }\n : {}),\n });\n } catch (err) {\n failApi(err);\n }\n },\n});\n\nregisterSchema({\n command: \"chats.diff\",\n description:\n \"See the real file-level changes a Session made (landings, creatives, brand, flows, knowledge). Published Sessions read from git; for an in-progress (unpublished) Session pass --live to read its changes straight from its running workspace. Without --live, an unpublished Session returns available:false — use `baker chats view` for the staged summary. Compact lists changed files with +/- counts; add --full for the actual diff text. Read-only.\",\n args: {\n id: { type: \"positional\", description: \"The Session id\", required: true },\n surface: {\n type: \"string\",\n description: \"Filter to one surface: knowledge|company|brand|landings|flows|creatives\",\n required: false,\n },\n full: {\n type: \"boolean\",\n description: \"Include the unified-diff patch text per file\",\n required: false,\n default: false,\n },\n live: {\n type: \"boolean\",\n description:\n \"For an in-progress Session, read its changes from the live workspace (slower; resumes the paused Runtime). Ignored for published Sessions.\",\n required: false,\n default: false,\n },\n },\n});\n\nconst diffCommand = defineCommand({\n meta: { name: \"diff\", description: \"See a published Session's real file-level changes.\" },\n args: {\n id: { type: \"positional\", description: \"The Session id\", required: true },\n surface: {\n type: \"string\",\n description: \"Filter: knowledge|company|brand|landings|flows|creatives\",\n required: false,\n },\n full: { type: \"boolean\", description: \"Include the diff patch text per file\", required: false, default: false },\n live: {\n type: \"boolean\",\n description: \"Read an in-progress Session's changes from its live workspace (slower)\",\n required: false,\n default: false,\n },\n },\n run: async ({ args }) => {\n try {\n const body: Record<string, unknown> = { chatId: args.id };\n if (args.surface) {\n if (!(REPO_SURFACES as readonly string[]).includes(args.surface)) {\n throw new Error(`--surface must be one of: ${REPO_SURFACES.join(\"|\")}`);\n }\n body.surface = args.surface;\n }\n if (args.full) {\n body.full = true;\n }\n if (args.live) {\n body.live = true;\n }\n const response = await apiPost<ChatsDiffResponse>(\"/api/chats/diff\", body);\n writeJson({\n ...response,\n meta: { count: response.data.files.length },\n ...(!response.data.available && response.data.reason ? { hints: [response.data.reason] } : {}),\n ...(response.data.available && !args.full && response.data.files.length > 0\n ? { hints: [\"Add --full to read the actual diff text for each file.\"] }\n : {}),\n });\n } catch (err) {\n failApi(err);\n }\n },\n});\n\nexport const chatsCommand = defineCommand({\n meta: {\n name: \"chats\",\n description: `Inspect other Sessions on this account (read-only): list them, view what they produced, read their conversation, and see their real file changes — so you can reuse past work for a new goal.\nFull guide: __tooling__/docs/tools/baker/chats.md`,\n },\n subCommands: {\n list: listCommand,\n view: viewCommand,\n transcript: transcriptCommand,\n diff: diffCommand,\n },\n});\n","import type { ChatPublishSummary } from \"@baker/api/chats\";\n\n/**\n * What a reader must not conclude from a completed Session: that it published\n * everything it staged (better than one published draft in three did not), or\n * that every change it sent is now what the platform holds.\n */\nexport function publishHints(publish: ChatPublishSummary): string[] {\n const hints: string[] = [];\n if (!publish.complete) {\n const failed = publish.failedTotal;\n hints.push(\n `This Session's publish left ${failed} change${failed === 1 ? \"\" : \"s\"} behind — see \\`publish.surfaces\\` for the platform's own words. Do not report those changes as live.`,\n );\n }\n const unconfirmed = publish.unconfirmedTotal ?? 0;\n if (unconfirmed > 0) {\n hints.push(\n `${unconfirmed} change${unconfirmed === 1 ? \"\" : \"s\"} went through but could not be confirmed when read back from the platform — \\`publish.surfaces[].unconfirmedChanges\\` says what it shows instead. Check before reporting them as done.`,\n );\n }\n return hints;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
readAdWords,
|
|
3
3
|
ruleRefusal
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LXQB4ZGE.js";
|
|
5
5
|
import "./chunk-PTGYM4J6.js";
|
|
6
6
|
import "./chunk-LCW3U4EA.js";
|
|
7
7
|
import {
|
|
@@ -22,8 +22,8 @@ import {
|
|
|
22
22
|
import "./chunk-MCJ5I5LR.js";
|
|
23
23
|
import {
|
|
24
24
|
marketFromCompanyDoc
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-2WZI36D3.js";
|
|
26
|
+
import "./chunk-65Y3RCWP.js";
|
|
27
27
|
import "./chunk-DWX44QL6.js";
|
|
28
28
|
import "./chunk-2FSEESJU.js";
|
|
29
29
|
import "./chunk-CVBKW75S.js";
|
|
@@ -101,4 +101,4 @@ export {
|
|
|
101
101
|
checkCommand,
|
|
102
102
|
checkCreatives
|
|
103
103
|
};
|
|
104
|
-
//# sourceMappingURL=check-
|
|
104
|
+
//# sourceMappingURL=check-SLNHVYGS.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
asRecord,
|
|
6
6
|
shapeListRows
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-65Y3RCWP.js";
|
|
8
8
|
import {
|
|
9
9
|
registerSchema
|
|
10
10
|
} from "./chunk-WNSE7N75.js";
|
|
@@ -18,11 +18,13 @@ function pick(row, keys) {
|
|
|
18
18
|
return picked;
|
|
19
19
|
}
|
|
20
20
|
var CAMPAIGN_COLUMNS = ["id", "name", "effective_status", "daily_budget", "lifetime_budget", "created_date"];
|
|
21
|
+
var DIAGNOSTIC_COLUMNS = ["issues", "suggestions"];
|
|
21
22
|
function compactCampaign(row) {
|
|
22
23
|
const created = row.created_time;
|
|
23
24
|
return {
|
|
24
25
|
...pick(row, ["id", "name", "effective_status", "daily_budget", "lifetime_budget"]),
|
|
25
|
-
...typeof created === "string" ? { created_date: created.slice(0, 10) } : {}
|
|
26
|
+
...typeof created === "string" ? { created_date: created.slice(0, 10) } : {},
|
|
27
|
+
...diagnostics(row)
|
|
26
28
|
};
|
|
27
29
|
}
|
|
28
30
|
var ADSET_KEYS = [
|
|
@@ -45,7 +47,8 @@ function compactAdSet(row) {
|
|
|
45
47
|
return {
|
|
46
48
|
...pick(row, ADSET_KEYS),
|
|
47
49
|
...typeof learning === "string" ? { learning_stage: learning } : {},
|
|
48
|
-
...pick(row, ["end_time", "created_time"])
|
|
50
|
+
...pick(row, ["end_time", "created_time"]),
|
|
51
|
+
...diagnostics(row)
|
|
49
52
|
};
|
|
50
53
|
}
|
|
51
54
|
var AD_COLUMNS = [
|
|
@@ -66,6 +69,22 @@ function adIssues(value) {
|
|
|
66
69
|
return typeof text === "string" && text ? [text] : [];
|
|
67
70
|
});
|
|
68
71
|
}
|
|
72
|
+
function suggestions(value) {
|
|
73
|
+
if (!Array.isArray(value)) return [];
|
|
74
|
+
return value.flatMap((entry) => {
|
|
75
|
+
const recommendation = asRecord(entry);
|
|
76
|
+
const text = recommendation?.title ?? recommendation?.message;
|
|
77
|
+
return typeof text === "string" && text ? [text] : [];
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function diagnostics(row) {
|
|
81
|
+
const issues = adIssues(row.issues_info);
|
|
82
|
+
const suggested = suggestions(row.recommendations);
|
|
83
|
+
return {
|
|
84
|
+
...issues.length > 0 ? { issues } : {},
|
|
85
|
+
...suggested.length > 0 ? { suggestions: suggested } : {}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
69
88
|
function compactAd(row) {
|
|
70
89
|
const creativeId = asRecord(row.creative)?.id;
|
|
71
90
|
const issues = adIssues(row.issues_info);
|
|
@@ -111,8 +130,8 @@ function compactActivity(row) {
|
|
|
111
130
|
};
|
|
112
131
|
}
|
|
113
132
|
var PROJECTIONS = {
|
|
114
|
-
campaigns: { row: compactCampaign, columns: CAMPAIGN_COLUMNS },
|
|
115
|
-
adsets: { row: compactAdSet, columns: ADSET_COLUMNS },
|
|
133
|
+
campaigns: { row: compactCampaign, columns: CAMPAIGN_COLUMNS, whenPresent: DIAGNOSTIC_COLUMNS },
|
|
134
|
+
adsets: { row: compactAdSet, columns: ADSET_COLUMNS, whenPresent: DIAGNOSTIC_COLUMNS },
|
|
116
135
|
ads: { row: compactAd, columns: AD_COLUMNS },
|
|
117
136
|
activities: { row: compactActivity, columns: ACTIVITY_COLUMNS }
|
|
118
137
|
};
|
|
@@ -169,4 +188,4 @@ export {
|
|
|
169
188
|
META_LIST_SHAPE_ARGS,
|
|
170
189
|
registerMetaListSchema
|
|
171
190
|
};
|
|
172
|
-
//# sourceMappingURL=chunk-
|
|
191
|
+
//# sourceMappingURL=chunk-2C7AHPM4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/list-rows.ts"],"sourcesContent":["import { registerSchema } from \"../../../schemas.ts\";\nimport { asRecord, type CompactProjection, type ShapedRows, shapeListRows } from \"../list-rows.ts\";\nimport { writeAdsOutput } from \"../output.ts\";\n\n/**\n * The compact row of each Meta listing. The backend asks Graph for every field a\n * write or an audit might need (targeting, tracking specs, three status fields),\n * and 100 campaigns or two days of activity passed through whole ran to 55–78 KB.\n * A compact row carries what an agent decides with; `--fields` reaches any other\n * path and `--full` returns the record Graph sent.\n *\n * `effective_status` is the one status kept: it is what Ads Manager shows, and\n * `status`/`configured_status` only restate the toggle it already folds in.\n *\n * Listings print a table by default: keyed JSON repeats every column name on\n * every row, and 100 campaigns stayed near 30 KB even compact. `--output json`\n * returns the same rows in the envelope.\n */\n\ntype MetaRow = Record<string, unknown>;\n\nexport type MetaListKind = \"campaigns\" | \"adsets\" | \"ads\" | \"activities\";\n\nfunction pick(row: MetaRow, keys: readonly string[]): MetaRow {\n const picked: MetaRow = {};\n for (const key of keys) {\n if (row[key] !== undefined) picked[key] = row[key];\n }\n return picked;\n}\n\n/**\n * An account's campaign list is the widest listing an agent reads (100+ rows), so\n * its row is the narrowest: what a campaign is called, whether it runs and what\n * it spends. Objective, bid strategy and Special Ad Category are one `--fields`\n * away; the creation day is enough to order by, and `--fields created_time` has\n * the timestamp.\n */\nconst CAMPAIGN_COLUMNS = [\"id\", \"name\", \"effective_status\", \"daily_budget\", \"lifetime_budget\", \"created_date\"] as const;\n\n/** Why delivery stops and what Meta suggests: columns only when a row has one. */\nconst DIAGNOSTIC_COLUMNS = [\"issues\", \"suggestions\"] as const;\n\nfunction compactCampaign(row: MetaRow): MetaRow {\n const created = row.created_time;\n return {\n ...pick(row, [\"id\", \"name\", \"effective_status\", \"daily_budget\", \"lifetime_budget\"]),\n ...(typeof created === \"string\" ? { created_date: created.slice(0, 10) } : {}),\n ...diagnostics(row),\n };\n}\n\nconst ADSET_KEYS = [\n \"id\",\n \"name\",\n \"campaign_id\",\n \"effective_status\",\n \"optimization_goal\",\n \"billing_event\",\n \"bid_strategy\",\n \"daily_budget\",\n \"lifetime_budget\",\n \"destination_type\",\n // A Dynamic Creative ad set refuses every new ad, which changes the plan before anything is staged.\n \"is_dynamic_creative\",\n] as const;\n\nconst ADSET_COLUMNS = [...ADSET_KEYS, \"learning_stage\", \"end_time\", \"created_time\"] as const;\n\nfunction compactAdSet(row: MetaRow): MetaRow {\n const learning = asRecord(row.learning_stage_info)?.status;\n return {\n ...pick(row, ADSET_KEYS),\n ...(typeof learning === \"string\" ? { learning_stage: learning } : {}),\n ...pick(row, [\"end_time\", \"created_time\"]),\n ...diagnostics(row),\n };\n}\n\nconst AD_COLUMNS = [\n \"id\",\n \"name\",\n \"adset_id\",\n \"campaign_id\",\n \"effective_status\",\n \"creative_id\",\n \"issues\",\n \"created_time\",\n] as const;\n\n/** Why an ad is WITH_ISSUES — the one reason to open `issues_info`, in its own words. */\nfunction adIssues(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((entry) => {\n const issue = asRecord(entry);\n const text = issue?.error_summary ?? issue?.error_message;\n return typeof text === \"string\" && text ? [text] : [];\n });\n}\n\n/** Meta's suggestions for a campaign or ad set (`recommendations`), by their titles. */\nfunction suggestions(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((entry) => {\n const recommendation = asRecord(entry);\n const text = recommendation?.title ?? recommendation?.message;\n return typeof text === \"string\" && text ? [text] : [];\n });\n}\n\n/** Why a campaign or ad set cannot deliver, and what Meta suggests — only when Meta says something. */\nfunction diagnostics(row: MetaRow): MetaRow {\n const issues = adIssues(row.issues_info);\n const suggested = suggestions(row.recommendations);\n return {\n ...(issues.length > 0 ? { issues } : {}),\n ...(suggested.length > 0 ? { suggestions: suggested } : {}),\n };\n}\n\nfunction compactAd(row: MetaRow): MetaRow {\n const creativeId = asRecord(row.creative)?.id;\n const issues = adIssues(row.issues_info);\n return {\n ...pick(row, [\"id\", \"name\", \"adset_id\", \"campaign_id\", \"effective_status\"]),\n ...(creativeId !== undefined ? { creative_id: creativeId } : {}),\n ...(issues.length > 0 ? { issues } : {}),\n ...pick(row, [\"created_time\"]),\n };\n}\n\nconst ACTIVITY_COLUMNS = [\n \"event_time\",\n \"event_type\",\n \"actor_name\",\n \"object_type\",\n \"object_name\",\n \"object_id\",\n \"change\",\n] as const;\n\nfunction isScalar(value: unknown): value is string | number | null {\n return value === null || typeof value === \"string\" || typeof value === \"number\";\n}\n\n/**\n * `extra_data` is a JSON string whose shape varies by event type and carries most\n * of an activity's bytes (image URLs, whole targeting specs). A status, name,\n * budget or goal change stores its before and after as two plain values — those\n * read as one line; any richer change stays behind `--fields extra_data`.\n */\nexport function activityChange(extraData: unknown): string | undefined {\n if (typeof extraData !== \"string\") return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(extraData);\n } catch {\n return undefined;\n }\n const data = asRecord(parsed);\n // An absent old_value is one this read did not observe, not an unset one — only `null` means \"none\".\n if (!data || !(\"new_value\" in data) || !(\"old_value\" in data)) return undefined;\n const { old_value: before, new_value: after } = data;\n if (!isScalar(before) || !isScalar(after)) return undefined;\n const show = (value: string | number | null) => (value === null ? \"(none)\" : String(value));\n return `${show(before)} → ${show(after)}`;\n}\n\nfunction compactActivity(row: MetaRow): MetaRow {\n const change = activityChange(row.extra_data);\n return {\n ...pick(row, [\"event_time\", \"event_type\", \"actor_name\", \"object_type\", \"object_name\", \"object_id\"]),\n ...(change !== undefined ? { change } : {}),\n };\n}\n\nconst PROJECTIONS: Record<MetaListKind, CompactProjection<MetaRow>> = {\n campaigns: { row: compactCampaign, columns: CAMPAIGN_COLUMNS, whenPresent: DIAGNOSTIC_COLUMNS },\n adsets: { row: compactAdSet, columns: ADSET_COLUMNS, whenPresent: DIAGNOSTIC_COLUMNS },\n ads: { row: compactAd, columns: AD_COLUMNS },\n activities: { row: compactActivity, columns: ACTIVITY_COLUMNS },\n};\n\nexport function shapeMetaListRows(kind: MetaListKind, rows: MetaRow[], args: Record<string, unknown>): ShapedRows {\n return shapeListRows(rows, args, PROJECTIONS[kind]);\n}\n\nconst NOUNS: Record<MetaListKind, string> = {\n campaigns: \"campaigns\",\n adsets: \"ad sets\",\n ads: \"ads\",\n activities: \"activities\",\n};\n\n/**\n * A table of no rows prints nothing at all, which reads as a failed call — so an empty\n * listing says so, and says why when a status filter may be hiding rows.\n */\nexport function writeMetaListRows(kind: MetaListKind, shaped: ShapedRows, format: string, hints: string[] = []): void {\n if (format === \"md\" && shaped.rows.length === 0) {\n process.stdout.write(`${hints.length > 0 ? hints.join(\"\\n\") : `No ${NOUNS[kind]} matched.`}\\n`);\n return;\n }\n writeAdsOutput(shaped.rows, format, shaped.fields, [...hints, ...(shaped.hints ?? [])]);\n}\n\n/** The projection flags every Meta listing shares, worded once for help and `baker schema`. */\nexport const META_LIST_SHAPE_ARGS = {\n fields: {\n type: \"string\",\n description: \"CSV of dotted paths to return instead of the compact row, e.g. id,name,targeting.geo_locations\",\n },\n full: { type: \"boolean\", description: \"Return every field Meta sent (targeting, tracking specs, raw extra_data)\" },\n output: {\n type: \"string\",\n description: \"md|json|csv|jsonl — md (default) prints a table; json returns the rows in the { ok, data } envelope\",\n default: \"md\",\n },\n} as const;\n\ninterface ListArgDef {\n type: string;\n description?: string;\n default?: unknown;\n}\n\n/**\n * `baker schema ads.meta.<list>`, read off the same arg defs the command parses,\n * so the introspection an agent checks before a call cannot promise a flag the\n * command refuses — `--full` on `adsets` was guessed three times in one Session.\n */\nexport function registerMetaListSchema(\n kind: MetaListKind,\n description: string,\n args: Record<string, ListArgDef>,\n): void {\n registerSchema({\n command: `ads.meta.${kind}`,\n description,\n args: Object.fromEntries(\n Object.entries(args).map(([name, def]) => [\n name,\n {\n type: def.type,\n description: def.description ?? \"\",\n required: false,\n ...(def.default !== undefined ? { default: def.default } : {}),\n },\n ]),\n ),\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
asRecord
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-65Y3RCWP.js";
|
|
4
4
|
|
|
5
5
|
// src/viewer-profile.ts
|
|
6
6
|
var VIEWER_TEMPERATURE_VALUES = ["cold", "warm", "hot"];
|
|
@@ -314,4 +314,4 @@ export {
|
|
|
314
314
|
AWARENESS_VALUES,
|
|
315
315
|
viewerFromKnowledge
|
|
316
316
|
};
|
|
317
|
-
//# sourceMappingURL=chunk-
|
|
317
|
+
//# sourceMappingURL=chunk-2WZI36D3.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
prepareCanvas,
|
|
3
3
|
unsuppliedPlaceholderAssets
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-KOXDXSKN.js";
|
|
5
5
|
import {
|
|
6
6
|
isSourceStale
|
|
7
7
|
} from "./chunk-66QHX566.js";
|
|
@@ -119,4 +119,4 @@ export {
|
|
|
119
119
|
staleCreatives,
|
|
120
120
|
clearLegacyDirtyMarker
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
122
|
+
//# sourceMappingURL=chunk-3W6G6ARX.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
BRAND_DIR,
|
|
3
3
|
inkLuma,
|
|
4
4
|
logoArtwork
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-JQH5VG6F.js";
|
|
6
6
|
import {
|
|
7
7
|
fetchExternalBytes
|
|
8
8
|
} from "./chunk-BLAHHMPF.js";
|
|
@@ -222,4 +222,4 @@ export {
|
|
|
222
222
|
fetchClientLogo,
|
|
223
223
|
withClientLogo
|
|
224
224
|
};
|
|
225
|
-
//# sourceMappingURL=chunk-
|
|
225
|
+
//# sourceMappingURL=chunk-46GWHUKN.js.map
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
nodeParamsPreview
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-C7NWUCLQ.js";
|
|
4
4
|
import {
|
|
5
5
|
creativeSlugFromCanvasPath
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ZJSGGJ5R.js";
|
|
7
7
|
import {
|
|
8
8
|
parseDefinitionDelivery,
|
|
9
9
|
parseDefinitionSeriesPlace,
|
|
10
10
|
parseDefinitionSourceFields,
|
|
11
11
|
parseDefinitionStrategyFields,
|
|
12
12
|
prepareCanvas
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-KOXDXSKN.js";
|
|
14
14
|
import {
|
|
15
15
|
BackendClient
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-JVH5A3XC.js";
|
|
17
17
|
import {
|
|
18
18
|
nodeDependencies
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-JQH5VG6F.js";
|
|
20
20
|
import {
|
|
21
21
|
requireCredentialsFromEnv
|
|
22
22
|
} from "./chunk-2FSEESJU.js";
|
|
@@ -221,4 +221,4 @@ export {
|
|
|
221
221
|
resolveCanvasPath,
|
|
222
222
|
syncDefinitionCommand
|
|
223
223
|
};
|
|
224
|
-
//# sourceMappingURL=chunk-
|
|
224
|
+
//# sourceMappingURL=chunk-4KJMLYCD.js.map
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
metaDraftOpInputSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-A4MVVPJ2.js";
|
|
4
4
|
import {
|
|
5
5
|
handleMetaError,
|
|
6
6
|
resolveAccountIdArg
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-QTOZ32SU.js";
|
|
8
|
+
import {
|
|
9
|
+
repeatedValues
|
|
10
|
+
} from "./chunk-ERSX3MKH.js";
|
|
8
11
|
import {
|
|
9
12
|
adCopyHints,
|
|
10
13
|
booleanWordPositionalError,
|
|
@@ -98,6 +101,10 @@ function listFlag(value) {
|
|
|
98
101
|
const items = value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
99
102
|
return items.length > 0 ? items : void 0;
|
|
100
103
|
}
|
|
104
|
+
function repeatedListFlag(rawArgs, flag, parsed) {
|
|
105
|
+
const items = repeatedValues(rawArgs, flag, parsed).flatMap((value) => value.split(",")).map((item) => item.trim()).filter(Boolean);
|
|
106
|
+
return items.length > 0 ? items : void 0;
|
|
107
|
+
}
|
|
101
108
|
function upper(value) {
|
|
102
109
|
return typeof value === "string" && value.length > 0 ? value.toUpperCase() : void 0;
|
|
103
110
|
}
|
|
@@ -123,7 +130,7 @@ function requireTarget(args, entity) {
|
|
|
123
130
|
}
|
|
124
131
|
return target;
|
|
125
132
|
}
|
|
126
|
-
|
|
133
|
+
function preflightOp(raw) {
|
|
127
134
|
const preflight = metaDraftOpInputSchema.safeParse(raw);
|
|
128
135
|
if (!preflight.success) {
|
|
129
136
|
const fields = preflight.error.issues.map((issue) => ({ path: issue.path.join("."), message: issue.message }));
|
|
@@ -138,15 +145,37 @@ async function stageOp(raw) {
|
|
|
138
145
|
});
|
|
139
146
|
process.exit(1);
|
|
140
147
|
}
|
|
148
|
+
return preflight.data;
|
|
149
|
+
}
|
|
150
|
+
async function stageOp(raw, extraHints = []) {
|
|
151
|
+
const op = preflightOp(raw);
|
|
141
152
|
try {
|
|
142
153
|
const chatId = requireChatId();
|
|
143
|
-
const response = await apiPost("/api/ads/meta/draft/stage", { chatId, op
|
|
144
|
-
const copyHints = await adCopyHints(
|
|
145
|
-
writeJsonEnvelope(withHints(response, copyHints));
|
|
154
|
+
const response = await apiPost("/api/ads/meta/draft/stage", { chatId, op });
|
|
155
|
+
const copyHints = await adCopyHints(op);
|
|
156
|
+
writeJsonEnvelope(withHints(response, [...copyHints, ...extraHints]));
|
|
146
157
|
} catch (err) {
|
|
147
158
|
handleMetaError(err);
|
|
148
159
|
}
|
|
149
160
|
}
|
|
161
|
+
async function stageOps(raws) {
|
|
162
|
+
const ops = raws.map(preflightOp);
|
|
163
|
+
const chatId = requireChatId();
|
|
164
|
+
const staged = [];
|
|
165
|
+
for (const op of ops) {
|
|
166
|
+
try {
|
|
167
|
+
const response = await apiPost("/api/ads/meta/draft/stage", { chatId, op });
|
|
168
|
+
staged.push(response.data);
|
|
169
|
+
} catch (err) {
|
|
170
|
+
if (staged.length > 0) {
|
|
171
|
+
process.stderr.write(`staged before the refusal: ${staged.map((entry) => entry.ref).join(", ")}
|
|
172
|
+
`);
|
|
173
|
+
}
|
|
174
|
+
handleMetaError(err);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
writeJsonEnvelope({ ok: true, data: staged });
|
|
178
|
+
}
|
|
150
179
|
async function stageStatusChange(input) {
|
|
151
180
|
await stageOp({
|
|
152
181
|
kind: input.kind,
|
|
@@ -165,10 +194,12 @@ export {
|
|
|
165
194
|
parseMoneyFlag,
|
|
166
195
|
parseDateFlag,
|
|
167
196
|
listFlag,
|
|
197
|
+
repeatedListFlag,
|
|
168
198
|
upper,
|
|
169
199
|
numberFlag,
|
|
170
200
|
requireTarget,
|
|
171
201
|
stageOp,
|
|
202
|
+
stageOps,
|
|
172
203
|
stageStatusChange
|
|
173
204
|
};
|
|
174
|
-
//# sourceMappingURL=chunk-
|
|
205
|
+
//# sourceMappingURL=chunk-5C35OW7L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/write-shared.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { type MetaDraftStageResponse, metaDraftOpInputSchema } from \"@baker/api/ads-meta\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { repeatedValues } from \"../../../lib/repeatedFlags.ts\";\nimport { capabilityFix } from \"../../capabilities/fix.ts\";\nimport { booleanWordPositionalError } from \"../boolean-word-positional.ts\";\nimport { adCopyHints } from \"../copy-hints.ts\";\nimport { withHints } from \"../hints.ts\";\nimport { writeJsonEnvelope } from \"../output.ts\";\nimport { handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\n/**\n * Shared plumbing for the staged Meta write commands. Writes NEVER hit Meta\n * directly: every command stages an op against this chat's draft\n * (`/api/ads/meta/draft/stage`), the dashboard shows it as a pending Meta\n * change, and it applies when the chat is published.\n */\n\n/** Backend account ids are bare numeric — strip the `act_` prefix resolveAccountIdArg adds. */\nexport function bareAccountId(args: Record<string, unknown>): string {\n return resolveAccountIdArg(args).replace(/^act_/, \"\");\n}\n\nexport function failWriteValidation(message: string): never {\n writeJsonEnvelope({ ok: false, error: { code: \"VALIDATION_ERROR\", message } });\n process.exit(1);\n}\n\n/** Deleting is permanent, so it only stages through `delete`, whose description carries that warning. */\nexport function refuseDeleteByUpdate(payload: Record<string, unknown>, group: \"campaigns\" | \"adsets\" | \"ads\"): void {\n if (payload.status === \"DELETED\") {\n failWriteValidation(\n `update does not delete — deleting is permanent. Use \\`baker ads meta ${group} delete <id>\\` if the user asked to delete; otherwise pause or archive.`,\n );\n }\n}\n\nexport function loadJsonFileArg(path: unknown): Record<string, unknown> {\n if (typeof path !== \"string\" || path.length === 0) {\n return {};\n }\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\")) as unknown;\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n failWriteValidation(`${path} must contain a JSON object`);\n }\n return parsed as Record<string, unknown>;\n } catch (err) {\n if (err instanceof SyntaxError) {\n failWriteValidation(`${path} is not valid JSON: ${err.message}`);\n }\n throw err;\n }\n}\n\n/** Flags override file keys — the file is the base, flags are the overrides. */\nexport function mergePayload(file: Record<string, unknown>, flags: Record<string, unknown>): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...file };\n for (const [key, value] of Object.entries(flags)) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n return merged;\n}\n\nexport function parseMoneyFlag(\n amount: unknown,\n currency: unknown,\n flag: string,\n): { amount: string; currencyCode?: string } | undefined {\n if (amount === undefined || amount === null || amount === \"\") {\n return undefined;\n }\n if (currency === undefined || currency === null || currency === \"\") {\n // Meta ad accounts are single-currency — the backend fills it in.\n return { amount: String(amount) };\n }\n if (typeof currency !== \"string\" || currency.length !== 3) {\n failWriteValidation(`${flag} got an invalid --currency (expected a 3-letter code like USD)`);\n }\n return { amount: String(amount), currencyCode: currency.toUpperCase() };\n}\n\n/** Accepts ISO dates (2026-07-10), ISO datetimes, or epoch millis. */\nexport function parseDateFlag(value: unknown, flag: string): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const raw = String(value);\n if (/^\\d{10,}$/.test(raw)) {\n return Number(raw);\n }\n const parsed = Date.parse(raw);\n if (Number.isNaN(parsed)) {\n failWriteValidation(`${flag} must be an ISO date (2026-07-10) or epoch milliseconds`);\n }\n return parsed;\n}\n\n/** Split a comma-separated flag into a trimmed, non-empty array. */\nexport function listFlag(value: unknown): string[] | undefined {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n const items = value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * A list flag that may be repeated as well as comma-separated\n * (`--countries ES,FR --countries DE`). citty keeps only a repeated flag's last\n * value, so the values are read from the command line (`repeatedValues`).\n */\nexport function repeatedListFlag(\n rawArgs: readonly string[] | undefined,\n flag: string,\n parsed: unknown,\n): string[] | undefined {\n const items = repeatedValues(rawArgs, flag, parsed)\n .flatMap((value) => value.split(\",\"))\n .map((item) => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nexport function upper(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value.toUpperCase() : undefined;\n}\n\nexport function numberFlag(value: unknown, flag: string): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const n = Number(value);\n if (!Number.isFinite(n)) {\n failWriteValidation(`${flag} must be a number`);\n }\n return n;\n}\n\n/**\n * Accepts whichever positional the command declared (`id`, `target`, `ref`) or the raw positional.\n *\n * `--flag false` is refused first: citty turns it into the flag set to TRUE plus a stray positional,\n * so on `campaigns duplicate 6123 --replace false` the copy stages AND the live original is staged\n * for pause — the opposite of what was typed, with an \"ok\" receipt. This is the only place on this\n * surface that reads positionals, and every target-taking command goes through it.\n */\nexport function requireTarget(args: Record<string, unknown>, entity: string): string {\n const inverted = booleanWordPositionalError(args, entity);\n if (inverted !== undefined) {\n failWriteValidation(inverted);\n }\n const positional = Array.isArray(args._) ? args._[0] : undefined;\n const target = args.id ?? args.target ?? args.ref ?? positional;\n if (typeof target !== \"string\" || target.length === 0) {\n failWriteValidation(`pass the ${entity} id as the positional argument`);\n }\n return target;\n}\n\ninterface StageEnvelope extends Record<string, unknown> {\n ok: true;\n data: MetaDraftStageResponse;\n}\n\n/**\n * Preflight-validates the op against the shared `@baker/api/ads-meta` contract\n * (same schema the backend enforces), then stages it. Prints the staged\n * envelope — ref, mode (always `live`: publishing reaches the real ad account),\n * summary, warnings.\n */\n/** The op parsed against the shared contract, or the validation envelope printed and the process ended. */\nfunction preflightOp(raw: Record<string, unknown>) {\n const preflight = metaDraftOpInputSchema.safeParse(raw);\n if (!preflight.success) {\n const fields = preflight.error.issues.map((issue) => ({ path: issue.path.join(\".\"), message: issue.message }));\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: fields.map((field) => (field.path ? `${field.path}: ${field.message}` : field.message)).join(\"; \"),\n fields,\n fix: capabilityFix(\"meta-ads\"),\n },\n });\n process.exit(1);\n }\n return preflight.data;\n}\n\nexport async function stageOp(raw: Record<string, unknown>, extraHints: readonly string[] = []): Promise<void> {\n const op = preflightOp(raw);\n try {\n const chatId = requireChatId();\n const response = await apiPost<StageEnvelope>(\"/api/ads/meta/draft/stage\", { chatId, op });\n const copyHints = await adCopyHints(op);\n writeJsonEnvelope(withHints(response, [...copyHints, ...extraHints]));\n } catch (err) {\n handleMetaError(err);\n }\n}\n\n/**\n * Stage several ops as one command and print one envelope: each staged op's\n * receipt, in order. Stops at the first refusal, which names the op it was —\n * the ones before it stay staged, and the envelope says which.\n */\nexport async function stageOps(raws: readonly Record<string, unknown>[]): Promise<void> {\n const ops = raws.map(preflightOp);\n const chatId = requireChatId();\n const staged: MetaDraftStageResponse[] = [];\n for (const op of ops) {\n try {\n const response = await apiPost<StageEnvelope>(\"/api/ads/meta/draft/stage\", { chatId, op });\n staged.push(response.data);\n } catch (err) {\n if (staged.length > 0) {\n process.stderr.write(`staged before the refusal: ${staged.map((entry) => entry.ref).join(\", \")}\\n`);\n }\n handleMetaError(err);\n }\n }\n writeJsonEnvelope({ ok: true, data: staged });\n}\n\nexport async function stageStatusChange(input: {\n kind: \"campaign.update\" | \"adSet.update\" | \"adCreative.update\" | \"ad.update\" | \"customAudience.update\";\n accountId: string;\n target: string;\n status: \"ACTIVE\" | \"PAUSED\" | \"ARCHIVED\" | \"DELETED\";\n}): Promise<void> {\n await stageOp({\n kind: input.kind,\n accountId: input.accountId,\n target: input.target,\n payload: { status: input.status },\n });\n}\n"],"mappings":"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","names":[]}
|