@koda-sl/baker-cli 0.447.0 → 0.448.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/{account-2ZMZFPIU.js → account-AL2ZDSR7.js} +4 -4
- package/dist/{accounts-VINHZRWA.js → accounts-HAFCLSR5.js} +3 -3
- package/dist/{accounts-RHGN5WMU.js → accounts-O5MFO3QQ.js} +5 -5
- package/dist/{actions-5F4ZP6M4.js → actions-P35MEMGN.js} +18 -18
- package/dist/{add-OGH4DZZ5.js → add-5GAN6CVO.js} +3 -3
- package/dist/{add-KBPMSK2P.js → add-6DTC6X5G.js} +2 -2
- package/dist/{ads-H7GH7A26.js → ads-6UEDYT3O.js} +9 -9
- package/dist/{ads-56OWZBXZ.js → ads-C47NA2HH.js} +5 -5
- package/dist/{adsets-H7QT42U6.js → adsets-Q5DWGANV.js} +11 -11
- package/dist/{advertisers-PM4WPG4N.js → advertisers-AE75CGVE.js} +3 -3
- package/dist/{analytics-JVZKN735.js → analytics-FKCXIMPO.js} +6 -6
- package/dist/{analytics-5FALU2GL.js → analytics-FPWQQGRM.js} +3 -3
- package/dist/{assign-KLYZ6USE.js → assign-ABN2AQ4J.js} +3 -3
- package/dist/{audience-size-JHB42DB4.js → audience-size-GNBJY35X.js} +3 -3
- package/dist/{audiences-JACGRBNN.js → audiences-AMRFZRZ7.js} +3 -3
- package/dist/{audit-5XH7WZIM.js → audit-3VS63TBW.js} +3 -3
- package/dist/{autocomplete-7F3PZLEY.js → autocomplete-VS3XG3B7.js} +3 -3
- package/dist/{avatars-N4SRNQI7.js → avatars-EKCKHCC3.js} +4 -4
- package/dist/{bid-pricing-VYLVGU26.js → bid-pricing-Q72B65AY.js} +3 -3
- package/dist/{brand-ASBS2HZM.js → brand-C6PFGGQN.js} +2 -2
- package/dist/{brief-JSZKDPGU.js → brief-UO52ZHFI.js} +13 -13
- package/dist/{campaign-groups-ATE2DE4V.js → campaign-groups-KFFYQPU3.js} +8 -8
- package/dist/{campaign-writes-ETT57KLQ.js → campaign-writes-FHOS5XZY.js} +3 -3
- package/dist/{campaigns-J6VZBIV6.js → campaigns-2NHWBF5C.js} +11 -11
- package/dist/{campaigns-WBEG5QA4.js → campaigns-D6B6Z67Y.js} +8 -8
- package/dist/{campaigns-FGBAS6AZ.js → campaigns-KZYZTXDS.js} +5 -5
- package/dist/{canvas-K7IN7HLO.js → canvas-KTALW6HY.js} +14 -14
- package/dist/{capabilities-RDAERPYY.js → capabilities-DJFTRJKS.js} +3 -3
- package/dist/{catalog-MENVHL5U.js → catalog-Y3XADCSY.js} +4 -4
- package/dist/{chats-YIAQGQ3X.js → chats-D2CSDX5Q.js} +3 -3
- package/dist/{chunk-U3HAMW5W.js → chunk-2BKVVCCV.js} +3 -3
- package/dist/{chunk-BA7FDXQC.js → chunk-3G3ZDLMI.js} +2 -2
- package/dist/{chunk-E4MDJBLO.js → chunk-3HJLHTWP.js} +2 -2
- package/dist/{chunk-G7UTTEBS.js → chunk-3IBYKLXR.js} +3 -3
- package/dist/{chunk-VAISMQQB.js → chunk-4AUMTNVB.js} +4 -4
- package/dist/{chunk-T3BDNJIX.js → chunk-4BQXAE7Z.js} +2 -2
- package/dist/{chunk-VMDAXFRI.js → chunk-4D7UBVSG.js} +3 -3
- package/dist/{chunk-U6SYRIOB.js → chunk-4QEY2L6U.js} +2 -2
- package/dist/{chunk-KNWHUMVZ.js → chunk-5QGMMZFQ.js} +4 -2
- package/dist/{chunk-UC6BWM5J.js → chunk-5ZDLTE5T.js} +3 -3
- package/dist/{chunk-ANCSKUWI.js → chunk-7YCRFMXF.js} +2 -2
- package/dist/{chunk-I4NEHDSD.js → chunk-7ZHMGXE2.js} +15 -9
- package/dist/{chunk-I4NEHDSD.js.map → chunk-7ZHMGXE2.js.map} +1 -1
- package/dist/{chunk-VDHQJ6HD.js → chunk-A4LOJ2VD.js} +2 -2
- package/dist/{chunk-DKGTQSLR.js → chunk-AEOSAVVL.js} +2 -2
- package/dist/{chunk-GATKK4RJ.js → chunk-BAVBLIAD.js} +3 -3
- package/dist/{chunk-5R5ADJ47.js → chunk-BY6M3TE5.js} +314 -47
- package/dist/chunk-BY6M3TE5.js.map +1 -0
- package/dist/{chunk-6DB2B3GF.js → chunk-CSYSX4D2.js} +2 -2
- package/dist/{chunk-IM52NHGL.js → chunk-DWHIOO7E.js} +5 -5
- package/dist/{chunk-HIPDMQZ6.js → chunk-DZSIUEGH.js} +2 -2
- package/dist/{chunk-65RIB7A6.js → chunk-HBTF25YG.js} +4 -4
- package/dist/{chunk-OTFHEHIU.js → chunk-HRYOZUSK.js} +9 -4
- package/dist/chunk-HRYOZUSK.js.map +1 -0
- package/dist/{chunk-2GK33EJV.js → chunk-IR6D7K4H.js} +2 -2
- package/dist/{chunk-KBP7WJQB.js → chunk-J4LSFZCF.js} +71 -8
- package/dist/chunk-J4LSFZCF.js.map +1 -0
- package/dist/{chunk-YBP7O5P4.js → chunk-JQJDXPCO.js} +2 -2
- package/dist/{chunk-ACANMASG.js → chunk-JWI6GIFJ.js} +3 -3
- package/dist/{chunk-MADAAZZV.js → chunk-KHRXPQID.js} +2 -2
- package/dist/{chunk-FXED3VZK.js → chunk-L27H2R2N.js} +2 -2
- package/dist/{chunk-TIOQ7ZFQ.js → chunk-LLOOWRBB.js} +2 -2
- package/dist/{chunk-AWMFUGVX.js → chunk-LYBXCXJB.js} +2 -2
- package/dist/{chunk-7SDFKGQ4.js → chunk-MXYBTMKB.js} +2 -2
- package/dist/{chunk-SB3GZFCV.js → chunk-NPY4QUMQ.js} +2 -2
- package/dist/{chunk-LW4VSTL5.js → chunk-OJ5R2OFK.js} +4 -4
- package/dist/chunk-OJ5R2OFK.js.map +1 -0
- package/dist/{chunk-3CWL2LY4.js → chunk-OZRUJVIQ.js} +2 -2
- package/dist/{chunk-JF47LEPU.js → chunk-PN4WWIHS.js} +30 -4
- package/dist/chunk-PN4WWIHS.js.map +1 -0
- package/dist/{chunk-YPZYOJP6.js → chunk-Q43MLYXE.js} +13 -10
- package/dist/chunk-Q43MLYXE.js.map +1 -0
- package/dist/{chunk-EH4C4CZK.js → chunk-QRP3PXWN.js} +2 -2
- package/dist/{chunk-YC2TQ3VC.js → chunk-S77PZVYM.js} +3 -3
- package/dist/{chunk-HZ5DR5MX.js → chunk-SHL7LOC3.js} +3 -3
- package/dist/{chunk-GIJT3A5U.js → chunk-T4DD5YMP.js} +3 -3
- package/dist/{chunk-ALTBBAYU.js → chunk-TD2CL5FE.js} +3 -3
- package/dist/{chunk-ZPU3WDVK.js → chunk-UQ4QIV56.js} +5 -5
- package/dist/{chunk-XMD4SHFI.js → chunk-W4VS475D.js} +2 -2
- package/dist/{chunk-K3PN7TN5.js → chunk-WTOYCUKH.js} +2 -2
- package/dist/{chunk-NDXBU22S.js → chunk-XF4JUKVF.js} +11 -5
- package/dist/{chunk-NDXBU22S.js.map → chunk-XF4JUKVF.js.map} +1 -1
- package/dist/{chunk-DR34ZTWD.js → chunk-Y5YBNAIS.js} +6 -6
- package/dist/{chunk-PDTB5EX6.js → chunk-Y6O7EWYY.js} +2 -2
- package/dist/{chunk-BSC33FLJ.js → chunk-YRQYA2LR.js} +2 -2
- package/dist/{chunk-4NBVGARW.js → chunk-ZEYEWPK6.js} +2 -2
- package/dist/{chunk-MLU6STIN.js → chunk-ZZQXVYUY.js} +2 -2
- package/dist/{claim-V4F5GZJK.js → claim-FZ5OQLMU.js} +3 -3
- package/dist/cli.js +27 -27
- package/dist/{companies-NJGJ7XNN.js → companies-DNI634RC.js} +3 -3
- package/dist/{complete-MGNF5OAK.js → complete-2FZMGJV5.js} +3 -3
- package/dist/{connect-PJOTRTT4.js → connect-QCOGEPP4.js} +6 -6
- package/dist/{conversation-4DM26FRD.js → conversation-6IOGV7B7.js} +3 -3
- package/dist/{conversion-upload-command-TZTHU2CD.js → conversion-upload-command-AUF3LNTH.js} +6 -6
- package/dist/{conversions-JGECVZSY.js → conversions-4SRZPBBX.js} +7 -7
- package/dist/{create-DSGQFBI7.js → create-BJNMO6HT.js} +2 -2
- package/dist/{create-I2KVDTCQ.js → create-FX4OJ2XF.js} +3 -3
- package/dist/{create-SBQWVLXG.js → create-RM7HV77Y.js} +3 -3
- package/dist/{create-WOHPIGBK.js → create-VXM34ZWH.js} +6 -6
- package/dist/{creatives-DWO5KEQC.js → creatives-AG6FCCHY.js} +10 -10
- package/dist/{creatives-4JGVZQGC.js → creatives-JSWBFQ5R.js} +8 -8
- package/dist/{creatives-PSWCNY7U.js → creatives-UEPLNCPN.js} +3 -3
- package/dist/{credentials-UULYCN2L.js → credentials-VOZTILFO.js} +3 -3
- package/dist/{critique-NGMZK5LX.js → critique-D74VSOGJ.js} +10 -10
- package/dist/{critique-TIZJ5GFM.js → critique-ZS4ON3SU.js} +6 -6
- package/dist/{crm-2WAR565U.js → crm-52ROSWH5.js} +4 -4
- package/dist/{crm-VDXUO2YU.js → crm-R5IXIFIV.js} +7 -7
- package/dist/{custom-conversions-6P555U2K.js → custom-conversions-2VLJGPRV.js} +2 -2
- package/dist/{customers-ATENMXDO.js → customers-4AWBFDUF.js} +8 -8
- package/dist/{delete-H744GNS4.js → delete-AIGE4Y4H.js} +3 -3
- package/dist/{delete-AVMZYNVT.js → delete-HGHXY24R.js} +3 -3
- package/dist/{delete-OEYPFATY.js → delete-M2GDLPYN.js} +2 -2
- package/dist/{demographics-M5LJF3RZ.js → demographics-NTWB2IMG.js} +3 -3
- package/dist/{discard-72I6SM7G.js → discard-2WWQG6OU.js} +3 -3
- package/dist/{domain-R4EIZD2W.js → domain-Y2LT6JLT.js} +3 -3
- package/dist/{draft-BV2QRPZ4.js → draft-5YAYCEYY.js} +6 -6
- package/dist/{draft-YYYRWF7M.js → draft-EJXNNJ3Y.js} +8 -8
- package/dist/{draft-BBFJNZ5X.js → draft-FJ7WHIXW.js} +3 -3
- package/dist/{draft-34C3F5U4.js → draft-SLHAKJ2A.js} +3 -3
- package/dist/engine/index.d.ts +12 -0
- package/dist/engine/index.js +3 -3
- package/dist/{facets-F2H52MS4.js → facets-U7AQC4H6.js} +3 -3
- package/dist/{feedback-IQKKT4MC.js → feedback-FFF3KELE.js} +2 -2
- package/dist/{feedback-record-UZV4Y7UD.js → feedback-record-DTCSUXRO.js} +12 -12
- package/dist/{fetch-ZUAZPLAE.js → fetch-W7NULDEO.js} +3 -3
- package/dist/{fit-2CA4JH7N.js → fit-PXZSHQRM.js} +5 -5
- package/dist/{flows-CWXCXEUD.js → flows-KABCBS3S.js} +10 -10
- package/dist/{fonts-F2XUCIIW.js → fonts-EMMX3KII.js} +8 -8
- package/dist/{forecast-IDKJYM2B.js → forecast-GNODEIIC.js} +3 -3
- package/dist/{funnel-RLGQGYKO.js → funnel-AAX27NH4.js} +4 -4
- package/dist/{get-C6UQ22HH.js → get-QEYJRLV3.js} +3 -3
- package/dist/{get-EEUR6SAW.js → get-RTVUZM6E.js} +3 -3
- package/dist/{google-35GDU3G3.js → google-M7KEXVK5.js} +8 -8
- package/dist/{google-ads-Q37I2D5P.js → google-ads-OK6IG3UV.js} +3 -3
- package/dist/{history-4II5QA4B.js → history-PQUJKK26.js} +3 -3
- package/dist/{hubspot-TTITJFBO.js → hubspot-Y77VLY6Y.js} +7 -7
- package/dist/{ideas-V4Q6JDKV.js → ideas-MIDU7YOA.js} +7 -7
- package/dist/{images-SP5REF6E.js → images-S254MS6O.js} +4 -4
- package/dist/{ingest-574GIFAR.js → ingest-J4I3HKM3.js} +2 -2
- package/dist/{ingest-IC4T76W6.js → ingest-YV2NLDBE.js} +3 -3
- package/dist/{inspect-ATHYY6A2.js → inspect-Q5NHBBHX.js} +5 -5
- package/dist/{keyword-metrics-J4UPUDN7.js → keyword-metrics-PDY4ZXSP.js} +3 -3
- package/dist/{keywords-for-site-MWADFEO2.js → keywords-for-site-GALSCV77.js} +3 -3
- package/dist/{landing-R6DN7XLK.js → landing-CJYGWCK4.js} +2 -2
- package/dist/{leads-7EVHMNUF.js → leads-ARUWPHBM.js} +6 -6
- package/dist/{leads-JM6HUERX.js → leads-PHKG6CP3.js} +3 -3
- package/dist/{learn-LGS2F5TR.js → learn-3VO6DXUX.js} +9 -9
- package/dist/{line-item-writes-KUYEXSIH.js → line-item-writes-E6MZPIZZ.js} +3 -3
- package/dist/{line-items-GIWLP3FL.js → line-items-7ZGIKEF2.js} +5 -5
- package/dist/{link-PVM7XJQI.js → link-QYAW6A2W.js} +3 -3
- package/dist/{linkedin-WX54EAX6.js → linkedin-FFSDSGGS.js} +30 -30
- package/dist/{list-MCEFXC6L.js → list-5IC6KIKO.js} +3 -3
- package/dist/{list-4ZKQZBCL.js → list-NVQC5SNY.js} +2 -2
- package/dist/{list-WR7QYTON.js → list-SAV3LQHY.js} +3 -3
- package/dist/{log-U6IWZGOF.js → log-XZPVOALD.js} +3 -3
- package/dist/{make-RXFHEGUI.js → make-NHZAHTV4.js} +19 -19
- package/dist/{map-TWL7T4KP.js → map-4J5WIWIG.js} +4 -4
- package/dist/{mcp-HVAVJGGS.js → mcp-XXD7ZQCP.js} +2 -2
- package/dist/{media-M7E6V2XU.js → media-53DJRC4N.js} +2 -2
- package/dist/{media-sources-JWGO23BZ.js → media-sources-O6ZRUA3N.js} +2 -2
- package/dist/{members-5FAW4YE7.js → members-D5ZYLS4Y.js} +3 -3
- package/dist/{meta-EZ4SY25M.js → meta-A7KM6TF5.js} +10 -10
- package/dist/{normalize-GW4GZNVY.js → normalize-PCNC6E2N.js} +3 -3
- package/dist/{options-NSUCENLU.js → options-MQ65VEVD.js} +6 -6
- package/dist/{performance-FGCDWHMC.js → performance-6QW2KEEQ.js} +4 -4
- package/dist/{promoted-tweet-writes-BPWTDESL.js → promoted-tweet-writes-JPLHY3GM.js} +3 -3
- package/dist/{promoted-tweets-OS3NHYVE.js → promoted-tweets-SURKMHFI.js} +3 -3
- package/dist/{publish-SXZEWBVJ.js → publish-HCQ6MXLB.js} +5 -5
- package/dist/{reddit-TF6K37SB.js → reddit-GIP3ADMS.js} +4 -4
- package/dist/{refresh-APVDWXRZ.js → refresh-UXQSLCR3.js} +2 -2
- package/dist/{release-32SEJU4L.js → release-5KVLXNP6.js} +3 -3
- package/dist/{remove-U64GTHLQ.js → remove-6FIVKCJI.js} +2 -2
- package/dist/{reopen-5VS233SF.js → reopen-YM5LNOLB.js} +3 -3
- package/dist/{rerun-7Z45QOOO.js → rerun-NTDXIB4E.js} +19 -19
- package/dist/{research-O7CJV5IS.js → research-EY7C7JJY.js} +10 -10
- package/dist/{research-QYSQ6LW4.js → research-YOGE7GT2.js} +2 -2
- package/dist/{reset-22FC7BXQ.js → reset-C4UHQ3EU.js} +2 -2
- package/dist/{reset-47B5VPT4.js → reset-OLVB6AE6.js} +2 -2
- package/dist/{resolve-7KQGVTQT.js → resolve-XYH2GDAE.js} +3 -3
- package/dist/{retry-J5UVLS72.js → retry-726GKI6V.js} +2 -2
- package/dist/{retry-UJ5UF4BM.js → retry-7EELDEQP.js} +2 -2
- package/dist/{run-TFLFBQU2.js → run-MZ7JLI75.js} +19 -19
- package/dist/{run-SI4FA32F.js → run-P4KR2MXC.js} +3 -3
- package/dist/{scaffold-ad-SEXNE2K6.js → scaffold-ad-M5CWSLZ4.js} +16 -16
- package/dist/{scaffold-static-ad-VBOL6CLN.js → scaffold-static-ad-QW3JWMXA.js} +23 -23
- package/dist/{scaffold-video-Z37MIBDI.js → scaffold-video-EVRMU6WP.js} +15 -15
- package/dist/{schedule-52ZM4KRQ.js → schedule-RDK4GEPI.js} +2 -2
- package/dist/{scheduled-agents-PCWCQAKP.js → scheduled-agents-6U44QE76.js} +11 -11
- package/dist/{schema-FY6ORDXZ.js → schema-CHJDC7GQ.js} +4 -4
- package/dist/{search-NS7XNRZC.js → search-PMJRU3C4.js} +2 -2
- package/dist/{select-4XCYVV2G.js → select-VYPVEO5J.js} +12 -12
- package/dist/{set-prompt-TRJBYA3D.js → set-prompt-VH3S47Z7.js} +11 -11
- package/dist/{setup-links-V3URI7DL.js → setup-links-REPREN3C.js} +3 -3
- package/dist/{site-WIQ7SSU3.js → site-WFSWIA3S.js} +4 -4
- package/dist/{sources-DWJXOLEH.js → sources-AMI2AWKZ.js} +6 -6
- package/dist/{sources-L453U5MT.js → sources-YBQ6KPFM.js} +6 -6
- package/dist/{stale-6OVG6VME.js → stale-LTRROC3C.js} +11 -11
- package/dist/{status-WXWU54WR.js → status-7F2KHFGA.js} +3 -3
- package/dist/{sync-CDZUTGV3.js → sync-GWTLKZTU.js} +2 -2
- package/dist/{sync-definition-BAJQUBE3.js → sync-definition-TQDIRIR5.js} +14 -14
- package/dist/{tags-SG3NVC3J.js → tags-3WPW6PTV.js} +4 -4
- package/dist/{tags-WR6PDIDR.js → tags-6342FQEB.js} +3 -3
- package/dist/{tags-6RY23XOG.js → tags-ABHSX6M5.js} +3 -3
- package/dist/{tags-VN5HTL35.js → tags-FJIBBBRG.js} +3 -3
- package/dist/{tags-BHFQWNPL.js → tags-KFYLZLB3.js} +2 -2
- package/dist/{targeting-criteria-5EXP2NXF.js → targeting-criteria-NR47AF5C.js} +3 -3
- package/dist/{targets-WUVEJPSD.js → targets-L56KOVQE.js} +3 -3
- package/dist/{templates-LOJQX2NG.js → templates-B6XGDYUF.js} +3 -3
- package/dist/{testimonials-6M5DXORT.js → testimonials-CVC4YIXO.js} +6 -6
- package/dist/{top-companies-E2OMMPSV.js → top-companies-45X3DT7Z.js} +3 -3
- package/dist/{translate-AW4CUKDA.js → translate-IHRONQW3.js} +17 -17
- package/dist/{triggers-MRXIDCSN.js → triggers-22EMIVFD.js} +3 -3
- package/dist/{unlink-HNL747YM.js → unlink-65KUN6ID.js} +3 -3
- package/dist/{unstage-OL2JDCLK.js → unstage-2E3I5SWF.js} +3 -3
- package/dist/{update-YNNRX5B2.js → update-2S7CSEAW.js} +3 -3
- package/dist/{update-JPBUF7M2.js → update-7NCOTAQZ.js} +3 -3
- package/dist/{update-RTTC3SAK.js → update-D6DJC6T7.js} +2 -2
- package/dist/{update-4KGIT4BF.js → update-KREBPGBH.js} +3 -3
- package/dist/{upload-UIXPCSXJ.js → upload-O6NHRPS7.js} +3 -3
- package/dist/{url-params-K47CE7Y5.js → url-params-3EFGVTZZ.js} +3 -3
- package/dist/{validate-TD2BY4VE.js → validate-5MDFJ76K.js} +12 -12
- package/dist/{videos-BP3BKNTY.js → videos-YSXYGTBM.js} +5 -5
- package/dist/{viewer-check-HFRUJ4ZU.js → viewer-check-45T2HLAH.js} +5 -5
- package/dist/{web-RPSGFN4U.js → web-IGIGVEKS.js} +3 -3
- package/dist/{winning-ads-WUENRDVJ.js → winning-ads-BXRQ7SBY.js} +3 -3
- package/dist/{write-commands-4WARNR2T.js → write-commands-5C7FUOVN.js} +8 -8
- package/dist/{write-commands-TAYGTJEZ.js → write-commands-CT74VHH6.js} +6 -6
- package/dist/{x-VZCELH3P.js → x-BFSKFCZD.js} +6 -6
- package/package.json +1 -1
- package/dist/chunk-5R5ADJ47.js.map +0 -1
- package/dist/chunk-JF47LEPU.js.map +0 -1
- package/dist/chunk-KBP7WJQB.js.map +0 -1
- package/dist/chunk-LW4VSTL5.js.map +0 -1
- package/dist/chunk-OTFHEHIU.js.map +0 -1
- package/dist/chunk-YPZYOJP6.js.map +0 -1
- /package/dist/{account-2ZMZFPIU.js.map → account-AL2ZDSR7.js.map} +0 -0
- /package/dist/{accounts-VINHZRWA.js.map → accounts-HAFCLSR5.js.map} +0 -0
- /package/dist/{accounts-RHGN5WMU.js.map → accounts-O5MFO3QQ.js.map} +0 -0
- /package/dist/{actions-5F4ZP6M4.js.map → actions-P35MEMGN.js.map} +0 -0
- /package/dist/{add-OGH4DZZ5.js.map → add-5GAN6CVO.js.map} +0 -0
- /package/dist/{add-KBPMSK2P.js.map → add-6DTC6X5G.js.map} +0 -0
- /package/dist/{ads-H7GH7A26.js.map → ads-6UEDYT3O.js.map} +0 -0
- /package/dist/{ads-56OWZBXZ.js.map → ads-C47NA2HH.js.map} +0 -0
- /package/dist/{adsets-H7QT42U6.js.map → adsets-Q5DWGANV.js.map} +0 -0
- /package/dist/{advertisers-PM4WPG4N.js.map → advertisers-AE75CGVE.js.map} +0 -0
- /package/dist/{analytics-JVZKN735.js.map → analytics-FKCXIMPO.js.map} +0 -0
- /package/dist/{analytics-5FALU2GL.js.map → analytics-FPWQQGRM.js.map} +0 -0
- /package/dist/{assign-KLYZ6USE.js.map → assign-ABN2AQ4J.js.map} +0 -0
- /package/dist/{audience-size-JHB42DB4.js.map → audience-size-GNBJY35X.js.map} +0 -0
- /package/dist/{audiences-JACGRBNN.js.map → audiences-AMRFZRZ7.js.map} +0 -0
- /package/dist/{audit-5XH7WZIM.js.map → audit-3VS63TBW.js.map} +0 -0
- /package/dist/{autocomplete-7F3PZLEY.js.map → autocomplete-VS3XG3B7.js.map} +0 -0
- /package/dist/{avatars-N4SRNQI7.js.map → avatars-EKCKHCC3.js.map} +0 -0
- /package/dist/{bid-pricing-VYLVGU26.js.map → bid-pricing-Q72B65AY.js.map} +0 -0
- /package/dist/{brand-ASBS2HZM.js.map → brand-C6PFGGQN.js.map} +0 -0
- /package/dist/{brief-JSZKDPGU.js.map → brief-UO52ZHFI.js.map} +0 -0
- /package/dist/{campaign-groups-ATE2DE4V.js.map → campaign-groups-KFFYQPU3.js.map} +0 -0
- /package/dist/{campaign-writes-ETT57KLQ.js.map → campaign-writes-FHOS5XZY.js.map} +0 -0
- /package/dist/{campaigns-J6VZBIV6.js.map → campaigns-2NHWBF5C.js.map} +0 -0
- /package/dist/{campaigns-WBEG5QA4.js.map → campaigns-D6B6Z67Y.js.map} +0 -0
- /package/dist/{campaigns-FGBAS6AZ.js.map → campaigns-KZYZTXDS.js.map} +0 -0
- /package/dist/{canvas-K7IN7HLO.js.map → canvas-KTALW6HY.js.map} +0 -0
- /package/dist/{capabilities-RDAERPYY.js.map → capabilities-DJFTRJKS.js.map} +0 -0
- /package/dist/{catalog-MENVHL5U.js.map → catalog-Y3XADCSY.js.map} +0 -0
- /package/dist/{chats-YIAQGQ3X.js.map → chats-D2CSDX5Q.js.map} +0 -0
- /package/dist/{chunk-U3HAMW5W.js.map → chunk-2BKVVCCV.js.map} +0 -0
- /package/dist/{chunk-BA7FDXQC.js.map → chunk-3G3ZDLMI.js.map} +0 -0
- /package/dist/{chunk-E4MDJBLO.js.map → chunk-3HJLHTWP.js.map} +0 -0
- /package/dist/{chunk-G7UTTEBS.js.map → chunk-3IBYKLXR.js.map} +0 -0
- /package/dist/{chunk-VAISMQQB.js.map → chunk-4AUMTNVB.js.map} +0 -0
- /package/dist/{chunk-T3BDNJIX.js.map → chunk-4BQXAE7Z.js.map} +0 -0
- /package/dist/{chunk-VMDAXFRI.js.map → chunk-4D7UBVSG.js.map} +0 -0
- /package/dist/{chunk-U6SYRIOB.js.map → chunk-4QEY2L6U.js.map} +0 -0
- /package/dist/{chunk-KNWHUMVZ.js.map → chunk-5QGMMZFQ.js.map} +0 -0
- /package/dist/{chunk-UC6BWM5J.js.map → chunk-5ZDLTE5T.js.map} +0 -0
- /package/dist/{chunk-ANCSKUWI.js.map → chunk-7YCRFMXF.js.map} +0 -0
- /package/dist/{chunk-VDHQJ6HD.js.map → chunk-A4LOJ2VD.js.map} +0 -0
- /package/dist/{chunk-DKGTQSLR.js.map → chunk-AEOSAVVL.js.map} +0 -0
- /package/dist/{chunk-GATKK4RJ.js.map → chunk-BAVBLIAD.js.map} +0 -0
- /package/dist/{chunk-6DB2B3GF.js.map → chunk-CSYSX4D2.js.map} +0 -0
- /package/dist/{chunk-IM52NHGL.js.map → chunk-DWHIOO7E.js.map} +0 -0
- /package/dist/{chunk-HIPDMQZ6.js.map → chunk-DZSIUEGH.js.map} +0 -0
- /package/dist/{chunk-65RIB7A6.js.map → chunk-HBTF25YG.js.map} +0 -0
- /package/dist/{chunk-2GK33EJV.js.map → chunk-IR6D7K4H.js.map} +0 -0
- /package/dist/{chunk-YBP7O5P4.js.map → chunk-JQJDXPCO.js.map} +0 -0
- /package/dist/{chunk-ACANMASG.js.map → chunk-JWI6GIFJ.js.map} +0 -0
- /package/dist/{chunk-MADAAZZV.js.map → chunk-KHRXPQID.js.map} +0 -0
- /package/dist/{chunk-FXED3VZK.js.map → chunk-L27H2R2N.js.map} +0 -0
- /package/dist/{chunk-TIOQ7ZFQ.js.map → chunk-LLOOWRBB.js.map} +0 -0
- /package/dist/{chunk-AWMFUGVX.js.map → chunk-LYBXCXJB.js.map} +0 -0
- /package/dist/{chunk-7SDFKGQ4.js.map → chunk-MXYBTMKB.js.map} +0 -0
- /package/dist/{chunk-SB3GZFCV.js.map → chunk-NPY4QUMQ.js.map} +0 -0
- /package/dist/{chunk-3CWL2LY4.js.map → chunk-OZRUJVIQ.js.map} +0 -0
- /package/dist/{chunk-EH4C4CZK.js.map → chunk-QRP3PXWN.js.map} +0 -0
- /package/dist/{chunk-YC2TQ3VC.js.map → chunk-S77PZVYM.js.map} +0 -0
- /package/dist/{chunk-HZ5DR5MX.js.map → chunk-SHL7LOC3.js.map} +0 -0
- /package/dist/{chunk-GIJT3A5U.js.map → chunk-T4DD5YMP.js.map} +0 -0
- /package/dist/{chunk-ALTBBAYU.js.map → chunk-TD2CL5FE.js.map} +0 -0
- /package/dist/{chunk-ZPU3WDVK.js.map → chunk-UQ4QIV56.js.map} +0 -0
- /package/dist/{chunk-XMD4SHFI.js.map → chunk-W4VS475D.js.map} +0 -0
- /package/dist/{chunk-K3PN7TN5.js.map → chunk-WTOYCUKH.js.map} +0 -0
- /package/dist/{chunk-DR34ZTWD.js.map → chunk-Y5YBNAIS.js.map} +0 -0
- /package/dist/{chunk-PDTB5EX6.js.map → chunk-Y6O7EWYY.js.map} +0 -0
- /package/dist/{chunk-BSC33FLJ.js.map → chunk-YRQYA2LR.js.map} +0 -0
- /package/dist/{chunk-4NBVGARW.js.map → chunk-ZEYEWPK6.js.map} +0 -0
- /package/dist/{chunk-MLU6STIN.js.map → chunk-ZZQXVYUY.js.map} +0 -0
- /package/dist/{claim-V4F5GZJK.js.map → claim-FZ5OQLMU.js.map} +0 -0
- /package/dist/{companies-NJGJ7XNN.js.map → companies-DNI634RC.js.map} +0 -0
- /package/dist/{complete-MGNF5OAK.js.map → complete-2FZMGJV5.js.map} +0 -0
- /package/dist/{connect-PJOTRTT4.js.map → connect-QCOGEPP4.js.map} +0 -0
- /package/dist/{conversation-4DM26FRD.js.map → conversation-6IOGV7B7.js.map} +0 -0
- /package/dist/{conversion-upload-command-TZTHU2CD.js.map → conversion-upload-command-AUF3LNTH.js.map} +0 -0
- /package/dist/{conversions-JGECVZSY.js.map → conversions-4SRZPBBX.js.map} +0 -0
- /package/dist/{create-DSGQFBI7.js.map → create-BJNMO6HT.js.map} +0 -0
- /package/dist/{create-I2KVDTCQ.js.map → create-FX4OJ2XF.js.map} +0 -0
- /package/dist/{create-SBQWVLXG.js.map → create-RM7HV77Y.js.map} +0 -0
- /package/dist/{create-WOHPIGBK.js.map → create-VXM34ZWH.js.map} +0 -0
- /package/dist/{creatives-DWO5KEQC.js.map → creatives-AG6FCCHY.js.map} +0 -0
- /package/dist/{creatives-4JGVZQGC.js.map → creatives-JSWBFQ5R.js.map} +0 -0
- /package/dist/{creatives-PSWCNY7U.js.map → creatives-UEPLNCPN.js.map} +0 -0
- /package/dist/{credentials-UULYCN2L.js.map → credentials-VOZTILFO.js.map} +0 -0
- /package/dist/{critique-NGMZK5LX.js.map → critique-D74VSOGJ.js.map} +0 -0
- /package/dist/{critique-TIZJ5GFM.js.map → critique-ZS4ON3SU.js.map} +0 -0
- /package/dist/{crm-2WAR565U.js.map → crm-52ROSWH5.js.map} +0 -0
- /package/dist/{crm-VDXUO2YU.js.map → crm-R5IXIFIV.js.map} +0 -0
- /package/dist/{custom-conversions-6P555U2K.js.map → custom-conversions-2VLJGPRV.js.map} +0 -0
- /package/dist/{customers-ATENMXDO.js.map → customers-4AWBFDUF.js.map} +0 -0
- /package/dist/{delete-H744GNS4.js.map → delete-AIGE4Y4H.js.map} +0 -0
- /package/dist/{delete-AVMZYNVT.js.map → delete-HGHXY24R.js.map} +0 -0
- /package/dist/{delete-OEYPFATY.js.map → delete-M2GDLPYN.js.map} +0 -0
- /package/dist/{demographics-M5LJF3RZ.js.map → demographics-NTWB2IMG.js.map} +0 -0
- /package/dist/{discard-72I6SM7G.js.map → discard-2WWQG6OU.js.map} +0 -0
- /package/dist/{domain-R4EIZD2W.js.map → domain-Y2LT6JLT.js.map} +0 -0
- /package/dist/{draft-BV2QRPZ4.js.map → draft-5YAYCEYY.js.map} +0 -0
- /package/dist/{draft-YYYRWF7M.js.map → draft-EJXNNJ3Y.js.map} +0 -0
- /package/dist/{draft-BBFJNZ5X.js.map → draft-FJ7WHIXW.js.map} +0 -0
- /package/dist/{draft-34C3F5U4.js.map → draft-SLHAKJ2A.js.map} +0 -0
- /package/dist/{facets-F2H52MS4.js.map → facets-U7AQC4H6.js.map} +0 -0
- /package/dist/{feedback-IQKKT4MC.js.map → feedback-FFF3KELE.js.map} +0 -0
- /package/dist/{feedback-record-UZV4Y7UD.js.map → feedback-record-DTCSUXRO.js.map} +0 -0
- /package/dist/{fetch-ZUAZPLAE.js.map → fetch-W7NULDEO.js.map} +0 -0
- /package/dist/{fit-2CA4JH7N.js.map → fit-PXZSHQRM.js.map} +0 -0
- /package/dist/{flows-CWXCXEUD.js.map → flows-KABCBS3S.js.map} +0 -0
- /package/dist/{fonts-F2XUCIIW.js.map → fonts-EMMX3KII.js.map} +0 -0
- /package/dist/{forecast-IDKJYM2B.js.map → forecast-GNODEIIC.js.map} +0 -0
- /package/dist/{funnel-RLGQGYKO.js.map → funnel-AAX27NH4.js.map} +0 -0
- /package/dist/{get-C6UQ22HH.js.map → get-QEYJRLV3.js.map} +0 -0
- /package/dist/{get-EEUR6SAW.js.map → get-RTVUZM6E.js.map} +0 -0
- /package/dist/{google-35GDU3G3.js.map → google-M7KEXVK5.js.map} +0 -0
- /package/dist/{google-ads-Q37I2D5P.js.map → google-ads-OK6IG3UV.js.map} +0 -0
- /package/dist/{history-4II5QA4B.js.map → history-PQUJKK26.js.map} +0 -0
- /package/dist/{hubspot-TTITJFBO.js.map → hubspot-Y77VLY6Y.js.map} +0 -0
- /package/dist/{ideas-V4Q6JDKV.js.map → ideas-MIDU7YOA.js.map} +0 -0
- /package/dist/{images-SP5REF6E.js.map → images-S254MS6O.js.map} +0 -0
- /package/dist/{ingest-574GIFAR.js.map → ingest-J4I3HKM3.js.map} +0 -0
- /package/dist/{ingest-IC4T76W6.js.map → ingest-YV2NLDBE.js.map} +0 -0
- /package/dist/{inspect-ATHYY6A2.js.map → inspect-Q5NHBBHX.js.map} +0 -0
- /package/dist/{keyword-metrics-J4UPUDN7.js.map → keyword-metrics-PDY4ZXSP.js.map} +0 -0
- /package/dist/{keywords-for-site-MWADFEO2.js.map → keywords-for-site-GALSCV77.js.map} +0 -0
- /package/dist/{landing-R6DN7XLK.js.map → landing-CJYGWCK4.js.map} +0 -0
- /package/dist/{leads-7EVHMNUF.js.map → leads-ARUWPHBM.js.map} +0 -0
- /package/dist/{leads-JM6HUERX.js.map → leads-PHKG6CP3.js.map} +0 -0
- /package/dist/{learn-LGS2F5TR.js.map → learn-3VO6DXUX.js.map} +0 -0
- /package/dist/{line-item-writes-KUYEXSIH.js.map → line-item-writes-E6MZPIZZ.js.map} +0 -0
- /package/dist/{line-items-GIWLP3FL.js.map → line-items-7ZGIKEF2.js.map} +0 -0
- /package/dist/{link-PVM7XJQI.js.map → link-QYAW6A2W.js.map} +0 -0
- /package/dist/{linkedin-WX54EAX6.js.map → linkedin-FFSDSGGS.js.map} +0 -0
- /package/dist/{list-MCEFXC6L.js.map → list-5IC6KIKO.js.map} +0 -0
- /package/dist/{list-4ZKQZBCL.js.map → list-NVQC5SNY.js.map} +0 -0
- /package/dist/{list-WR7QYTON.js.map → list-SAV3LQHY.js.map} +0 -0
- /package/dist/{log-U6IWZGOF.js.map → log-XZPVOALD.js.map} +0 -0
- /package/dist/{make-RXFHEGUI.js.map → make-NHZAHTV4.js.map} +0 -0
- /package/dist/{map-TWL7T4KP.js.map → map-4J5WIWIG.js.map} +0 -0
- /package/dist/{mcp-HVAVJGGS.js.map → mcp-XXD7ZQCP.js.map} +0 -0
- /package/dist/{media-M7E6V2XU.js.map → media-53DJRC4N.js.map} +0 -0
- /package/dist/{media-sources-JWGO23BZ.js.map → media-sources-O6ZRUA3N.js.map} +0 -0
- /package/dist/{members-5FAW4YE7.js.map → members-D5ZYLS4Y.js.map} +0 -0
- /package/dist/{meta-EZ4SY25M.js.map → meta-A7KM6TF5.js.map} +0 -0
- /package/dist/{normalize-GW4GZNVY.js.map → normalize-PCNC6E2N.js.map} +0 -0
- /package/dist/{options-NSUCENLU.js.map → options-MQ65VEVD.js.map} +0 -0
- /package/dist/{performance-FGCDWHMC.js.map → performance-6QW2KEEQ.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-BPWTDESL.js.map → promoted-tweet-writes-JPLHY3GM.js.map} +0 -0
- /package/dist/{promoted-tweets-OS3NHYVE.js.map → promoted-tweets-SURKMHFI.js.map} +0 -0
- /package/dist/{publish-SXZEWBVJ.js.map → publish-HCQ6MXLB.js.map} +0 -0
- /package/dist/{reddit-TF6K37SB.js.map → reddit-GIP3ADMS.js.map} +0 -0
- /package/dist/{refresh-APVDWXRZ.js.map → refresh-UXQSLCR3.js.map} +0 -0
- /package/dist/{release-32SEJU4L.js.map → release-5KVLXNP6.js.map} +0 -0
- /package/dist/{remove-U64GTHLQ.js.map → remove-6FIVKCJI.js.map} +0 -0
- /package/dist/{reopen-5VS233SF.js.map → reopen-YM5LNOLB.js.map} +0 -0
- /package/dist/{rerun-7Z45QOOO.js.map → rerun-NTDXIB4E.js.map} +0 -0
- /package/dist/{research-O7CJV5IS.js.map → research-EY7C7JJY.js.map} +0 -0
- /package/dist/{research-QYSQ6LW4.js.map → research-YOGE7GT2.js.map} +0 -0
- /package/dist/{reset-22FC7BXQ.js.map → reset-C4UHQ3EU.js.map} +0 -0
- /package/dist/{reset-47B5VPT4.js.map → reset-OLVB6AE6.js.map} +0 -0
- /package/dist/{resolve-7KQGVTQT.js.map → resolve-XYH2GDAE.js.map} +0 -0
- /package/dist/{retry-J5UVLS72.js.map → retry-726GKI6V.js.map} +0 -0
- /package/dist/{retry-UJ5UF4BM.js.map → retry-7EELDEQP.js.map} +0 -0
- /package/dist/{run-TFLFBQU2.js.map → run-MZ7JLI75.js.map} +0 -0
- /package/dist/{run-SI4FA32F.js.map → run-P4KR2MXC.js.map} +0 -0
- /package/dist/{scaffold-ad-SEXNE2K6.js.map → scaffold-ad-M5CWSLZ4.js.map} +0 -0
- /package/dist/{scaffold-static-ad-VBOL6CLN.js.map → scaffold-static-ad-QW3JWMXA.js.map} +0 -0
- /package/dist/{scaffold-video-Z37MIBDI.js.map → scaffold-video-EVRMU6WP.js.map} +0 -0
- /package/dist/{schedule-52ZM4KRQ.js.map → schedule-RDK4GEPI.js.map} +0 -0
- /package/dist/{scheduled-agents-PCWCQAKP.js.map → scheduled-agents-6U44QE76.js.map} +0 -0
- /package/dist/{schema-FY6ORDXZ.js.map → schema-CHJDC7GQ.js.map} +0 -0
- /package/dist/{search-NS7XNRZC.js.map → search-PMJRU3C4.js.map} +0 -0
- /package/dist/{select-4XCYVV2G.js.map → select-VYPVEO5J.js.map} +0 -0
- /package/dist/{set-prompt-TRJBYA3D.js.map → set-prompt-VH3S47Z7.js.map} +0 -0
- /package/dist/{setup-links-V3URI7DL.js.map → setup-links-REPREN3C.js.map} +0 -0
- /package/dist/{site-WIQ7SSU3.js.map → site-WFSWIA3S.js.map} +0 -0
- /package/dist/{sources-DWJXOLEH.js.map → sources-AMI2AWKZ.js.map} +0 -0
- /package/dist/{sources-L453U5MT.js.map → sources-YBQ6KPFM.js.map} +0 -0
- /package/dist/{stale-6OVG6VME.js.map → stale-LTRROC3C.js.map} +0 -0
- /package/dist/{status-WXWU54WR.js.map → status-7F2KHFGA.js.map} +0 -0
- /package/dist/{sync-CDZUTGV3.js.map → sync-GWTLKZTU.js.map} +0 -0
- /package/dist/{sync-definition-BAJQUBE3.js.map → sync-definition-TQDIRIR5.js.map} +0 -0
- /package/dist/{tags-SG3NVC3J.js.map → tags-3WPW6PTV.js.map} +0 -0
- /package/dist/{tags-WR6PDIDR.js.map → tags-6342FQEB.js.map} +0 -0
- /package/dist/{tags-6RY23XOG.js.map → tags-ABHSX6M5.js.map} +0 -0
- /package/dist/{tags-VN5HTL35.js.map → tags-FJIBBBRG.js.map} +0 -0
- /package/dist/{tags-BHFQWNPL.js.map → tags-KFYLZLB3.js.map} +0 -0
- /package/dist/{targeting-criteria-5EXP2NXF.js.map → targeting-criteria-NR47AF5C.js.map} +0 -0
- /package/dist/{targets-WUVEJPSD.js.map → targets-L56KOVQE.js.map} +0 -0
- /package/dist/{templates-LOJQX2NG.js.map → templates-B6XGDYUF.js.map} +0 -0
- /package/dist/{testimonials-6M5DXORT.js.map → testimonials-CVC4YIXO.js.map} +0 -0
- /package/dist/{top-companies-E2OMMPSV.js.map → top-companies-45X3DT7Z.js.map} +0 -0
- /package/dist/{translate-AW4CUKDA.js.map → translate-IHRONQW3.js.map} +0 -0
- /package/dist/{triggers-MRXIDCSN.js.map → triggers-22EMIVFD.js.map} +0 -0
- /package/dist/{unlink-HNL747YM.js.map → unlink-65KUN6ID.js.map} +0 -0
- /package/dist/{unstage-OL2JDCLK.js.map → unstage-2E3I5SWF.js.map} +0 -0
- /package/dist/{update-YNNRX5B2.js.map → update-2S7CSEAW.js.map} +0 -0
- /package/dist/{update-JPBUF7M2.js.map → update-7NCOTAQZ.js.map} +0 -0
- /package/dist/{update-RTTC3SAK.js.map → update-D6DJC6T7.js.map} +0 -0
- /package/dist/{update-4KGIT4BF.js.map → update-KREBPGBH.js.map} +0 -0
- /package/dist/{upload-UIXPCSXJ.js.map → upload-O6NHRPS7.js.map} +0 -0
- /package/dist/{url-params-K47CE7Y5.js.map → url-params-3EFGVTZZ.js.map} +0 -0
- /package/dist/{validate-TD2BY4VE.js.map → validate-5MDFJ76K.js.map} +0 -0
- /package/dist/{videos-BP3BKNTY.js.map → videos-YSXYGTBM.js.map} +0 -0
- /package/dist/{viewer-check-HFRUJ4ZU.js.map → viewer-check-45T2HLAH.js.map} +0 -0
- /package/dist/{web-RPSGFN4U.js.map → web-IGIGVEKS.js.map} +0 -0
- /package/dist/{winning-ads-WUENRDVJ.js.map → winning-ads-BXRQ7SBY.js.map} +0 -0
- /package/dist/{write-commands-4WARNR2T.js.map → write-commands-5C7FUOVN.js.map} +0 -0
- /package/dist/{write-commands-TAYGTJEZ.js.map → write-commands-CT74VHH6.js.map} +0 -0
- /package/dist/{x-VZCELH3P.js.map → x-BFSKFCZD.js.map} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
finalOutputLabelsFromCanvas,
|
|
3
3
|
parseDefinitionStrategyFields
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-OJ5R2OFK.js";
|
|
5
5
|
import {
|
|
6
6
|
readRenderState
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-4D7UBVSG.js";
|
|
8
8
|
import {
|
|
9
9
|
STATIC_AD_ROLE,
|
|
10
10
|
formatOfAdaptId,
|
|
@@ -12,14 +12,15 @@ import {
|
|
|
12
12
|
isSignatureLine,
|
|
13
13
|
sameTag,
|
|
14
14
|
seriesMemberAd
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-Q43MLYXE.js";
|
|
16
16
|
import {
|
|
17
17
|
fetchRunRecord
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-A4LOJ2VD.js";
|
|
19
19
|
import {
|
|
20
20
|
localPathParam
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-DZSIUEGH.js";
|
|
22
22
|
import {
|
|
23
|
+
NodeDecl,
|
|
23
24
|
STATIC_ADAPT_FORMAT_ROLE,
|
|
24
25
|
STATIC_FIX_ROLE,
|
|
25
26
|
STATIC_MASTER_ROLE,
|
|
@@ -30,11 +31,15 @@ import {
|
|
|
30
31
|
nodesWithRole,
|
|
31
32
|
relaidPictureRole,
|
|
32
33
|
rolesById
|
|
33
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-5QGMMZFQ.js";
|
|
34
35
|
import {
|
|
35
36
|
isAdSpec,
|
|
36
37
|
readAdSpec
|
|
37
38
|
} from "./chunk-VB6WJJR3.js";
|
|
39
|
+
import {
|
|
40
|
+
sha256Hex,
|
|
41
|
+
toModelSafeImage
|
|
42
|
+
} from "./chunk-HRYOZUSK.js";
|
|
38
43
|
|
|
39
44
|
// src/commands/baker-child.ts
|
|
40
45
|
import { execFile } from "child_process";
|
|
@@ -81,6 +86,7 @@ function isStaticAdCanvas(parsed) {
|
|
|
81
86
|
// src/commands/canvas/static-fix.ts
|
|
82
87
|
import { readFile } from "fs/promises";
|
|
83
88
|
import path from "path";
|
|
89
|
+
import { z } from "zod";
|
|
84
90
|
async function previousAdImage(canvasRoot, runId, fetchRecord = fetchRunRecord, roles = {}) {
|
|
85
91
|
try {
|
|
86
92
|
const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, "manifest.json"), "utf8"));
|
|
@@ -140,7 +146,9 @@ function chosenUrl(byNode) {
|
|
|
140
146
|
return null;
|
|
141
147
|
}
|
|
142
148
|
function correctedUrl(byNode) {
|
|
143
|
-
|
|
149
|
+
const editNumber = (id) => Number(id.match(/^edit_(\d+)$/)?.[1] ?? 0);
|
|
150
|
+
const entries = Object.entries(byNode).sort(([a], [b]) => editNumber(b) - editNumber(a));
|
|
151
|
+
for (const [id, out] of entries) {
|
|
144
152
|
if (id === "fix" || id === "chosen" || out.role === STATIC_FIX_ROLE) {
|
|
145
153
|
const url = urlOf(out);
|
|
146
154
|
if (url) return url;
|
|
@@ -148,6 +156,59 @@ function correctedUrl(byNode) {
|
|
|
148
156
|
}
|
|
149
157
|
return null;
|
|
150
158
|
}
|
|
159
|
+
async function fetchGraph(url) {
|
|
160
|
+
const res = await fetch(url);
|
|
161
|
+
return res.ok ? res.json() : null;
|
|
162
|
+
}
|
|
163
|
+
var HISTORY = { record: fetchRunRecord, graph: fetchGraph };
|
|
164
|
+
var VersionGraph = z.object({ nodes: z.array(NodeDecl) });
|
|
165
|
+
var VersionManifest = z.object({
|
|
166
|
+
canvas: VersionGraph,
|
|
167
|
+
outputs_by_node: z.record(z.string(), z.record(z.string(), z.unknown()))
|
|
168
|
+
});
|
|
169
|
+
async function versionRun(canvasRoot, runId, sources = HISTORY) {
|
|
170
|
+
try {
|
|
171
|
+
const manifest = VersionManifest.safeParse(JSON.parse(await readFile(path.join(canvasRoot, runId, "manifest.json"), "utf8")));
|
|
172
|
+
if (manifest.success) return { canvas: manifest.data.canvas, outputs: manifest.data.outputs_by_node };
|
|
173
|
+
} catch {
|
|
174
|
+
}
|
|
175
|
+
const record = await sources.record(runId).catch(() => null);
|
|
176
|
+
const graph = record?.graphUrl ? await sources.graph(record.graphUrl).catch(() => null) : null;
|
|
177
|
+
const canvas = VersionGraph.safeParse(graph);
|
|
178
|
+
return record && canvas.success ? { canvas: canvas.data, outputs: outputsByNode(record.nodes) } : null;
|
|
179
|
+
}
|
|
180
|
+
async function ingestedNow(files, canvasDir) {
|
|
181
|
+
const entries = await Promise.all(
|
|
182
|
+
files.map(async (file) => {
|
|
183
|
+
const bytes = await readFile(path.resolve(canvasDir, file.path)).catch(() => null);
|
|
184
|
+
if (!bytes) return [file.id, []];
|
|
185
|
+
const own = sha256Hex(bytes);
|
|
186
|
+
if (file.expect !== "image") return [file.id, [own]];
|
|
187
|
+
const raster = await toModelSafeImage(bytes).catch(() => null);
|
|
188
|
+
return [file.id, raster ? [.../* @__PURE__ */ new Set([own, sha256Hex(raster.bytes)])] : [own]];
|
|
189
|
+
})
|
|
190
|
+
);
|
|
191
|
+
return Object.fromEntries(entries);
|
|
192
|
+
}
|
|
193
|
+
function outputsByNode(nodes) {
|
|
194
|
+
const byNode = {};
|
|
195
|
+
for (const node of nodes) {
|
|
196
|
+
const outputs = {};
|
|
197
|
+
for (const out of node.outputs) {
|
|
198
|
+
const [slot = "", index] = String(out.slot ?? "").split("#");
|
|
199
|
+
const { slot: _slot, label: _label, durationMs, ...ref } = out;
|
|
200
|
+
const asset = { ...ref, ...typeof durationMs === "number" ? { duration_ms: durationMs } : {} };
|
|
201
|
+
if (index === void 0) outputs[slot] = asset;
|
|
202
|
+
else {
|
|
203
|
+
const list = Array.isArray(outputs[slot]) ? outputs[slot] : [];
|
|
204
|
+
list[Number(index)] = asset;
|
|
205
|
+
outputs[slot] = list;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (Object.keys(outputs).length > 0) byNode[node.nodeId] = outputs;
|
|
209
|
+
}
|
|
210
|
+
return byNode;
|
|
211
|
+
}
|
|
151
212
|
async function correctedPicture(canvasRoot, runId, fetchRecord = fetchRunRecord) {
|
|
152
213
|
try {
|
|
153
214
|
const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, "manifest.json"), "utf8"));
|
|
@@ -432,6 +493,8 @@ export {
|
|
|
432
493
|
isStaticAdCanvas,
|
|
433
494
|
previousAdImage,
|
|
434
495
|
previousDelivered,
|
|
496
|
+
versionRun,
|
|
497
|
+
ingestedNow,
|
|
435
498
|
correctedPicture,
|
|
436
499
|
pictureRecord,
|
|
437
500
|
keepsChosen,
|
|
@@ -443,4 +506,4 @@ export {
|
|
|
443
506
|
writeSeriesMemberCanvas,
|
|
444
507
|
seriesRunHints
|
|
445
508
|
};
|
|
446
|
-
//# sourceMappingURL=chunk-
|
|
509
|
+
//# sourceMappingURL=chunk-J4LSFZCF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/baker-child.ts","../src/commands/canvas/static-ad-canvas.ts","../src/commands/canvas/static-fix.ts","../src/commands/canvas/series-member.ts"],"sourcesContent":["/**\n * Another `baker` command run from this one, as a child process of the same CLI, read back by its\n * JSON answer: `creatives make` scaffolds through it, and `canvas run --series` renders each ad of\n * a series through it, all at once.\n */\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst run = promisify(execFile);\n\n/** The last JSON object a command printed, after any progress lines. Pure. */\nexport function lastJsonObject(stdout: string): Record<string, unknown> | null {\n for (let at = stdout.lastIndexOf(\"{\"); at >= 0; at = stdout.lastIndexOf(\"{\", at - 1)) {\n if (at > 0 && stdout[at - 1] !== \"\\n\") continue;\n try {\n const parsed: unknown = JSON.parse(stdout.slice(at));\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) return parsed as Record<string, unknown>;\n } catch {\n // Not the start of the final object: keep looking further back.\n }\n if (at === 0) break;\n }\n return null;\n}\n\n/** Run another `baker` command in this same CLI and read its JSON answer. */\nexport async function runBaker(args: string[], signal?: AbortSignal): Promise<Record<string, unknown>> {\n const entry = process.argv[1];\n const [file, argv] = entry ? [process.execPath, [...process.execArgv, entry, ...args]] : [\"baker\", args];\n try {\n const { stdout } = await run(file, argv, { maxBuffer: 32 * 1024 * 1024, ...(signal ? { signal } : {}) });\n return lastJsonObject(stdout) ?? { ok: false, error: { code: \"INTERNAL_ERROR\", message: \"no answer\" } };\n } catch (err) {\n // A scaffold reports its failure on stderr, other commands on stdout.\n const { stdout = \"\", stderr = \"\" } = err as { stdout?: string; stderr?: string };\n return (\n lastJsonObject(stdout) ??\n lastJsonObject(stderr) ?? {\n ok: false,\n error: { code: \"INTERNAL_ERROR\", message: err instanceof Error ? err.message.slice(0, 300) : String(err) },\n }\n );\n }\n}\n","import { STATIC_AD_ROLE } from \"../../engine/scaffold/static-render-briefs.ts\";\nimport { STATIC_VARIANTS_ROLE } from \"../../engine/scaffold/static-topology.ts\";\n\n/**\n * A static ad canvas, by role: an ingest tagged as the static ad's blueprint, or a node that\n * renders a static ad's variants. A canvas scaffolded by the overlay engine (a `compose_spec`\n * ingest) still counts, so a creative already in a client workspace reads as one until it is\n * re-scaffolded.\n */\nexport function isStaticAdCanvas(parsed: unknown): boolean {\n const nodes = (parsed as { nodes?: unknown } | null)?.nodes;\n if (!Array.isArray(nodes)) return false;\n return nodes.some((n) => {\n const role = (n as { tags?: { role?: unknown } } | null)?.tags?.role;\n if (role === STATIC_VARIANTS_ROLE) return true;\n return n?.type === \"ingest\" && (role === STATIC_AD_ROLE || n?.id === \"compose_spec\");\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { toModelSafeImage } from \"../../engine/nodes/ingest.ts\";\nimport type { VariantFile, VersionRun } from \"../../engine/scaffold/static-history.ts\";\nimport { NodeDecl } from \"../../engine/schema/canvas.ts\";\nimport { sha256Hex } from \"../../engine/storage/sha256.ts\";\nimport { fetchRunRecord } from \"./run-history.ts\";\n\nimport {\n rolesById,\n STATIC_ADAPT_FORMAT_ROLE,\n STATIC_FIX_ROLE,\n STATIC_MASTER_ROLE,\n STATIC_PICK_ROLE,\n STATIC_SAFE_FIT_ROLE,\n STATIC_SIZE_ROLE,\n STATIC_VARIANTS_ROLE,\n} from \"../../engine/scaffold/static-topology.ts\";\n\ntype Output = { url?: unknown; slot?: unknown; sha256?: unknown; path?: unknown };\n/** One node's outputs as a run keeps them: a list (`images`) or a single image, and its role when known. */\n/** A node's outputs by slot: a generation's `images`, a tool's `image`, an ingest's `asset`. */\ntype NodeOutputs = { images?: Output[]; image?: Output; asset?: Output; role?: string };\n\n/**\n * The finished ad a run chose, as the durable URL its record holds: its master (the chosen\n * picture before any logo is placed on it), or, on a run of the older graph, the judge's pick\n * or the lone take. Read from the local run folder first (`manifest.json`, outputs by node id,\n * given roles by `roles` — the canvas's), then from the company's run history (whose nodes\n * carry their roles), so a version rendered in another chat can be corrected too. Null when\n * the run is unknown or made no ad.\n */\nexport async function previousAdImage(\n canvasRoot: string,\n runId: string,\n fetchRecord: (\n runId: string,\n ) => Promise<{ nodes: Array<{ nodeId: string; role?: string; outputs: Output[] }> } | null> = fetchRunRecord,\n roles: Readonly<Record<string, string>> = {},\n): Promise<string | null> {\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n const byNode = Object.fromEntries(\n Object.entries(manifest.outputs_by_node ?? {}).map(([id, out]) => [id, { ...out, ...(roles[id] ? { role: roles[id] } : {}) }]),\n );\n const local = chosenUrl(byNode);\n if (local) return local;\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await fetchRecord(runId).catch(() => null);\n if (!record) return null;\n return chosenUrl(\n Object.fromEntries(\n record.nodes.map((n) => {\n const role = n.role ?? roles[n.nodeId];\n return [n.nodeId, { images: n.outputs, ...(role ? { role } : {}) }];\n }),\n ),\n );\n}\n\n/**\n * The sizes a run delivered (its `output` collect, `finalNode`), each with the format `labels`\n * gives it, from the local run folder: its local file, or its durable URL first (`prefer: \"url\"`).\n * Empty when the run was not rendered here.\n */\nexport async function previousDelivered(\n canvasRoot: string,\n runId: string,\n finalNode: string,\n labels: readonly (string | undefined)[],\n opts: { prefer?: \"url\" } = {},\n): Promise<Array<{ format: string; path: string }>> {\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n const images = manifest.outputs_by_node?.[finalNode]?.images ?? [];\n return images.flatMap((image, i) => {\n const local = typeof image.path === \"string\" ? image.path : null;\n const durable = typeof image.url === \"string\" ? image.url : null;\n const source = opts.prefer === \"url\" ? (durable ?? local) : (local ?? durable);\n const format = labels[i];\n return source && format ? [{ format, path: source }] : [];\n });\n } catch {\n return [];\n }\n}\n\n/** Which node holds the chosen ad, best first: by role on the one-picture graph, by id on an older one. */\nconst CHOSEN: ReadonlyArray<(id: string, out: NodeOutputs) => boolean> = [\n (_, out) => out.role === STATIC_MASTER_ROLE,\n (_, out) => out.role === STATIC_PICK_ROLE,\n (_, out) => out.role === STATIC_FIX_ROLE,\n (id, out) => id === \"pick\" && out.role === undefined,\n (id, out) => id === \"ad\" && out.role === undefined,\n];\n\nfunction urlOf(out: NodeOutputs): string | null {\n const url = out.images?.find((o) => typeof o?.url === \"string\")?.url ?? out.image?.url ?? out.asset?.url;\n return typeof url === \"string\" ? url : null;\n}\n\n/** The chosen ad among a run's node outputs (see `previousAdImage`). Never a variant the judge did not keep. Pure. */\nexport function chosenUrl(byNode: Record<string, NodeOutputs>): string | null {\n const entries = Object.entries(byNode).filter(([, out]) => out.role !== STATIC_VARIANTS_ROLE);\n for (const matches of CHOSEN) {\n for (const [id, out] of entries) {\n if (!matches(id, out)) continue;\n const url = urlOf(out);\n if (url) return url;\n }\n }\n return null;\n}\n\n/**\n * The picture a correction (`--fix`) or a person's choice (`--use-variant`) put in place of the\n * variants, the input its master was made from. Null for a plain render: the scaffolded graph\n * already reaches that picture through its own cache. Ids are the ones `fixStaticAd` and\n * `rederiveFromVariant` give those nodes; a run record also carries the correction's role. Pure.\n */\nexport function correctedUrl(byNode: Record<string, NodeOutputs>): string | null {\n // A version grown on top of others (`static-history.ts`) keeps every correction: it shows its last.\n // `fix` and `chosen` never share a graph with an `edit_<n>`: a chosen variant drops the edits before it.\n const editNumber = (id: string) => Number(id.match(/^edit_(\\d+)$/)?.[1] ?? 0);\n const entries = Object.entries(byNode).sort(([a], [b]) => editNumber(b) - editNumber(a));\n for (const [id, out] of entries) {\n if (id === \"fix\" || id === \"chosen\" || out.role === STATIC_FIX_ROLE) {\n const url = urlOf(out);\n if (url) return url;\n }\n }\n return null;\n}\n\n/** A run as the run history keeps it: each node's recorded outputs, and where the graph it ran is kept. */\ntype RecordedRun = {\n graphUrl?: string;\n nodes: ReadonlyArray<{ nodeId: string; outputs: ReadonlyArray<Record<string, unknown>> }>;\n};\n\ntype VersionSources = {\n record: (runId: string) => Promise<RecordedRun | null>;\n graph: (url: string) => Promise<unknown>;\n};\n\nasync function fetchGraph(url: string): Promise<unknown> {\n const res = await fetch(url);\n return res.ok ? res.json() : null;\n}\n\nconst HISTORY: VersionSources = { record: fetchRunRecord, graph: fetchGraph };\n\n/** The graph a version ran, as its manifest or the run history keeps it. */\nconst VersionGraph = z.object({ nodes: z.array(NodeDecl) });\n/** The part of a run's manifest a version grows from: the graph it ran and every node's outputs. */\nconst VersionManifest = z.object({\n canvas: VersionGraph,\n outputs_by_node: z.record(z.string(), z.record(z.string(), z.unknown())),\n});\n\n/**\n * The graph run `runId` ran and every node's outputs, so the next version can be grown on top of\n * it (`growFromVersion`): from its run folder here, else, for a version rendered in another\n * workspace (\"Edit creative …\" from a new chat), from the run history and the graph it kept. Null\n * when neither has it (a run recorded before graphs were kept): the caller corrects by URL.\n */\nexport async function versionRun(\n canvasRoot: string,\n runId: string,\n sources: VersionSources = HISTORY,\n): Promise<VersionRun | null> {\n try {\n const manifest = VersionManifest.safeParse(JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")));\n if (manifest.success) return { canvas: manifest.data.canvas, outputs: manifest.data.outputs_by_node };\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await sources.record(runId).catch(() => null);\n const graph = record?.graphUrl ? await sources.graph(record.graphUrl).catch(() => null) : null;\n const canvas = VersionGraph.safeParse(graph);\n return record && canvas.success ? { canvas: canvas.data, outputs: outputsByNode(record.nodes) } : null;\n}\n\n/**\n * What each workspace file the variants read is ingested as now, by node id (`makesSameVariants`):\n * the sha256 of its bytes, and for a picture also of the raster the ingest makes it into (an SVG\n * logo is ingested as a PNG). A file that cannot be read matches nothing.\n */\nexport async function ingestedNow(files: readonly VariantFile[], canvasDir: string): Promise<Record<string, string[]>> {\n const entries = await Promise.all(\n files.map(async (file): Promise<[string, string[]]> => {\n const bytes = await readFile(path.resolve(canvasDir, file.path)).catch(() => null);\n if (!bytes) return [file.id, []];\n const own = sha256Hex(bytes);\n if (file.expect !== \"image\") return [file.id, [own]];\n const raster = await toModelSafeImage(bytes).catch(() => null);\n return [file.id, raster ? [...new Set([own, sha256Hex(raster.bytes)])] : [own]];\n }),\n );\n return Object.fromEntries(entries);\n}\n\n/**\n * Each node's outputs as the engine hands them on, from the run record's flat list: `images#1`\n * back into `images[1]`, `image` as it is, each an asset ref. A node that recorded none is left out.\n * Pure.\n */\nfunction outputsByNode(nodes: RecordedRun[\"nodes\"]): Record<string, Record<string, unknown>> {\n const byNode: Record<string, Record<string, unknown>> = {};\n for (const node of nodes) {\n const outputs: Record<string, unknown> = {};\n for (const out of node.outputs) {\n const [slot = \"\", index] = String(out.slot ?? \"\").split(\"#\");\n const { slot: _slot, label: _label, durationMs, ...ref } = out;\n const asset = { ...ref, ...(typeof durationMs === \"number\" ? { duration_ms: durationMs } : {}) };\n if (index === undefined) outputs[slot] = asset;\n else {\n const list = (Array.isArray(outputs[slot]) ? outputs[slot] : []) as unknown[];\n list[Number(index)] = asset;\n outputs[slot] = list;\n }\n }\n if (Object.keys(outputs).length > 0) byNode[node.nodeId] = outputs;\n }\n return byNode;\n}\n\n/**\n * `correctedUrl` of a run: the local run folder first, then the company's run history, so a\n * version corrected in another chat is found too. Null for a plain render or an unknown run.\n */\nexport async function correctedPicture(\n canvasRoot: string,\n runId: string,\n fetchRecord: (\n runId: string,\n ) => Promise<{ nodes: Array<{ nodeId: string; role?: string; outputs: Output[] }> } | null> = fetchRunRecord,\n): Promise<string | null> {\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n if (manifest.outputs_by_node) return correctedUrl(manifest.outputs_by_node);\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await fetchRecord(runId).catch(() => null);\n if (!record) return null;\n return correctedUrl(\n Object.fromEntries(record.nodes.map((n) => [n.nodeId, { images: n.outputs, ...(n.role ? { role: n.role } : {}) }])),\n );\n}\n\n/**\n * How a version's picture came to be, where its canvas alone would not say: `chosen`, the person\n * picked it (`--use-variant`), so it is only ever corrected, never replaced, through every fix and\n * re-layout of it; `redrawn`, a new picture told what the last one got wrong (an autofix round),\n * which the scaffolded graph would not draw again.\n */\nexport type PictureRecord = { runId: string; chosen?: true; redrawn?: true };\n\n/**\n * The record of run `runId`'s picture: `chose`, the person picked it now; `keeps`, the run kept the\n * picture of version `from` (a fix, an edit, a re-layout), whose record `of` is. Pure.\n */\nexport function pictureRecord(\n runId: string,\n opts: { chose?: boolean; of?: PictureRecord | undefined; from?: string | undefined; keeps?: boolean; redrawn?: boolean },\n): PictureRecord {\n const chosen = opts.chose === true || (opts.keeps === true && keepsChosen(opts.of, opts.from));\n return { runId, ...(chosen ? { chosen: true as const } : {}), ...(opts.redrawn ? { redrawn: true as const } : {}) };\n}\n\n/** Whether version `from` shows a picture the person chose. Pure. */\nexport function keepsChosen(picture: PictureRecord | undefined, from: string | undefined): boolean {\n return picture?.chosen === true && from !== undefined && picture.runId === from;\n}\n\n/**\n * Whether `--regenerate` forces only re-laid-out sizes (their fills and safe fits): work that must start\n * from the picture the version already shows, never from new variants. Pure.\n */\nexport function relaysSizesOnly(canvas: unknown, ids: readonly string[]): boolean {\n const roles = rolesById(canvas);\n const sizing = new Set([STATIC_ADAPT_FORMAT_ROLE, STATIC_SIZE_ROLE, STATIC_SAFE_FIT_ROLE]);\n return ids.length > 0 && ids.every((id) => sizing.has(roles[id] ?? \"\"));\n}\n\n/** A sha256 or a unique prefix of one (at least 8 hex characters). */\nconst SHA_PREFIX = /^[0-9a-f]{8,64}$/;\n\n/** The URL of the variant whose sha256 starts with `sha` among one node's outputs; null when none or several match. */\nfunction matchVariant(outputs: readonly Output[], sha: string): string | null {\n const hits = outputs.filter((o) => typeof o?.sha256 === \"string\" && o.sha256.startsWith(sha) && typeof o.url === \"string\");\n const urls = [...new Set(hits.map((o) => o.url as string))];\n return urls.length === 1 ? (urls[0] as string) : null;\n}\n\n/**\n * The durable URL of the variant to make every size from instead of the judge's pick (`--use-variant`),\n * found by its sha256 among the run's variants, never by position: the local run folder first\n * (its outputs keyed by node id, given roles by `roles`), then the run history. Null when the\n * run or the variant is unknown.\n */\nexport async function variantImage(\n canvasRoot: string,\n runId: string,\n sha256: string,\n fetchRecord: (\n runId: string,\n ) => Promise<{ nodes: Array<{ nodeId: string; role?: string; outputs: Output[] }> } | null> = fetchRunRecord,\n roles: Readonly<Record<string, string>> = {},\n): Promise<string | null> {\n const sha = sha256.trim().toLowerCase();\n if (!SHA_PREFIX.test(sha)) return null;\n try {\n const manifest = JSON.parse(await readFile(path.join(canvasRoot, runId, \"manifest.json\"), \"utf8\")) as {\n outputs_by_node?: Record<string, NodeOutputs>;\n };\n for (const [id, out] of Object.entries(manifest.outputs_by_node ?? {})) {\n if (roles[id] !== STATIC_VARIANTS_ROLE) continue;\n const url = matchVariant(out.images ?? [], sha);\n if (url) return url;\n }\n } catch {\n // Not rendered here: ask the run history.\n }\n const record = await fetchRecord(runId).catch(() => null);\n const variants = record?.nodes.find((n) => n.role === STATIC_VARIANTS_ROLE);\n return variants ? matchVariant(variants.outputs, sha) : null;\n}\n","/**\n * An ad of a series, on disk: `src/creatives/<slug>/` holds its own words (`prompt.json`) and a\n * `_definition.md` naming its lead (`series: <lead>`); its canvas is written from the lead's,\n * every run, as an edit of the lead's ready version (`seriesMemberAd`). The ad never designs a\n * picture of its own, so ten messages in one style come out as one ad ten times.\n */\nimport { existsSync } from \"node:fs\";\nimport { readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { CreativesRunData } from \"@baker/api\";\nimport { isAdSpec, readAdSpec } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { isCustomersWords, isSignatureLine } from \"../../engine/scaffold/static-proof.ts\";\nimport { sameTag } from \"../../language.ts\";\nimport { formatOfAdaptId } from \"../../engine/scaffold/static-adapt-briefs.ts\";\nimport {\n nodesWithRole,\n relaidPictureRole,\n rolesById,\n STATIC_ADAPT_FORMAT_ROLE,\n} from \"../../engine/scaffold/static-topology.ts\";\nimport { type SeriesLead, seriesMemberAd } from \"../../engine/scaffold/staticAd.ts\";\nimport { parseDefinitionStrategyFields } from \"./creative-definition.ts\";\nimport { localPathParam } from \"./resolve-paths.ts\";\nimport { readRenderState } from \"./render-state.ts\";\nimport { fetchRunRecord } from \"./run-history.ts\";\nimport { finalOutputLabelsFromCanvas } from \"./run-record.ts\";\nimport { isStaticAdCanvas } from \"./static-ad-canvas.ts\";\nimport { previousAdImage, previousDelivered } from \"./static-fix.ts\";\n\n/** Why a series ad cannot be made yet: what to tell the agent, and what to do. */\nexport type SeriesRefusal = { refused: { code: string; message: string; fix: string } };\n\ntype Fetch = (runId: string) => Promise<CreativesRunData | null>;\n\nconst creativeDir = (root: string, slug: string) => path.join(root, \"src\", \"creatives\", slug);\nconst canvasFile = (root: string, slug: string) => path.join(creativeDir(root, slug), `${slug}.canvas.json`);\n\n/** What a creative's `_definition.md` says of its series: its lead (`series:`) and the language its words are in. */\nasync function seriesFieldsOf(root: string, slug: string): Promise<{ seriesLead?: string; language?: string }> {\n const raw = await readFile(path.join(creativeDir(root, slug), \"_definition.md\"), \"utf8\").catch(() => null);\n return raw === null ? {} : parseDefinitionStrategyFields(raw);\n}\n\n/** The lead a creative's `_definition.md` names (`series:`); null when it is no ad of a series. */\nexport async function seriesLeadOf(root: string, slug: string): Promise<string | null> {\n return (await seriesFieldsOf(root, slug)).seriesLead ?? null;\n}\n\n/** The language a translation's words are in: its own, when it is not its lead's. Undefined on any other ad. */\nasync function translatedInto(root: string, slug: string, lead: string): Promise<string | undefined> {\n const own = (await seriesFieldsOf(root, slug)).language;\n const leads = (await seriesFieldsOf(root, lead)).language;\n return own && !(leads && sameTag(own, leads)) ? own : undefined;\n}\n\n/** How many leads up a series may chain: a design, its angle ads, their translations. */\nexport const SERIES_DEPTH = 3;\n\n/**\n * The leads above `slug`, nearest first, up to the ad whose design the whole series has (an angle\n * ad, then the design it was made from). Bounded and cycle-safe; empty for an ad in no series.\n */\nexport async function seriesLeadsAbove(root: string, slug: string): Promise<string[]> {\n const leads: string[] = [];\n let at = await seriesLeadOf(root, slug);\n while (at && at !== slug && !leads.includes(at) && leads.length < SERIES_DEPTH) {\n leads.push(at);\n at = await seriesLeadOf(root, at);\n }\n return leads;\n}\n\n/** Every ad of the series led by `lead`, by slug, in folder order. */\nexport async function seriesMembers(root: string, lead: string): Promise<string[]> {\n const slugs = await readdir(path.join(root, \"src\", \"creatives\")).catch(() => [] as string[]);\n const members: string[] = [];\n for (const slug of slugs.sort()) {\n if (slug !== lead && (await seriesLeadOf(root, slug)) === lead) members.push(slug);\n }\n return members;\n}\n\nfunction refusal(code: string, message: string, fix: string): SeriesRefusal {\n return { refused: { code, message, fix } };\n}\n\n/**\n * The lead's ready version: the one this workspace shows (its render state), its words as that\n * render drew them, its chosen picture and every size it delivered. A lead never rendered, or\n * whose version still needs fixes, is refused: every ad of the series copies it.\n */\nexport async function leadVersion(\n root: string,\n lead: string,\n fetchRecord: Fetch = fetchRunRecord,\n): Promise<{ lead: SeriesLead; canvas: unknown; spec: unknown } | SeriesRefusal> {\n const file = canvasFile(root, lead);\n const canvas: unknown = existsSync(file) ? JSON.parse(await readFile(file, \"utf8\")) : null;\n if (!canvas || !isStaticAdCanvas(canvas)) {\n return refusal(\n \"series_lead_not_found\",\n `The lead ad \"${lead}\" is not a static ad in this workspace.`,\n \"Name a static ad of this workspace as the lead: make it with `baker creatives make <idea>` and render it first.\",\n );\n }\n const canvasRoot = path.join(root, \"canvas\");\n const state = await readRenderState(canvasRoot, lead);\n const runId = state.rendered?.runId;\n if (!runId) {\n return refusal(\n \"series_lead_not_rendered\",\n `The lead ad \"${lead}\" has no finished version yet: every ad of its series is made from it.`,\n `Render the lead first and get it ready: baker canvas run --slug ${lead}. Then make the series.`,\n );\n }\n if ((state.blocking ?? []).length > 0) {\n return refusal(\n \"series_lead_not_ready\",\n `The lead ad \"${lead}\" still needs fixes (${(state.blocking ?? []).join(\" | \")}): the series would copy them.`,\n `Correct the lead until its verdict is ready (baker canvas run --slug ${lead}, or --fix \"<what to change>\"), then run the series again.`,\n );\n }\n const record = (): Promise<CreativesRunData | null> => fetchRecord(runId).catch(() => null);\n const picture = await previousAdImage(canvasRoot, runId, record, { ...rolesById(canvas), ...relaidPictureRole(canvas) });\n const sizes = await deliveredSizes(canvasRoot, runId, canvas, record);\n if (!picture) {\n return refusal(\n \"series_lead_not_rendered\",\n `The finished picture of the lead's version (${runId}) is not available.`,\n `Render the lead again (baker canvas run --slug ${lead}), then run the series.`,\n );\n }\n const drawn = state.prompt ?? JSON.parse(await readFile(path.join(creativeDir(root, lead), \"prompt.json\"), \"utf8\"));\n const copy = readAdSpec(drawn).copy.map((l) => ({ text: l.text, ...(l.role ? { role: l.role } : {}) }));\n return { lead: { slug: lead, runId, copy, picture, sizes }, canvas, spec: drawn };\n}\n\n/** Each re-laid-out size the lead's version delivered, by format: its local run folder first, else its record. */\nasync function deliveredSizes(\n canvasRoot: string,\n runId: string,\n canvas: unknown,\n record: () => Promise<CreativesRunData | null>,\n): Promise<Record<string, string>> {\n const wanted = new Set(nodesWithRole(canvas, STATIC_ADAPT_FORMAT_ROLE).flatMap((n) => formatOfAdaptId(n.id) ?? []));\n const labels = finalOutputLabelsFromCanvas(canvas);\n const local = await previousDelivered(canvasRoot, runId, labels?.nodeId ?? \"final\", labels?.labels ?? [], {\n prefer: \"url\",\n });\n const found = local.length > 0 ? local : ((await record())?.finalOutputs ?? []).flatMap((o) =>\n o.label && o.url ? [{ format: o.label, path: o.url }] : [],\n );\n return Object.fromEntries(found.filter((d) => wanted.has(d.format)).map((d) => [d.format, d.path]));\n}\n\n/**\n * The lead's canvas with its local paths read from the member's folder: the brand's font and\n * logo are the same files, the member's own `prompt.json` stays its own. Pure.\n */\nexport function rebaseLeadPaths<T>(canvas: T, leadDir: string, memberDir: string): T {\n const out = structuredClone(canvas) as { nodes?: Array<{ id?: unknown; type?: unknown; params?: Record<string, unknown> }> };\n for (const node of out.nodes ?? []) {\n const key = localPathParam(node);\n const value = key ? node.params?.[key] : undefined;\n if (!key || !node.params || typeof value !== \"string\" || node.id === \"prompt\" || path.isAbsolute(value)) continue;\n const rel = path.relative(memberDir, path.resolve(leadDir, value)).split(path.sep).join(\"/\");\n node.params[key] = rel.startsWith(\".\") ? rel : `./${rel}`;\n }\n return out as T;\n}\n\n/** What every ad of a series shares with its lead: everything in prompt.json but its words and who it speaks to. */\nconst DESIGN_FIELDS = [\n \"scene\",\n \"brand\",\n \"colors\",\n \"references\",\n \"logo\",\n \"logo_position\",\n \"third_party_brands\",\n \"formats\",\n \"direction\",\n] as const;\n\n/** The design a spec draws, as one comparable string; null when it does not read as an ad spec. Pure. */\nexport function seriesDesignOf(spec: unknown): string | null {\n try {\n const read = readAdSpec(spec) as Record<string, unknown>;\n return JSON.stringify(DESIGN_FIELDS.map((key) => read[key] ?? null));\n } catch {\n return null;\n }\n}\n\n/** `memberSpec` with the lead's design and its own words, viewer and message. Pure. */\nfunction withLeadDesign(memberSpec: unknown, leadSpec: unknown): Record<string, unknown> {\n // An older blueprint names its design in its own shape: each is taken as the ad spec it reads as.\n const asSpec = (spec: unknown): Record<string, unknown> =>\n isAdSpec(spec) ? (spec as Record<string, unknown>) : readAdSpec(spec);\n const lead = asSpec(leadSpec);\n const out = { ...asSpec(memberSpec) };\n for (const key of DESIGN_FIELDS) {\n if (key in lead) out[key] = lead[key];\n else delete out[key];\n }\n return out;\n}\n\n/** A series ad whose words are still the lead's renders the lead again: refused before anything bills. Pure. */\nexport function unchangedCopyRefusal(lead: SeriesLead, memberSpec: unknown): SeriesRefusal | null {\n const words = (copy: ReadonlyArray<{ text: string }>) => copy.map((l) => l.text.trim()).join(\"\\n\");\n let copy: ReadonlyArray<{ text: string }>;\n try {\n copy = readAdSpec(memberSpec).copy;\n } catch {\n return null;\n }\n if (words(copy) !== words(lead.copy)) return null;\n return refusal(\n \"series_copy_unchanged\",\n `This ad's words are still the lead's (\"${lead.copy[0]?.text ?? \"\"}\"): it would render the lead again.`,\n \"Write this ad's own words in its prompt.json `copy`, one line for each of the lead's (same roles), saying this ad's message. Keep everything else: the design is the lead's.\",\n );\n}\n\n/**\n * A translation whose lines the lead holds as a customer's words (a quote, signed by its shape or\n * its role, or by a signature on the line below) are not those words as the lead has them: the\n * translation puts words the customer never said under their name. Null when every one is kept. Pure.\n */\nexport function changedCustomerWordsRefusal(lead: SeriesLead, memberSpec: unknown): SeriesRefusal | null {\n let copy: ReadonlyArray<{ text: string }>;\n try {\n copy = readAdSpec(memberSpec).copy;\n } catch {\n return null;\n }\n const said = new Set(copy.map((l) => l.text.trim()));\n const changed = lead.copy.filter((line, i) => {\n const below = lead.copy[i + 1];\n const theirs = isCustomersWords(line) || (below !== undefined && isSignatureLine(below));\n return theirs && !said.has(line.text.trim());\n });\n if (changed.length === 0) return null;\n return refusal(\n \"series_customer_words_changed\",\n `This translation changed a customer's own words: ${changed.map((l) => `\"${l.text}\"`).join(\", \")} is how they said it, and translated it would be words they never said under their name.`,\n `Put ${changed.length === 1 ? \"that line\" : \"those lines\"} back in this ad's prompt.json exactly as the lead has ${changed.length === 1 ? \"it\" : \"them\"}: ${changed.map((l) => `\"${l.text}\"`).join(\", \")}. Translate only the advertiser's own lines.`,\n );\n}\n\n/**\n * A design edited on an ad of a series: it is made once, on the ad whose design the whole series\n * has (the last of `leads`), then carried down each series run, the farthest first. Pure.\n */\nexport function designChangedRefusal(lead: string, leads: readonly string[]): SeriesRefusal {\n const chain = leads.length > 0 ? leads : [lead];\n const design = chain[chain.length - 1] ?? lead;\n const runs = [...chain].reverse().map((l) => `baker canvas run --series ${l}`);\n return refusal(\n \"series_design_changed\",\n `This ad's design (its scene, colours, pictures or logo in prompt.json) was changed on the ad itself, but every ad of the series has the design of \"${design}\".`,\n `Make the change once, on ${design}: edit src/creatives/${design}/prompt.json (or baker canvas run --slug ${design} --fix \"<the change>\"), then ${runs.join(\", then \")}: every ad takes the new design, its own words kept. Only this ad's copy belongs in its own prompt.json.`,\n );\n}\n\n/**\n * Write the canvas of series ad `slug` from its lead's ready version. Null when `slug` is no ad\n * of a series; a refusal when its lead is not ready or its words are still the lead's (allowed\n * only when the ad is first made, before its words are written: `leadWords`).\n */\nexport async function writeSeriesMemberCanvas(\n root: string,\n slug: string,\n opts: { fetchRecord?: Fetch; leadWords?: boolean; takeLeadDesign?: boolean } = {},\n): Promise<\n | {\n lead: string;\n leadRunId: string;\n canvasPath: string;\n written: boolean;\n designFromLead: boolean;\n /** The ad was last made from an older version of its lead: this run is a new version of the ad. */\n newLeadVersion: boolean;\n }\n | SeriesRefusal\n | null\n> {\n const lead = await seriesLeadOf(root, slug);\n if (!lead) return null;\n const version = await leadVersion(root, lead, opts.fetchRecord);\n if (\"refused\" in version) return version;\n const dir = creativeDir(root, slug);\n const promptPath = path.join(dir, \"prompt.json\");\n let memberSpec = JSON.parse(await readFile(promptPath, \"utf8\").catch(() => \"null\"));\n const unchanged = opts.leadWords ? null : unchangedCopyRefusal(version.lead, memberSpec);\n if (unchanged) return unchanged;\n const language = await translatedInto(root, slug, lead);\n const rewritten = language ? changedCustomerWordsRefusal(version.lead, memberSpec) : null;\n if (rewritten) return rewritten;\n const file = canvasFile(root, slug);\n const before = await readFile(file, \"utf8\").catch(() => null);\n // The design is the lead's. A new version of the lead carries it to an ad untouched since; a\n // design edited on the ad itself is refused, unless the series run is asked to take the lead's back.\n const leadDesign = seriesDesignOf(version.spec);\n const ownDesign = seriesDesignOf(memberSpec);\n const previous = before\n ? (JSON.parse(before) as { metadata?: { series?: { design?: string; run_id?: string } } }).metadata?.series\n : undefined;\n const synced = previous?.design;\n let designFromLead = false;\n if (leadDesign !== null && ownDesign !== null && ownDesign !== leadDesign) {\n if (!opts.takeLeadDesign && ownDesign !== synced) {\n return designChangedRefusal(lead, await seriesLeadsAbove(root, slug));\n }\n memberSpec = withLeadDesign(memberSpec, version.spec);\n await writeFile(promptPath, `${JSON.stringify(memberSpec, null, 2)}\\n`, \"utf8\");\n designFromLead = true;\n }\n const canvas = seriesMemberAd(\n rebaseLeadPaths(version.canvas, creativeDir(root, lead), dir),\n { ...version.lead, ...(leadDesign !== null ? { design: leadDesign } : {}) },\n language ? { language } : {},\n );\n const text = `${JSON.stringify(canvas, null, 2)}\\n`;\n if (before !== text) await writeFile(file, text, \"utf8\");\n const madeFrom = (await readRenderState(path.join(root, \"canvas\"), slug)).seriesLeadRun;\n const newLeadVersion = madeFrom !== undefined && madeFrom !== version.lead.runId;\n return { lead, leadRunId: version.lead.runId, canvasPath: file, written: before !== text, designFromLead, newLeadVersion };\n}\n\n/**\n * What a run of an ad of a series, or of its lead, says to do next: a new version of the lead\n * reaches the series only through a series run, and a change to the design every ad shares is\n * made once, on the lead. Empty for an ad in no series. Pure.\n */\nexport function seriesRunHints(\n slug: string,\n series: { lead?: string | null; leads?: readonly string[]; members: readonly string[] },\n): string[] {\n // Nearest lead first: a translation of an angle ad takes its design from the ad at the top.\n const leads = series.leads?.length ? series.leads : series.lead ? [series.lead] : [];\n const root = leads[leads.length - 1];\n if (root) {\n const runs = [...leads].reverse().map((lead) => `baker canvas run --series ${lead}`);\n return [\n `This ad is one of the series led by ${leads[0]}: its picture is ${root}'s with its own words. A change to what every ad shares (the picture, colours, layout, logo) is made once, on ${root} (src/creatives/${root}/prompt.json, or baker canvas run --slug ${root} --fix \"<the change>\"), then ${runs.join(\", then \")}. Correct only this ad's own words or its own defect here.`,\n ];\n }\n if (series.members.length === 0) return [];\n return [\n `This ad leads a series of ${series.members.length + 1}: baker canvas run --series ${slug} makes ${series.members.join(\", \")} again from this version, each with its own words. Until then they show the lead's earlier version; an ad of the series run by itself (baker canvas run --slug ${series.members[0]}) is made from this version too, its design included.`,\n ];\n}\n"],"mappings":"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","names":["readFile","path","path","readFile","copy"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
SITE_COLLECTION_MODES,
|
|
3
3
|
SITE_CONSENT_MODES,
|
|
4
4
|
SITE_HOME_MODES
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-XF4JUKVF.js";
|
|
6
6
|
import {
|
|
7
7
|
ApiError
|
|
8
8
|
} from "./chunk-XBOK23HI.js";
|
|
@@ -100,4 +100,4 @@ export {
|
|
|
100
100
|
parseSetArgs,
|
|
101
101
|
failSite
|
|
102
102
|
};
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
103
|
+
//# sourceMappingURL=chunk-JQJDXPCO.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
latestVersion
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4D7UBVSG.js";
|
|
4
4
|
import {
|
|
5
5
|
canvasOutputsRoot
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DZSIUEGH.js";
|
|
7
7
|
|
|
8
8
|
// src/commands/creatives/version-of.ts
|
|
9
9
|
import path from "path";
|
|
@@ -16,4 +16,4 @@ async function versionOf(slug, run) {
|
|
|
16
16
|
export {
|
|
17
17
|
versionOf
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=chunk-
|
|
19
|
+
//# sourceMappingURL=chunk-JWI6GIFJ.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
X_DRAFT_BATCH_MAX,
|
|
13
13
|
xDraftOpInputSchema
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-XF4JUKVF.js";
|
|
15
15
|
import {
|
|
16
16
|
ApiError,
|
|
17
17
|
apiPost
|
|
@@ -166,4 +166,4 @@ export {
|
|
|
166
166
|
requireTarget,
|
|
167
167
|
requireTargets
|
|
168
168
|
};
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
169
|
+
//# sourceMappingURL=chunk-KHRXPQID.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
adCopyHints,
|
|
10
10
|
booleanWordPositionalError,
|
|
11
11
|
capabilityFix
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-T4DD5YMP.js";
|
|
13
13
|
import {
|
|
14
14
|
withHints
|
|
15
15
|
} from "./chunk-D5FY4FAK.js";
|
|
@@ -171,4 +171,4 @@ export {
|
|
|
171
171
|
stageOp,
|
|
172
172
|
stageStatusChange
|
|
173
173
|
};
|
|
174
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-L27H2R2N.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
adCopyHints,
|
|
6
6
|
booleanWordPositionalError,
|
|
7
7
|
capabilityFix
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-T4DD5YMP.js";
|
|
9
9
|
import {
|
|
10
10
|
hintLines,
|
|
11
11
|
withHints
|
|
@@ -493,4 +493,4 @@ export {
|
|
|
493
493
|
draftAction,
|
|
494
494
|
draftListAction
|
|
495
495
|
};
|
|
496
|
-
//# sourceMappingURL=chunk-
|
|
496
|
+
//# sourceMappingURL=chunk-LLOOWRBB.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
IDEA_VIDEO_FORMATS,
|
|
3
3
|
figuresIn,
|
|
4
4
|
unsourcedClaims
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-4QEY2L6U.js";
|
|
6
6
|
import {
|
|
7
7
|
AD_SPEC_SCHEMA
|
|
8
8
|
} from "./chunk-VB6WJJR3.js";
|
|
@@ -157,4 +157,4 @@ export {
|
|
|
157
157
|
unsourcedCopyLines,
|
|
158
158
|
ideaSpec
|
|
159
159
|
};
|
|
160
|
-
//# sourceMappingURL=chunk-
|
|
160
|
+
//# sourceMappingURL=chunk-LYBXCXJB.js.map
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
} from "./chunk-VVZBBKRC.js";
|
|
24
24
|
import {
|
|
25
25
|
videosIngestRequestSchema
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-XF4JUKVF.js";
|
|
27
27
|
import {
|
|
28
28
|
ApiError,
|
|
29
29
|
apiPost
|
|
@@ -360,4 +360,4 @@ export {
|
|
|
360
360
|
runVideoIngest,
|
|
361
361
|
ingestHints
|
|
362
362
|
};
|
|
363
|
-
//# sourceMappingURL=chunk-
|
|
363
|
+
//# sourceMappingURL=chunk-MXYBTMKB.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
flowsDir,
|
|
3
3
|
walkNodes
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YRQYA2LR.js";
|
|
5
5
|
|
|
6
6
|
// src/commands/flows/value-expression.ts
|
|
7
7
|
import { existsSync, readFileSync } from "fs";
|
|
@@ -619,4 +619,4 @@ export {
|
|
|
619
619
|
otherSlots,
|
|
620
620
|
buildFieldMapping
|
|
621
621
|
};
|
|
622
|
-
//# sourceMappingURL=chunk-
|
|
622
|
+
//# sourceMappingURL=chunk-NPY4QUMQ.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
languageTag
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Q43MLYXE.js";
|
|
4
4
|
import {
|
|
5
5
|
parseRefExpr
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-5QGMMZFQ.js";
|
|
7
7
|
import {
|
|
8
8
|
AWARENESS_VALUES
|
|
9
9
|
} from "./chunk-5HYSKH77.js";
|
|
10
10
|
import {
|
|
11
11
|
collectAssetRefLikes,
|
|
12
12
|
isPersistedAssetRef
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-HRYOZUSK.js";
|
|
14
14
|
|
|
15
15
|
// src/commands/canvas/creative-definition.ts
|
|
16
16
|
import { parseDocument } from "yaml";
|
|
@@ -301,4 +301,4 @@ export {
|
|
|
301
301
|
buildInitialRunRecord,
|
|
302
302
|
buildFailedRunRecord
|
|
303
303
|
};
|
|
304
|
-
//# sourceMappingURL=chunk-
|
|
304
|
+
//# sourceMappingURL=chunk-OJ5R2OFK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/canvas/creative-definition.ts","../src/commands/canvas/run-record.ts"],"sourcesContent":["import { parseDocument } from \"yaml\";\nimport { AWARENESS_VALUES, type ViewerProfile } from \"../../viewer-profile.ts\";\nimport { languageTag } from \"../../language.ts\";\n\n// The scaffold's `creatives` collection (src/collections/creatives.ts) accepts exactly these;\n// `creative-definition.parity.test.ts` fails when the two lists drift. An unknown platform or\n// format degrades to the default rather than emitting a definition the collection would reject.\nexport const PLATFORM_VALUES = [\"meta\", \"google\", \"linkedin\", \"tiktok\", \"youtube\", \"x\", \"other\"] as const;\nexport const FORMAT_VALUES = [\"1:1\", \"4:5\", \"9:16\", \"16:9\", \"1.91:1\"] as const;\nexport const CREATIVE_KIND_VALUES = [\"static\", \"video\"] as const;\nexport const CREATIVE_STATUS_VALUES = [\"draft\", \"rendered\", \"published\", \"archived\"] as const;\nexport const SOURCE_KIND_VALUES = [\"image\", \"video\"] as const;\nexport const EVIDENCE_VALUES = [\"observed\", \"interpreted\", \"hypothesized\", \"generated\"] as const;\n\n/** Frontmatter + body for a creative's `_definition.md`, mirroring the scaffold `creatives` collection schema. */\nexport type CreativeSourceKind = (typeof SOURCE_KIND_VALUES)[number];\n\nexport type CreativeDefinitionInput = {\n title: string;\n kind: (typeof CREATIVE_KIND_VALUES)[number];\n platform: string;\n formats: string[];\n status?: (typeof CREATIVE_STATUS_VALUES)[number];\n sourceReferenceUrl?: string;\n sourceAdvertiser?: string;\n /** The library ad it adapted (`baker winning-ads` ids): what `baker_uses` in reference search counts. */\n sourceAdId?: string;\n sourcePlatform?: string;\n sourceAdvertiserId?: string;\n sourceKind?: CreativeSourceKind;\n /** Repo-relative path to the committed source asset (e.g. \"references/original.jpg\"). */\n sourcePath?: string;\n /** The Meta ad set the ad is made for (`baker ads meta adsets`). */\n targetAdSet?: string;\n /** Who that ad set reaches (`baker ads meta adsets --audience`), or the viewer read from the Knowledge. */\n viewer?: ViewerProfile;\n description?: string;\n};\n\n/** Title-case a slug: \"factorial-hr-4x5\" -> \"Factorial Hr 4x5\". Falls back to the slug when empty. */\nexport function titleFromSlug(slug: string): string {\n const title = slug\n .split(\"-\")\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n return title || slug;\n}\n\n/** Coerce a platform flag to a collection-valid value (default \"meta\"). */\nexport function resolvePlatform(platform: string | undefined): string {\n const value = platform?.trim();\n return value && (PLATFORM_VALUES as readonly string[]).includes(value) ? value : \"meta\";\n}\n\n/** A single-format array from the resolved aspect ratio (default [\"4:5\"] when unknown). */\nexport function resolveFormats(aspect: string | undefined): string[] {\n const value = aspect?.trim();\n return value && (FORMAT_VALUES as readonly string[]).includes(value) ? [value] : [\"4:5\"];\n}\n\n/** A deduped list of collection-valid formats (default [\"4:5\"] when none are recognized). */\nexport function resolveFormatList(formats: readonly string[]): string[] {\n const valid = [...new Set(formats.map((f) => f.trim()))].filter((f) =>\n (FORMAT_VALUES as readonly string[]).includes(f),\n );\n return valid.length > 0 ? valid : [\"4:5\"];\n}\n\n/** Best-effort human summary from an image_describe blueprint's ad_intent (for the definition body). */\nexport function describeBlueprintIntent(blueprint: unknown): string | undefined {\n const intent = (blueprint as { ad_intent?: unknown } | null)?.ad_intent;\n if (typeof intent === \"string\" && intent.trim()) return intent.trim();\n if (intent && typeof intent === \"object\") {\n const summary = (intent as { summary?: unknown }).summary ?? (intent as { feeling?: unknown }).feeling;\n if (typeof summary === \"string\" && summary.trim()) return summary.trim();\n }\n return undefined;\n}\n\n// Double-quoted YAML scalar via JSON.stringify — valid YAML that survives colons, quotes, and unicode.\nfunction yamlScalar(value: string): string {\n return JSON.stringify(value);\n}\n\n/** Render `_definition.md` (YAML frontmatter + body) for a creative. */\nexport function buildCreativeDefinition(input: CreativeDefinitionInput): string {\n const lines = [\"---\", `title: ${yamlScalar(input.title)}`, `kind: ${input.kind}`, `platform: ${input.platform}`];\n lines.push(`formats: [${input.formats.map(yamlScalar).join(\", \")}]`);\n lines.push(`status: ${input.status ?? \"draft\"}`);\n if (input.sourceReferenceUrl) lines.push(`sourceReferenceUrl: ${yamlScalar(input.sourceReferenceUrl)}`);\n if (input.sourceAdvertiser) lines.push(`sourceAdvertiser: ${yamlScalar(input.sourceAdvertiser)}`);\n if (input.sourceAdvertiserId) lines.push(`sourceAdvertiserId: ${yamlScalar(input.sourceAdvertiserId)}`);\n if (input.sourceAdId) lines.push(`sourceAdId: ${yamlScalar(input.sourceAdId)}`);\n if (input.sourcePlatform) lines.push(`sourcePlatform: ${input.sourcePlatform}`);\n if (input.sourceKind) lines.push(`sourceKind: ${input.sourceKind}`);\n if (input.sourcePath) lines.push(`sourcePath: ${yamlScalar(input.sourcePath)}`);\n if (input.targetAdSet) lines.push(`targetAdSet: ${yamlScalar(input.targetAdSet)}`);\n // A JSON object is a YAML flow mapping: one line, and every string in it quoted.\n if (input.viewer) lines.push(`viewer: ${JSON.stringify(input.viewer)}`);\n lines.push(\"---\", \"\");\n lines.push(input.description?.trim() || `${input.title} — canvas-built ${input.kind} ad for ${input.platform}.`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/** The library ids a `_definition.md` names, as `DefinitionSourceFields`. */\nexport type DefinitionSourceFields = {\n sourceAdId?: string;\n sourcePlatform?: string;\n sourceAdvertiserId?: string;\n};\n\nconst SOURCE_FIELD_KEYS = [\"sourceAdId\", \"sourcePlatform\", \"sourceAdvertiserId\"] as const;\n\n/**\n * Read the library ids back out of a `_definition.md`, so a sync after the agent edited the\n * file still carries them. Tolerant: no frontmatter, a mid-edit parse error, or a non-string\n * value yields nothing for that field rather than a failed sync.\n */\nexport function parseDefinitionSourceFields(raw: string): DefinitionSourceFields {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return {};\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return {};\n const fields: DefinitionSourceFields = {};\n for (const key of SOURCE_FIELD_KEYS) {\n const value = doc.get(key);\n if (typeof value === \"string\" && value.trim()) fields[key] = value.trim();\n }\n return fields;\n}\n\n/** Why the creative exists, as a `_definition.md` states it (its `idea` sent as `ideaSlug`). */\nexport type DefinitionStrategyFields = {\n ideaSlug?: string;\n message?: string;\n evidence?: (typeof EVIDENCE_VALUES)[number];\n angle?: string;\n persona?: string;\n awareness?: (typeof AWARENESS_VALUES)[number];\n hypothesis?: string;\n /** The lead ad of the series this creative is one of (`series`): its picture is the lead's with other words. */\n seriesLead?: string;\n /** The language its words are in (`language`), as a canonical BCP-47 tag (`es-MX`): a translation's. */\n language?: string;\n};\n\nfunction oneOf<T extends string>(values: readonly T[], value: string | undefined): T | undefined {\n return values.find((allowed) => allowed === value);\n}\n\n/**\n * Read the creative's strategy back out of a `_definition.md`, so the dashboard holds it from the\n * first sync rather than from Publish. Tolerant like `parseDefinitionSourceFields`; an `evidence`\n * or `awareness` the collection would reject is dropped rather than sent.\n */\nexport function parseDefinitionStrategyFields(raw: string): DefinitionStrategyFields {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return {};\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return {};\n const text = (key: string): string | undefined => {\n const value = doc.get(key);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n };\n const ideaSlug = text(\"idea\");\n const message = text(\"message\");\n const evidence = oneOf(EVIDENCE_VALUES, text(\"evidence\"));\n const angle = text(\"angle\");\n const persona = text(\"persona\");\n const awareness = oneOf(AWARENESS_VALUES, text(\"awareness\"));\n const hypothesis = text(\"hypothesis\");\n const seriesLead = text(\"series\");\n const language = languageTag(text(\"language\") ?? \"\");\n return {\n ...(seriesLead ? { seriesLead } : {}),\n ...(language ? { language } : {}),\n ...(ideaSlug ? { ideaSlug } : {}),\n ...(message ? { message } : {}),\n ...(evidence ? { evidence } : {}),\n ...(angle ? { angle } : {}),\n ...(persona ? { persona } : {}),\n ...(awareness ? { awareness } : {}),\n ...(hypothesis ? { hypothesis } : {}),\n };\n}\n\n/** Where a definition places its creative in a series: null for a field it does not name. */\nexport type DefinitionSeriesPlace = { seriesLead: string | null; language: string | null };\n\n/**\n * The series lead and language a `_definition.md` names, each null when it names none, so a\n * sync can tell the backend the creative left its series. Null when the front matter cannot be\n * read (none, or mid-edit invalid YAML): the sync then says nothing and the backend keeps what it has.\n */\nexport function parseDefinitionSeriesPlace(raw: string): DefinitionSeriesPlace | null {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match || parseDocument(match[1] ?? \"\").errors.length > 0) return null;\n const { seriesLead, language } = parseDefinitionStrategyFields(raw);\n return { seriesLead: seriesLead ?? null, language: language ?? null };\n}\n\n/** Who a `_definition.md` says the ad is for: its `targetAdSet` and its recorded `viewer`, unchecked. */\nexport type DefinitionViewerFields = { targetAdSet?: string; viewer?: unknown };\n\n/** Read `targetAdSet` and `viewer` back out of a `_definition.md`; tolerant like `parseDefinitionSourceFields`. */\nexport function parseDefinitionViewerFields(raw: string): DefinitionViewerFields {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return {};\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return {};\n const data = doc.toJS() as { targetAdSet?: unknown; viewer?: unknown } | null;\n const adSet = data?.targetAdSet;\n const targetAdSet = typeof adSet === \"string\" || typeof adSet === \"number\" ? String(adSet).trim() : \"\";\n return {\n ...(targetAdSet ? { targetAdSet } : {}),\n ...(data?.viewer !== undefined ? { viewer: data.viewer } : {}),\n };\n}\n\n/**\n * Record the ad set an ad is for and the viewer it reaches in an existing `_definition.md`,\n * keeping every other field and the body. A file without frontmatter, or one mid-edit, is\n * returned as it is: the viewer is then read again from the ad set on the next run.\n */\nexport function setDefinitionViewer(raw: string, fields: { targetAdSet?: string; viewer?: ViewerProfile }): string {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?\\r?\\n)?---/);\n if (!match) return raw;\n const doc = parseDocument(match[1] ?? \"\");\n if (doc.errors.length > 0) return raw;\n if (fields.targetAdSet) doc.set(\"targetAdSet\", fields.targetAdSet);\n if (fields.viewer) doc.set(\"viewer\", doc.createNode(fields.viewer, { flow: true }));\n return `---\\n${doc.toString()}---${raw.slice(match[0].length)}`;\n}\n","import path from \"node:path\";\nimport type { CanvasRunVerdict } from \"@baker/api\";\nimport type { NodeRunRecord, RunResult } from \"../../engine/engine/executor.ts\";\nimport { parseRefExpr } from \"../../engine/schema/canvas.ts\";\nimport { collectAssetRefLikes, isPersistedAssetRef } from \"../../engine/storage/remote-cache-store.ts\";\n\n// Mirrors of the backend intake caps (canvas/runRecords.ts) so an in-bounds\n// payload is sent even for pathological runs; the server re-caps defensively.\nconst MAX_RUN_NODES = 200;\nconst MAX_OUTPUTS_PER_NODE = 10;\nconst MAX_FINAL_OUTPUTS = 10;\n\nexport type RunRecordOutput = {\n slot: string;\n /** Variant identity from the collect terminal (branch/scene name) — slot stays the stable key. */\n label?: string;\n kind: \"image\" | \"video\" | \"audio\" | \"json\" | \"text\" | \"font\";\n sha256: string;\n url: string;\n mime: string;\n width?: number;\n height?: number;\n durationMs?: number;\n};\n\n/** Labels for a collect-terminated canvas: the collector's node id + one label per collected image. */\nexport type FinalOutputLabels = { nodeId: string; labels: (string | undefined)[] };\n\nexport type RunNodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\";\n\nexport type RunRecordNode = {\n nodeId: string;\n nodeType: string;\n cached: boolean;\n credits: number;\n durationMs: number;\n outputs: RunRecordOutput[];\n /** Upstream node ids ($ref edges) — lets the dashboard render the workflow graph. */\n deps?: string[];\n status?: RunNodeStatus;\n /** Compact params excerpt (prompt text preferred) for graph-node legibility. */\n paramsPreview?: string;\n /** Why this node failed — the real upstream status/provider — set only on `status: \"failed\"`. */\n error?: RunNodeError;\n /** The node's job, from its `tags.role` (e.g. `static_variants`), so readers never parse node ids. */\n role?: string;\n};\n\n/** Display-ready per-node failure detail. Mirrors the engine's `NodeFailureDetail`. */\nexport type RunNodeError = {\n message: string;\n code?: string;\n provider?: string;\n retryable?: boolean;\n};\n\n/** Run attribution stamped on every record post (progress, terminal, initial). */\nexport type RunRecordMeta = {\n creativeSlug?: string;\n canvasPath?: string;\n canvasSha?: string;\n /** Content sha of the rendered source (canvas.json + prompt.json) — powers the dashboard staleness signal. */\n sourceSha?: string;\n chatId?: string;\n /** R2 manifest of the executed canvas + its local file refs — first-write-wins server-side. */\n canvasSnapshotUrl?: string;\n /** R2 copy of the graph this run executes (every node's declaration): what a correction elsewhere grows on. */\n graphUrl?: string;\n /** What the render review found, so it outlives the terminal it was printed to. */\n review?: { severity: \"blocking\" | \"warning\"; what: string; scene?: string }[];\n /**\n * What the review's own model calls cost, as the gateway reported them.\n *\n * The review calls OpenRouter from the Runtime — that is where the finished video is,\n * and shipping 60MB through Convex to reach the same gateway would buy nothing — so\n * this record is what carries the spend back to where it is billed. `costUsd` is\n * OpenRouter's own `usage.cost`, relayed rather than computed: the sandbox never\n * prices anything, which is what makes it safe for the model id to float.\n */\n reviewUsage?: { model: string; inputTokens: number; outputTokens: number; costUsd: number }[];\n /** What the render review said (`@baker/api` CANVAS_RUN_VERDICTS), and whether the run may be shown as a version. */\n verdict?: CanvasRunVerdict;\n presentable?: boolean;\n /** An ad of a series made again from a new version of its lead: a new version of the ad, not a retry. */\n newAsk?: boolean;\n};\n\nexport type RunRecordPayload = {\n runId: string;\n /** `awaiting_approval`: stopped on purpose at a `--until` checkpoint, resumable with the same run id. */\n status: \"running\" | \"completed\" | \"failed\" | \"awaiting_approval\";\n errorMessage?: string;\n stats: { totalNodes: number; cachedNodes: number; totalCredits: number; durationMs: number };\n nodes: RunRecordNode[];\n finalOutputs?: RunRecordOutput[];\n /**\n * What the render review found, sent with the run that produced it.\n *\n * Without this the findings existed only in the CLI's stdout — visible to the agent\n * for one turn and to nobody afterwards. A check whose result leaves no trace cannot\n * be read back, compared between runs, or shown to the person the ad is for, and is\n * indistinguishable from a check that never ran.\n */\n review?: { severity: \"blocking\" | \"warning\"; what: string; scene?: string }[];\n /** Graceful-abort flush (SIGINT/SIGTERM): terminal but resumable — the backend keeps the row adoptable. */\n interrupted?: boolean;\n} & RunRecordMeta;\n\n/** Per-node plan facts (edges + params preview) captured from the engine's plan event. */\nexport type RunPlanInfo = Map<string, { deps: string[]; paramsPreview?: string; role?: string }>;\n\n// Mirrors the backend's CREATIVE_SLUG_MAX_LENGTH — an over-long slug would\n// 400 the whole run record, so attribution is dropped instead.\nconst MAX_CREATIVE_SLUG_LENGTH = 100;\n\n/**\n * A canvas under the repo convention `src/creatives/{slug}/` belongs to that\n * creative; its runs become the creative's generation history. Returns null\n * for canvases anywhere else (and for slugs the backend would reject).\n */\nexport function creativeSlugFromCanvasPath(filePath: string): string | null {\n const normalized = filePath.split(path.sep).join(\"/\");\n const match = normalized.match(/(?:^|\\/)src\\/creatives\\/([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\\//);\n const slug = match?.[1] ?? null;\n return slug && slug.length <= MAX_CREATIVE_SLUG_LENGTH ? slug : null;\n}\n\n/**\n * Best-effort variant labels from a not-yet-validated canvas: when the declared\n * output is a `collect` node, each final inherits the node's explicit\n * `params.labels[i]`, else the producer node id parsed from the raw `$ref` it\n * collects (`$ref:gen_billboard_03.images#0` → `gen_billboard_03`). Null for\n * every other canvas shape — single-output runs stay unlabeled.\n */\nexport function finalOutputLabelsFromCanvas(parsed: unknown): FinalOutputLabels | null {\n const canvas = parsed as { nodes?: unknown; output?: { node?: unknown } } | null;\n const outputNodeId = canvas?.output?.node;\n if (typeof outputNodeId !== \"string\" || !Array.isArray(canvas?.nodes)) return null;\n const node = canvas.nodes.find((n) => (n as { id?: unknown })?.id === outputNodeId) as\n | { type?: unknown; inputs?: { images?: unknown }; params?: { labels?: unknown } }\n | undefined;\n if (node?.type !== \"collect\") return null;\n const explicit = node.params?.labels;\n if (Array.isArray(explicit) && explicit.every((l) => typeof l === \"string\")) {\n return { nodeId: outputNodeId, labels: explicit };\n }\n const images = node.inputs?.images;\n if (!Array.isArray(images)) return null;\n const labels = images.map((entry) => {\n if (typeof entry !== \"string\") return undefined;\n return parseRefExpr(entry)?.nodeId;\n });\n return { nodeId: outputNodeId, labels };\n}\n\nconst OUTPUT_KINDS = new Set([\"image\", \"video\", \"audio\", \"json\", \"text\", \"font\"]);\n\nfunction toRecordOutput(slot: string, value: unknown, label?: string): RunRecordOutput | null {\n const refs = collectAssetRefLikes(value);\n const ref = refs.length === 1 ? refs[0] : null;\n if (!ref || !isPersistedAssetRef(ref)) return null;\n const kind = typeof ref.kind === \"string\" && OUTPUT_KINDS.has(ref.kind) ? ref.kind : null;\n if (!kind) return null;\n return {\n slot,\n label,\n kind: kind as RunRecordOutput[\"kind\"],\n sha256: ref.sha256,\n url: ref.url,\n mime: ref.mime,\n width: typeof ref.width === \"number\" ? ref.width : undefined,\n height: typeof ref.height === \"number\" ? ref.height : undefined,\n durationMs: typeof ref.duration_ms === \"number\" ? ref.duration_ms : undefined,\n };\n}\n\n/**\n * Flatten one node's outputs into record entries. Single refs keep their slot\n * name; arrays become `slot#i`. Values without a persisted ref (plain JSON\n * manifests, refs whose upload failed) are dropped — every stored output must\n * be renderable from R2.\n */\nexport function nodeOutputsToRecord(\n nodeOutputs: Record<string, unknown>,\n labels?: (string | undefined)[],\n): RunRecordOutput[] {\n const out: RunRecordOutput[] = [];\n for (const [slot, value] of Object.entries(nodeOutputs)) {\n if (Array.isArray(value)) {\n value.forEach((item, i) => {\n const rec = toRecordOutput(`${slot}#${i}`, item, labels?.[i]);\n if (rec) out.push(rec);\n });\n } else {\n const rec = toRecordOutput(slot, value);\n if (rec) out.push(rec);\n }\n }\n return out.slice(0, MAX_OUTPUTS_PER_NODE);\n}\n\nfunction finalOutputsToRecord(output: unknown, labels?: (string | undefined)[]): RunRecordOutput[] {\n if (Array.isArray(output)) {\n return output\n .map((item, i) => toRecordOutput(`final#${i}`, item, labels?.[i]))\n .filter((rec): rec is RunRecordOutput => rec !== null)\n .slice(0, MAX_FINAL_OUTPUTS);\n }\n const rec = toRecordOutput(\"final\", output);\n return rec ? [rec] : [];\n}\n\n/** Each delivered size's local file, keyed by its label (or `final#i`), so the agent opens it with Read. */\nexport function finalFiles(output: unknown, labels?: (string | undefined)[]): Record<string, string> {\n const items = Array.isArray(output) ? output : [output];\n const files: Record<string, string> = {};\n items.forEach((item, i) => {\n const ref = collectAssetRefLikes(item)[0];\n if (ref && typeof ref.path === \"string\") files[labels?.[i] ?? `final#${i}`] = ref.path;\n });\n return files;\n}\n\nexport function buildRunRecord(\n result: Pick<RunResult, \"run_id\" | \"output\" | \"outputs_by_node\" | \"stats\"> & { node_runs: NodeRunRecord[] },\n meta: RunRecordMeta,\n plan?: RunPlanInfo,\n finalLabels?: FinalOutputLabels,\n): RunRecordPayload {\n const nodes = result.node_runs.slice(0, MAX_RUN_NODES).map((run): RunRecordNode => {\n const planned = plan?.get(run.node_id);\n return {\n nodeId: run.node_id,\n nodeType: run.node_type,\n cached: run.cached,\n credits: run.credits,\n durationMs: run.duration_ms,\n outputs: nodeOutputsToRecord(\n result.outputs_by_node[run.node_id] ?? {},\n run.node_id === finalLabels?.nodeId ? finalLabels.labels : undefined,\n ),\n deps: planned?.deps,\n status: plan ? \"completed\" : undefined,\n paramsPreview: planned?.paramsPreview,\n ...(planned?.role !== undefined ? { role: planned.role } : {}),\n };\n });\n const finalOutputs = finalOutputsToRecord(result.output, finalLabels?.labels);\n return {\n runId: result.run_id,\n ...meta,\n status: \"completed\",\n stats: {\n totalNodes: result.stats.total_nodes,\n cachedNodes: result.stats.cached_nodes,\n totalCredits: result.stats.total_credits,\n durationMs: result.stats.duration_ms,\n },\n nodes,\n finalOutputs: finalOutputs.length > 0 ? finalOutputs : undefined,\n // Sent whenever the review RAN, empty list included. Sending it only when there\n // were findings makes a clean render and an unreviewed one look identical in the\n // record — which is the exact ambiguity this field was added to remove: proving a\n // review had happened once meant re-running a cached canvas and reading raw JSON.\n // Only the fields the backend keeps: a static review's typed fields (`kind`) stay in the CLI.\n ...(meta.review\n ? { review: meta.review.slice(0, 40).map(({ severity, what, scene }) => ({ severity, what, ...(scene ? { scene } : {}) })) }\n : {}),\n };\n}\n\n/**\n * The empty `running` record posted BEFORE layer 1 executes. This row is the\n * Convex-side in-flight marker: the reconciliation sweep and cross-sandbox\n * resume both key off it, so unlike the fire-and-forget progress stream it is\n * posted synchronously (with retries) at run start.\n */\nexport function buildInitialRunRecord(runId: string, meta: RunRecordMeta): RunRecordPayload {\n return {\n runId,\n ...meta,\n status: \"running\",\n stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },\n nodes: [],\n };\n}\n\nexport function buildFailedRunRecord(runId: string, errorMessage: string, meta: RunRecordMeta): RunRecordPayload {\n return {\n runId,\n ...meta,\n status: \"failed\",\n errorMessage: errorMessage.slice(0, 2000),\n stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },\n nodes: [],\n };\n}\n"],"mappings":"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","names":["rec"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
RESEARCH_GOOGLE_ADS_MAX_COPY
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XF4JUKVF.js";
|
|
4
4
|
|
|
5
5
|
// src/commands/research/hints.ts
|
|
6
6
|
var AD_COPY_ROUTE = 'This returns competing domains and their SERP economics \u2014 no ad copy, no headlines, no creative. For a competitor\'s Google ads and their copy: `baker research google-ads <competitor.com> --copy` (Google\'s Ads Transparency Center: every ad, how long it has run, and the text ads\' headline and description). For Meta and LinkedIn: `baker winning-ads advertisers "<brand>"` \u2192 `baker winning-ads search "<brief>" --advertiser-id <id>` \u2192 `baker winning-ads content <adId>` (`primary_text` / `headline` / `cta`, plus the spoken transcript and on-screen text for video). Do not keep querying this command for copy.';
|
|
@@ -203,4 +203,4 @@ export {
|
|
|
203
203
|
redditPageFix,
|
|
204
204
|
googleAdsHints
|
|
205
205
|
};
|
|
206
|
-
//# sourceMappingURL=chunk-
|
|
206
|
+
//# sourceMappingURL=chunk-OZRUJVIQ.js.map
|
|
@@ -16,10 +16,11 @@ import {
|
|
|
16
16
|
renderedPromptOverLimit,
|
|
17
17
|
spellNumber,
|
|
18
18
|
subgraph,
|
|
19
|
+
sumCredits,
|
|
19
20
|
topologicalLayers,
|
|
20
21
|
validateCanvas,
|
|
21
22
|
validateCanvasDeep
|
|
22
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-5QGMMZFQ.js";
|
|
23
24
|
import {
|
|
24
25
|
remoteCacheEnabledFromEnv
|
|
25
26
|
} from "./chunk-W3B4BHQU.js";
|
|
@@ -94,7 +95,7 @@ import {
|
|
|
94
95
|
persistOutputAssetUrls,
|
|
95
96
|
sha256Hex,
|
|
96
97
|
uploadAndIngest
|
|
97
|
-
} from "./chunk-
|
|
98
|
+
} from "./chunk-HRYOZUSK.js";
|
|
98
99
|
import {
|
|
99
100
|
fetchExternalBytes
|
|
100
101
|
} from "./chunk-YBMVHGY3.js";
|
|
@@ -106,6 +107,9 @@ import {
|
|
|
106
107
|
// src/engine/index.ts
|
|
107
108
|
import path15 from "path";
|
|
108
109
|
|
|
110
|
+
// src/engine/engine/executor.ts
|
|
111
|
+
import { existsSync } from "fs";
|
|
112
|
+
|
|
109
113
|
// src/engine/lib/concurrency.ts
|
|
110
114
|
var DEFAULT_CONCURRENCY = 8;
|
|
111
115
|
function resolveConcurrency(...candidates) {
|
|
@@ -298,7 +302,8 @@ var Engine = class {
|
|
|
298
302
|
const runId = opts.run_id ?? `r_${ulid()}`;
|
|
299
303
|
const writer = new OutputWriter({ outputsDir: this.outputsDir, runId });
|
|
300
304
|
await writer.ensure();
|
|
301
|
-
|
|
305
|
+
const estimate = opts.pinned ? sumCredits((validation.perNodeCredits ?? []).filter((n) => !opts.pinned?.[n.node_id])) : validation.estimatedCredits;
|
|
306
|
+
this.log(`[validate] ok (${canvas.nodes.length} nodes, est. ${estimate} credits)`);
|
|
302
307
|
for (const w of validation.warnings ?? []) {
|
|
303
308
|
this.log(`[warn ] ${w.code}${w.node_id ? ` (${w.node_id})` : ""}: ${w.message}`);
|
|
304
309
|
}
|
|
@@ -449,6 +454,8 @@ var Engine = class {
|
|
|
449
454
|
if (!node) throw new Error(`executor: missing node ${nodeId}`);
|
|
450
455
|
const def = this.registry.get(node.type);
|
|
451
456
|
if (!def) throw new Error(`executor: missing registry entry for type ${node.type}`);
|
|
457
|
+
const pinned = opts.pinned?.[node.id];
|
|
458
|
+
if (pinned) return this.replayPinned(node, pinned, outputs, writer, downloadOutputs);
|
|
452
459
|
const regenerateToken = resolveRegenerateToken(node, opts.regenerate, runId);
|
|
453
460
|
const prepared = await prepareForExecution(node, outputs, def, canvas.cache_salt, regenerateToken, this.assets);
|
|
454
461
|
const policy = opts.cache_policy ?? "read_write";
|
|
@@ -507,6 +514,25 @@ var Engine = class {
|
|
|
507
514
|
this.logOutputWarnings(node.id, hit.outputs);
|
|
508
515
|
return { cached: true, credits: 0, durationMs: Date.now() - cacheT0 };
|
|
509
516
|
}
|
|
517
|
+
/**
|
|
518
|
+
* An earlier run's outputs replayed as this node's result: free, and never rendered again. A
|
|
519
|
+
* local file that is gone falls back to the durable URL, downloaded when a local node needs it.
|
|
520
|
+
*/
|
|
521
|
+
async replayPinned(node, pinned, outputs, writer, downloadOutputs) {
|
|
522
|
+
const t0 = Date.now();
|
|
523
|
+
const replayed = await mapObjectsAsync(pinned, (v) => {
|
|
524
|
+
if (!isAssetRef(v) || typeof v.url !== "string") return void 0;
|
|
525
|
+
if (typeof v.path === "string" && existsSync(v.path)) return Promise.resolve(v);
|
|
526
|
+
const { path: _gone, ...urlOnly } = v;
|
|
527
|
+
if (!downloadOutputs) return Promise.resolve(urlOnly);
|
|
528
|
+
const url = v.url;
|
|
529
|
+
return this.assets.ingestRemote({ kind: v.kind, url, sha256: v.sha256, mime: v.mime, metadata: v.metadata }).then((local) => ({ ...urlOnly, path: local.path }));
|
|
530
|
+
});
|
|
531
|
+
outputs[node.id] = replayed;
|
|
532
|
+
await this.materializeNodeOutputs(node.id, replayed, writer);
|
|
533
|
+
this.log(`[exec ] ${node.id.padEnd(20)} ${node.type.padEnd(20)} kept from the version before`);
|
|
534
|
+
return { cached: true, credits: 0, durationMs: Date.now() - t0 };
|
|
535
|
+
}
|
|
510
536
|
/** Best-effort: a failed upload keeps the outputs local-only, never fails the node. */
|
|
511
537
|
async persistOutputs(nodeId, outputs, ctx) {
|
|
512
538
|
try {
|
|
@@ -5160,4 +5186,4 @@ export {
|
|
|
5160
5186
|
defaultRegistry,
|
|
5161
5187
|
createEngineFromEnv
|
|
5162
5188
|
};
|
|
5163
|
-
//# sourceMappingURL=chunk-
|
|
5189
|
+
//# sourceMappingURL=chunk-PN4WWIHS.js.map
|