@koda-sl/baker-cli 0.384.0-dev.4699b7308 → 0.384.0-dev.557795bef
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 +1098 -217
- package/canvas/tiktok-captions-composition/index.html +5 -6
- package/canvas/tiktok-captions-composition/meta.json +5 -0
- package/dist/account-4UEZAY5T.js +49 -0
- package/dist/account-4UEZAY5T.js.map +1 -0
- package/dist/account-OINZG6UP.js +80 -0
- package/dist/account-OINZG6UP.js.map +1 -0
- package/dist/account-QMDCUUSG.js +79 -0
- package/dist/account-QMDCUUSG.js.map +1 -0
- package/dist/account-reads-ZKKDYHK5.js +218 -0
- package/dist/account-reads-ZKKDYHK5.js.map +1 -0
- package/dist/account-writes-N4JDIDRB.js +66 -0
- package/dist/account-writes-N4JDIDRB.js.map +1 -0
- package/dist/accounts-AEBQFCNH.js +114 -0
- package/dist/accounts-AEBQFCNH.js.map +1 -0
- package/dist/accounts-EBGJ2YO7.js +611 -0
- package/dist/accounts-EBGJ2YO7.js.map +1 -0
- package/dist/accounts-HP4BLKK5.js +75 -0
- package/dist/accounts-HP4BLKK5.js.map +1 -0
- package/dist/accounts-YE2SQ3UQ.js +77 -0
- package/dist/accounts-YE2SQ3UQ.js.map +1 -0
- package/dist/accounts-Z4CLGQXJ.js +115 -0
- package/dist/accounts-Z4CLGQXJ.js.map +1 -0
- package/dist/actions-ADRIEQZX.js +55 -0
- package/dist/actions-ADRIEQZX.js.map +1 -0
- package/dist/active-entities-YB46ADQN.js +103 -0
- package/dist/active-entities-YB46ADQN.js.map +1 -0
- package/dist/activities-DUAIQJLN.js +74 -0
- package/dist/activities-DUAIQJLN.js.map +1 -0
- package/dist/ad-group-writes-HL3EZ3BT.js +170 -0
- package/dist/ad-group-writes-HL3EZ3BT.js.map +1 -0
- package/dist/ad-groups-FGS5JJGN.js +68 -0
- package/dist/ad-groups-FGS5JJGN.js.map +1 -0
- package/dist/ad-writes-LX4ACUHB.js +174 -0
- package/dist/ad-writes-LX4ACUHB.js.map +1 -0
- package/dist/add-5CUXNOUM.js +97 -0
- package/dist/add-5CUXNOUM.js.map +1 -0
- package/dist/add-6OXOQNET.js +302 -0
- package/dist/add-6OXOQNET.js.map +1 -0
- package/dist/add-E66HBIZV.js +105 -0
- package/dist/add-E66HBIZV.js.map +1 -0
- package/dist/add-ROK3ETQC.js +104 -0
- package/dist/add-ROK3ETQC.js.map +1 -0
- package/dist/add-accounts-YME5SCXD.js +91 -0
- package/dist/add-accounts-YME5SCXD.js.map +1 -0
- package/dist/ads-65R3WMDU.js +128 -0
- package/dist/ads-65R3WMDU.js.map +1 -0
- package/dist/ads-O63J7BDF.js +113 -0
- package/dist/ads-O63J7BDF.js.map +1 -0
- package/dist/ads-TFZ5PXKS.js +77 -0
- package/dist/ads-TFZ5PXKS.js.map +1 -0
- package/dist/ads-XSVRH45E.js +40 -0
- package/dist/ads-XSVRH45E.js.map +1 -0
- package/dist/adsets-Y62JOOTV.js +176 -0
- package/dist/adsets-Y62JOOTV.js.map +1 -0
- package/dist/advertisers-AIC4QPEK.js +120 -0
- package/dist/advertisers-AIC4QPEK.js.map +1 -0
- package/dist/advertisers-LJ2HKJ4W.js +125 -0
- package/dist/advertisers-LJ2HKJ4W.js.map +1 -0
- package/dist/analytics-N4PGXXEQ.js +1976 -0
- package/dist/analytics-N4PGXXEQ.js.map +1 -0
- package/dist/analytics-X3DR3UVG.js +433 -0
- package/dist/analytics-X3DR3UVG.js.map +1 -0
- package/dist/animate-E3SKQ6SI.js +480 -0
- package/dist/animate-E3SKQ6SI.js.map +1 -0
- package/dist/assign-Y7HGSQVJ.js +77 -0
- package/dist/assign-Y7HGSQVJ.js.map +1 -0
- package/dist/audience-size-SWX5YJQF.js +94 -0
- package/dist/audience-size-SWX5YJQF.js.map +1 -0
- package/dist/audiences-5A6BCWSA.js +268 -0
- package/dist/audiences-5A6BCWSA.js.map +1 -0
- package/dist/audiences-6QOCASVV.js +78 -0
- package/dist/audiences-6QOCASVV.js.map +1 -0
- package/dist/audiences-O67NGIP5.js +85 -0
- package/dist/audiences-O67NGIP5.js.map +1 -0
- package/dist/audit-2KVLWSAI.js +151 -0
- package/dist/audit-2KVLWSAI.js.map +1 -0
- package/dist/audit-HWK24VXI.js +88 -0
- package/dist/audit-HWK24VXI.js.map +1 -0
- package/dist/autocomplete-JJSGC5WU.js +111 -0
- package/dist/autocomplete-JJSGC5WU.js.map +1 -0
- package/dist/avatars-XIEKQ77J.js +38 -0
- package/dist/avatars-XIEKQ77J.js.map +1 -0
- package/dist/bid-pricing-D2HGRWZL.js +99 -0
- package/dist/bid-pricing-D2HGRWZL.js.map +1 -0
- package/dist/brand-AYYWRGIE.js +22 -0
- package/dist/brand-AYYWRGIE.js.map +1 -0
- package/dist/brief-3HUIDK5F.js +490 -0
- package/dist/brief-3HUIDK5F.js.map +1 -0
- package/dist/businesses-65EWTK5E.js +53 -0
- package/dist/businesses-65EWTK5E.js.map +1 -0
- package/dist/campaign-groups-6HCYR2JX.js +95 -0
- package/dist/campaign-groups-6HCYR2JX.js.map +1 -0
- package/dist/campaign-writes-M6JLF5AC.js +170 -0
- package/dist/campaign-writes-M6JLF5AC.js.map +1 -0
- package/dist/campaign-writes-Y6QPRQ4E.js +165 -0
- package/dist/campaign-writes-Y6QPRQ4E.js.map +1 -0
- package/dist/campaigns-6SM2ZSIH.js +76 -0
- package/dist/campaigns-6SM2ZSIH.js.map +1 -0
- package/dist/campaigns-7RKJZRY2.js +107 -0
- package/dist/campaigns-7RKJZRY2.js.map +1 -0
- package/dist/campaigns-KRI25JDZ.js +109 -0
- package/dist/campaigns-KRI25JDZ.js.map +1 -0
- package/dist/campaigns-TD7ZB5DG.js +110 -0
- package/dist/campaigns-TD7ZB5DG.js.map +1 -0
- package/dist/canvas-DMYY2DWI.js +46 -0
- package/dist/canvas-DMYY2DWI.js.map +1 -0
- package/dist/capabilities-3WJTXS2O.js +144 -0
- package/dist/capabilities-3WJTXS2O.js.map +1 -0
- package/dist/cards-7HRC4UQQ.js +85 -0
- package/dist/cards-7HRC4UQQ.js.map +1 -0
- package/dist/catalog-N6MDMIVL.js +64 -0
- package/dist/catalog-N6MDMIVL.js.map +1 -0
- package/dist/catalogs-PB46L7FH.js +128 -0
- package/dist/catalogs-PB46L7FH.js.map +1 -0
- package/dist/changes-SASUQK62.js +135 -0
- package/dist/changes-SASUQK62.js.map +1 -0
- package/dist/chatgpt-JKBSAG25.js +47 -0
- package/dist/chatgpt-JKBSAG25.js.map +1 -0
- package/dist/chats-WRVSQQB2.js +262 -0
- package/dist/chats-WRVSQQB2.js.map +1 -0
- package/dist/chunk-2FGKJY63.js +455 -0
- package/dist/chunk-2FGKJY63.js.map +1 -0
- package/dist/chunk-2GVXNKAE.js +42 -0
- package/dist/chunk-2GVXNKAE.js.map +1 -0
- package/dist/chunk-2J3PTIQB.js +479 -0
- package/dist/chunk-2J3PTIQB.js.map +1 -0
- package/dist/chunk-2J7XC2NO.js +346 -0
- package/dist/chunk-2J7XC2NO.js.map +1 -0
- package/dist/{chunk-VLUGGVJL.js → chunk-2UFRHW3T.js} +12 -4
- package/dist/chunk-2UFRHW3T.js.map +1 -0
- package/dist/chunk-2Y5V23PU.js +29 -0
- package/dist/chunk-2Y5V23PU.js.map +1 -0
- package/dist/chunk-3ACMDRSE.js +39 -0
- package/dist/chunk-3ACMDRSE.js.map +1 -0
- package/dist/chunk-3EWF7VII.js +1079 -0
- package/dist/chunk-3EWF7VII.js.map +1 -0
- package/dist/chunk-3LYMIKKN.js +625 -0
- package/dist/chunk-3LYMIKKN.js.map +1 -0
- package/dist/chunk-3M6RNCDD.js +26 -0
- package/dist/chunk-3M6RNCDD.js.map +1 -0
- package/dist/chunk-3MDO4RR2.js +310 -0
- package/dist/chunk-3MDO4RR2.js.map +1 -0
- package/dist/chunk-3NPOIHSX.js +6667 -0
- package/dist/chunk-3NPOIHSX.js.map +1 -0
- package/dist/chunk-3SK7TWGP.js +103 -0
- package/dist/chunk-3SK7TWGP.js.map +1 -0
- package/dist/chunk-3VXQYDJN.js +1743 -0
- package/dist/chunk-3VXQYDJN.js.map +1 -0
- package/dist/chunk-44VXKO65.js +106 -0
- package/dist/chunk-44VXKO65.js.map +1 -0
- package/dist/chunk-4NZ47VXO.js +137 -0
- package/dist/chunk-4NZ47VXO.js.map +1 -0
- package/dist/chunk-4X3UR372.js +225 -0
- package/dist/chunk-4X3UR372.js.map +1 -0
- package/dist/chunk-553XSIFW.js +304 -0
- package/dist/chunk-553XSIFW.js.map +1 -0
- package/dist/chunk-5FEBUCJU.js +25 -0
- package/dist/chunk-5FEBUCJU.js.map +1 -0
- package/dist/chunk-5HYSKH77.js +315 -0
- package/dist/chunk-5HYSKH77.js.map +1 -0
- package/dist/chunk-5MBPIONY.js +29 -0
- package/dist/chunk-5MBPIONY.js.map +1 -0
- package/dist/chunk-5UCP4EEQ.js +111 -0
- package/dist/chunk-5UCP4EEQ.js.map +1 -0
- package/dist/chunk-5VPJNNJL.js +494 -0
- package/dist/chunk-5VPJNNJL.js.map +1 -0
- package/dist/{chunk-VZEDAFAR.js → chunk-6YYSUISH.js} +47 -8
- package/dist/chunk-6YYSUISH.js.map +1 -0
- package/dist/chunk-7OHWEF3I.js +98 -0
- package/dist/chunk-7OHWEF3I.js.map +1 -0
- package/dist/chunk-A636XRD7.js +159 -0
- package/dist/chunk-A636XRD7.js.map +1 -0
- package/dist/chunk-A76FRBSF.js +297 -0
- package/dist/chunk-A76FRBSF.js.map +1 -0
- package/dist/chunk-AADVCEL4.js +817 -0
- package/dist/chunk-AADVCEL4.js.map +1 -0
- package/dist/chunk-AG62YO7C.js +96 -0
- package/dist/chunk-AG62YO7C.js.map +1 -0
- package/dist/chunk-AIRIT4GF.js +75 -0
- package/dist/chunk-AIRIT4GF.js.map +1 -0
- package/dist/chunk-AMCY5YCB.js +206 -0
- package/dist/chunk-AMCY5YCB.js.map +1 -0
- package/dist/chunk-AP3TP6VG.js +139 -0
- package/dist/chunk-AP3TP6VG.js.map +1 -0
- package/dist/chunk-APP475IQ.js +474 -0
- package/dist/chunk-APP475IQ.js.map +1 -0
- package/dist/chunk-AR7PU7BB.js +76 -0
- package/dist/chunk-AR7PU7BB.js.map +1 -0
- package/dist/chunk-B4S72KSS.js +172 -0
- package/dist/chunk-B4S72KSS.js.map +1 -0
- package/dist/chunk-BIPIL4QA.js +486 -0
- package/dist/chunk-BIPIL4QA.js.map +1 -0
- package/dist/chunk-BPUSL5Y2.js +58 -0
- package/dist/chunk-BPUSL5Y2.js.map +1 -0
- package/dist/chunk-BR32GHYD.js +65 -0
- package/dist/chunk-BR32GHYD.js.map +1 -0
- package/dist/chunk-CAMX6OHF.js +3182 -0
- package/dist/chunk-CAMX6OHF.js.map +1 -0
- package/dist/{chunk-MF7YA62W.js → chunk-CUL3VB4L.js} +10 -5
- package/dist/chunk-CUL3VB4L.js.map +1 -0
- package/dist/chunk-CVEY353K.js +66 -0
- package/dist/chunk-CVEY353K.js.map +1 -0
- package/dist/chunk-CWXADUKL.js +1599 -0
- package/dist/chunk-CWXADUKL.js.map +1 -0
- package/dist/chunk-D5FY4FAK.js +24 -0
- package/dist/chunk-D5FY4FAK.js.map +1 -0
- package/dist/chunk-DGCUPJZD.js +39 -0
- package/dist/chunk-DGCUPJZD.js.map +1 -0
- package/dist/chunk-DNCLWSHO.js +41 -0
- package/dist/chunk-DNCLWSHO.js.map +1 -0
- package/dist/chunk-DUPURL26.js +97 -0
- package/dist/chunk-DUPURL26.js.map +1 -0
- package/dist/chunk-E2ZOSNF5.js +96 -0
- package/dist/chunk-E2ZOSNF5.js.map +1 -0
- package/dist/chunk-E3HYHT7C.js +274 -0
- package/dist/chunk-E3HYHT7C.js.map +1 -0
- package/dist/chunk-EDLZGTGN.js +216 -0
- package/dist/chunk-EDLZGTGN.js.map +1 -0
- package/dist/chunk-EI5QN4UO.js +363 -0
- package/dist/chunk-EI5QN4UO.js.map +1 -0
- package/dist/{chunk-XHC4LMK4.js → chunk-EIGXX6KI.js} +16 -8
- package/dist/chunk-EIGXX6KI.js.map +1 -0
- package/dist/chunk-EPDE7ZRU.js +174 -0
- package/dist/chunk-EPDE7ZRU.js.map +1 -0
- package/dist/chunk-ERSX3MKH.js +34 -0
- package/dist/chunk-ERSX3MKH.js.map +1 -0
- package/dist/chunk-EVDRF4CI.js +509 -0
- package/dist/chunk-EVDRF4CI.js.map +1 -0
- package/dist/chunk-F4IEILTR.js +382 -0
- package/dist/chunk-F4IEILTR.js.map +1 -0
- package/dist/chunk-F7HRLPR5.js +67 -0
- package/dist/chunk-F7HRLPR5.js.map +1 -0
- package/dist/chunk-FEG6MN4H.js +84 -0
- package/dist/chunk-FEG6MN4H.js.map +1 -0
- package/dist/chunk-FKOECEVC.js +126 -0
- package/dist/chunk-FKOECEVC.js.map +1 -0
- package/dist/chunk-FMGW2NZI.js +106 -0
- package/dist/chunk-FMGW2NZI.js.map +1 -0
- package/dist/chunk-FPZKKNDK.js +98 -0
- package/dist/chunk-FPZKKNDK.js.map +1 -0
- package/dist/chunk-FUVCY63N.js +169 -0
- package/dist/chunk-FUVCY63N.js.map +1 -0
- package/dist/chunk-GBNJQNDS.js +19 -0
- package/dist/chunk-GBNJQNDS.js.map +1 -0
- package/dist/chunk-GIWHHCD6.js +145 -0
- package/dist/chunk-GIWHHCD6.js.map +1 -0
- package/dist/chunk-GOJXKIFQ.js +1605 -0
- package/dist/chunk-GOJXKIFQ.js.map +1 -0
- package/dist/chunk-GRQ2AXDX.js +9 -0
- package/dist/chunk-GRQ2AXDX.js.map +1 -0
- package/dist/chunk-GXDLWBOY.js +73 -0
- package/dist/chunk-GXDLWBOY.js.map +1 -0
- package/dist/chunk-HAE4WWFQ.js +455 -0
- package/dist/chunk-HAE4WWFQ.js.map +1 -0
- package/dist/chunk-I2DNBEV6.js +4227 -0
- package/dist/chunk-I2DNBEV6.js.map +1 -0
- package/dist/chunk-I4FTS5EE.js +455 -0
- package/dist/chunk-I4FTS5EE.js.map +1 -0
- package/dist/chunk-IELPT4K2.js +74 -0
- package/dist/chunk-IELPT4K2.js.map +1 -0
- package/dist/chunk-IJMWEO4P.js +57 -0
- package/dist/chunk-IJMWEO4P.js.map +1 -0
- package/dist/chunk-IREMSVKW.js +175 -0
- package/dist/chunk-IREMSVKW.js.map +1 -0
- package/dist/chunk-IVIJJXXT.js +62 -0
- package/dist/chunk-IVIJJXXT.js.map +1 -0
- package/dist/chunk-JD3W3ON7.js +188 -0
- package/dist/chunk-JD3W3ON7.js.map +1 -0
- package/dist/chunk-JLWBK3VC.js +5187 -0
- package/dist/chunk-JLWBK3VC.js.map +1 -0
- package/dist/chunk-JPK34QPS.js +134 -0
- package/dist/chunk-JPK34QPS.js.map +1 -0
- package/dist/chunk-JUY47NZ2.js +183 -0
- package/dist/chunk-JUY47NZ2.js.map +1 -0
- package/dist/chunk-JXMZEOHV.js +333 -0
- package/dist/chunk-JXMZEOHV.js.map +1 -0
- package/dist/chunk-K37K447U.js +51 -0
- package/dist/chunk-K37K447U.js.map +1 -0
- package/dist/chunk-K6TDB2KV.js +1442 -0
- package/dist/chunk-K6TDB2KV.js.map +1 -0
- package/dist/chunk-KIGGMKAE.js +66 -0
- package/dist/chunk-KIGGMKAE.js.map +1 -0
- package/dist/chunk-KKJ4KJCW.js +29 -0
- package/dist/chunk-KKJ4KJCW.js.map +1 -0
- package/dist/chunk-KONA5PSR.js +55 -0
- package/dist/chunk-KONA5PSR.js.map +1 -0
- package/dist/chunk-KVHRW7KO.js +60 -0
- package/dist/chunk-KVHRW7KO.js.map +1 -0
- package/dist/chunk-LA6PPSNA.js +65 -0
- package/dist/chunk-LA6PPSNA.js.map +1 -0
- package/dist/chunk-LKPJADL2.js +74 -0
- package/dist/chunk-LKPJADL2.js.map +1 -0
- package/dist/chunk-LWAEHLKV.js +74 -0
- package/dist/chunk-LWAEHLKV.js.map +1 -0
- package/dist/chunk-M6UNISGO.js +66 -0
- package/dist/chunk-M6UNISGO.js.map +1 -0
- package/dist/chunk-MIJAGBEP.js +23992 -0
- package/dist/chunk-MIJAGBEP.js.map +1 -0
- package/dist/chunk-MP4EXZ45.js +3151 -0
- package/dist/chunk-MP4EXZ45.js.map +1 -0
- package/dist/chunk-MYTDK3AL.js +2102 -0
- package/dist/chunk-MYTDK3AL.js.map +1 -0
- package/dist/chunk-MZQ5DX6S.js +125 -0
- package/dist/chunk-MZQ5DX6S.js.map +1 -0
- package/dist/chunk-NFSLRRIE.js +77 -0
- package/dist/chunk-NFSLRRIE.js.map +1 -0
- package/dist/chunk-NOK7MSVJ.js +533 -0
- package/dist/chunk-NOK7MSVJ.js.map +1 -0
- package/dist/chunk-NR5RZDAW.js +592 -0
- package/dist/chunk-NR5RZDAW.js.map +1 -0
- package/dist/chunk-O2EVJALZ.js +133 -0
- package/dist/chunk-O2EVJALZ.js.map +1 -0
- package/dist/chunk-O6UM5WWH.js +275 -0
- package/dist/chunk-O6UM5WWH.js.map +1 -0
- package/dist/chunk-O6XZIQXZ.js +6212 -0
- package/dist/chunk-O6XZIQXZ.js.map +1 -0
- package/dist/chunk-OIL6PU5W.js +35 -0
- package/dist/chunk-OIL6PU5W.js.map +1 -0
- package/dist/chunk-P4NSJS54.js +20 -0
- package/dist/chunk-P4NSJS54.js.map +1 -0
- package/dist/chunk-P5T7OZKV.js +26 -0
- package/dist/chunk-P5T7OZKV.js.map +1 -0
- package/dist/chunk-PFBQERWX.js +10 -0
- package/dist/chunk-PFBQERWX.js.map +1 -0
- package/dist/chunk-PSWVSLJU.js +56 -0
- package/dist/chunk-PSWVSLJU.js.map +1 -0
- package/dist/chunk-PY2NJ6XZ.js +191 -0
- package/dist/chunk-PY2NJ6XZ.js.map +1 -0
- package/dist/chunk-PZ4OM2LK.js +45 -0
- package/dist/chunk-PZ4OM2LK.js.map +1 -0
- package/dist/chunk-PZNOJ76W.js +541 -0
- package/dist/chunk-PZNOJ76W.js.map +1 -0
- package/dist/chunk-Q6ULQMWG.js +41 -0
- package/dist/chunk-Q6ULQMWG.js.map +1 -0
- package/dist/chunk-QKFD6PPX.js +57 -0
- package/dist/chunk-QKFD6PPX.js.map +1 -0
- package/dist/chunk-QMLGJ5OW.js +2891 -0
- package/dist/chunk-QMLGJ5OW.js.map +1 -0
- package/dist/chunk-R4TPDVBD.js +207 -0
- package/dist/chunk-R4TPDVBD.js.map +1 -0
- package/dist/chunk-R7QV5N2S.js +846 -0
- package/dist/chunk-R7QV5N2S.js.map +1 -0
- package/dist/chunk-RR3KT2E7.js +665 -0
- package/dist/chunk-RR3KT2E7.js.map +1 -0
- package/dist/chunk-SEPPFM5S.js +228 -0
- package/dist/chunk-SEPPFM5S.js.map +1 -0
- package/dist/chunk-SQ7DRYCC.js +150 -0
- package/dist/chunk-SQ7DRYCC.js.map +1 -0
- package/dist/chunk-SYULM665.js +610 -0
- package/dist/chunk-SYULM665.js.map +1 -0
- package/dist/chunk-TKT3OHZ6.js +170 -0
- package/dist/chunk-TKT3OHZ6.js.map +1 -0
- package/dist/chunk-TNOSX3PJ.js +136 -0
- package/dist/chunk-TNOSX3PJ.js.map +1 -0
- package/dist/chunk-TTVKI54A.js +160 -0
- package/dist/chunk-TTVKI54A.js.map +1 -0
- package/dist/chunk-U7ZVXFS3.js +23 -0
- package/dist/chunk-U7ZVXFS3.js.map +1 -0
- package/dist/chunk-UI6BKYQD.js +225 -0
- package/dist/chunk-UI6BKYQD.js.map +1 -0
- package/dist/chunk-UKLDW4UW.js +46 -0
- package/dist/chunk-UKLDW4UW.js.map +1 -0
- package/dist/chunk-V6XXXEXZ.js +76 -0
- package/dist/chunk-V6XXXEXZ.js.map +1 -0
- package/dist/chunk-V7BW2CIQ.js +92 -0
- package/dist/chunk-V7BW2CIQ.js.map +1 -0
- package/dist/chunk-VSU5R34H.js +76 -0
- package/dist/chunk-VSU5R34H.js.map +1 -0
- package/dist/chunk-W4SA4CMR.js +296 -0
- package/dist/chunk-W4SA4CMR.js.map +1 -0
- package/dist/chunk-WFUMNDCE.js +111 -0
- package/dist/chunk-WFUMNDCE.js.map +1 -0
- package/dist/chunk-WHWNXLTD.js +166 -0
- package/dist/chunk-WHWNXLTD.js.map +1 -0
- package/dist/chunk-WN4KX7GE.js +25 -0
- package/dist/chunk-WN4KX7GE.js.map +1 -0
- package/dist/chunk-XIY7P54H.js +84 -0
- package/dist/chunk-XIY7P54H.js.map +1 -0
- package/dist/chunk-YFPLNMPZ.js +337 -0
- package/dist/chunk-YFPLNMPZ.js.map +1 -0
- package/dist/chunk-YMBB4JBD.js +1830 -0
- package/dist/chunk-YMBB4JBD.js.map +1 -0
- package/dist/chunk-YQFM2P5W.js +197 -0
- package/dist/chunk-YQFM2P5W.js.map +1 -0
- package/dist/chunk-YQSBHWOI.js +41 -0
- package/dist/chunk-YTF3IVMF.js +149 -0
- package/dist/chunk-YTF3IVMF.js.map +1 -0
- package/dist/chunk-Z3ENMCFE.js +94 -0
- package/dist/chunk-Z3ENMCFE.js.map +1 -0
- package/dist/chunk-Z7MWSXLG.js +94 -0
- package/dist/chunk-Z7MWSXLG.js.map +1 -0
- package/dist/chunk-ZIXHS6AM.js +42 -0
- package/dist/chunk-ZIXHS6AM.js.map +1 -0
- package/dist/chunk-ZJ7TQUCU.js +4410 -0
- package/dist/chunk-ZJ7TQUCU.js.map +1 -0
- package/dist/chunk-ZNQRDLSS.js +52 -0
- package/dist/chunk-ZNQRDLSS.js.map +1 -0
- package/dist/claim-ROWH6JVB.js +197 -0
- package/dist/claim-ROWH6JVB.js.map +1 -0
- package/dist/cli.js +104 -69986
- package/dist/cli.js.map +1 -1
- package/dist/client-EURRWXPW.js +19 -0
- package/dist/code-FKQW7V7N.js +76 -0
- package/dist/code-FKQW7V7N.js.map +1 -0
- package/dist/companies-MD2MZKU6.js +195 -0
- package/dist/companies-MD2MZKU6.js.map +1 -0
- package/dist/complete-FCAJM6Z4.js +81 -0
- package/dist/complete-FCAJM6Z4.js.map +1 -0
- package/dist/config-OZOHIAOJ.js +88 -0
- package/dist/config-OZOHIAOJ.js.map +1 -0
- package/dist/connect-4YXFMXYX.js +42 -0
- package/dist/content-PCGSX2QU.js +85 -0
- package/dist/content-PCGSX2QU.js.map +1 -0
- package/dist/conversation-UX5NZ3IO.js +93 -0
- package/dist/conversation-UX5NZ3IO.js.map +1 -0
- package/dist/conversion-report-7QSWB2FY.js +125 -0
- package/dist/conversion-report-7QSWB2FY.js.map +1 -0
- package/dist/conversion-upload-command-XESIAQPU.js +438 -0
- package/dist/conversion-upload-command-XESIAQPU.js.map +1 -0
- package/dist/conversion-writes-BGOVLBS5.js +120 -0
- package/dist/conversion-writes-BGOVLBS5.js.map +1 -0
- package/dist/conversions-IYIWW4O7.js +76 -0
- package/dist/conversions-IYIWW4O7.js.map +1 -0
- package/dist/conversions-RLIJAE7E.js +135 -0
- package/dist/conversions-RLIJAE7E.js.map +1 -0
- package/dist/countries-5OBUVLLD.js +82 -0
- package/dist/countries-5OBUVLLD.js.map +1 -0
- package/dist/create-CUJLJUAQ.js +138 -0
- package/dist/create-CUJLJUAQ.js.map +1 -0
- package/dist/create-FENOT6DX.js +236 -0
- package/dist/create-FENOT6DX.js.map +1 -0
- package/dist/create-OFZQMOWO.js +59 -0
- package/dist/create-OFZQMOWO.js.map +1 -0
- package/dist/create-Z5SS2AWB.js +207 -0
- package/dist/create-Z5SS2AWB.js.map +1 -0
- package/dist/creatives-UJW2QBLH.js +182 -0
- package/dist/creatives-UJW2QBLH.js.map +1 -0
- package/dist/creatives-XI2DGQUZ.js +87 -0
- package/dist/creatives-XI2DGQUZ.js.map +1 -0
- package/dist/creatives-YLXQSROD.js +51 -0
- package/dist/creatives-YLXQSROD.js.map +1 -0
- package/dist/credentials-CH73QMD2.js +287 -0
- package/dist/credentials-CH73QMD2.js.map +1 -0
- package/dist/critique-C4WRQ4AJ.js +1449 -0
- package/dist/critique-C4WRQ4AJ.js.map +1 -0
- package/dist/critique-ZBNJ6MQ3.js +213 -0
- package/dist/critique-ZBNJ6MQ3.js.map +1 -0
- package/dist/crm-MJTT6GOJ.js +224 -0
- package/dist/crm-MJTT6GOJ.js.map +1 -0
- package/dist/crm-ZXHSEFYI.js +318 -0
- package/dist/crm-ZXHSEFYI.js.map +1 -0
- package/dist/crop-B52KIQ4O.js +113 -0
- package/dist/crop-B52KIQ4O.js.map +1 -0
- package/dist/currency-GGWF5DMU.js +88 -0
- package/dist/currency-GGWF5DMU.js.map +1 -0
- package/dist/custom-conversions-7WDBTC4X.js +125 -0
- package/dist/custom-conversions-7WDBTC4X.js.map +1 -0
- package/dist/customers-7E4HBSEY.js +56 -0
- package/dist/decide-PK7WNSQ2.js +199 -0
- package/dist/decide-PK7WNSQ2.js.map +1 -0
- package/dist/delete-56LKNEGA.js +71 -0
- package/dist/delete-56LKNEGA.js.map +1 -0
- package/dist/delete-DQY4ZSFN.js +54 -0
- package/dist/delete-DQY4ZSFN.js.map +1 -0
- package/dist/delete-EZ7HHOOD.js +69 -0
- package/dist/delete-EZ7HHOOD.js.map +1 -0
- package/dist/delete-JV4KAA6Y.js +66 -0
- package/dist/delete-JV4KAA6Y.js.map +1 -0
- package/dist/delete-YONJW4UZ.js +63 -0
- package/dist/delete-YONJW4UZ.js.map +1 -0
- package/dist/delete-YSYVFL6W.js +71 -0
- package/dist/delete-YSYVFL6W.js.map +1 -0
- package/dist/demographics-6N3TTYWC.js +138 -0
- package/dist/demographics-6N3TTYWC.js.map +1 -0
- package/dist/describe-AAVYIFE3.js +97 -0
- package/dist/describe-AAVYIFE3.js.map +1 -0
- package/dist/describe-UQFLWVFR.js +97 -0
- package/dist/describe-UQFLWVFR.js.map +1 -0
- package/dist/dimensions-QDXBG2XC.js +101 -0
- package/dist/dimensions-QDXBG2XC.js.map +1 -0
- package/dist/discard-S3NGGUSK.js +66 -0
- package/dist/discard-S3NGGUSK.js.map +1 -0
- package/dist/discover-6TEBPVNC.js +93 -0
- package/dist/discover-6TEBPVNC.js.map +1 -0
- package/dist/discover-SBZPB7T2.js +172 -0
- package/dist/discover-SBZPB7T2.js.map +1 -0
- package/dist/domain-AMAR76PB.js +98 -0
- package/dist/domain-AMAR76PB.js.map +1 -0
- package/dist/download-LV3GPOWV.js +299 -0
- package/dist/download-LV3GPOWV.js.map +1 -0
- package/dist/draft-6QZ7WMWM.js +217 -0
- package/dist/draft-6QZ7WMWM.js.map +1 -0
- package/dist/draft-DDFFTZ43.js +233 -0
- package/dist/draft-DDFFTZ43.js.map +1 -0
- package/dist/draft-FIKJXNIQ.js +281 -0
- package/dist/draft-FIKJXNIQ.js.map +1 -0
- package/dist/draft-GYGWTMBU.js +307 -0
- package/dist/draft-GYGWTMBU.js.map +1 -0
- package/dist/draft-KXL62WFS.js +328 -0
- package/dist/draft-KXL62WFS.js.map +1 -0
- package/dist/draft-N4LFPKTA.js +100 -0
- package/dist/draft-N4LFPKTA.js.map +1 -0
- package/dist/draft-POSLJCWG.js +306 -0
- package/dist/draft-POSLJCWG.js.map +1 -0
- package/dist/draft-XPO5RWST.js +103 -0
- package/dist/draft-XPO5RWST.js.map +1 -0
- package/dist/engine/index.d.ts +213 -127
- package/dist/engine/index.js +18 -4
- package/dist/{env-4P5HOGNA.js → env-TQ2XS2KY.js} +12 -2
- package/dist/env-TQ2XS2KY.js.map +1 -0
- package/dist/experiment-FQNKMORZ.js +1397 -0
- package/dist/experiment-FQNKMORZ.js.map +1 -0
- package/dist/export-4IZQZAPF.js +168 -0
- package/dist/export-4IZQZAPF.js.map +1 -0
- package/dist/extract-DZMGVQ7D.js +113 -0
- package/dist/extract-DZMGVQ7D.js.map +1 -0
- package/dist/facets-223V5P47.js +114 -0
- package/dist/facets-223V5P47.js.map +1 -0
- package/dist/favorites-DD2LNSTG.js +178 -0
- package/dist/favorites-DD2LNSTG.js.map +1 -0
- package/dist/feed-TUVFNX2U.js +177 -0
- package/dist/feed-TUVFNX2U.js.map +1 -0
- package/dist/feedback-MIW23MI2.js +66 -0
- package/dist/feedback-MIW23MI2.js.map +1 -0
- package/dist/feedback-record-RGKRKPGZ.js +175 -0
- package/dist/feedback-record-RGKRKPGZ.js.map +1 -0
- package/dist/fetch-O6UHNXWB.js +139 -0
- package/dist/fetch-O6UHNXWB.js.map +1 -0
- package/dist/fetch-TZ4UCMJK.js +176 -0
- package/dist/fetch-TZ4UCMJK.js.map +1 -0
- package/dist/find-4XKIBF4D.js +134 -0
- package/dist/find-4XKIBF4D.js.map +1 -0
- package/dist/fit-ODVVXV2Q.js +45 -0
- package/dist/fit-ODVVXV2Q.js.map +1 -0
- package/dist/flows-HVWBFZ7T.js +247 -0
- package/dist/flows-HVWBFZ7T.js.map +1 -0
- package/dist/follow-RCOXTZGY.js +94 -0
- package/dist/follow-RCOXTZGY.js.map +1 -0
- package/dist/follow-competitors-SQ5XBFTK.js +112 -0
- package/dist/follow-competitors-SQ5XBFTK.js.map +1 -0
- package/dist/following-VDU3BHC4.js +113 -0
- package/dist/following-VDU3BHC4.js.map +1 -0
- package/dist/fonts-NBIQAVQN.js +34 -0
- package/dist/fonts-NBIQAVQN.js.map +1 -0
- package/dist/forecast-2GJKBNBM.js +168 -0
- package/dist/forecast-2GJKBNBM.js.map +1 -0
- package/dist/forecast-76MUJBPO.js +104 -0
- package/dist/forecast-76MUJBPO.js.map +1 -0
- package/dist/funding-HTFVZLLG.js +85 -0
- package/dist/funding-HTFVZLLG.js.map +1 -0
- package/dist/funnel-FE2HIRVQ.js +394 -0
- package/dist/funnel-FE2HIRVQ.js.map +1 -0
- package/dist/ga4-2RC4EH7V.js +55 -0
- package/dist/ga4-2RC4EH7V.js.map +1 -0
- package/dist/generate-TPDOBCKQ.js +262 -0
- package/dist/generate-TPDOBCKQ.js.map +1 -0
- package/dist/get-6JNOVI27.js +56 -0
- package/dist/get-6JNOVI27.js.map +1 -0
- package/dist/get-FH2LIEYL.js +63 -0
- package/dist/get-FH2LIEYL.js.map +1 -0
- package/dist/get-GZLCDXXW.js +61 -0
- package/dist/get-GZLCDXXW.js.map +1 -0
- package/dist/get-KVAOPAQW.js +78 -0
- package/dist/get-KVAOPAQW.js.map +1 -0
- package/dist/get-TSPQYEKC.js +59 -0
- package/dist/get-TSPQYEKC.js.map +1 -0
- package/dist/get-TY3RXYNZ.js +63 -0
- package/dist/get-TY3RXYNZ.js.map +1 -0
- package/dist/get-VPW33XTN.js +92 -0
- package/dist/get-VPW33XTN.js.map +1 -0
- package/dist/gif-JFEYPFFI.js +94 -0
- package/dist/gif-JFEYPFFI.js.map +1 -0
- package/dist/google-R6RD4L6Z.js +136 -0
- package/dist/google-R6RD4L6Z.js.map +1 -0
- package/dist/google-VPQNRVIB.js +3190 -0
- package/dist/google-VPQNRVIB.js.map +1 -0
- package/dist/google-ads-JEQMNNMN.js +195 -0
- package/dist/google-ads-JEQMNNMN.js.map +1 -0
- package/dist/group-7AV6UL26.js +43 -0
- package/dist/group-7AV6UL26.js.map +1 -0
- package/dist/group-BVQZEZIC.js +43 -0
- package/dist/group-BVQZEZIC.js.map +1 -0
- package/dist/gsc-SQ42WAQE.js +30 -0
- package/dist/gsc-SQ42WAQE.js.map +1 -0
- package/dist/history-BNNHFURR.js +67 -0
- package/dist/history-BNNHFURR.js.map +1 -0
- package/dist/history-EHUQG4CE.js +133 -0
- package/dist/history-EHUQG4CE.js.map +1 -0
- package/dist/hubspot-JABE4USC.js +779 -0
- package/dist/hubspot-JABE4USC.js.map +1 -0
- package/dist/icon-OYTTSNSL.js +137 -0
- package/dist/icon-OYTTSNSL.js.map +1 -0
- package/dist/ideas-OD76WOQ3.js +32 -0
- package/dist/ideas-OD76WOQ3.js.map +1 -0
- package/dist/images-LY7AWWBK.js +90 -0
- package/dist/images-LY7AWWBK.js.map +1 -0
- package/dist/improve-W6GZNT2A.js +86 -0
- package/dist/improve-W6GZNT2A.js.map +1 -0
- package/dist/ingest-47WON6HT.js +23 -0
- package/dist/ingest-47WON6HT.js.map +1 -0
- package/dist/ingest-HDGGHBSJ.js +107 -0
- package/dist/ingest-HDGGHBSJ.js.map +1 -0
- package/dist/insights-IW7LGAWU.js +423 -0
- package/dist/insights-IW7LGAWU.js.map +1 -0
- package/dist/insights-QH54F56A.js +122 -0
- package/dist/insights-QH54F56A.js.map +1 -0
- package/dist/inspect-AJLG2HGL.js +189 -0
- package/dist/inspect-AJLG2HGL.js.map +1 -0
- package/dist/inspiration-RDQ3Y3N3.js +53 -0
- package/dist/inspiration-RDQ3Y3N3.js.map +1 -0
- package/dist/intent-5GSSCFZ2.js +95 -0
- package/dist/intent-5GSSCFZ2.js.map +1 -0
- package/dist/job-URVXJP75.js +202 -0
- package/dist/job-URVXJP75.js.map +1 -0
- package/dist/job-create-S4SECUVF.js +109 -0
- package/dist/job-create-S4SECUVF.js.map +1 -0
- package/dist/job-status-253SUCTJ.js +74 -0
- package/dist/job-status-253SUCTJ.js.map +1 -0
- package/dist/keep-GPSYDIGJ.js +78 -0
- package/dist/keep-GPSYDIGJ.js.map +1 -0
- package/dist/keyword-gap-NTFDX43B.js +130 -0
- package/dist/keyword-gap-NTFDX43B.js.map +1 -0
- package/dist/keyword-metrics-XSFLMBZX.js +197 -0
- package/dist/keyword-metrics-XSFLMBZX.js.map +1 -0
- package/dist/keywords-for-site-U4JLYXVE.js +128 -0
- package/dist/keywords-for-site-U4JLYXVE.js.map +1 -0
- package/dist/landing-AO72EGJ6.js +28 -0
- package/dist/landing-AO72EGJ6.js.map +1 -0
- package/dist/landings-NEF4PQL2.js +151 -0
- package/dist/landings-NEF4PQL2.js.map +1 -0
- package/dist/languages-3RDPPPTE.js +55 -0
- package/dist/languages-3RDPPPTE.js.map +1 -0
- package/dist/languages-CQX3YOIT.js +40 -0
- package/dist/languages-CQX3YOIT.js.map +1 -0
- package/dist/launches-GBHLJH5S.js +19 -0
- package/dist/launches-GBHLJH5S.js.map +1 -0
- package/dist/layerize-Q56C6LFG.js +190 -0
- package/dist/layerize-Q56C6LFG.js.map +1 -0
- package/dist/leads-JHUM6FYR.js +293 -0
- package/dist/leads-JHUM6FYR.js.map +1 -0
- package/dist/leads-UYZM2XQX.js +90 -0
- package/dist/leads-UYZM2XQX.js.map +1 -0
- package/dist/learn-D2KBGJHZ.js +203 -0
- package/dist/learn-D2KBGJHZ.js.map +1 -0
- package/dist/library-6VUFHTEK.js +109 -0
- package/dist/library-6VUFHTEK.js.map +1 -0
- package/dist/lighthouse-57U2GMPV.js +75 -0
- package/dist/lighthouse-57U2GMPV.js.map +1 -0
- package/dist/line-item-writes-R5GO6GTL.js +208 -0
- package/dist/line-item-writes-R5GO6GTL.js.map +1 -0
- package/dist/line-items-RBMH6YBZ.js +103 -0
- package/dist/line-items-RBMH6YBZ.js.map +1 -0
- package/dist/link-WS2RMCOP.js +64 -0
- package/dist/link-WS2RMCOP.js.map +1 -0
- package/dist/linkedin-FSIALZTS.js +1008 -0
- package/dist/linkedin-FSIALZTS.js.map +1 -0
- package/dist/list-2AE2Q4ZD.js +151 -0
- package/dist/list-2AE2Q4ZD.js.map +1 -0
- package/dist/list-E635Y6M4.js +303 -0
- package/dist/list-E635Y6M4.js.map +1 -0
- package/dist/list-G57ZO4PG.js +50 -0
- package/dist/list-G57ZO4PG.js.map +1 -0
- package/dist/list-JCSWZWDI.js +57 -0
- package/dist/list-JCSWZWDI.js.map +1 -0
- package/dist/list-KT6NXVLV.js +63 -0
- package/dist/list-KT6NXVLV.js.map +1 -0
- package/dist/list-RINCJOAC.js +76 -0
- package/dist/list-RINCJOAC.js.map +1 -0
- package/dist/list-SRNXHS6L.js +51 -0
- package/dist/list-SRNXHS6L.js.map +1 -0
- package/dist/list-YJSO4M5Q.js +65 -0
- package/dist/list-YJSO4M5Q.js.map +1 -0
- package/dist/locations-HW2Y5OJO.js +67 -0
- package/dist/locations-HW2Y5OJO.js.map +1 -0
- package/dist/locations-XOHI3VWI.js +40 -0
- package/dist/locations-XOHI3VWI.js.map +1 -0
- package/dist/log-3HX5BIO6.js +92 -0
- package/dist/log-3HX5BIO6.js.map +1 -0
- package/dist/logo-KXTGIYBI.js +18 -0
- package/dist/logo-KXTGIYBI.js.map +1 -0
- package/dist/lookup-X6O5UNJH.js +22 -0
- package/dist/lookup-X6O5UNJH.js.map +1 -0
- package/dist/make-QH77XOWM.js +633 -0
- package/dist/make-QH77XOWM.js.map +1 -0
- package/dist/map-QABBPYZM.js +404 -0
- package/dist/map-QABBPYZM.js.map +1 -0
- package/dist/mcp-HSD3W3OB.js +463 -0
- package/dist/mcp-HSD3W3OB.js.map +1 -0
- package/dist/media-MI4EE7L4.js +89 -0
- package/dist/media-MI4EE7L4.js.map +1 -0
- package/dist/media-QUTQOBA7.js +15 -0
- package/dist/media-QUTQOBA7.js.map +1 -0
- package/dist/media-sources-HO4DXRX5.js +32 -0
- package/dist/media-sources-HO4DXRX5.js.map +1 -0
- package/dist/members-YEYYJGY6.js +44 -0
- package/dist/members-YEYYJGY6.js.map +1 -0
- package/dist/meta-E3JOUOSS.js +69 -0
- package/dist/meta-E3JOUOSS.js.map +1 -0
- package/dist/metrics-HQ7XJAYQ.js +152 -0
- package/dist/metrics-HQ7XJAYQ.js.map +1 -0
- package/dist/models-PGX3FBHU.js +155 -0
- package/dist/models-PGX3FBHU.js.map +1 -0
- package/dist/normalize-FPJ6GSOY.js +806 -0
- package/dist/normalize-FPJ6GSOY.js.map +1 -0
- package/dist/normalize-GSQWN77S.js +141 -0
- package/dist/normalize-GSQWN77S.js.map +1 -0
- package/dist/options-F5XZMQLK.js +121 -0
- package/dist/options-F5XZMQLK.js.map +1 -0
- package/dist/output-GQFJ2T5B.js +24 -0
- package/dist/output-GQFJ2T5B.js.map +1 -0
- package/dist/page-VTTSBC6Y.js +105 -0
- package/dist/page-VTTSBC6Y.js.map +1 -0
- package/dist/pages-PMZVNVQM.js +66 -0
- package/dist/pages-PMZVNVQM.js.map +1 -0
- package/dist/performance-G67JQE5J.js +24 -0
- package/dist/performance-G67JQE5J.js.map +1 -0
- package/dist/pinterest-UDNGOWDM.js +96 -0
- package/dist/pinterest-UDNGOWDM.js.map +1 -0
- package/dist/pixels-OYZDGCH3.js +108 -0
- package/dist/pixels-OYZDGCH3.js.map +1 -0
- package/dist/pixels-XKGNTCFX.js +60 -0
- package/dist/pixels-XKGNTCFX.js.map +1 -0
- package/dist/plan-DZS3TVIJ.js +207 -0
- package/dist/plan-DZS3TVIJ.js.map +1 -0
- package/dist/preview-DR6MXOGI.js +169 -0
- package/dist/preview-DR6MXOGI.js.map +1 -0
- package/dist/profile-VOVZG44G.js +159 -0
- package/dist/profile-VOVZG44G.js.map +1 -0
- package/dist/promoted-tweet-writes-VCK2ADVJ.js +180 -0
- package/dist/promoted-tweet-writes-VCK2ADVJ.js.map +1 -0
- package/dist/promoted-tweets-4ACBP2RV.js +119 -0
- package/dist/promoted-tweets-4ACBP2RV.js.map +1 -0
- package/dist/properties-MKVF7MUK.js +101 -0
- package/dist/properties-MKVF7MUK.js.map +1 -0
- package/dist/publish-6XVA35T6.js +322 -0
- package/dist/publish-6XVA35T6.js.map +1 -0
- package/dist/query-CNWQ6STR.js +61 -0
- package/dist/query-CNWQ6STR.js.map +1 -0
- package/dist/query-DBSBZ73C.js +247 -0
- package/dist/query-DBSBZ73C.js.map +1 -0
- package/dist/query-QK4U4TEL.js +236 -0
- package/dist/query-QK4U4TEL.js.map +1 -0
- package/dist/questionnaire-OVJWNUVV.js +93 -0
- package/dist/questionnaire-OVJWNUVV.js.map +1 -0
- package/dist/read-L2QIVJTL.js +141 -0
- package/dist/read-L2QIVJTL.js.map +1 -0
- package/dist/reddit-SCEB2JQL.js +26 -0
- package/dist/reddit-SCEB2JQL.js.map +1 -0
- package/dist/refresh-TIH5Y3NP.js +94 -0
- package/dist/refresh-TIH5Y3NP.js.map +1 -0
- package/dist/release-LKMUKVXM.js +60 -0
- package/dist/release-LKMUKVXM.js.map +1 -0
- package/dist/relevant-pages-CRI2NLWG.js +99 -0
- package/dist/relevant-pages-CRI2NLWG.js.map +1 -0
- package/dist/remove-6ABOB7TZ.js +50 -0
- package/dist/remove-6ABOB7TZ.js.map +1 -0
- package/dist/remove-JKSCGKQG.js +48 -0
- package/dist/remove-JKSCGKQG.js.map +1 -0
- package/dist/reopen-27TDNXFP.js +63 -0
- package/dist/reopen-27TDNXFP.js.map +1 -0
- package/dist/rerun-XHECBJD5.js +84 -0
- package/dist/rerun-XHECBJD5.js.map +1 -0
- package/dist/research-4MOXIMDX.js +62 -0
- package/dist/research-4MOXIMDX.js.map +1 -0
- package/dist/research-XYXP7D4R.js +262 -0
- package/dist/research-XYXP7D4R.js.map +1 -0
- package/dist/reset-NLYEBPLX.js +54 -0
- package/dist/reset-NLYEBPLX.js.map +1 -0
- package/dist/reset-RDQOYBXX.js +54 -0
- package/dist/reset-RDQOYBXX.js.map +1 -0
- package/dist/resolve-VHKWC5KW.js +121 -0
- package/dist/resolve-VHKWC5KW.js.map +1 -0
- package/dist/retry-MTQSHXKH.js +60 -0
- package/dist/retry-MTQSHXKH.js.map +1 -0
- package/dist/retry-ZI5ECSFD.js +62 -0
- package/dist/retry-ZI5ECSFD.js.map +1 -0
- package/dist/retry-failed-2OYMCB55.js +45 -0
- package/dist/retry-failed-2OYMCB55.js.map +1 -0
- package/dist/run-BMJJRJL2.js +65 -0
- package/dist/run-BMJJRJL2.js.map +1 -0
- package/dist/run-IHXS6F5V.js +59 -0
- package/dist/run-IHXS6F5V.js.map +1 -0
- package/dist/scaffold-ad-QEADKYPL.js +1548 -0
- package/dist/scaffold-ad-QEADKYPL.js.map +1 -0
- package/dist/scaffold-static-ad-PTJ73ZNF.js +971 -0
- package/dist/scaffold-static-ad-PTJ73ZNF.js.map +1 -0
- package/dist/scaffold-video-ZQEZRVD6.js +872 -0
- package/dist/scaffold-video-ZQEZRVD6.js.map +1 -0
- package/dist/schedule-JD2EQJCT.js +61 -0
- package/dist/schedule-JD2EQJCT.js.map +1 -0
- package/dist/schedule-TLYT5UXM.js +66 -0
- package/dist/schedule-TLYT5UXM.js.map +1 -0
- package/dist/scheduled-agents-GIVKWTXX.js +49 -0
- package/dist/scheduled-agents-GIVKWTXX.js.map +1 -0
- package/dist/schema-MZTVCNP4.js +63 -0
- package/dist/schema-MZTVCNP4.js.map +1 -0
- package/dist/schema-RYTVKPLZ.js +132 -0
- package/dist/schema-RYTVKPLZ.js.map +1 -0
- package/dist/scrape-T3DA7ER7.js +2241 -0
- package/dist/scrape-T3DA7ER7.js.map +1 -0
- package/dist/screenshot-EIGC6SZB.js +102 -0
- package/dist/screenshot-EIGC6SZB.js.map +1 -0
- package/dist/search-2SVUDZIX.js +224 -0
- package/dist/search-2SVUDZIX.js.map +1 -0
- package/dist/search-34NFJ5F6.js +26 -0
- package/dist/search-34NFJ5F6.js.map +1 -0
- package/dist/search-AOFAN5NB.js +174 -0
- package/dist/search-AOFAN5NB.js.map +1 -0
- package/dist/search-BWE3OPOY.js +91 -0
- package/dist/search-BWE3OPOY.js.map +1 -0
- package/dist/search-EYYAOZND.js +92 -0
- package/dist/search-EYYAOZND.js.map +1 -0
- package/dist/search-copy-VKQ2OOBM.js +168 -0
- package/dist/search-copy-VKQ2OOBM.js.map +1 -0
- package/dist/seeds-HQYSVFIX.js +101 -0
- package/dist/seeds-HQYSVFIX.js.map +1 -0
- package/dist/select-HJMOAWAU.js +94 -0
- package/dist/select-HJMOAWAU.js.map +1 -0
- package/dist/sends-I7VQFE4S.js +309 -0
- package/dist/sends-I7VQFE4S.js.map +1 -0
- package/dist/sequences-JHSEJJGN.js +146 -0
- package/dist/sequences-JHSEJJGN.js.map +1 -0
- package/dist/set-prompt-TSS33JQZ.js +185 -0
- package/dist/set-prompt-TSS33JQZ.js.map +1 -0
- package/dist/setup-links-IW4BUANK.js +141 -0
- package/dist/setup-links-IW4BUANK.js.map +1 -0
- package/dist/{shared-J7DQZ2ED.js → shared-AT3FXPAG.js} +8 -6
- package/dist/shared-AT3FXPAG.js.map +1 -0
- package/dist/shopify-RQKO5TMR.js +3819 -0
- package/dist/shopify-RQKO5TMR.js.map +1 -0
- package/dist/site-3NU2BDAR.js +177 -0
- package/dist/site-3NU2BDAR.js.map +1 -0
- package/dist/sitemaps-FG37N5EB.js +87 -0
- package/dist/sitemaps-FG37N5EB.js.map +1 -0
- package/dist/sites-FIXK4Y3O.js +101 -0
- package/dist/sites-FIXK4Y3O.js.map +1 -0
- package/dist/skills-OKVCVQVD.js +47 -0
- package/dist/skills-OKVCVQVD.js.map +1 -0
- package/dist/sources-SEODRUIC.js +30 -0
- package/dist/sources-SEODRUIC.js.map +1 -0
- package/dist/sources-Z6BGTBGO.js +421 -0
- package/dist/sources-Z6BGTBGO.js.map +1 -0
- package/dist/stale-SWPDWXG7.js +63 -0
- package/dist/stale-SWPDWXG7.js.map +1 -0
- package/dist/stats-ZWZ7BAHV.js +34 -0
- package/dist/stats-ZWZ7BAHV.js.map +1 -0
- package/dist/status-7Y7UNSO6.js +62 -0
- package/dist/status-7Y7UNSO6.js.map +1 -0
- package/dist/sticker-FLRZM3BI.js +94 -0
- package/dist/sticker-FLRZM3BI.js.map +1 -0
- package/dist/stock-2CSMWRWV.js +179 -0
- package/dist/stock-2CSMWRWV.js.map +1 -0
- package/dist/studio-TTTR6N7D.js +49 -0
- package/dist/studio-TTTR6N7D.js.map +1 -0
- package/dist/sync-FH773IFH.js +54 -0
- package/dist/sync-FH773IFH.js.map +1 -0
- package/dist/sync-G5CS2RYV.js +54 -0
- package/dist/sync-G5CS2RYV.js.map +1 -0
- package/dist/sync-UADA6M33.js +265 -0
- package/dist/sync-UADA6M33.js.map +1 -0
- package/dist/sync-definition-77KLGPMA.js +52 -0
- package/dist/sync-definition-77KLGPMA.js.map +1 -0
- package/dist/tag-manager-NK3ZHSJB.js +43 -0
- package/dist/tag-manager-NK3ZHSJB.js.map +1 -0
- package/dist/tags-ANGHHLAC.js +20 -0
- package/dist/tags-ANGHHLAC.js.map +1 -0
- package/dist/tags-DKPUSQTJ.js +20 -0
- package/dist/tags-DKPUSQTJ.js.map +1 -0
- package/dist/tags-HSCV4ZAQ.js +20 -0
- package/dist/tags-HSCV4ZAQ.js.map +1 -0
- package/dist/tags-J3RMQEQM.js +26 -0
- package/dist/tags-J3RMQEQM.js.map +1 -0
- package/dist/tags-VZGTR3VJ.js +224 -0
- package/dist/tags-VZGTR3VJ.js.map +1 -0
- package/dist/targeting-constants-ZGBX3VWU.js +118 -0
- package/dist/targeting-constants-ZGBX3VWU.js.map +1 -0
- package/dist/targeting-criteria-BSG3CLHU.js +113 -0
- package/dist/targeting-criteria-BSG3CLHU.js.map +1 -0
- package/dist/targets-DVOAFYZQ.js +102 -0
- package/dist/targets-DVOAFYZQ.js.map +1 -0
- package/dist/templates-KJ5O44FF.js +178 -0
- package/dist/templates-KJ5O44FF.js.map +1 -0
- package/dist/testimonials-NB7V3DUO.js +32 -0
- package/dist/testimonials-NB7V3DUO.js.map +1 -0
- package/dist/themes-3RV3HNNE.js +94 -0
- package/dist/themes-3RV3HNNE.js.map +1 -0
- package/dist/top-companies-KRB3OZOT.js +108 -0
- package/dist/top-companies-KRB3OZOT.js.map +1 -0
- package/dist/translate-5FP32BIA.js +598 -0
- package/dist/translate-5FP32BIA.js.map +1 -0
- package/dist/triggers-EURHTCYC.js +141 -0
- package/dist/triggers-EURHTCYC.js.map +1 -0
- package/dist/tweets-X64YDEAA.js +123 -0
- package/dist/tweets-X64YDEAA.js.map +1 -0
- package/dist/unfollow-PIONCSBL.js +46 -0
- package/dist/unfollow-PIONCSBL.js.map +1 -0
- package/dist/unlink-HVVTZ3MB.js +67 -0
- package/dist/unlink-HVVTZ3MB.js.map +1 -0
- package/dist/unstage-BJJ5M7MK.js +95 -0
- package/dist/unstage-BJJ5M7MK.js.map +1 -0
- package/dist/unstage-Y7ZE3NUJ.js +84 -0
- package/dist/unstage-Y7ZE3NUJ.js.map +1 -0
- package/dist/update-3IP7FB6Y.js +98 -0
- package/dist/update-3IP7FB6Y.js.map +1 -0
- package/dist/update-CSDSK5NO.js +63 -0
- package/dist/update-CSDSK5NO.js.map +1 -0
- package/dist/update-FGJXVDB7.js +142 -0
- package/dist/update-FGJXVDB7.js.map +1 -0
- package/dist/update-MF7LY2OT.js +155 -0
- package/dist/update-MF7LY2OT.js.map +1 -0
- package/dist/upload-DDPI7KJV.js +126 -0
- package/dist/upload-DDPI7KJV.js.map +1 -0
- package/dist/upload-IWFYKD7A.js +150 -0
- package/dist/upload-IWFYKD7A.js.map +1 -0
- package/dist/upscale-EYCEYRWE.js +109 -0
- package/dist/upscale-EYCEYRWE.js.map +1 -0
- package/dist/url-options-RA3XISLN.js +130 -0
- package/dist/url-options-RA3XISLN.js.map +1 -0
- package/dist/url-params-SN4APXCK.js +98 -0
- package/dist/url-params-SN4APXCK.js.map +1 -0
- package/dist/use-E2TA2K6J.js +95 -0
- package/dist/use-E2TA2K6J.js.map +1 -0
- package/dist/validate-W52JOEXI.js +88 -0
- package/dist/validate-W52JOEXI.js.map +1 -0
- package/dist/variant-ETHB6XUM.js +338 -0
- package/dist/variant-ETHB6XUM.js.map +1 -0
- package/dist/videos-653WAFPG.js +39 -0
- package/dist/videos-653WAFPG.js.map +1 -0
- package/dist/view-BVEZRRV2.js +121 -0
- package/dist/view-BVEZRRV2.js.map +1 -0
- package/dist/viewer-check-W4ICSBHO.js +68 -0
- package/dist/viewer-check-W4ICSBHO.js.map +1 -0
- package/dist/web-JWIGFGIU.js +140 -0
- package/dist/web-JWIGFGIU.js.map +1 -0
- package/dist/winners-MJDKCGEZ.js +113 -0
- package/dist/winners-MJDKCGEZ.js.map +1 -0
- package/dist/winning-ads-O3IMUGGO.js +84 -0
- package/dist/winning-ads-O3IMUGGO.js.map +1 -0
- package/dist/write-commands-DA6FIFAO.js +737 -0
- package/dist/write-commands-DA6FIFAO.js.map +1 -0
- package/dist/write-commands-EMN2WENA.js +1015 -0
- package/dist/write-commands-EMN2WENA.js.map +1 -0
- package/dist/write-commands-KTPISQRE.js +206 -0
- package/dist/write-commands-KTPISQRE.js.map +1 -0
- package/dist/write-commands-QBGIWU27.js +713 -0
- package/dist/write-commands-QBGIWU27.js.map +1 -0
- package/dist/x-BT3SNCTU.js +47 -0
- package/dist/x-BT3SNCTU.js.map +1 -0
- package/package.json +9 -2
- package/dist/chunk-CHJOTJTZ.js +0 -9989
- package/dist/chunk-CHJOTJTZ.js.map +0 -1
- package/dist/chunk-HJEMOSPH.js +0 -1292
- package/dist/chunk-HJEMOSPH.js.map +0 -1
- package/dist/chunk-MF7YA62W.js.map +0 -1
- package/dist/chunk-VLUGGVJL.js.map +0 -1
- package/dist/chunk-VZEDAFAR.js.map +0 -1
- package/dist/chunk-XHC4LMK4.js.map +0 -1
- package/dist/client-GR6YL3YX.js +0 -17
- package/dist/output-NMQXZF3Z.js +0 -18
- /package/dist/{client-GR6YL3YX.js.map → chunk-YQSBHWOI.js.map} +0 -0
- /package/dist/{env-4P5HOGNA.js.map → client-EURRWXPW.js.map} +0 -0
- /package/dist/{output-NMQXZF3Z.js.map → connect-4YXFMXYX.js.map} +0 -0
- /package/dist/{shared-J7DQZ2ED.js.map → customers-7E4HBSEY.js.map} +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// src/engine/copy-tells/questions.ts
|
|
2
|
+
var ANY_LANGUAGE = "The copy may be in any language; judge the construction, not the words.";
|
|
3
|
+
var TELL_QUESTIONS = [
|
|
4
|
+
{
|
|
5
|
+
id: "rhetorical-opener",
|
|
6
|
+
question: `Does \`sentence\` open with a fake-candid pause before an ordinary claim, such as "Honestly?", "Here's the thing:", "Look,", "Let's be real", "La verdad es que", "Seamos sinceros"? A sentence that simply starts with its claim does not count. ${ANY_LANGUAGE}`,
|
|
7
|
+
threshold: 0.75
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "negation-pivot",
|
|
11
|
+
question: `Is \`sentence\` built as a negative parallelism that denies a smaller framing to assert a bigger one, such as "It's not just a CRM, it's a growth engine", "Not only X but also Y", "No se trata solo de X, sino de Y", or a short "Not a tool." answered by "A partner." (\`before\` is the sentence before it, for that two-sentence form)? A plain negative fact ("No setup fee", "We don't sell your data") does not count. ${ANY_LANGUAGE}`,
|
|
12
|
+
threshold: 0.5
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: "participle-tail",
|
|
16
|
+
question: `Does \`sentence\` end with a participle or gerund phrase hung off a comma to add vague significance, such as ", ensuring nothing slips through", ", fostering growth", ", permitiendo cerrar el mes antes"? A sentence that opens with such a word does not count. ${ANY_LANGUAGE}`,
|
|
17
|
+
threshold: 0.5
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "copula-avoidance",
|
|
21
|
+
question: `Does \`sentence\` use an inflated verb where a plain "is" or "has" would do, such as "serves as", "stands as", "boasts", "se erige como", "cuenta con"? ${ANY_LANGUAGE}`,
|
|
22
|
+
threshold: 0.6
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "authority-trope",
|
|
26
|
+
question: `Does \`sentence\` claim to reveal what is "really" at stake, with a phrase like "The real question is", "At its core", "What really matters is", "The heart of the matter", "En el fondo", "Lo que realmente importa"? Candid openers ("Honestly", "To be fair"), contrasts ("not just X, but Y") and filler words are other tells and do not count here. ${ANY_LANGUAGE}`,
|
|
27
|
+
threshold: 0.5
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "signposting",
|
|
31
|
+
question: `Does \`sentence\` announce what the text is about to explain instead of saying it, such as "Let's dive in", "Here's what you need to know", "Let's break it down", "Vamos a ver c\xF3mo funciona"? Presenting the offer itself ("Here is a plan for every team size", "Aqu\xED tienes nuestras tarifas") and an assistant handing over a summary are not this. ${ANY_LANGUAGE}`,
|
|
32
|
+
threshold: 0.5
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "chat-artifact",
|
|
36
|
+
question: `Is \`sentence\` an AI assistant talking to the person who asked it for the text, pasted into the page by mistake, such as "I hope this helps!", "Let me know if you want changes", "Here is an overview of the plan", "Would you like me to", "Aqu\xED tienes el resumen"? Copy that speaks to the page's own visitor ("Here are our three plans", "Tell us what you need") does not count. ${ANY_LANGUAGE}`,
|
|
37
|
+
threshold: 0.62
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: "vague-attribution",
|
|
41
|
+
question: `Does \`sentence\` credit a claim to unnamed authorities, such as "Experts agree", "Studies show", "Research shows", "Los expertos coinciden", without naming who? ${ANY_LANGUAGE}`,
|
|
42
|
+
threshold: 0.5
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "hollow-conclusion",
|
|
46
|
+
question: `Is \`sentence\` a vague upbeat ending that asserts nothing, such as "The future looks bright", "The possibilities are endless", "El cielo es el l\xEDmite"? ${ANY_LANGUAGE}`,
|
|
47
|
+
threshold: 0.65
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "filler-phrase",
|
|
51
|
+
question: `Does \`sentence\` contain a wordy filler phrase that carries no meaning, such as "in order to", "due to the fact that", "it is worth noting that", "cabe destacar"? ${ANY_LANGUAGE}`,
|
|
52
|
+
threshold: 0.75
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "aphorism-formula",
|
|
56
|
+
question: `Is \`sentence\` an aphorism of the form "X is the <abstract noun> of Y", such as "Trust is the currency of every deal", "Data is the language of growth", "Los datos son la columna vertebral de tu negocio"? Other contrasts and slogans do not count. ${ANY_LANGUAGE}`,
|
|
57
|
+
threshold: 0.7
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: "false-range",
|
|
61
|
+
question: `Does \`sentence\` use a "from X to Y" range whose two ends are not points on one scale, such as "from onboarding to retention", "from startups to enterprises", "desde la captaci\xF3n hasta la fidelizaci\xF3n"? A real range of numbers, prices or dates ("from $9 to $99") does not count. ${ANY_LANGUAGE}`,
|
|
62
|
+
threshold: 0.5
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
function tellQuestionsFor(sentence) {
|
|
66
|
+
return TELL_QUESTIONS.map((t) => ({
|
|
67
|
+
instructions: {
|
|
68
|
+
sentence: sentence.text,
|
|
69
|
+
...t.id === "negation-pivot" && sentence.before ? { before: sentence.before } : {},
|
|
70
|
+
question: t.question
|
|
71
|
+
}
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
var SAME_CLAIM_QUESTION = `\`a\` and \`b\` are two headlines of the same ad. Are they the same claim reworded, a synonym or a swapped verb apart ("Boost Your Sales Fast" and "Increase Your Sales Fast"), rather than two different claims (a price, a guarantee, a delivery time, a rating)? ${ANY_LANGUAGE}`;
|
|
75
|
+
var SAME_CLAIM_HELD = 0.5;
|
|
76
|
+
function sameClaimQuestion(a, b) {
|
|
77
|
+
return { instructions: { a, b, question: SAME_CLAIM_QUESTION } };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// src/engine/copy-tells/sentences.ts
|
|
81
|
+
var SENTENCES = new Intl.Segmenter(void 0, { granularity: "sentence" });
|
|
82
|
+
var WORDS = new Intl.Segmenter(void 0, { granularity: "word" });
|
|
83
|
+
function wordCount(text) {
|
|
84
|
+
let n = 0;
|
|
85
|
+
for (const s of WORDS.segment(text)) if (s.isWordLike) n++;
|
|
86
|
+
return n;
|
|
87
|
+
}
|
|
88
|
+
function rawSentences(text) {
|
|
89
|
+
return [...SENTENCES.segment(text)].map((s) => s.segment.trim()).filter(Boolean);
|
|
90
|
+
}
|
|
91
|
+
function blockSentences(block, offset) {
|
|
92
|
+
const out = [];
|
|
93
|
+
let pending = null;
|
|
94
|
+
for (const segment of SENTENCES.segment(block)) {
|
|
95
|
+
const trimmed = segment.segment.trim().replace(/\s+/g, " ");
|
|
96
|
+
if (!trimmed) continue;
|
|
97
|
+
const start = offset + segment.index + (segment.segment.length - segment.segment.trimStart().length);
|
|
98
|
+
const joined = pending ? { text: `${pending.text} ${trimmed}`, start: pending.start } : { text: trimmed, start };
|
|
99
|
+
pending = wordCount(joined.text) < 2 ? joined : null;
|
|
100
|
+
if (!pending) out.push(joined);
|
|
101
|
+
}
|
|
102
|
+
if (pending && wordCount(pending.text) > 0) out.push(pending);
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
var BLOCK_END = /\n[^\S\n]*\n/g;
|
|
106
|
+
function copySentences(copy) {
|
|
107
|
+
const out = [];
|
|
108
|
+
let offset = 0;
|
|
109
|
+
for (const end of [...copy.matchAll(BLOCK_END), null]) {
|
|
110
|
+
const to = end ? end.index : copy.length;
|
|
111
|
+
blockSentences(copy.slice(offset, to).replaceAll("\n", " "), offset).forEach((s, i, all) => {
|
|
112
|
+
const before = all[i - 1]?.text;
|
|
113
|
+
out.push({ ...s, ...before ? { before } : {} });
|
|
114
|
+
});
|
|
115
|
+
if (end) offset = end.index + end[0].length;
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// src/engine/copy-tells/patterns.ts
|
|
121
|
+
var STACCATO_MAX_WORDS = 4;
|
|
122
|
+
var STACCATO_RUN = 3;
|
|
123
|
+
var HEADLINE_SET_FLOOR = 3;
|
|
124
|
+
|
|
125
|
+
export {
|
|
126
|
+
STACCATO_MAX_WORDS,
|
|
127
|
+
STACCATO_RUN,
|
|
128
|
+
HEADLINE_SET_FLOOR,
|
|
129
|
+
TELL_QUESTIONS,
|
|
130
|
+
tellQuestionsFor,
|
|
131
|
+
SAME_CLAIM_HELD,
|
|
132
|
+
sameClaimQuestion,
|
|
133
|
+
wordCount,
|
|
134
|
+
rawSentences,
|
|
135
|
+
copySentences
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=chunk-4NZ47VXO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/copy-tells/questions.ts","../src/engine/copy-tells/sentences.ts","../src/engine/copy-tells/patterns.ts"],"sourcesContent":["/**\n * The AI copy tells that are a reading of the words, asked of the decision model (Jev) one\n * sentence at a time, in whatever language the copy is written.\n *\n * The observation set is Wikipedia's \"Signs of AI writing\" (WikiProject AI Cleanup), via the\n * `humanizer` skill (MIT, github.com/blader/humanizer): which constructions models over-produce.\n * It used to be phrase lists in English and Spanish, so a Portuguese, German or French page passed\n * clean and a paraphrase of a listed phrase did too. The examples in each question are examples:\n * Jev reads the construction, not the words. Thresholds were measured on\n * scripts/copy-tells-evals (docs/decision-model.md).\n *\n * The tells that are a shape rather than a reading (a run of very short sentences, Title Case in\n * a heading, emoji, curly quotes, an inline-header list) stay in code: `detect.ts`.\n */\nimport type { NoulQuestion } from \"../lib/remembered-nouls.ts\";\n\nexport type JudgedTellId =\n | \"rhetorical-opener\"\n | \"negation-pivot\"\n | \"participle-tail\"\n | \"copula-avoidance\"\n | \"authority-trope\"\n | \"signposting\"\n | \"chat-artifact\"\n | \"vague-attribution\"\n | \"hollow-conclusion\"\n | \"filler-phrase\"\n | \"aphorism-formula\"\n | \"false-range\";\n\ntype TellQuestion = {\n id: JudgedTellId;\n question: string;\n /** At or above this, the sentence carries the tell. Measured per question. */\n threshold: number;\n};\n\nconst ANY_LANGUAGE = \"The copy may be in any language; judge the construction, not the words.\";\n\nexport const TELL_QUESTIONS: readonly TellQuestion[] = [\n {\n id: \"rhetorical-opener\",\n question: `Does \\`sentence\\` open with a fake-candid pause before an ordinary claim, such as \"Honestly?\", \"Here's the thing:\", \"Look,\", \"Let's be real\", \"La verdad es que\", \"Seamos sinceros\"? A sentence that simply starts with its claim does not count. ${ANY_LANGUAGE}`,\n threshold: 0.75,\n },\n {\n id: \"negation-pivot\",\n question: `Is \\`sentence\\` built as a negative parallelism that denies a smaller framing to assert a bigger one, such as \"It's not just a CRM, it's a growth engine\", \"Not only X but also Y\", \"No se trata solo de X, sino de Y\", or a short \"Not a tool.\" answered by \"A partner.\" (\\`before\\` is the sentence before it, for that two-sentence form)? A plain negative fact (\"No setup fee\", \"We don't sell your data\") does not count. ${ANY_LANGUAGE}`,\n threshold: 0.5,\n },\n {\n id: \"participle-tail\",\n question: `Does \\`sentence\\` end with a participle or gerund phrase hung off a comma to add vague significance, such as \", ensuring nothing slips through\", \", fostering growth\", \", permitiendo cerrar el mes antes\"? A sentence that opens with such a word does not count. ${ANY_LANGUAGE}`,\n threshold: 0.5,\n },\n {\n id: \"copula-avoidance\",\n question: `Does \\`sentence\\` use an inflated verb where a plain \"is\" or \"has\" would do, such as \"serves as\", \"stands as\", \"boasts\", \"se erige como\", \"cuenta con\"? ${ANY_LANGUAGE}`,\n threshold: 0.6,\n },\n {\n id: \"authority-trope\",\n question: `Does \\`sentence\\` claim to reveal what is \"really\" at stake, with a phrase like \"The real question is\", \"At its core\", \"What really matters is\", \"The heart of the matter\", \"En el fondo\", \"Lo que realmente importa\"? Candid openers (\"Honestly\", \"To be fair\"), contrasts (\"not just X, but Y\") and filler words are other tells and do not count here. ${ANY_LANGUAGE}`,\n threshold: 0.5,\n },\n {\n id: \"signposting\",\n question: `Does \\`sentence\\` announce what the text is about to explain instead of saying it, such as \"Let's dive in\", \"Here's what you need to know\", \"Let's break it down\", \"Vamos a ver cómo funciona\"? Presenting the offer itself (\"Here is a plan for every team size\", \"Aquí tienes nuestras tarifas\") and an assistant handing over a summary are not this. ${ANY_LANGUAGE}`,\n threshold: 0.5,\n },\n {\n id: \"chat-artifact\",\n question: `Is \\`sentence\\` an AI assistant talking to the person who asked it for the text, pasted into the page by mistake, such as \"I hope this helps!\", \"Let me know if you want changes\", \"Here is an overview of the plan\", \"Would you like me to\", \"Aquí tienes el resumen\"? Copy that speaks to the page's own visitor (\"Here are our three plans\", \"Tell us what you need\") does not count. ${ANY_LANGUAGE}`,\n threshold: 0.62,\n },\n {\n id: \"vague-attribution\",\n question: `Does \\`sentence\\` credit a claim to unnamed authorities, such as \"Experts agree\", \"Studies show\", \"Research shows\", \"Los expertos coinciden\", without naming who? ${ANY_LANGUAGE}`,\n threshold: 0.5,\n },\n {\n id: \"hollow-conclusion\",\n question: `Is \\`sentence\\` a vague upbeat ending that asserts nothing, such as \"The future looks bright\", \"The possibilities are endless\", \"El cielo es el límite\"? ${ANY_LANGUAGE}`,\n threshold: 0.65,\n },\n {\n id: \"filler-phrase\",\n question: `Does \\`sentence\\` contain a wordy filler phrase that carries no meaning, such as \"in order to\", \"due to the fact that\", \"it is worth noting that\", \"cabe destacar\"? ${ANY_LANGUAGE}`,\n threshold: 0.75,\n },\n {\n id: \"aphorism-formula\",\n question: `Is \\`sentence\\` an aphorism of the form \"X is the <abstract noun> of Y\", such as \"Trust is the currency of every deal\", \"Data is the language of growth\", \"Los datos son la columna vertebral de tu negocio\"? Other contrasts and slogans do not count. ${ANY_LANGUAGE}`,\n threshold: 0.7,\n },\n {\n id: \"false-range\",\n question: `Does \\`sentence\\` use a \"from X to Y\" range whose two ends are not points on one scale, such as \"from onboarding to retention\", \"from startups to enterprises\", \"desde la captación hasta la fidelización\"? A real range of numbers, prices or dates (\"from $9 to $99\") does not count. ${ANY_LANGUAGE}`,\n threshold: 0.5,\n },\n];\n\n/** One sentence of copy, and the one before it in the same block, when there is one. */\nexport type CopySentence = { text: string; before?: string };\n\n/** The tell questions for one sentence, in `TELL_QUESTIONS` order. Pure. */\nexport function tellQuestionsFor(sentence: CopySentence): NoulQuestion[] {\n return TELL_QUESTIONS.map((t) => ({\n instructions: {\n sentence: sentence.text,\n ...(t.id === \"negation-pivot\" && sentence.before ? { before: sentence.before } : {}),\n question: t.question,\n },\n }));\n}\n\n/**\n * Synonym cycling (§11): headlines of one ad that are one claim reworded with a swapped verb. Both\n * an AI tell and a real Google Ads defect, since a cycled set gives the auction nothing to choose\n * between. Asked of each pair of a set; it replaced a table of English and Spanish verb synonyms.\n */\nexport const SAME_CLAIM_QUESTION = `\\`a\\` and \\`b\\` are two headlines of the same ad. Are they the same claim reworded, a synonym or a swapped verb apart (\"Boost Your Sales Fast\" and \"Increase Your Sales Fast\"), rather than two different claims (a price, a guarantee, a delivery time, a rating)? ${ANY_LANGUAGE}`;\nexport const SAME_CLAIM_HELD = 0.5;\n\nexport function sameClaimQuestion(a: string, b: string): NoulQuestion {\n return { instructions: { a, b, question: SAME_CLAIM_QUESTION } };\n}\n","/**\n * Copy cut into the sentences the decision model reads one at a time. ICU's sentence and word\n * segmentation (`Intl.Segmenter`) does the cutting, so it holds in any script, Japanese and Thai\n * included, with no list of abbreviations or punctuation of our own.\n */\n\nexport type LocatedSentence = {\n text: string;\n /** Where the sentence starts in the copy, in UTF-16 code units. */\n start: number;\n /** The sentence before it in the same block, for a construction that spans two. */\n before?: string;\n};\n\nconst SENTENCES = new Intl.Segmenter(undefined, { granularity: \"sentence\" });\nconst WORDS = new Intl.Segmenter(undefined, { granularity: \"word\" });\n\n/** How many words `text` holds, in any script. Pure. */\nexport function wordCount(text: string): number {\n let n = 0;\n for (const s of WORDS.segment(text)) if (s.isWordLike) n++;\n return n;\n}\n\n/** Every sentence of `text` exactly as written, a one-word one included. Pure. */\nexport function rawSentences(text: string): string[] {\n return [...SENTENCES.segment(text)].map((s) => s.segment.trim()).filter(Boolean);\n}\n\n/** The sentences of one block, each located from `offset`, a one-word one joined to the next. */\nfunction blockSentences(block: string, offset: number): Array<{ text: string; start: number }> {\n const out: Array<{ text: string; start: number }> = [];\n let pending: { text: string; start: number } | null = null;\n for (const segment of SENTENCES.segment(block)) {\n const trimmed = segment.segment.trim().replace(/\\s+/g, \" \");\n if (!trimmed) continue;\n const start = offset + segment.index + (segment.segment.length - segment.segment.trimStart().length);\n const joined: { text: string; start: number } = pending\n ? { text: `${pending.text} ${trimmed}`, start: pending.start }\n : { text: trimmed, start };\n pending = wordCount(joined.text) < 2 ? joined : null;\n if (!pending) out.push(joined);\n }\n if (pending && wordCount(pending.text) > 0) out.push(pending);\n return out;\n}\n\n/** A blank line: what ends a block, in Markdown and in page copy, where block tags leave one. */\nconst BLOCK_END = /\\n[^\\S\\n]*\\n/g;\n\n/**\n * Every sentence of `copy`, block by block (a blank line ends a block; a single line break is a\n * soft wrap, read as a space). A one-word sentence is kept with the one it opens (\"Honestly? It\n * depends.\"): alone it says nothing to judge. Pure.\n */\nexport function copySentences(copy: string): LocatedSentence[] {\n const out: LocatedSentence[] = [];\n let offset = 0;\n for (const end of [...copy.matchAll(BLOCK_END), null]) {\n const to = end ? end.index : copy.length;\n blockSentences(copy.slice(offset, to).replaceAll(\"\\n\", \" \"), offset).forEach((s, i, all) => {\n const before = all[i - 1]?.text;\n out.push({ ...s, ...(before ? { before } : {}) });\n });\n if (end) offset = end.index + end[0].length;\n }\n return out;\n}\n","/**\n * AI copy tells — the ids, and the measures of the tells that are a shape.\n *\n * The observation set is Wikipedia's \"Signs of AI writing\" (WikiProject AI Cleanup) via the\n * `humanizer` skill (MIT, github.com/blader/humanizer): which constructions models over-produce.\n * The tells that read the words are questions to the decision model (`questions.ts`), in any\n * language; the ones here are measured in code and hold in any language too.\n *\n * Callers own the thresholds: a single tell in a 30-character Google headline is damning, the\n * same tell in a long landing is noise.\n */\nimport type { JudgedTellId } from \"./questions.ts\";\n\n/** The tells this module can report. */\nexport type CopyTellId =\n | JudgedTellId\n | \"staccato-drama\"\n | \"curly-quote\"\n | \"emoji\"\n | \"inline-header-list\"\n | \"title-case-heading\"\n | \"synonym-cycling\";\n\n/** Staccato drama (§31): N consecutive sentences at or under this word count. */\nexport const STACCATO_MAX_WORDS = 4;\nexport const STACCATO_RUN = 3;\n\n/** Below this many headlines there is no \"set\" to judge for synonym cycling (§11). */\nexport const HEADLINE_SET_FLOOR = 3;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ApiError
|
|
3
|
+
} from "./chunk-CUL3VB4L.js";
|
|
4
|
+
import {
|
|
5
|
+
optionalChatId
|
|
6
|
+
} from "./chunk-I4FTS5EE.js";
|
|
7
|
+
import {
|
|
8
|
+
writeJson
|
|
9
|
+
} from "./chunk-MYTDK3AL.js";
|
|
10
|
+
|
|
11
|
+
// src/commands/avatars/casting.ts
|
|
12
|
+
var CAST_FLAG_RULE = "Cast with `--avatar <handle>` on `baker studio generate`, `baker studio animate`, `baker canvas scaffold-ad`, `baker canvas scaffold-static-ad` and `baker canvas scaffold-video`. Don't hand-roll it by pasting `subjectDescription` into the prompt or by passing the sheet through `--reference` \u2014 both render something that merely resembles them. `--avatar` is also the only thing that carries their accent and delivery into a clip. An avatar has no pinned voice by design (ADR 0005): the video model renders the voice, and the region on their profile is the only thing steering it \u2014 without the flag the clip is performed flat, in whatever accent the model picks on its own. `baker canvas scaffold-video` casts only their face: a reproduced video keeps the source ad's accent direction, so never tell the user it speaks in theirs.";
|
|
13
|
+
var VERBATIM_RULE = "When you do write the description yourself \u2014 a hand-built canvas node, a landing image, anywhere `--avatar` does not exist \u2014 copy `subjectDescription` verbatim, word for word. Re-phrasing it per generation is the other reason a face drifts across a set.";
|
|
14
|
+
var VIDEO_ROUTING = "In video, a photoreal presenter renders on `google/veo-3.1` (or `google/veo-3.1-fast`), never `bytedance/seedance-2.0` \u2014 it refuses photoreal human faces, AI-generated ones included. Reproducing a video the user gave you: `baker canvas scaffold-video \u2026 --avatar <handle> --real-face`.";
|
|
15
|
+
function castingHints(avatar) {
|
|
16
|
+
if (avatar.status === "generating" && avatar.needsFace) {
|
|
17
|
+
return [
|
|
18
|
+
`The user is picking @${avatar.handle}'s face right now \u2014 portraits are on their screen and nothing renders until they answer. There is NOTHING to wait for and nothing to check: do not poll, do not block on it, do not ask about the face in a question of your own, and do not delete or recreate this avatar. Whatever you do next simply runs after they have chosen.`
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
if (avatar.status === "generating") {
|
|
22
|
+
return [
|
|
23
|
+
`Still building \u2014 a ~30s render that settles on its own, and this avatar is castable only once it reads \`ready\`. If the next thing you do needs it (a clip, a still, anything with --avatar), block on it: \`baker avatars get ${avatar.handle} --wait\` returns the moment it is ready. Otherwise do other work first and read it back with \`baker avatars get ${avatar.handle}\`. Never write your own sleep or poll loop, and never end the turn waiting \u2014 the user would have to come back and tell you it is ready.`
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
if (avatar.status === "error") {
|
|
27
|
+
return [
|
|
28
|
+
`The identity sheet could not be built${avatar.errorMessage ? `: ${avatar.errorMessage}` : ""}. This avatar cannot be cast. Sharpen the subject description (one person, plain description, no scene) and rebuild: \`baker avatars update ${avatar.handle} --subject "\u2026" --regenerate-sheet\`.`
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
if (avatar.status === "archived") {
|
|
32
|
+
return [
|
|
33
|
+
`Retired. Work that already used it still resolves, but do not cast it into anything new \u2014 \`baker avatars list\` shows the roster you can cast from.`
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
if (!avatar.sheetUrl) {
|
|
37
|
+
return [
|
|
38
|
+
`No identity sheet on this avatar yet, so there is nothing to ground a render on. Re-read it with \`baker avatars get ${avatar.handle}\`; if it stays this way, rebuild the sheet with \`baker avatars update ${avatar.handle} --regenerate-sheet\`.`
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
return [
|
|
42
|
+
`Ready to cast: \`baker studio generate "<your scene>" --avatar ${avatar.handle}\` for a still, \`baker studio animate "<the motion, and the line they say>" --avatar ${avatar.handle}\` for a clip.`,
|
|
43
|
+
CAST_FLAG_RULE,
|
|
44
|
+
VERBATIM_RULE,
|
|
45
|
+
VIDEO_ROUTING
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
function rosterRow(avatar) {
|
|
49
|
+
return {
|
|
50
|
+
handle: avatar.handle,
|
|
51
|
+
name: avatar.name,
|
|
52
|
+
status: avatar.status,
|
|
53
|
+
likeness: avatar.likeness,
|
|
54
|
+
sheetUrl: avatar.sheetUrl ?? null,
|
|
55
|
+
avatarId: avatar.avatarId,
|
|
56
|
+
...avatar.errorMessage ? { errorMessage: avatar.errorMessage } : {}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function chatIdFromEnv() {
|
|
60
|
+
return optionalChatId();
|
|
61
|
+
}
|
|
62
|
+
function rosterHints(roster, statusFilter) {
|
|
63
|
+
if (roster.length === 0) {
|
|
64
|
+
return [
|
|
65
|
+
statusFilter ? `No avatars with status "${statusFilter}". Drop \`--status\` to see the whole roster.` : `No avatars yet \u2014 and retired ones are hidden unless you pass \`--status archived\`. Cast a new presenter with \`baker avatars create --name "\u2026" --subject "\u2026"\`.`
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
const mine = roster.filter((avatar) => avatar.fromThisChat).map((avatar) => avatar.handle);
|
|
69
|
+
const hints = mine.length ? [
|
|
70
|
+
`@${mine[0]} was made in this conversation${mine.length > 1 ? ` (with ${mine.slice(1).map((h) => `@${h}`).join(", ")})` : ""} \u2014 that is the avatar this chat is about, and the user chose its face. Use it. The others belong to earlier conversations: only reach for one if the user names it, and never ask which to use when the answer is the one you just cast.`
|
|
71
|
+
] : [];
|
|
72
|
+
hints.push(
|
|
73
|
+
"Casting one of these? Cast them with `--avatar <handle>` on `baker studio generate` / `baker studio animate` \u2014 that flag carries their face AND their accent. `baker avatars get <handle>` returns the written profile behind it; the roster leaves the description out on purpose, because it must never be read half-way."
|
|
74
|
+
);
|
|
75
|
+
const building = roster.filter((avatar) => avatar.status === "generating").map((avatar) => avatar.handle);
|
|
76
|
+
if (building.length > 0) {
|
|
77
|
+
hints.push(
|
|
78
|
+
`Still building, not castable yet: ${building.join(", ")}. Check with \`baker avatars get ${building[0]}\` after your next piece of work.`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const failed = roster.filter((avatar) => avatar.status === "error").map((avatar) => avatar.handle);
|
|
82
|
+
if (failed.length > 0) {
|
|
83
|
+
hints.push(
|
|
84
|
+
`Could not be built: ${failed.join(", ")}. Read why with \`baker avatars get ${failed[0]}\`, then rebuild with \`baker avatars update ${failed[0]} --subject "\u2026" --regenerate-sheet\`.`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
return hints;
|
|
88
|
+
}
|
|
89
|
+
function thinProfileHint(profile, handle) {
|
|
90
|
+
const missing = ["motion", "persona", "speech", "accent", "wardrobe", "setting"].filter(
|
|
91
|
+
(field) => !profile?.[field]?.trim()
|
|
92
|
+
);
|
|
93
|
+
if (missing.length === 0) return null;
|
|
94
|
+
return `MISSING ${missing.map((field) => `--${field}`).join(" ")}. A bare subject description holds the face still and nothing else, so clips of @${handle} come out stiff and generic \u2014 measured, filling these in nearly doubled the movement in the same brief. --accent is the one nobody guesses and the only one that fails silently: it decides the LANGUAGE and accent the avatar speaks in, in every clip. Name the region whose language the USER is writing to you in ("Spanish from Spain, Madrid accent") \u2014 "Spanish" on its own renders as no accent at all, and a region taken from how the person LOOKS ("European", "Nordic") renders as that region's language: an ad for a Spanish client shipped with --accent "German" and came back spoken in German. The user almost certainly told you how this person talks and carries themselves; put it in: \`baker avatars update ${handle} ${missing.map((field) => `--${field} "\u2026"`).join(" ")}\`.`;
|
|
95
|
+
}
|
|
96
|
+
function parseFaceChoice(raw) {
|
|
97
|
+
if (raw === void 0) return "ask";
|
|
98
|
+
const value = raw.trim().toLowerCase();
|
|
99
|
+
if (value === "ask" || value === "auto") return value;
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
function creationHints(created, profile) {
|
|
103
|
+
const thin = thinProfileHint(profile, created.handle);
|
|
104
|
+
const casting = created.likeness === "synthetic" && created.faceChoice === "auto" ? [
|
|
105
|
+
`No one was asked about this face \u2014 \`--face auto\` cast it and it is kept. Do not tell the user they chose it, and do not offer them a pick you are not going to run. If this should have been theirs, say so and create it again with \`--face ask\`.`
|
|
106
|
+
] : created.likeness === "synthetic" ? [
|
|
107
|
+
`The user is being shown real portraits of @${created.handle} right now, and the turn waits for them to pick \u2014 this happens on its own, triggered by the command you just ran. The picker is already showing, so don't call request_avatar_casting, don't ask about the face in a question of your own, and don't wait or poll: whatever you do next simply runs after they have chosen \u2014 or, if they have not picked within 30 seconds of the faces appearing, after the first face is kept for them (then never say they chose it). Say what you created, then carry on with what the user asked for: when that was only the avatar, or they said to stop after it, stop there and render nothing.`
|
|
108
|
+
] : [];
|
|
109
|
+
const hints = [
|
|
110
|
+
...casting,
|
|
111
|
+
...thin ? [thin] : [],
|
|
112
|
+
...castingHints({ handle: created.handle, status: created.status }),
|
|
113
|
+
`Once it is ready, cast it with \`--avatar ${created.handle}\` on \`baker studio generate\` / \`baker studio animate\` \u2014 that flag is what grounds the render on its identity sheet and, for a clip, what carries their accent and delivery into the read.`
|
|
114
|
+
];
|
|
115
|
+
if (created.likeness === "licensed") {
|
|
116
|
+
hints.push(
|
|
117
|
+
"This avatar carries a real person's likeness, used on the company's confirmation that it may appear in their advertising. Keep it out of any creative that would misrepresent them, and out of claims they did not make."
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return hints;
|
|
121
|
+
}
|
|
122
|
+
function updateHints(update) {
|
|
123
|
+
const hints = [];
|
|
124
|
+
if (update.previousHandle !== update.avatar.handle) {
|
|
125
|
+
hints.push(
|
|
126
|
+
`Renamed to @${update.avatar.handle}. @${update.previousHandle} no longer resolves \u2014 update anything that mentioned it.`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
if (update.regeneratedSheet) {
|
|
130
|
+
hints.push(
|
|
131
|
+
`Rebuilding the identity sheet (~30s). The avatar is back to building and cannot be cast until \`baker avatars get ${update.avatar.handle}\` shows \`ready\` \u2014 and the sheet URL changes, so drop any \`--reference\` you were reusing and read the new one.`
|
|
132
|
+
);
|
|
133
|
+
return hints;
|
|
134
|
+
}
|
|
135
|
+
if (update.subjectChanged) {
|
|
136
|
+
hints.push(
|
|
137
|
+
`MISSING --regenerate-sheet. You changed the subject description but the identity sheet still shows the person you described before, so the words and the face no longer match and every new render will drift. Re-run: \`baker avatars update ${update.avatar.handle} --regenerate-sheet\` (a ~30s rebuild, billed).`
|
|
138
|
+
);
|
|
139
|
+
return hints;
|
|
140
|
+
}
|
|
141
|
+
hints.push(...castingHints(update.avatar));
|
|
142
|
+
return hints;
|
|
143
|
+
}
|
|
144
|
+
function removalHints(removal) {
|
|
145
|
+
if (removal.archived) {
|
|
146
|
+
return [
|
|
147
|
+
`Retired @${removal.handle}. Work that already used it still resolves and its images stay as they are; it no longer shows in \`baker avatars list\` and must not be cast into anything new.`
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
return [
|
|
151
|
+
`Deleted @${removal.handle} for good. The mention no longer resolves anywhere \u2014 creatives that already rendered keep their images, but nothing new can be grounded on this identity. \`--archive\` is the reversible option next time.`
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
function avatarRowNormalizer(record) {
|
|
155
|
+
const flat = {};
|
|
156
|
+
for (const [key, value] of Object.entries(record)) {
|
|
157
|
+
if (Array.isArray(value)) {
|
|
158
|
+
flat[key] = value.join("; ");
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (value !== null && typeof value === "object") {
|
|
162
|
+
for (const [nested, nestedValue] of Object.entries(value)) {
|
|
163
|
+
flat[nested] = Array.isArray(nestedValue) ? nestedValue.join("; ") : nestedValue;
|
|
164
|
+
}
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
flat[key] = value;
|
|
168
|
+
}
|
|
169
|
+
return flat;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/commands/avatars/failures.ts
|
|
173
|
+
function failValidation(message, fix) {
|
|
174
|
+
writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message, ...fix ? { fix } : {} } });
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
function avatarFailureFix(err, handle, context = {}) {
|
|
178
|
+
if (err.code === "NOT_FOUND") {
|
|
179
|
+
return {
|
|
180
|
+
action: "list_avatars",
|
|
181
|
+
explanation: `Run \`baker avatars list\` to see which avatars this company has${handle ? ` \u2014 "${handle}" is not one of them` : ""}. Handles are lowercase letters, numbers and dashes ("maria-founder", not "Maria Founder"). If the roster is empty, create the avatar first with \`baker avatars create\`. Do not abandon the wider job over this \u2014 carry on without the avatar and say so.`
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (err.code === "CONFLICT" && context.operation === "remove") {
|
|
185
|
+
return {
|
|
186
|
+
action: "wait_for_the_user",
|
|
187
|
+
explanation: `Do not remove or recreate${handle ? ` @${handle}` : " this avatar"} \u2014 wait. The portraits are on the user's screen and the turn continues once they answer. If you think the faces are wrong, say so in your reply and let them turn all four down; that recasts the same avatar from what they tell you was missing, and keeps everything already pointing at it.`
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
if (err.code === "CONFLICT" && handle) {
|
|
191
|
+
return {
|
|
192
|
+
action: "use_the_existing_avatar",
|
|
193
|
+
explanation: `@${handle} already exists in this company \u2014 avatars belong to the company, not to a chat, so one made in an earlier conversation is still here and still castable. If it is the person you want, use it as it is: \`--avatar ${handle}\`. Read it first with \`baker avatars get ${handle} --full\` and say who they already are. Do not create the same person under a second name: the user would be told about one avatar and handed another, and the company ends up with duplicates nobody chose a face for. If you genuinely need a different person, ask the user what to call them.`
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
return void 0;
|
|
197
|
+
}
|
|
198
|
+
function failAvatarApi(err, handle, context = {}) {
|
|
199
|
+
if (err instanceof ApiError) {
|
|
200
|
+
const fix = avatarFailureFix(err, handle, context);
|
|
201
|
+
writeJson({ ok: false, error: { code: err.code, message: err.message, ...fix ? { fix } : {} } });
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
if (err instanceof Error) {
|
|
205
|
+
writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: err.message } });
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export {
|
|
213
|
+
castingHints,
|
|
214
|
+
rosterRow,
|
|
215
|
+
chatIdFromEnv,
|
|
216
|
+
rosterHints,
|
|
217
|
+
parseFaceChoice,
|
|
218
|
+
creationHints,
|
|
219
|
+
updateHints,
|
|
220
|
+
removalHints,
|
|
221
|
+
avatarRowNormalizer,
|
|
222
|
+
failValidation,
|
|
223
|
+
failAvatarApi
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=chunk-4X3UR372.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/avatars/casting.ts","../src/commands/avatars/failures.ts"],"sourcesContent":["import type { AvatarLikeness, AvatarStatus, AvatarSummary } from \"@baker/api\";\nimport { optionalChatId } from \"../../env.ts\";\n\n/** What an avatar has to look like before it can be put on screen. */\nexport interface CastingSubject {\n handle: string;\n status: AvatarStatus;\n sheetUrl?: string;\n errorMessage?: string;\n /** Parked on a face the user has not picked. `generating` with nothing rendering. */\n needsFace?: boolean;\n}\n\n// Observed failure, end to end: the agent cast an avatar, gave it a voice, then\n// rendered two clips by PASTING the subject description into the prompt and\n// leaving `--avatar` off. Every hint here used to teach exactly that shape, so\n// the rule now leads with the flag and only then explains the words.\nconst CAST_FLAG_RULE =\n \"Cast with `--avatar <handle>` on `baker studio generate`, `baker studio animate`, `baker canvas scaffold-ad`, `baker canvas scaffold-static-ad` and `baker canvas scaffold-video`. Don't hand-roll it by pasting `subjectDescription` into the prompt or by passing the sheet through `--reference` — both render something that merely resembles them. `--avatar` is also the only thing that carries their accent and delivery into a clip. An avatar has no pinned voice by design (ADR 0005): the video model renders the voice, and the region on their profile is the only thing steering it — without the flag the clip is performed flat, in whatever accent the model picks on its own. `baker canvas scaffold-video` casts only their face: a reproduced video keeps the source ad's accent direction, so never tell the user it speaks in theirs.\";\n\nconst VERBATIM_RULE =\n \"When you do write the description yourself — a hand-built canvas node, a landing image, anywhere `--avatar` does not exist — copy `subjectDescription` verbatim, word for word. Re-phrasing it per generation is the other reason a face drifts across a set.\";\n\n// ByteDance's filter refuses photoreal human faces, AI-generated ones included,\n// so a presenter clip routed to Seedance is a paid refusal every time.\nconst VIDEO_ROUTING =\n \"In video, a photoreal presenter renders on `google/veo-3.1` (or `google/veo-3.1-fast`), never `bytedance/seedance-2.0` — it refuses photoreal human faces, AI-generated ones included. Reproducing a video the user gave you: `baker canvas scaffold-video … --avatar <handle> --real-face`.\";\n\n/**\n * What the agent should do next with this avatar, keyed off its status.\n *\n * The two lines that matter on a ready avatar are the same two things that make\n * a face hold still across a set: ground on the identity sheet, and reuse the\n * subject description word for word.\n */\nexport function castingHints(avatar: CastingSubject): string[] {\n // Before the building hint, and deliberately loud. `generating` normally means a\n // render is running, so every piece of advice below reads as \"come back in a moment\"\n // — and an agent that acts on it here waits out a deadline on work that has not\n // started. Observed end to end: two 90s `--wait` calls against this exact state, then\n // a delete and a recreate with `--face auto`, which took the choice off the user\n // while the four portraits were still on their screen.\n if (avatar.status === \"generating\" && avatar.needsFace) {\n return [\n `The user is picking @${avatar.handle}'s face right now — portraits are on their screen and nothing renders until they answer. There is NOTHING to wait for and nothing to check: do not poll, do not block on it, do not ask about the face in a question of your own, and do not delete or recreate this avatar. Whatever you do next simply runs after they have chosen.`,\n ];\n }\n\n if (avatar.status === \"generating\") {\n return [\n `Still building — a ~30s render that settles on its own, and this avatar is castable only once it reads \\`ready\\`. If the next thing you do needs it (a clip, a still, anything with --avatar), block on it: \\`baker avatars get ${avatar.handle} --wait\\` returns the moment it is ready. Otherwise do other work first and read it back with \\`baker avatars get ${avatar.handle}\\`. Never write your own sleep or poll loop, and never end the turn waiting — the user would have to come back and tell you it is ready.`,\n ];\n }\n\n if (avatar.status === \"error\") {\n return [\n `The identity sheet could not be built${avatar.errorMessage ? `: ${avatar.errorMessage}` : \"\"}. This avatar cannot be cast. Sharpen the subject description (one person, plain description, no scene) and rebuild: \\`baker avatars update ${avatar.handle} --subject \"…\" --regenerate-sheet\\`.`,\n ];\n }\n\n if (avatar.status === \"archived\") {\n return [\n `Retired. Work that already used it still resolves, but do not cast it into anything new — \\`baker avatars list\\` shows the roster you can cast from.`,\n ];\n }\n\n if (!avatar.sheetUrl) {\n return [\n `No identity sheet on this avatar yet, so there is nothing to ground a render on. Re-read it with \\`baker avatars get ${avatar.handle}\\`; if it stays this way, rebuild the sheet with \\`baker avatars update ${avatar.handle} --regenerate-sheet\\`.`,\n ];\n }\n\n return [\n `Ready to cast: \\`baker studio generate \"<your scene>\" --avatar ${avatar.handle}\\` for a still, \\`baker studio animate \"<the motion, and the line they say>\" --avatar ${avatar.handle}\\` for a clip.`,\n CAST_FLAG_RULE,\n VERBATIM_RULE,\n VIDEO_ROUTING,\n ];\n}\n\n/**\n * One line of the roster.\n *\n * `subjectDescription` is deliberately absent: it has to reach a prompt word for\n * word, and a list is exactly where a long description gets skimmed, wrapped, or\n * half-copied. `baker avatars get <handle>` is the one place it is read.\n */\nexport function rosterRow(avatar: AvatarSummary): Record<string, unknown> {\n return {\n handle: avatar.handle,\n name: avatar.name,\n status: avatar.status,\n likeness: avatar.likeness,\n sheetUrl: avatar.sheetUrl ?? null,\n avatarId: avatar.avatarId,\n ...(avatar.errorMessage ? { errorMessage: avatar.errorMessage } : {}),\n };\n}\n\n/** Next steps after reading the roster. */\n/**\n * The chat this command is running inside, when it is running inside one.\n *\n * Attribution is best-effort: a direct caller outside a chat still works, it just isn't\n * tied to a Session. Shared with the roster, which uses it to say which avatar the\n * current conversation is about.\n */\nexport function chatIdFromEnv(): string | undefined {\n return optionalChatId();\n}\n\nexport function rosterHints(\n roster: ReadonlyArray<{ handle: string; status: AvatarStatus; fromThisChat?: boolean }>,\n statusFilter: string | undefined,\n): string[] {\n if (roster.length === 0) {\n return [\n statusFilter\n ? `No avatars with status \"${statusFilter}\". Drop \\`--status\\` to see the whole roster.`\n : `No avatars yet — and retired ones are hidden unless you pass \\`--status archived\\`. Cast a new presenter with \\`baker avatars create --name \"…\" --subject \"…\"\\`.`,\n ];\n }\n\n // Leads the list, because the roster is the moment the agent picks who to use and the\n // rest of it is noise at that moment. Observed: the user had just chosen a face for an\n // avatar in this conversation, and the agent came back offering two from earlier chats\n // and asking which one to use — a question they had already answered by picking.\n const mine = roster.filter((avatar) => avatar.fromThisChat).map((avatar) => avatar.handle);\n const hints = mine.length\n ? [\n `@${mine[0]} was made in this conversation${\n mine.length > 1\n ? ` (with ${mine\n .slice(1)\n .map((h) => `@${h}`)\n .join(\", \")})`\n : \"\"\n } — that is the avatar this chat is about, and the user chose its face. Use it. The others belong to earlier conversations: only reach for one if the user names it, and never ask which to use when the answer is the one you just cast.`,\n ]\n : [];\n // Says what `CAST_FLAG_RULE` says, because this is the hint read at the moment the\n // agent picks who to use. It used to hand back \"the identity sheet URL for\n // `--reference`\" — the exact hand-rolled shape that rule bans — and an agent that\n // lists the roster and then casts never reads the rule itself.\n hints.push(\n \"Casting one of these? Cast them with `--avatar <handle>` on `baker studio generate` / `baker studio animate` — that flag carries their face AND their accent. `baker avatars get <handle>` returns the written profile behind it; the roster leaves the description out on purpose, because it must never be read half-way.\",\n );\n const building = roster.filter((avatar) => avatar.status === \"generating\").map((avatar) => avatar.handle);\n if (building.length > 0) {\n hints.push(\n `Still building, not castable yet: ${building.join(\", \")}. Check with \\`baker avatars get ${building[0]}\\` after your next piece of work.`,\n );\n }\n const failed = roster.filter((avatar) => avatar.status === \"error\").map((avatar) => avatar.handle);\n if (failed.length > 0) {\n hints.push(\n `Could not be built: ${failed.join(\", \")}. Read why with \\`baker avatars get ${failed[0]}\\`, then rebuild with \\`baker avatars update ${failed[0]} --subject \"…\" --regenerate-sheet\\`.`,\n );\n }\n return hints;\n}\n\n/** The parts of a profile that describe a PERFORMANCE rather than a photograph. */\nexport interface AvatarPerformanceProfile {\n persona?: string;\n speech?: string;\n accent?: string;\n motion?: string;\n wardrobe?: string;\n setting?: string;\n}\n\n/**\n * Warn when an avatar was cast on a bare description.\n *\n * A subject description alone is enough to keep a FACE consistent and nothing\n * else, so every clip built on it comes back stiff and generic — the fields that\n * tell a video model how this person moves, dresses and stands are simply absent\n * from the render.\n *\n * Measured on one avatar, same sheet, same 5s brief, inter-frame motion averaged\n * over the clip: a bare profile with a flat prompt scored 1.28; adding a real\n * motion brief took it to 3.28; filling `motion`/`persona`/`speech`/`wardrobe`/\n * `setting` as well reached 4.91 — 3.8x the movement, for text that costs\n * nothing. The prompt is the bigger lever of the two, but the profile is the one\n * that keeps paying out on every future clip instead of just this one.\n */\nexport function thinProfileHint(profile: AvatarPerformanceProfile | undefined, handle: string): string | null {\n const missing = ([\"motion\", \"persona\", \"speech\", \"accent\", \"wardrobe\", \"setting\"] as const).filter(\n (field) => !profile?.[field]?.trim(),\n );\n if (missing.length === 0) return null;\n return `MISSING ${missing.map((field) => `--${field}`).join(\" \")}. A bare subject description holds the face still and nothing else, so clips of @${handle} come out stiff and generic — measured, filling these in nearly doubled the movement in the same brief. --accent is the one nobody guesses and the only one that fails silently: it decides the LANGUAGE and accent the avatar speaks in, in every clip. Name the region whose language the USER is writing to you in (\"Spanish from Spain, Madrid accent\") — \"Spanish\" on its own renders as no accent at all, and a region taken from how the person LOOKS (\"European\", \"Nordic\") renders as that region's language: an ad for a Spanish client shipped with --accent \"German\" and came back spoken in German. The user almost certainly told you how this person talks and carries themselves; put it in: \\`baker avatars update ${handle} ${missing.map((field) => `--${field} \"…\"`).join(\" \")}\\`.`;\n}\n\n/**\n * Who picks the avatar's face.\n *\n * `ask` blocks on the user; `auto` lets the build cast one and keep it. Both are real\n * modes, not a default and a fallback: a scheduled agent rendering overnight has nobody to ask,\n * and blocking there would park the run until it times out.\n */\nexport type FaceChoice = \"ask\" | \"auto\";\n\n/**\n * Read `--face`. Null for a value this does not know.\n *\n * Defaulting to `ask` rather than `auto` is the deliberate half: an unasked face is\n * silent — the avatar comes back ready and looks finished, and nothing about it says the\n * user was skipped. A blocked turn is loud, and a person who is there can answer it.\n */\nexport function parseFaceChoice(raw: string | undefined): FaceChoice | null {\n if (raw === undefined) return \"ask\";\n const value = raw.trim().toLowerCase();\n if (value === \"ask\" || value === \"auto\") return value;\n return null;\n}\n\n/** Next steps straight after casting a new avatar — it is never ready yet. */\nexport function creationHints(\n created: { handle: string; status: AvatarStatus; likeness: AvatarLikeness; faceChoice?: FaceChoice },\n profile?: AvatarPerformanceProfile,\n): string[] {\n const thin = thinProfileHint(profile, created.handle);\n // First, ahead of everything — including \"still building, come back later\", which is\n // true and is also the hint an agent acts on. Left to that one it goes off and does\n // other work, and when it does want the user to choose a face it invents a question of\n // its own: four text options, no portraits, a choice nobody can actually make. The\n // sheet this avatar is building right now is fused from a face nobody has seen.\n const casting =\n created.likeness === \"synthetic\" && created.faceChoice === \"auto\"\n ? [\n `No one was asked about this face — \\`--face auto\\` cast it and it is kept. Do not tell the user they chose it, and do not offer them a pick you are not going to run. If this should have been theirs, say so and create it again with \\`--face ask\\`.`,\n ]\n : created.likeness === \"synthetic\"\n ? [\n `The user is being shown real portraits of @${created.handle} right now, and the turn waits for them to pick — this happens on its own, triggered by the command you just ran. The picker is already showing, so don't call request_avatar_casting, don't ask about the face in a question of your own, and don't wait or poll: whatever you do next simply runs after they have chosen — or, if they have not picked within 30 seconds of the faces appearing, after the first face is kept for them (then never say they chose it). Say what you created, then carry on with what the user asked for: when that was only the avatar, or they said to stop after it, stop there and render nothing.`,\n ]\n : [];\n const hints = [\n ...casting,\n ...(thin ? [thin] : []),\n ...castingHints({ handle: created.handle, status: created.status }),\n `Once it is ready, cast it with \\`--avatar ${created.handle}\\` on \\`baker studio generate\\` / \\`baker studio animate\\` — that flag is what grounds the render on its identity sheet and, for a clip, what carries their accent and delivery into the read.`,\n ];\n if (created.likeness === \"licensed\") {\n hints.push(\n \"This avatar carries a real person's likeness, used on the company's confirmation that it may appear in their advertising. Keep it out of any creative that would misrepresent them, and out of claims they did not make.\",\n );\n }\n return hints;\n}\n\n/** Next steps after an edit — mostly about keeping sheet and description in sync. */\nexport function updateHints(update: {\n avatar: CastingSubject;\n subjectChanged: boolean;\n regeneratedSheet: boolean;\n previousHandle: string;\n}): string[] {\n const hints: string[] = [];\n if (update.previousHandle !== update.avatar.handle) {\n hints.push(\n `Renamed to @${update.avatar.handle}. @${update.previousHandle} no longer resolves — update anything that mentioned it.`,\n );\n }\n\n if (update.regeneratedSheet) {\n hints.push(\n `Rebuilding the identity sheet (~30s). The avatar is back to building and cannot be cast until \\`baker avatars get ${update.avatar.handle}\\` shows \\`ready\\` — and the sheet URL changes, so drop any \\`--reference\\` you were reusing and read the new one.`,\n );\n return hints;\n }\n\n if (update.subjectChanged) {\n hints.push(\n `MISSING --regenerate-sheet. You changed the subject description but the identity sheet still shows the person you described before, so the words and the face no longer match and every new render will drift. Re-run: \\`baker avatars update ${update.avatar.handle} --regenerate-sheet\\` (a ~30s rebuild, billed).`,\n );\n return hints;\n }\n\n hints.push(...castingHints(update.avatar));\n return hints;\n}\n\n/** Next steps after retiring or deleting an avatar. */\nexport function removalHints(removal: { handle: string; archived: boolean }): string[] {\n if (removal.archived) {\n return [\n `Retired @${removal.handle}. Work that already used it still resolves and its images stay as they are; it no longer shows in \\`baker avatars list\\` and must not be cast into anything new.`,\n ];\n }\n return [\n `Deleted @${removal.handle} for good. The mention no longer resolves anywhere — creatives that already rendered keep their images, but nothing new can be grounded on this identity. \\`--archive\\` is the reversible option next time.`,\n ];\n}\n\n/**\n * Flatten one avatar for `--output md|files`, which can only print scalars.\n * JSON output is untouched — it already carries the shape the API returned.\n */\nexport function avatarRowNormalizer(record: Record<string, unknown>): Record<string, unknown> {\n const flat: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n if (Array.isArray(value)) {\n flat[key] = value.join(\"; \");\n continue;\n }\n if (value !== null && typeof value === \"object\") {\n for (const [nested, nestedValue] of Object.entries(value as Record<string, unknown>)) {\n flat[nested] = Array.isArray(nestedValue) ? nestedValue.join(\"; \") : nestedValue;\n }\n continue;\n }\n flat[key] = value;\n }\n return flat;\n}\n","import { ApiError } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\n\ntype Remediation = { action: string; explanation: string } & Record<string, unknown>;\n\nexport function failValidation(message: string, fix?: Remediation): never {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message, ...(fix ? { fix } : {}) } });\n process.exit(1);\n}\n\n/**\n * The remedy for a failed avatar call, when there is one.\n *\n * An unknown handle and a taken one are the two failures the agent can act on, and each\n * has exactly one right move — which is the point: left with a bare message it invents a\n * third. A taken handle became a silent rename (\"Elena\" already existed from an earlier\n * chat, so it created \"Marta\"), which left the user reading about one avatar and looking\n * at another.\n */\n/** Which call failed. A CONFLICT means two different things on create and on remove. */\nexport interface AvatarFailureContext {\n operation?: \"remove\";\n}\n\nexport function avatarFailureFix(\n err: ApiError,\n handle?: string,\n context: AvatarFailureContext = {},\n): Remediation | undefined {\n if (err.code === \"NOT_FOUND\") {\n return {\n action: \"list_avatars\",\n explanation: `Run \\`baker avatars list\\` to see which avatars this company has${handle ? ` — \"${handle}\" is not one of them` : \"\"}. Handles are lowercase letters, numbers and dashes (\"maria-founder\", not \"Maria Founder\"). If the roster is empty, create the avatar first with \\`baker avatars create\\`. Do not abandon the wider job over this — carry on without the avatar and say so.`,\n };\n }\n // A removal is refused for one reason only: the user is choosing this avatar's face.\n // Falling through to the handle-collision remedy below answered that with \"use the\n // existing avatar\", which is both wrong and an invitation to go find another one.\n if (err.code === \"CONFLICT\" && context.operation === \"remove\") {\n return {\n action: \"wait_for_the_user\",\n explanation: `Do not remove or recreate${handle ? ` @${handle}` : \" this avatar\"} — wait. The portraits are on the user's screen and the turn continues once they answer. If you think the faces are wrong, say so in your reply and let them turn all four down; that recasts the same avatar from what they tell you was missing, and keeps everything already pointing at it.`,\n };\n }\n if (err.code === \"CONFLICT\" && handle) {\n return {\n action: \"use_the_existing_avatar\",\n explanation: `@${handle} already exists in this company — avatars belong to the company, not to a chat, so one made in an earlier conversation is still here and still castable. If it is the person you want, use it as it is: \\`--avatar ${handle}\\`. Read it first with \\`baker avatars get ${handle} --full\\` and say who they already are. Do not create the same person under a second name: the user would be told about one avatar and handed another, and the company ends up with duplicates nobody chose a face for. If you genuinely need a different person, ask the user what to call them.`,\n };\n }\n return undefined;\n}\n\n/**\n * Report a failed avatar call.\n */\nexport function failAvatarApi(err: unknown, handle?: string, context: AvatarFailureContext = {}): never {\n if (err instanceof ApiError) {\n const fix = avatarFailureFix(err, handle, context);\n writeJson({ ok: false, error: { code: err.code, message: err.message, ...(fix ? { fix } : {}) } });\n process.exit(1);\n }\n if (err instanceof Error) {\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n"],"mappings":"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","names":[]}
|