@koda-sl/baker-cli 0.447.0-dev.f5788a631 → 0.447.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 +14 -10
- package/dist/account-2ZMZFPIU.js +79 -0
- package/dist/account-F6MHQ64I.js +80 -0
- package/dist/account-writes-ISE4U2FQ.js +66 -0
- package/dist/accounts-RHGN5WMU.js +611 -0
- package/dist/accounts-VINHZRWA.js +77 -0
- package/dist/actions-5F4ZP6M4.js +55 -0
- package/dist/ad-group-writes-UU5NNKSO.js +170 -0
- package/dist/ad-groups-CGFXZNIA.js +68 -0
- package/dist/ad-writes-NALDYWOR.js +174 -0
- package/dist/add-KBPMSK2P.js +104 -0
- package/dist/add-OGH4DZZ5.js +280 -0
- package/dist/ads-56OWZBXZ.js +40 -0
- package/dist/ads-H7GH7A26.js +113 -0
- package/dist/ads-PV7GZXPR.js +77 -0
- package/dist/adsets-H7QT42U6.js +176 -0
- package/dist/advertisers-PM4WPG4N.js +120 -0
- package/dist/advertisers-PM4WPG4N.js.map +1 -0
- package/dist/analytics-5FALU2GL.js +433 -0
- package/dist/analytics-JVZKN735.js +1958 -0
- package/dist/animate-FWWHSYPL.js +480 -0
- package/dist/assign-KLYZ6USE.js +77 -0
- package/dist/audience-size-JHB42DB4.js +94 -0
- package/dist/audiences-JACGRBNN.js +78 -0
- package/dist/audiences-VEKGLWBG.js +268 -0
- package/dist/audit-5XH7WZIM.js +151 -0
- package/dist/autocomplete-7F3PZLEY.js +111 -0
- package/dist/autocomplete-7F3PZLEY.js.map +1 -0
- package/dist/avatars-N4SRNQI7.js +38 -0
- package/dist/bid-pricing-VYLVGU26.js +99 -0
- package/dist/brand-ASBS2HZM.js +22 -0
- package/dist/brief-JSZKDPGU.js +477 -0
- package/dist/brief-JSZKDPGU.js.map +1 -0
- package/dist/campaign-groups-ATE2DE4V.js +95 -0
- package/dist/campaign-writes-ETT57KLQ.js +165 -0
- package/dist/campaign-writes-SX52CJYW.js +170 -0
- package/dist/campaigns-FGBAS6AZ.js +107 -0
- package/dist/campaigns-J6VZBIV6.js +109 -0
- package/dist/campaigns-WBEG5QA4.js +110 -0
- package/dist/campaigns-X3DPCCSN.js +76 -0
- package/dist/canvas-K7IN7HLO.js +46 -0
- package/dist/capabilities-RDAERPYY.js +144 -0
- package/dist/catalog-MENVHL5U.js +65 -0
- package/dist/catalog-MENVHL5U.js.map +1 -0
- package/dist/catalogs-G3YEVG6S.js +128 -0
- package/dist/changes-TP7ZZHB3.js +135 -0
- package/dist/chatgpt-QNUN63YS.js +47 -0
- package/dist/chats-YIAQGQ3X.js +262 -0
- package/dist/chunk-2GK33EJV.js +382 -0
- package/dist/chunk-35XWJEWH.js +274 -0
- package/dist/chunk-3CWL2LY4.js +206 -0
- package/dist/chunk-3CWL2LY4.js.map +1 -0
- package/dist/chunk-4NBVGARW.js +1079 -0
- package/dist/chunk-5R5ADJ47.js +2880 -0
- package/dist/chunk-5R5ADJ47.js.map +1 -0
- package/dist/chunk-65RIB7A6.js +592 -0
- package/dist/chunk-6DB2B3GF.js +175 -0
- package/dist/chunk-7SDFKGQ4.js +363 -0
- package/dist/chunk-ACANMASG.js +19 -0
- package/dist/chunk-ALTBBAYU.js +96 -0
- package/dist/chunk-ANCSKUWI.js +433 -0
- package/dist/chunk-AWMFUGVX.js +160 -0
- package/dist/chunk-AWMFUGVX.js.map +1 -0
- package/dist/chunk-BA7FDXQC.js +197 -0
- package/dist/chunk-BNCW67EM.js +534 -0
- package/dist/chunk-BSC33FLJ.js +217 -0
- package/dist/chunk-CHSNHVYF.js +3182 -0
- package/dist/chunk-CHSNHVYF.js.map +1 -0
- package/dist/chunk-DKGTQSLR.js +310 -0
- package/dist/chunk-DR34ZTWD.js +207 -0
- package/dist/chunk-E4MDJBLO.js +163 -0
- package/dist/chunk-EH4C4CZK.js +455 -0
- package/dist/chunk-FXED3VZK.js +174 -0
- package/dist/chunk-G7UTTEBS.js +337 -0
- package/dist/chunk-GATKK4RJ.js +440 -0
- package/dist/chunk-GATKK4RJ.js.map +1 -0
- package/dist/chunk-GIJT3A5U.js +166 -0
- package/dist/chunk-GX6VAHY7.js +830 -0
- package/dist/chunk-HIPDMQZ6.js +136 -0
- package/dist/chunk-HQSCJYZO.js +26 -0
- package/dist/chunk-HZ5DR5MX.js +51 -0
- package/dist/chunk-I4NEHDSD.js +813 -0
- package/dist/chunk-I4NEHDSD.js.map +1 -0
- package/dist/chunk-IM52NHGL.js +390 -0
- package/dist/chunk-JF47LEPU.js +5163 -0
- package/dist/chunk-JF47LEPU.js.map +1 -0
- package/dist/chunk-K3PN7TN5.js +84 -0
- package/dist/chunk-KBP7WJQB.js +446 -0
- package/dist/chunk-KBP7WJQB.js.map +1 -0
- package/dist/chunk-KLBTXETO.js +23992 -0
- package/dist/chunk-KLBTXETO.js.map +1 -0
- package/dist/chunk-KNWHUMVZ.js +4381 -0
- package/dist/chunk-KNWHUMVZ.js.map +1 -0
- package/dist/chunk-KQTYTCKQ.js +98 -0
- package/dist/chunk-LIQ4SQ2T.js +150 -0
- package/dist/chunk-LW4VSTL5.js +304 -0
- package/dist/chunk-LW4VSTL5.js.map +1 -0
- package/dist/chunk-MADAAZZV.js +169 -0
- package/dist/chunk-MLU6STIN.js +66 -0
- package/dist/chunk-NDXBU22S.js +6145 -0
- package/dist/chunk-NDXBU22S.js.map +1 -0
- package/dist/chunk-NE4F3FHN.js +1854 -0
- package/dist/chunk-NE4F3FHN.js.map +1 -0
- package/dist/chunk-OTFHEHIU.js +1706 -0
- package/dist/chunk-OTFHEHIU.js.map +1 -0
- package/dist/chunk-PDTB5EX6.js +57 -0
- package/dist/chunk-SB3GZFCV.js +622 -0
- package/dist/chunk-T3BDNJIX.js +494 -0
- package/dist/chunk-TEINLN64.js +649 -0
- package/dist/chunk-TEINLN64.js.map +1 -0
- package/dist/chunk-TIOQ7ZFQ.js +496 -0
- package/dist/chunk-U3HAMW5W.js +133 -0
- package/dist/chunk-U6SYRIOB.js +486 -0
- package/dist/chunk-UC6BWM5J.js +159 -0
- package/dist/chunk-ULJ5RFOV.js +76 -0
- package/dist/chunk-VAISMQQB.js +346 -0
- package/dist/chunk-VB6WJJR3.js +1830 -0
- package/dist/chunk-VB6WJJR3.js.map +1 -0
- package/dist/chunk-VDHQJ6HD.js +23 -0
- package/dist/chunk-VMDAXFRI.js +111 -0
- package/dist/chunk-WNFIJAUO.js +98 -0
- package/dist/chunk-WNFIJAUO.js.map +1 -0
- package/dist/chunk-XCM6XWOB.js +417 -0
- package/dist/chunk-XMD4SHFI.js +60 -0
- package/dist/chunk-Y6QAJNKP.js +1411 -0
- package/dist/chunk-YBP7O5P4.js +103 -0
- package/dist/chunk-YC2TQ3VC.js +297 -0
- package/dist/chunk-YPZYOJP6.js +6664 -0
- package/dist/chunk-YPZYOJP6.js.map +1 -0
- package/dist/chunk-ZPU3WDVK.js +92 -0
- package/dist/claim-V4F5GZJK.js +197 -0
- package/dist/cli.js +29 -29
- package/dist/companies-NJGJ7XNN.js +195 -0
- package/dist/complete-MGNF5OAK.js +81 -0
- package/dist/connect-PJOTRTT4.js +36 -0
- package/dist/conversation-4DM26FRD.js +93 -0
- package/dist/conversion-report-N4HANYOB.js +125 -0
- package/dist/conversion-upload-command-TZTHU2CD.js +438 -0
- package/dist/conversion-writes-LW4HQKK5.js +120 -0
- package/dist/conversions-JGECVZSY.js +135 -0
- package/dist/conversions-TS723AZV.js +76 -0
- package/dist/countries-ESAKTQAE.js +82 -0
- package/dist/create-DSGQFBI7.js +207 -0
- package/dist/create-I2KVDTCQ.js +59 -0
- package/dist/create-SBQWVLXG.js +130 -0
- package/dist/create-WOHPIGBK.js +235 -0
- package/dist/creatives-4JGVZQGC.js +182 -0
- package/dist/creatives-DWO5KEQC.js +51 -0
- package/dist/creatives-PSWCNY7U.js +87 -0
- package/dist/credentials-UULYCN2L.js +1055 -0
- package/dist/credentials-UULYCN2L.js.map +1 -0
- package/dist/critique-NGMZK5LX.js +213 -0
- package/dist/critique-NGMZK5LX.js.map +1 -0
- package/dist/critique-TIZJ5GFM.js +1449 -0
- package/dist/crm-2WAR565U.js +224 -0
- package/dist/crm-VDXUO2YU.js +318 -0
- package/dist/currency-XCGKQ7FE.js +88 -0
- package/dist/custom-conversions-6P555U2K.js +125 -0
- package/dist/customers-ATENMXDO.js +56 -0
- package/dist/delete-AVMZYNVT.js +54 -0
- package/dist/delete-H744GNS4.js +63 -0
- package/dist/delete-OEYPFATY.js +66 -0
- package/dist/demographics-M5LJF3RZ.js +138 -0
- package/dist/discard-72I6SM7G.js +66 -0
- package/dist/discover-BJPZNXUQ.js +172 -0
- package/dist/domain-R4EIZD2W.js +98 -0
- package/dist/draft-34C3F5U4.js +217 -0
- package/dist/draft-BBFJNZ5X.js +328 -0
- package/dist/draft-BV2QRPZ4.js +107 -0
- package/dist/draft-THPZFASM.js +281 -0
- package/dist/draft-YYYRWF7M.js +306 -0
- package/dist/engine/index.d.ts +0 -12
- package/dist/engine/index.js +6 -7
- package/dist/facets-F2H52MS4.js +114 -0
- package/dist/feedback-IQKKT4MC.js +66 -0
- package/dist/feedback-IQKKT4MC.js.map +1 -0
- package/dist/feedback-record-UZV4Y7UD.js +175 -0
- package/dist/feedback-record-UZV4Y7UD.js.map +1 -0
- package/dist/fetch-ZUAZPLAE.js +176 -0
- package/dist/fetch-ZUAZPLAE.js.map +1 -0
- package/dist/fit-2CA4JH7N.js +45 -0
- package/dist/flows-CWXCXEUD.js +244 -0
- package/dist/follow-FN7LV3WV.js +82 -0
- package/dist/follow-competitors-MKXFHLXB.js +131 -0
- package/dist/fonts-F2XUCIIW.js +34 -0
- package/dist/forecast-IDKJYM2B.js +104 -0
- package/dist/funnel-RLGQGYKO.js +837 -0
- package/dist/generate-MMBYB44G.js +262 -0
- package/dist/get-C6UQ22HH.js +54 -0
- package/dist/get-EEUR6SAW.js +78 -0
- package/dist/google-35GDU3G3.js +1872 -0
- package/dist/google-35GDU3G3.js.map +1 -0
- package/dist/google-ads-Q37I2D5P.js +195 -0
- package/dist/google-ads-Q37I2D5P.js.map +1 -0
- package/dist/history-4II5QA4B.js +133 -0
- package/dist/history-DBIEYQHY.js +67 -0
- package/dist/hubspot-TTITJFBO.js +779 -0
- package/dist/ideas-V4Q6JDKV.js +32 -0
- package/dist/images-SP5REF6E.js +90 -0
- package/dist/ingest-574GIFAR.js +107 -0
- package/dist/ingest-IC4T76W6.js +23 -0
- package/dist/insights-ZIU6FJMS.js +122 -0
- package/dist/inspect-ATHYY6A2.js +189 -0
- package/dist/inspiration-P265QJ2H.js +53 -0
- package/dist/intent-E3UIVZBN.js +95 -0
- package/dist/keyword-gap-BG6M665A.js +130 -0
- package/dist/keyword-metrics-J4UPUDN7.js +197 -0
- package/dist/keywords-for-site-MWADFEO2.js +128 -0
- package/dist/keywords-for-site-MWADFEO2.js.map +1 -0
- package/dist/landing-R6DN7XLK.js +28 -0
- package/dist/languages-HORKPDNH.js +40 -0
- package/dist/languages-JSGWCC7Z.js +55 -0
- package/dist/leads-7EVHMNUF.js +293 -0
- package/dist/leads-JM6HUERX.js +90 -0
- package/dist/learn-LGS2F5TR.js +203 -0
- package/dist/learn-LGS2F5TR.js.map +1 -0
- package/dist/lighthouse-6ZC45E53.js +75 -0
- package/dist/line-item-writes-KUYEXSIH.js +208 -0
- package/dist/line-items-GIWLP3FL.js +103 -0
- package/dist/link-PVM7XJQI.js +64 -0
- package/dist/linkedin-WX54EAX6.js +1008 -0
- package/dist/list-4ZKQZBCL.js +151 -0
- package/dist/list-MCEFXC6L.js +63 -0
- package/dist/list-WR7QYTON.js +303 -0
- package/dist/locations-74TPQWAT.js +67 -0
- package/dist/locations-J4G5RNPH.js +40 -0
- package/dist/log-U6IWZGOF.js +92 -0
- package/dist/make-RXFHEGUI.js +593 -0
- package/dist/make-RXFHEGUI.js.map +1 -0
- package/dist/map-TWL7T4KP.js +404 -0
- package/dist/mcp-HVAVJGGS.js +476 -0
- package/dist/media-M7E6V2XU.js +15 -0
- package/dist/media-sources-JWGO23BZ.js +32 -0
- package/dist/members-5FAW4YE7.js +44 -0
- package/dist/meta-EZ4SY25M.js +69 -0
- package/dist/metrics-SQDJ5NQO.js +152 -0
- package/dist/models-7U3GRYHF.js +155 -0
- package/dist/normalize-GW4GZNVY.js +138 -0
- package/dist/options-NSUCENLU.js +121 -0
- package/dist/performance-FGCDWHMC.js +24 -0
- package/dist/pixels-45A55MOP.js +60 -0
- package/dist/promoted-tweet-writes-BPWTDESL.js +180 -0
- package/dist/promoted-tweets-OS3NHYVE.js +119 -0
- package/dist/publish-SXZEWBVJ.js +322 -0
- package/dist/query-IEZRY6HV.js +1341 -0
- package/dist/reddit-TF6K37SB.js +26 -0
- package/dist/refresh-APVDWXRZ.js +94 -0
- package/dist/release-32SEJU4L.js +60 -0
- package/dist/relevant-pages-OWMNUCP7.js +99 -0
- package/dist/remove-U64GTHLQ.js +50 -0
- package/dist/reopen-5VS233SF.js +63 -0
- package/dist/rerun-7Z45QOOO.js +85 -0
- package/dist/rerun-7Z45QOOO.js.map +1 -0
- package/dist/research-O7CJV5IS.js +62 -0
- package/dist/research-O7CJV5IS.js.map +1 -0
- package/dist/research-QYSQ6LW4.js +262 -0
- package/dist/reset-22FC7BXQ.js +54 -0
- package/dist/reset-47B5VPT4.js +54 -0
- package/dist/resolve-7KQGVTQT.js +121 -0
- package/dist/retry-J5UVLS72.js +62 -0
- package/dist/retry-UJ5UF4BM.js +60 -0
- package/dist/run-SI4FA32F.js +65 -0
- package/dist/run-TFLFBQU2.js +60 -0
- package/dist/scaffold-ad-SEXNE2K6.js +1549 -0
- package/dist/scaffold-ad-SEXNE2K6.js.map +1 -0
- package/dist/scaffold-static-ad-VBOL6CLN.js +966 -0
- package/dist/scaffold-static-ad-VBOL6CLN.js.map +1 -0
- package/dist/scaffold-video-Z37MIBDI.js +873 -0
- package/dist/scaffold-video-Z37MIBDI.js.map +1 -0
- package/dist/schedule-52ZM4KRQ.js +61 -0
- package/dist/scheduled-agents-PCWCQAKP.js +49 -0
- package/dist/schema-FY6ORDXZ.js +129 -0
- package/dist/search-NS7XNRZC.js +174 -0
- package/dist/search-UO5KJTYS.js +26 -0
- package/dist/select-4XCYVV2G.js +94 -0
- package/dist/select-4XCYVV2G.js.map +1 -0
- package/dist/set-prompt-TRJBYA3D.js +186 -0
- package/dist/set-prompt-TRJBYA3D.js.map +1 -0
- package/dist/setup-links-V3URI7DL.js +141 -0
- package/dist/site-WIQ7SSU3.js +177 -0
- package/dist/sources-DWJXOLEH.js +421 -0
- package/dist/sources-L453U5MT.js +30 -0
- package/dist/stale-6OVG6VME.js +63 -0
- package/dist/stale-6OVG6VME.js.map +1 -0
- package/dist/status-WXWU54WR.js +62 -0
- package/dist/studio-C5K3YX3P.js +49 -0
- package/dist/sync-CDZUTGV3.js +54 -0
- package/dist/sync-definition-BAJQUBE3.js +53 -0
- package/dist/tag-manager-DYZUOIAS.js +43 -0
- package/dist/tags-6RY23XOG.js +20 -0
- package/dist/tags-BHFQWNPL.js +224 -0
- package/dist/tags-SG3NVC3J.js +26 -0
- package/dist/tags-VN5HTL35.js +20 -0
- package/dist/tags-WR6PDIDR.js +20 -0
- package/dist/targeting-criteria-5EXP2NXF.js +113 -0
- package/dist/targets-WUVEJPSD.js +102 -0
- package/dist/templates-LOJQX2NG.js +178 -0
- package/dist/testimonials-6M5DXORT.js +32 -0
- package/dist/top-companies-E2OMMPSV.js +108 -0
- package/dist/translate-AW4CUKDA.js +598 -0
- package/dist/translate-AW4CUKDA.js.map +1 -0
- package/dist/triggers-MRXIDCSN.js +141 -0
- package/dist/unlink-HNL747YM.js +67 -0
- package/dist/unstage-OL2JDCLK.js +84 -0
- package/dist/update-4KGIT4BF.js +142 -0
- package/dist/update-JPBUF7M2.js +98 -0
- package/dist/update-RTTC3SAK.js +155 -0
- package/dist/update-YNNRX5B2.js +63 -0
- package/dist/upload-UIXPCSXJ.js +126 -0
- package/dist/url-options-GGXAL3J4.js +127 -0
- package/dist/url-params-K47CE7Y5.js +98 -0
- package/dist/validate-TD2BY4VE.js +89 -0
- package/dist/validate-TD2BY4VE.js.map +1 -0
- package/dist/videos-BP3BKNTY.js +39 -0
- package/dist/viewer-check-HFRUJ4ZU.js +69 -0
- package/dist/web-RPSGFN4U.js +140 -0
- package/dist/web-RPSGFN4U.js.map +1 -0
- package/dist/winning-ads-WUENRDVJ.js +62 -0
- package/dist/write-commands-4WARNR2T.js +1015 -0
- package/dist/write-commands-TAYGTJEZ.js +737 -0
- package/dist/x-VZCELH3P.js +47 -0
- package/package.json +1 -1
- package/dist/account-4H7QVBRK.js +0 -80
- package/dist/account-PCEZQUK7.js +0 -79
- package/dist/account-writes-AK42HGRM.js +0 -66
- package/dist/accounts-5AXLYU7P.js +0 -77
- package/dist/accounts-OSXDZZLY.js +0 -611
- package/dist/actions-HM4VVTGW.js +0 -55
- package/dist/ad-group-writes-QQS4223F.js +0 -170
- package/dist/ad-groups-WGPDPUI2.js +0 -68
- package/dist/ad-writes-XE2IE4DS.js +0 -174
- package/dist/add-4J2EF54O.js +0 -104
- package/dist/add-VZAY57M4.js +0 -280
- package/dist/ads-6UEDYT3O.js +0 -113
- package/dist/ads-BCOSQALY.js +0 -77
- package/dist/ads-NUME2UXH.js +0 -40
- package/dist/adsets-Q5DWGANV.js +0 -176
- package/dist/advertisers-WSNHNCBQ.js +0 -116
- package/dist/advertisers-WSNHNCBQ.js.map +0 -1
- package/dist/analytics-PHU7H5VY.js +0 -433
- package/dist/analytics-QTR2ZITZ.js +0 -1958
- package/dist/animate-3Z7HXOLE.js +0 -480
- package/dist/assign-IIAVNATI.js +0 -77
- package/dist/audience-size-2L7XMYJL.js +0 -94
- package/dist/audiences-AMRFZRZ7.js +0 -78
- package/dist/audiences-TGD5US2M.js +0 -268
- package/dist/audit-ZCUFJLUG.js +0 -151
- package/dist/autocomplete-6PYFCOMX.js +0 -107
- package/dist/autocomplete-6PYFCOMX.js.map +0 -1
- package/dist/avatars-OEK3FYKK.js +0 -38
- package/dist/bid-pricing-FDW3IY6G.js +0 -99
- package/dist/brand-OXYFSNA5.js +0 -22
- package/dist/brief-TBSXPEXI.js +0 -478
- package/dist/brief-TBSXPEXI.js.map +0 -1
- package/dist/campaign-groups-5GCFQT2W.js +0 -95
- package/dist/campaign-writes-3SJQSCUK.js +0 -165
- package/dist/campaign-writes-SXLZFYF6.js +0 -170
- package/dist/campaigns-7QDDWZ76.js +0 -107
- package/dist/campaigns-D6B6Z67Y.js +0 -110
- package/dist/campaigns-SYEOFKFV.js +0 -109
- package/dist/campaigns-YS3OGQXO.js +0 -76
- package/dist/canvas-B6DPRQGN.js +0 -46
- package/dist/capabilities-GVHPHH2G.js +0 -144
- package/dist/catalog-TNNG66MH.js +0 -66
- package/dist/catalog-TNNG66MH.js.map +0 -1
- package/dist/catalogs-BRXEDE56.js +0 -128
- package/dist/changes-6QBJMGJC.js +0 -135
- package/dist/chatgpt-7W75X3ER.js +0 -47
- package/dist/chats-54CWM7DL.js +0 -262
- package/dist/chunk-2SCPDSFN.js +0 -150
- package/dist/chunk-3X3446TG.js +0 -169
- package/dist/chunk-4SJDDGPV.js +0 -1411
- package/dist/chunk-4SNOWJV7.js +0 -103
- package/dist/chunk-5EEDEVOR.js +0 -486
- package/dist/chunk-5VC6IK7B.js +0 -390
- package/dist/chunk-654U6NU6.js +0 -534
- package/dist/chunk-6HJAHLLA.js +0 -6086
- package/dist/chunk-6HJAHLLA.js.map +0 -1
- package/dist/chunk-6TCDQSM7.js +0 -111
- package/dist/chunk-6YYEBLYI.js +0 -92
- package/dist/chunk-7FVWIZHM.js +0 -382
- package/dist/chunk-7J6EHOH6.js +0 -274
- package/dist/chunk-7JUUKYKG.js +0 -57
- package/dist/chunk-ACFWVULZ.js +0 -304
- package/dist/chunk-ACFWVULZ.js.map +0 -1
- package/dist/chunk-AO5UQQLJ.js +0 -197
- package/dist/chunk-CKU4WYTF.js +0 -175
- package/dist/chunk-CLMM6P6B.js +0 -1751
- package/dist/chunk-CLMM6P6B.js.map +0 -1
- package/dist/chunk-DE6ANJLU.js +0 -310
- package/dist/chunk-DZSIUEGH.js +0 -136
- package/dist/chunk-E5IFTZJ3.js +0 -622
- package/dist/chunk-EAHP7L2R.js +0 -363
- package/dist/chunk-EPMN4BK7.js +0 -217
- package/dist/chunk-EVYXTT7V.js +0 -417
- package/dist/chunk-F46KAIBS.js +0 -159
- package/dist/chunk-FGH4Z5K5.js +0 -433
- package/dist/chunk-FTWJFDIN.js +0 -23992
- package/dist/chunk-FTWJFDIN.js.map +0 -1
- package/dist/chunk-FYQPB2SS.js +0 -207
- package/dist/chunk-GTK46DE3.js +0 -346
- package/dist/chunk-H2QNBOPS.js +0 -819
- package/dist/chunk-H2QNBOPS.js.map +0 -1
- package/dist/chunk-HDWKLFF5.js +0 -96
- package/dist/chunk-HO3IUJ4K.js +0 -70
- package/dist/chunk-HO3IUJ4K.js.map +0 -1
- package/dist/chunk-HRYOZUSK.js +0 -1711
- package/dist/chunk-HRYOZUSK.js.map +0 -1
- package/dist/chunk-HYCIBVDW.js +0 -98
- package/dist/chunk-HYUUH4BE.js +0 -3149
- package/dist/chunk-HYUUH4BE.js.map +0 -1
- package/dist/chunk-IH4UQ2OK.js +0 -6668
- package/dist/chunk-IH4UQ2OK.js.map +0 -1
- package/dist/chunk-IKYNOT57.js +0 -131
- package/dist/chunk-IKYNOT57.js.map +0 -1
- package/dist/chunk-J5IU4OX2.js +0 -297
- package/dist/chunk-KMEMA7AZ.js +0 -496
- package/dist/chunk-KV5BCSUR.js +0 -337
- package/dist/chunk-KWAOTV7F.js +0 -830
- package/dist/chunk-L27H2R2N.js +0 -174
- package/dist/chunk-NK2UFFVH.js +0 -19
- package/dist/chunk-NSA6HRG6.js +0 -60
- package/dist/chunk-NTPXZU3V.js +0 -163
- package/dist/chunk-OAQPHP6V.js +0 -592
- package/dist/chunk-OBDAYP2P.js +0 -3155
- package/dist/chunk-OBDAYP2P.js.map +0 -1
- package/dist/chunk-PIWMNKWI.js +0 -164
- package/dist/chunk-PIWMNKWI.js.map +0 -1
- package/dist/chunk-RB5DB3WN.js +0 -1079
- package/dist/chunk-RCQJHKK5.js +0 -4374
- package/dist/chunk-RCQJHKK5.js.map +0 -1
- package/dist/chunk-SKT3SAHG.js +0 -133
- package/dist/chunk-T4DD5YMP.js +0 -166
- package/dist/chunk-TBEUMOEL.js +0 -95
- package/dist/chunk-TBEUMOEL.js.map +0 -1
- package/dist/chunk-V2X3KK52.js +0 -420
- package/dist/chunk-V2X3KK52.js.map +0 -1
- package/dist/chunk-V5WSJP5A.js +0 -51
- package/dist/chunk-VJZHVOA4.js +0 -509
- package/dist/chunk-VJZHVOA4.js.map +0 -1
- package/dist/chunk-WRIC2RPQ.js +0 -23
- package/dist/chunk-WTOYCUKH.js +0 -84
- package/dist/chunk-WYCVJIHD.js +0 -638
- package/dist/chunk-WYCVJIHD.js.map +0 -1
- package/dist/chunk-XDNEG2H6.js +0 -5189
- package/dist/chunk-XDNEG2H6.js.map +0 -1
- package/dist/chunk-XG3XCHN6.js +0 -26
- package/dist/chunk-XML7AJM3.js +0 -1854
- package/dist/chunk-XML7AJM3.js.map +0 -1
- package/dist/chunk-XV6XCFF7.js +0 -494
- package/dist/chunk-YUPRCOEN.js +0 -455
- package/dist/chunk-ZNBDKK4Y.js +0 -76
- package/dist/chunk-ZZQXVYUY.js +0 -66
- package/dist/claim-CIASHKMC.js +0 -197
- package/dist/companies-ECVMO24S.js +0 -195
- package/dist/complete-32CPBFIG.js +0 -81
- package/dist/connect-OJSOM6PY.js +0 -36
- package/dist/conversation-7FHN5ESN.js +0 -93
- package/dist/conversion-report-XQBJ6LG4.js +0 -125
- package/dist/conversion-upload-command-BBUXLFT3.js +0 -438
- package/dist/conversion-writes-UBCVXP2E.js +0 -120
- package/dist/conversions-7YJDNZ7Y.js +0 -135
- package/dist/conversions-D236RTUK.js +0 -76
- package/dist/countries-FYHM3IMJ.js +0 -82
- package/dist/create-2TBDXHAM.js +0 -130
- package/dist/create-FE5QLW7V.js +0 -207
- package/dist/create-OYT76OMJ.js +0 -235
- package/dist/create-ZGRL7YCV.js +0 -59
- package/dist/creatives-5MUTX4DQ.js +0 -51
- package/dist/creatives-IUB57I3T.js +0 -182
- package/dist/creatives-UEPLNCPN.js +0 -87
- package/dist/credentials-AETHKP5T.js +0 -1055
- package/dist/credentials-AETHKP5T.js.map +0 -1
- package/dist/critique-C53EJDPA.js +0 -214
- package/dist/critique-C53EJDPA.js.map +0 -1
- package/dist/critique-T7HJ42D4.js +0 -1449
- package/dist/crm-JP4UOPMN.js +0 -318
- package/dist/crm-KH6XX2TT.js +0 -224
- package/dist/currency-DJDVIR3C.js +0 -88
- package/dist/custom-conversions-2VLJGPRV.js +0 -125
- package/dist/customers-7I7UY5PS.js +0 -56
- package/dist/delete-6IOUDEWY.js +0 -54
- package/dist/delete-ODFKNHAI.js +0 -63
- package/dist/delete-RAETUVO2.js +0 -66
- package/dist/demographics-2FTDKPBD.js +0 -138
- package/dist/discard-ZX5TLFYH.js +0 -66
- package/dist/discover-M3ZKKFEL.js +0 -172
- package/dist/domain-TH7KIC2T.js +0 -98
- package/dist/draft-CRE2Y24G.js +0 -328
- package/dist/draft-MNFJ4G3C.js +0 -281
- package/dist/draft-S2FSQOJN.js +0 -217
- package/dist/draft-SH25PKST.js +0 -107
- package/dist/draft-YHUIFDDR.js +0 -306
- package/dist/facets-6B2U4BSM.js +0 -114
- package/dist/feedback-QGSAJJVC.js +0 -66
- package/dist/feedback-QGSAJJVC.js.map +0 -1
- package/dist/feedback-record-NUAJ6UBL.js +0 -176
- package/dist/feedback-record-NUAJ6UBL.js.map +0 -1
- package/dist/fetch-UTTJAOLC.js +0 -171
- package/dist/fetch-UTTJAOLC.js.map +0 -1
- package/dist/fit-FJ5CLQS4.js +0 -43
- package/dist/flows-OGGSWWGT.js +0 -244
- package/dist/follow-DUIEGDVK.js +0 -82
- package/dist/follow-competitors-IT5ZVJPE.js +0 -131
- package/dist/fonts-GCJRLEGD.js +0 -34
- package/dist/forecast-2AGTFMXH.js +0 -104
- package/dist/funnel-7U55LNJ4.js +0 -837
- package/dist/generate-DMQUS665.js +0 -262
- package/dist/get-IRJIHOQK.js +0 -78
- package/dist/get-N7FR6NFX.js +0 -54
- package/dist/google-NYRI2NDZ.js +0 -1872
- package/dist/google-NYRI2NDZ.js.map +0 -1
- package/dist/history-PSNJAUTW.js +0 -133
- package/dist/history-Q3QCT64S.js +0 -67
- package/dist/hubspot-2NHL47R2.js +0 -779
- package/dist/ideas-22MRXKT7.js +0 -32
- package/dist/images-LXFWEON7.js +0 -90
- package/dist/ingest-W7VEDEYD.js +0 -107
- package/dist/ingest-ZN3DEZHY.js +0 -23
- package/dist/insights-LNAXV2CG.js +0 -122
- package/dist/inspect-3LBIHMMP.js +0 -189
- package/dist/inspiration-I4MMKAWA.js +0 -53
- package/dist/intent-ICKFJRT2.js +0 -95
- package/dist/keyword-gap-NGPH32FN.js +0 -130
- package/dist/keyword-metrics-PZXFB4NG.js +0 -197
- package/dist/keywords-for-site-RH47P4GJ.js +0 -124
- package/dist/keywords-for-site-RH47P4GJ.js.map +0 -1
- package/dist/landing-D7QS42GK.js +0 -28
- package/dist/languages-JDYL2N5F.js +0 -40
- package/dist/languages-JMVNOHMG.js +0 -55
- package/dist/leads-ARUWPHBM.js +0 -293
- package/dist/leads-E22XFSX2.js +0 -90
- package/dist/learn-Y4KIZNRF.js +0 -204
- package/dist/learn-Y4KIZNRF.js.map +0 -1
- package/dist/lighthouse-NQBUCHTW.js +0 -75
- package/dist/line-item-writes-KA5PVKFO.js +0 -208
- package/dist/line-items-3ZFFZCNH.js +0 -103
- package/dist/link-AEU6BV75.js +0 -64
- package/dist/linkedin-WCB2H5NH.js +0 -1008
- package/dist/list-OLX7AI3O.js +0 -63
- package/dist/list-PAMYQS4X.js +0 -151
- package/dist/list-TOUUGHMS.js +0 -303
- package/dist/locations-2NKBJKBT.js +0 -67
- package/dist/locations-S4U6IJIS.js +0 -40
- package/dist/log-UGVWSK7Z.js +0 -92
- package/dist/make-3PZLTEXT.js +0 -516
- package/dist/make-3PZLTEXT.js.map +0 -1
- package/dist/map-BW4CHSIO.js +0 -404
- package/dist/mcp-JOXKA5HY.js +0 -476
- package/dist/media-53DJRC4N.js +0 -15
- package/dist/media-sources-SJZUOMI2.js +0 -32
- package/dist/members-VAX6KAFN.js +0 -44
- package/dist/meta-A7KM6TF5.js +0 -69
- package/dist/metrics-AY4RP54F.js +0 -152
- package/dist/models-5NTC7A5G.js +0 -155
- package/dist/normalize-IVQ7I54Z.js +0 -138
- package/dist/options-V7C6CU6M.js +0 -121
- package/dist/performance-L6RJZPXX.js +0 -24
- package/dist/pixels-TZPF746S.js +0 -60
- package/dist/promoted-tweet-writes-DBATH765.js +0 -180
- package/dist/promoted-tweets-AU3XF3JD.js +0 -119
- package/dist/publish-G6DYVT4S.js +0 -322
- package/dist/query-CPZZNMDY.js +0 -1341
- package/dist/reddit-S2S6C4RT.js +0 -26
- package/dist/refresh-ARJ2SOMY.js +0 -94
- package/dist/release-3WCBAHPO.js +0 -60
- package/dist/relevant-pages-MTMFMBPD.js +0 -99
- package/dist/remove-FUAARCSC.js +0 -50
- package/dist/reopen-PZI5H4X2.js +0 -63
- package/dist/rerun-AUP4XT6T.js +0 -86
- package/dist/rerun-AUP4XT6T.js.map +0 -1
- package/dist/research-SY3QRGOC.js +0 -262
- package/dist/research-TISR736S.js +0 -59
- package/dist/research-TISR736S.js.map +0 -1
- package/dist/reset-E6F5NXOI.js +0 -54
- package/dist/reset-ZWM7DDD7.js +0 -54
- package/dist/resolve-I5R5ELMZ.js +0 -121
- package/dist/retry-7CFZTKWI.js +0 -60
- package/dist/retry-JO3JXXT2.js +0 -62
- package/dist/run-JR6SILHL.js +0 -61
- package/dist/run-UKB647DI.js +0 -65
- package/dist/scaffold-ad-BYGVU7MT.js +0 -1550
- package/dist/scaffold-ad-BYGVU7MT.js.map +0 -1
- package/dist/scaffold-static-ad-U57V5UV3.js +0 -948
- package/dist/scaffold-static-ad-U57V5UV3.js.map +0 -1
- package/dist/scaffold-video-POZTINEV.js +0 -874
- package/dist/scaffold-video-POZTINEV.js.map +0 -1
- package/dist/schedule-SOAHLZZF.js +0 -61
- package/dist/scheduled-agents-K5WU7SVJ.js +0 -49
- package/dist/schema-SOPL6GJP.js +0 -129
- package/dist/search-5VUDFOHI.js +0 -174
- package/dist/search-XUIVHGAY.js +0 -26
- package/dist/select-T36UH4HL.js +0 -95
- package/dist/select-T36UH4HL.js.map +0 -1
- package/dist/set-prompt-Y4X7GV2Q.js +0 -187
- package/dist/set-prompt-Y4X7GV2Q.js.map +0 -1
- package/dist/setup-links-KFROCISS.js +0 -141
- package/dist/site-MXPKMRQT.js +0 -177
- package/dist/sources-FFHNWVLV.js +0 -30
- package/dist/sources-MLDLMEDT.js +0 -421
- package/dist/stale-UXL4X4AD.js +0 -64
- package/dist/stale-UXL4X4AD.js.map +0 -1
- package/dist/status-M47G5HD4.js +0 -62
- package/dist/studio-HUEBE6DS.js +0 -49
- package/dist/sync-HS7VZJ2H.js +0 -54
- package/dist/sync-definition-PY6REQ4J.js +0 -54
- package/dist/tag-manager-HREEYGVM.js +0 -43
- package/dist/tags-DIXLYB5P.js +0 -224
- package/dist/tags-DYRZTYHD.js +0 -20
- package/dist/tags-MRG56YOE.js +0 -26
- package/dist/tags-WAW6MQAY.js +0 -20
- package/dist/tags-Y4HHJJGE.js +0 -20
- package/dist/targeting-criteria-5UUESFWC.js +0 -113
- package/dist/targets-COZPVG52.js +0 -102
- package/dist/templates-75VFYZ3E.js +0 -178
- package/dist/testimonials-WJBRWLNW.js +0 -32
- package/dist/top-companies-C2R4FG6H.js +0 -108
- package/dist/translate-RYAJAFV7.js +0 -599
- package/dist/translate-RYAJAFV7.js.map +0 -1
- package/dist/triggers-5UHVJPBV.js +0 -141
- package/dist/unlink-PLOOAGM3.js +0 -67
- package/dist/unstage-JIIOTBTF.js +0 -84
- package/dist/update-G6R5ZHUI.js +0 -63
- package/dist/update-QYM6U7LL.js +0 -142
- package/dist/update-RCP7F5L5.js +0 -98
- package/dist/update-RGVNTA5X.js +0 -155
- package/dist/upload-EEJ34Q3Y.js +0 -126
- package/dist/url-options-QEWKRKZ3.js +0 -127
- package/dist/url-params-2G5M2B3J.js +0 -98
- package/dist/validate-M33VLUG4.js +0 -90
- package/dist/validate-M33VLUG4.js.map +0 -1
- package/dist/videos-FVVID55J.js +0 -39
- package/dist/viewer-check-2Q3WHSEL.js +0 -70
- package/dist/web-WUGLSULO.js +0 -135
- package/dist/web-WUGLSULO.js.map +0 -1
- package/dist/winning-ads-OSRFHVLV.js +0 -62
- package/dist/write-commands-CLJOD2XF.js +0 -1015
- package/dist/write-commands-CT74VHH6.js +0 -737
- package/dist/x-EBKLJJPJ.js +0 -47
- /package/dist/{account-PCEZQUK7.js.map → account-2ZMZFPIU.js.map} +0 -0
- /package/dist/{account-4H7QVBRK.js.map → account-F6MHQ64I.js.map} +0 -0
- /package/dist/{account-writes-AK42HGRM.js.map → account-writes-ISE4U2FQ.js.map} +0 -0
- /package/dist/{accounts-OSXDZZLY.js.map → accounts-RHGN5WMU.js.map} +0 -0
- /package/dist/{accounts-5AXLYU7P.js.map → accounts-VINHZRWA.js.map} +0 -0
- /package/dist/{actions-HM4VVTGW.js.map → actions-5F4ZP6M4.js.map} +0 -0
- /package/dist/{ad-group-writes-QQS4223F.js.map → ad-group-writes-UU5NNKSO.js.map} +0 -0
- /package/dist/{ad-groups-WGPDPUI2.js.map → ad-groups-CGFXZNIA.js.map} +0 -0
- /package/dist/{ad-writes-XE2IE4DS.js.map → ad-writes-NALDYWOR.js.map} +0 -0
- /package/dist/{add-4J2EF54O.js.map → add-KBPMSK2P.js.map} +0 -0
- /package/dist/{add-VZAY57M4.js.map → add-OGH4DZZ5.js.map} +0 -0
- /package/dist/{ads-NUME2UXH.js.map → ads-56OWZBXZ.js.map} +0 -0
- /package/dist/{ads-6UEDYT3O.js.map → ads-H7GH7A26.js.map} +0 -0
- /package/dist/{ads-BCOSQALY.js.map → ads-PV7GZXPR.js.map} +0 -0
- /package/dist/{adsets-Q5DWGANV.js.map → adsets-H7QT42U6.js.map} +0 -0
- /package/dist/{analytics-PHU7H5VY.js.map → analytics-5FALU2GL.js.map} +0 -0
- /package/dist/{analytics-QTR2ZITZ.js.map → analytics-JVZKN735.js.map} +0 -0
- /package/dist/{animate-3Z7HXOLE.js.map → animate-FWWHSYPL.js.map} +0 -0
- /package/dist/{assign-IIAVNATI.js.map → assign-KLYZ6USE.js.map} +0 -0
- /package/dist/{audience-size-2L7XMYJL.js.map → audience-size-JHB42DB4.js.map} +0 -0
- /package/dist/{audiences-AMRFZRZ7.js.map → audiences-JACGRBNN.js.map} +0 -0
- /package/dist/{audiences-TGD5US2M.js.map → audiences-VEKGLWBG.js.map} +0 -0
- /package/dist/{audit-ZCUFJLUG.js.map → audit-5XH7WZIM.js.map} +0 -0
- /package/dist/{avatars-OEK3FYKK.js.map → avatars-N4SRNQI7.js.map} +0 -0
- /package/dist/{bid-pricing-FDW3IY6G.js.map → bid-pricing-VYLVGU26.js.map} +0 -0
- /package/dist/{brand-OXYFSNA5.js.map → brand-ASBS2HZM.js.map} +0 -0
- /package/dist/{campaign-groups-5GCFQT2W.js.map → campaign-groups-ATE2DE4V.js.map} +0 -0
- /package/dist/{campaign-writes-3SJQSCUK.js.map → campaign-writes-ETT57KLQ.js.map} +0 -0
- /package/dist/{campaign-writes-SXLZFYF6.js.map → campaign-writes-SX52CJYW.js.map} +0 -0
- /package/dist/{campaigns-7QDDWZ76.js.map → campaigns-FGBAS6AZ.js.map} +0 -0
- /package/dist/{campaigns-SYEOFKFV.js.map → campaigns-J6VZBIV6.js.map} +0 -0
- /package/dist/{campaigns-D6B6Z67Y.js.map → campaigns-WBEG5QA4.js.map} +0 -0
- /package/dist/{campaigns-YS3OGQXO.js.map → campaigns-X3DPCCSN.js.map} +0 -0
- /package/dist/{canvas-B6DPRQGN.js.map → canvas-K7IN7HLO.js.map} +0 -0
- /package/dist/{capabilities-GVHPHH2G.js.map → capabilities-RDAERPYY.js.map} +0 -0
- /package/dist/{catalogs-BRXEDE56.js.map → catalogs-G3YEVG6S.js.map} +0 -0
- /package/dist/{changes-6QBJMGJC.js.map → changes-TP7ZZHB3.js.map} +0 -0
- /package/dist/{chatgpt-7W75X3ER.js.map → chatgpt-QNUN63YS.js.map} +0 -0
- /package/dist/{chats-54CWM7DL.js.map → chats-YIAQGQ3X.js.map} +0 -0
- /package/dist/{chunk-7FVWIZHM.js.map → chunk-2GK33EJV.js.map} +0 -0
- /package/dist/{chunk-7J6EHOH6.js.map → chunk-35XWJEWH.js.map} +0 -0
- /package/dist/{chunk-RB5DB3WN.js.map → chunk-4NBVGARW.js.map} +0 -0
- /package/dist/{chunk-OAQPHP6V.js.map → chunk-65RIB7A6.js.map} +0 -0
- /package/dist/{chunk-CKU4WYTF.js.map → chunk-6DB2B3GF.js.map} +0 -0
- /package/dist/{chunk-EAHP7L2R.js.map → chunk-7SDFKGQ4.js.map} +0 -0
- /package/dist/{chunk-NK2UFFVH.js.map → chunk-ACANMASG.js.map} +0 -0
- /package/dist/{chunk-HDWKLFF5.js.map → chunk-ALTBBAYU.js.map} +0 -0
- /package/dist/{chunk-FGH4Z5K5.js.map → chunk-ANCSKUWI.js.map} +0 -0
- /package/dist/{chunk-AO5UQQLJ.js.map → chunk-BA7FDXQC.js.map} +0 -0
- /package/dist/{chunk-654U6NU6.js.map → chunk-BNCW67EM.js.map} +0 -0
- /package/dist/{chunk-EPMN4BK7.js.map → chunk-BSC33FLJ.js.map} +0 -0
- /package/dist/{chunk-DE6ANJLU.js.map → chunk-DKGTQSLR.js.map} +0 -0
- /package/dist/{chunk-FYQPB2SS.js.map → chunk-DR34ZTWD.js.map} +0 -0
- /package/dist/{chunk-NTPXZU3V.js.map → chunk-E4MDJBLO.js.map} +0 -0
- /package/dist/{chunk-YUPRCOEN.js.map → chunk-EH4C4CZK.js.map} +0 -0
- /package/dist/{chunk-L27H2R2N.js.map → chunk-FXED3VZK.js.map} +0 -0
- /package/dist/{chunk-KV5BCSUR.js.map → chunk-G7UTTEBS.js.map} +0 -0
- /package/dist/{chunk-T4DD5YMP.js.map → chunk-GIJT3A5U.js.map} +0 -0
- /package/dist/{chunk-KWAOTV7F.js.map → chunk-GX6VAHY7.js.map} +0 -0
- /package/dist/{chunk-DZSIUEGH.js.map → chunk-HIPDMQZ6.js.map} +0 -0
- /package/dist/{chunk-XG3XCHN6.js.map → chunk-HQSCJYZO.js.map} +0 -0
- /package/dist/{chunk-V5WSJP5A.js.map → chunk-HZ5DR5MX.js.map} +0 -0
- /package/dist/{chunk-5VC6IK7B.js.map → chunk-IM52NHGL.js.map} +0 -0
- /package/dist/{chunk-WTOYCUKH.js.map → chunk-K3PN7TN5.js.map} +0 -0
- /package/dist/{chunk-HYCIBVDW.js.map → chunk-KQTYTCKQ.js.map} +0 -0
- /package/dist/{chunk-2SCPDSFN.js.map → chunk-LIQ4SQ2T.js.map} +0 -0
- /package/dist/{chunk-3X3446TG.js.map → chunk-MADAAZZV.js.map} +0 -0
- /package/dist/{chunk-ZZQXVYUY.js.map → chunk-MLU6STIN.js.map} +0 -0
- /package/dist/{chunk-7JUUKYKG.js.map → chunk-PDTB5EX6.js.map} +0 -0
- /package/dist/{chunk-E5IFTZJ3.js.map → chunk-SB3GZFCV.js.map} +0 -0
- /package/dist/{chunk-XV6XCFF7.js.map → chunk-T3BDNJIX.js.map} +0 -0
- /package/dist/{chunk-KMEMA7AZ.js.map → chunk-TIOQ7ZFQ.js.map} +0 -0
- /package/dist/{chunk-SKT3SAHG.js.map → chunk-U3HAMW5W.js.map} +0 -0
- /package/dist/{chunk-5EEDEVOR.js.map → chunk-U6SYRIOB.js.map} +0 -0
- /package/dist/{chunk-F46KAIBS.js.map → chunk-UC6BWM5J.js.map} +0 -0
- /package/dist/{chunk-ZNBDKK4Y.js.map → chunk-ULJ5RFOV.js.map} +0 -0
- /package/dist/{chunk-GTK46DE3.js.map → chunk-VAISMQQB.js.map} +0 -0
- /package/dist/{chunk-WRIC2RPQ.js.map → chunk-VDHQJ6HD.js.map} +0 -0
- /package/dist/{chunk-6TCDQSM7.js.map → chunk-VMDAXFRI.js.map} +0 -0
- /package/dist/{chunk-EVYXTT7V.js.map → chunk-XCM6XWOB.js.map} +0 -0
- /package/dist/{chunk-NSA6HRG6.js.map → chunk-XMD4SHFI.js.map} +0 -0
- /package/dist/{chunk-4SJDDGPV.js.map → chunk-Y6QAJNKP.js.map} +0 -0
- /package/dist/{chunk-4SNOWJV7.js.map → chunk-YBP7O5P4.js.map} +0 -0
- /package/dist/{chunk-J5IU4OX2.js.map → chunk-YC2TQ3VC.js.map} +0 -0
- /package/dist/{chunk-6YYEBLYI.js.map → chunk-ZPU3WDVK.js.map} +0 -0
- /package/dist/{claim-CIASHKMC.js.map → claim-V4F5GZJK.js.map} +0 -0
- /package/dist/{companies-ECVMO24S.js.map → companies-NJGJ7XNN.js.map} +0 -0
- /package/dist/{complete-32CPBFIG.js.map → complete-MGNF5OAK.js.map} +0 -0
- /package/dist/{connect-OJSOM6PY.js.map → connect-PJOTRTT4.js.map} +0 -0
- /package/dist/{conversation-7FHN5ESN.js.map → conversation-4DM26FRD.js.map} +0 -0
- /package/dist/{conversion-report-XQBJ6LG4.js.map → conversion-report-N4HANYOB.js.map} +0 -0
- /package/dist/{conversion-upload-command-BBUXLFT3.js.map → conversion-upload-command-TZTHU2CD.js.map} +0 -0
- /package/dist/{conversion-writes-UBCVXP2E.js.map → conversion-writes-LW4HQKK5.js.map} +0 -0
- /package/dist/{conversions-7YJDNZ7Y.js.map → conversions-JGECVZSY.js.map} +0 -0
- /package/dist/{conversions-D236RTUK.js.map → conversions-TS723AZV.js.map} +0 -0
- /package/dist/{countries-FYHM3IMJ.js.map → countries-ESAKTQAE.js.map} +0 -0
- /package/dist/{create-FE5QLW7V.js.map → create-DSGQFBI7.js.map} +0 -0
- /package/dist/{create-ZGRL7YCV.js.map → create-I2KVDTCQ.js.map} +0 -0
- /package/dist/{create-2TBDXHAM.js.map → create-SBQWVLXG.js.map} +0 -0
- /package/dist/{create-OYT76OMJ.js.map → create-WOHPIGBK.js.map} +0 -0
- /package/dist/{creatives-IUB57I3T.js.map → creatives-4JGVZQGC.js.map} +0 -0
- /package/dist/{creatives-5MUTX4DQ.js.map → creatives-DWO5KEQC.js.map} +0 -0
- /package/dist/{creatives-UEPLNCPN.js.map → creatives-PSWCNY7U.js.map} +0 -0
- /package/dist/{critique-T7HJ42D4.js.map → critique-TIZJ5GFM.js.map} +0 -0
- /package/dist/{crm-KH6XX2TT.js.map → crm-2WAR565U.js.map} +0 -0
- /package/dist/{crm-JP4UOPMN.js.map → crm-VDXUO2YU.js.map} +0 -0
- /package/dist/{currency-DJDVIR3C.js.map → currency-XCGKQ7FE.js.map} +0 -0
- /package/dist/{custom-conversions-2VLJGPRV.js.map → custom-conversions-6P555U2K.js.map} +0 -0
- /package/dist/{customers-7I7UY5PS.js.map → customers-ATENMXDO.js.map} +0 -0
- /package/dist/{delete-6IOUDEWY.js.map → delete-AVMZYNVT.js.map} +0 -0
- /package/dist/{delete-ODFKNHAI.js.map → delete-H744GNS4.js.map} +0 -0
- /package/dist/{delete-RAETUVO2.js.map → delete-OEYPFATY.js.map} +0 -0
- /package/dist/{demographics-2FTDKPBD.js.map → demographics-M5LJF3RZ.js.map} +0 -0
- /package/dist/{discard-ZX5TLFYH.js.map → discard-72I6SM7G.js.map} +0 -0
- /package/dist/{discover-M3ZKKFEL.js.map → discover-BJPZNXUQ.js.map} +0 -0
- /package/dist/{domain-TH7KIC2T.js.map → domain-R4EIZD2W.js.map} +0 -0
- /package/dist/{draft-S2FSQOJN.js.map → draft-34C3F5U4.js.map} +0 -0
- /package/dist/{draft-CRE2Y24G.js.map → draft-BBFJNZ5X.js.map} +0 -0
- /package/dist/{draft-SH25PKST.js.map → draft-BV2QRPZ4.js.map} +0 -0
- /package/dist/{draft-MNFJ4G3C.js.map → draft-THPZFASM.js.map} +0 -0
- /package/dist/{draft-YHUIFDDR.js.map → draft-YYYRWF7M.js.map} +0 -0
- /package/dist/{facets-6B2U4BSM.js.map → facets-F2H52MS4.js.map} +0 -0
- /package/dist/{fit-FJ5CLQS4.js.map → fit-2CA4JH7N.js.map} +0 -0
- /package/dist/{flows-OGGSWWGT.js.map → flows-CWXCXEUD.js.map} +0 -0
- /package/dist/{follow-DUIEGDVK.js.map → follow-FN7LV3WV.js.map} +0 -0
- /package/dist/{follow-competitors-IT5ZVJPE.js.map → follow-competitors-MKXFHLXB.js.map} +0 -0
- /package/dist/{fonts-GCJRLEGD.js.map → fonts-F2XUCIIW.js.map} +0 -0
- /package/dist/{forecast-2AGTFMXH.js.map → forecast-IDKJYM2B.js.map} +0 -0
- /package/dist/{funnel-7U55LNJ4.js.map → funnel-RLGQGYKO.js.map} +0 -0
- /package/dist/{generate-DMQUS665.js.map → generate-MMBYB44G.js.map} +0 -0
- /package/dist/{get-N7FR6NFX.js.map → get-C6UQ22HH.js.map} +0 -0
- /package/dist/{get-IRJIHOQK.js.map → get-EEUR6SAW.js.map} +0 -0
- /package/dist/{history-PSNJAUTW.js.map → history-4II5QA4B.js.map} +0 -0
- /package/dist/{history-Q3QCT64S.js.map → history-DBIEYQHY.js.map} +0 -0
- /package/dist/{hubspot-2NHL47R2.js.map → hubspot-TTITJFBO.js.map} +0 -0
- /package/dist/{ideas-22MRXKT7.js.map → ideas-V4Q6JDKV.js.map} +0 -0
- /package/dist/{images-LXFWEON7.js.map → images-SP5REF6E.js.map} +0 -0
- /package/dist/{ingest-W7VEDEYD.js.map → ingest-574GIFAR.js.map} +0 -0
- /package/dist/{ingest-ZN3DEZHY.js.map → ingest-IC4T76W6.js.map} +0 -0
- /package/dist/{insights-LNAXV2CG.js.map → insights-ZIU6FJMS.js.map} +0 -0
- /package/dist/{inspect-3LBIHMMP.js.map → inspect-ATHYY6A2.js.map} +0 -0
- /package/dist/{inspiration-I4MMKAWA.js.map → inspiration-P265QJ2H.js.map} +0 -0
- /package/dist/{intent-ICKFJRT2.js.map → intent-E3UIVZBN.js.map} +0 -0
- /package/dist/{keyword-gap-NGPH32FN.js.map → keyword-gap-BG6M665A.js.map} +0 -0
- /package/dist/{keyword-metrics-PZXFB4NG.js.map → keyword-metrics-J4UPUDN7.js.map} +0 -0
- /package/dist/{landing-D7QS42GK.js.map → landing-R6DN7XLK.js.map} +0 -0
- /package/dist/{languages-JDYL2N5F.js.map → languages-HORKPDNH.js.map} +0 -0
- /package/dist/{languages-JMVNOHMG.js.map → languages-JSGWCC7Z.js.map} +0 -0
- /package/dist/{leads-ARUWPHBM.js.map → leads-7EVHMNUF.js.map} +0 -0
- /package/dist/{leads-E22XFSX2.js.map → leads-JM6HUERX.js.map} +0 -0
- /package/dist/{lighthouse-NQBUCHTW.js.map → lighthouse-6ZC45E53.js.map} +0 -0
- /package/dist/{line-item-writes-KA5PVKFO.js.map → line-item-writes-KUYEXSIH.js.map} +0 -0
- /package/dist/{line-items-3ZFFZCNH.js.map → line-items-GIWLP3FL.js.map} +0 -0
- /package/dist/{link-AEU6BV75.js.map → link-PVM7XJQI.js.map} +0 -0
- /package/dist/{linkedin-WCB2H5NH.js.map → linkedin-WX54EAX6.js.map} +0 -0
- /package/dist/{list-PAMYQS4X.js.map → list-4ZKQZBCL.js.map} +0 -0
- /package/dist/{list-OLX7AI3O.js.map → list-MCEFXC6L.js.map} +0 -0
- /package/dist/{list-TOUUGHMS.js.map → list-WR7QYTON.js.map} +0 -0
- /package/dist/{locations-2NKBJKBT.js.map → locations-74TPQWAT.js.map} +0 -0
- /package/dist/{locations-S4U6IJIS.js.map → locations-J4G5RNPH.js.map} +0 -0
- /package/dist/{log-UGVWSK7Z.js.map → log-U6IWZGOF.js.map} +0 -0
- /package/dist/{map-BW4CHSIO.js.map → map-TWL7T4KP.js.map} +0 -0
- /package/dist/{mcp-JOXKA5HY.js.map → mcp-HVAVJGGS.js.map} +0 -0
- /package/dist/{media-53DJRC4N.js.map → media-M7E6V2XU.js.map} +0 -0
- /package/dist/{media-sources-SJZUOMI2.js.map → media-sources-JWGO23BZ.js.map} +0 -0
- /package/dist/{members-VAX6KAFN.js.map → members-5FAW4YE7.js.map} +0 -0
- /package/dist/{meta-A7KM6TF5.js.map → meta-EZ4SY25M.js.map} +0 -0
- /package/dist/{metrics-AY4RP54F.js.map → metrics-SQDJ5NQO.js.map} +0 -0
- /package/dist/{models-5NTC7A5G.js.map → models-7U3GRYHF.js.map} +0 -0
- /package/dist/{normalize-IVQ7I54Z.js.map → normalize-GW4GZNVY.js.map} +0 -0
- /package/dist/{options-V7C6CU6M.js.map → options-NSUCENLU.js.map} +0 -0
- /package/dist/{performance-L6RJZPXX.js.map → performance-FGCDWHMC.js.map} +0 -0
- /package/dist/{pixels-TZPF746S.js.map → pixels-45A55MOP.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-DBATH765.js.map → promoted-tweet-writes-BPWTDESL.js.map} +0 -0
- /package/dist/{promoted-tweets-AU3XF3JD.js.map → promoted-tweets-OS3NHYVE.js.map} +0 -0
- /package/dist/{publish-G6DYVT4S.js.map → publish-SXZEWBVJ.js.map} +0 -0
- /package/dist/{query-CPZZNMDY.js.map → query-IEZRY6HV.js.map} +0 -0
- /package/dist/{reddit-S2S6C4RT.js.map → reddit-TF6K37SB.js.map} +0 -0
- /package/dist/{refresh-ARJ2SOMY.js.map → refresh-APVDWXRZ.js.map} +0 -0
- /package/dist/{release-3WCBAHPO.js.map → release-32SEJU4L.js.map} +0 -0
- /package/dist/{relevant-pages-MTMFMBPD.js.map → relevant-pages-OWMNUCP7.js.map} +0 -0
- /package/dist/{remove-FUAARCSC.js.map → remove-U64GTHLQ.js.map} +0 -0
- /package/dist/{reopen-PZI5H4X2.js.map → reopen-5VS233SF.js.map} +0 -0
- /package/dist/{research-SY3QRGOC.js.map → research-QYSQ6LW4.js.map} +0 -0
- /package/dist/{reset-E6F5NXOI.js.map → reset-22FC7BXQ.js.map} +0 -0
- /package/dist/{reset-ZWM7DDD7.js.map → reset-47B5VPT4.js.map} +0 -0
- /package/dist/{resolve-I5R5ELMZ.js.map → resolve-7KQGVTQT.js.map} +0 -0
- /package/dist/{retry-JO3JXXT2.js.map → retry-J5UVLS72.js.map} +0 -0
- /package/dist/{retry-7CFZTKWI.js.map → retry-UJ5UF4BM.js.map} +0 -0
- /package/dist/{run-UKB647DI.js.map → run-SI4FA32F.js.map} +0 -0
- /package/dist/{run-JR6SILHL.js.map → run-TFLFBQU2.js.map} +0 -0
- /package/dist/{schedule-SOAHLZZF.js.map → schedule-52ZM4KRQ.js.map} +0 -0
- /package/dist/{scheduled-agents-K5WU7SVJ.js.map → scheduled-agents-PCWCQAKP.js.map} +0 -0
- /package/dist/{schema-SOPL6GJP.js.map → schema-FY6ORDXZ.js.map} +0 -0
- /package/dist/{search-5VUDFOHI.js.map → search-NS7XNRZC.js.map} +0 -0
- /package/dist/{search-XUIVHGAY.js.map → search-UO5KJTYS.js.map} +0 -0
- /package/dist/{setup-links-KFROCISS.js.map → setup-links-V3URI7DL.js.map} +0 -0
- /package/dist/{site-MXPKMRQT.js.map → site-WIQ7SSU3.js.map} +0 -0
- /package/dist/{sources-MLDLMEDT.js.map → sources-DWJXOLEH.js.map} +0 -0
- /package/dist/{sources-FFHNWVLV.js.map → sources-L453U5MT.js.map} +0 -0
- /package/dist/{status-M47G5HD4.js.map → status-WXWU54WR.js.map} +0 -0
- /package/dist/{studio-HUEBE6DS.js.map → studio-C5K3YX3P.js.map} +0 -0
- /package/dist/{sync-HS7VZJ2H.js.map → sync-CDZUTGV3.js.map} +0 -0
- /package/dist/{sync-definition-PY6REQ4J.js.map → sync-definition-BAJQUBE3.js.map} +0 -0
- /package/dist/{tag-manager-HREEYGVM.js.map → tag-manager-DYZUOIAS.js.map} +0 -0
- /package/dist/{tags-WAW6MQAY.js.map → tags-6RY23XOG.js.map} +0 -0
- /package/dist/{tags-DIXLYB5P.js.map → tags-BHFQWNPL.js.map} +0 -0
- /package/dist/{tags-MRG56YOE.js.map → tags-SG3NVC3J.js.map} +0 -0
- /package/dist/{tags-DYRZTYHD.js.map → tags-VN5HTL35.js.map} +0 -0
- /package/dist/{tags-Y4HHJJGE.js.map → tags-WR6PDIDR.js.map} +0 -0
- /package/dist/{targeting-criteria-5UUESFWC.js.map → targeting-criteria-5EXP2NXF.js.map} +0 -0
- /package/dist/{targets-COZPVG52.js.map → targets-WUVEJPSD.js.map} +0 -0
- /package/dist/{templates-75VFYZ3E.js.map → templates-LOJQX2NG.js.map} +0 -0
- /package/dist/{testimonials-WJBRWLNW.js.map → testimonials-6M5DXORT.js.map} +0 -0
- /package/dist/{top-companies-C2R4FG6H.js.map → top-companies-E2OMMPSV.js.map} +0 -0
- /package/dist/{triggers-5UHVJPBV.js.map → triggers-MRXIDCSN.js.map} +0 -0
- /package/dist/{unlink-PLOOAGM3.js.map → unlink-HNL747YM.js.map} +0 -0
- /package/dist/{unstage-JIIOTBTF.js.map → unstage-OL2JDCLK.js.map} +0 -0
- /package/dist/{update-QYM6U7LL.js.map → update-4KGIT4BF.js.map} +0 -0
- /package/dist/{update-RCP7F5L5.js.map → update-JPBUF7M2.js.map} +0 -0
- /package/dist/{update-RGVNTA5X.js.map → update-RTTC3SAK.js.map} +0 -0
- /package/dist/{update-G6R5ZHUI.js.map → update-YNNRX5B2.js.map} +0 -0
- /package/dist/{upload-EEJ34Q3Y.js.map → upload-UIXPCSXJ.js.map} +0 -0
- /package/dist/{url-options-QEWKRKZ3.js.map → url-options-GGXAL3J4.js.map} +0 -0
- /package/dist/{url-params-2G5M2B3J.js.map → url-params-K47CE7Y5.js.map} +0 -0
- /package/dist/{videos-FVVID55J.js.map → videos-BP3BKNTY.js.map} +0 -0
- /package/dist/{viewer-check-2Q3WHSEL.js.map → viewer-check-HFRUJ4ZU.js.map} +0 -0
- /package/dist/{winning-ads-OSRFHVLV.js.map → winning-ads-WUENRDVJ.js.map} +0 -0
- /package/dist/{write-commands-CLJOD2XF.js.map → write-commands-4WARNR2T.js.map} +0 -0
- /package/dist/{write-commands-CT74VHH6.js.map → write-commands-TAYGTJEZ.js.map} +0 -0
- /package/dist/{x-EBKLJJPJ.js.map → x-VZCELH3P.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/creatives/make.ts"],"sourcesContent":["/**\n * `baker creatives make <idea>`: one idea becomes one creative. For a static it finds a reference\n * for the job itself (the idea's container, made for our viewer), keeps the first whose\n * load-bearing parts we can supply, scaffolds from it, and records the idea on the creative and\n * its message in the ad spec. The agent then writes only the copy lines and the scene, and runs it.\n */\n\nimport { mkdtemp, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport type { ScopedWinnersSearchResponse } from \"@baker/api/ad-library\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport type { ConceptCarry } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { readAdSpec, SPEC_SHAPES_HINT, unwrittenProblems } from \"../../engine/scaffold/static-ad-spec.ts\";\nimport { projectStaticBriefs } from \"../../engine/scaffold/static-render-briefs.ts\";\nimport { optionalChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { type ViewerTemperature, viewerFromKnowledge } from \"../../viewer-profile.ts\";\nimport { runBaker as baker } from \"../baker-child.ts\";\nimport { findWorkspaceRoot } from \"../canvas/normalize-paths.ts\";\nimport { liveViewerLookups } from \"../canvas/viewer-check.ts\";\nimport { conceptFromFit, type FitAnswer, type FitFailure, fitReference, NO_FIT_HINT } from \"../winning-ads/fit.ts\";\nimport { buildSearchBody } from \"../winning-ads/search.ts\";\nimport { checkIdeas, type EvidenceLevel, type Idea, type IdeaCheck, sourcesClaims } from \"./ideas-model.ts\";\nimport {\n coverageOf,\n IDEAS_DIR,\n readCreativeRecords,\n readIdeas,\n readInsights,\n readKnowledgeCorpus,\n readPersonaIds,\n} from \"./ideas-workspace.ts\";\nimport {\n definitionFieldsOf,\n fitsIdea,\n ideaSpec,\n isVideoIdea,\n missingElements,\n pooledCandidates,\n referenceSearchesFor,\n setDefinitionFields,\n setSpecMessage,\n unsourcedCopyLines,\n withFitConcept,\n} from \"./make-model.ts\";\nimport { makeSeriesAd, seriesMadeEnvelope } from \"./make-series.ts\";\n\n/** Candidates whose fit may be asked (a few cents each, cached per workspace). */\nconst FITS_TRIED = 6;\n/**\n * Fits asked at a time: the best-ranked candidate is usually kept, so the rest wait for a slot that\n * one not fitting frees (six at once billed six fits where one was kept).\n */\nconst FITS_AT_ONCE = 3;\nconst SEARCH_TIMEOUT_MS = 120_000;\n/**\n * How long make looks for, checks and describes a reference before it starts the ad from the idea.\n * Every ad starts from a proven one when it can: dev, Oct 2026, a search took 3-30 s, a fit 20-50 s\n * and the describe ~35 s beside them, so the 50 s this once was sent good references to the idea.\n */\nconst REFERENCE_MS = 150_000;\n\nconst DESCRIPTION = `Build one idea from src/creatives/_ideas/ into a creative. For a static it builds on a proven winning ad in the idea's container: it searches on the idea's message for our viewer, then the container's strongest winners from any category, checks which fit us, scaffolds the creative on the best-ranked one, records the idea on it and sets the ad's message. The fit says what made that ad win, so what ours carries of it (\\`reference.carry\\`: whole_ad, layout, hook or angle); its first hint names the ad: tell the person. When no proven ad fits, it starts the ad from the idea itself and says why (never a dead end, never retry with another format). You then write the copy lines and the scene in prompt.json and run it. Takes up to about two and a half minutes: run it in the foreground, once per idea.\n\nStart here, with an idea from \\`baker creatives ideas\\` build_next:\n baker creatives make phone-payroll # static: reference found and checked for you\n baker creatives make phone-payroll --adset 120210000000 # written for that ad set's viewer\n baker creatives make phone-payroll --reference 1310524137919413 # your own reference instead\n baker creatives make founder-story --spec beats.json # a video idea: from its beats spec\n baker creatives make phone-payroll --slug phone-payroll-h2 # another hook of the same idea\n baker creatives make tiktok-speed --series zernio-live # another message in the style of a ready ad\nThen: edit src/creatives/<slug>/prompt.json (copy + scene; the message is set), and \\`baker canvas run src/creatives/<slug>/<slug>.canvas.json\\`.`;\n\nconst ARGS = {\n idea: { type: \"positional\", required: true, description: \"The idea id (src/creatives/_ideas/<idea>.md)\" },\n slug: { type: \"string\", required: false, description: \"Creative slug (default: the idea id)\" },\n adset: { type: \"string\", required: false, description: \"Meta ad set the ad is for: its viewer and placements\" },\n reference: {\n type: \"string\",\n required: false,\n description: \"A library ad id to build on instead of searching (statics)\",\n },\n platform: {\n type: \"string\",\n required: false,\n description: \"Library platform of --reference: meta|linkedin|tiktok (default meta)\",\n },\n spec: {\n type: \"string\",\n required: false,\n description: \"Video ideas: the beats spec for `baker canvas scaffold-ad --spec`\",\n },\n series: {\n type: \"string\",\n required: false,\n description:\n \"Statics: make this idea as another ad of the series led by this creative (its slug): the same design, only its words changed. No reference is searched; seconds. The lead must have a ready version. Then write its words and run the whole series: baker canvas run --series <lead>\",\n },\n \"from-idea\": {\n type: \"boolean\",\n required: false,\n default: false,\n description:\n \"Statics: skip the reference search and start from the idea (what make does by itself when no proven ad fits)\",\n },\n} as const;\n\nregisterSchema({ command: \"creatives.make\", description: DESCRIPTION, args: ARGS });\n\ntype Failure = { code: string; message: string; fix?: string };\n\nfunction fail(error: Failure): never {\n writeJson({ ok: false, error });\n process.exit(1);\n}\n\nasync function viewerTemperature(\n root: string,\n adSet: string | undefined,\n awareness: string,\n): Promise<ViewerTemperature> {\n if (adSet) {\n const read = await liveViewerLookups(root)\n .adSetViewer(adSet)\n .catch(() => null);\n if (read) return read.temperature;\n }\n return viewerFromKnowledge({ personas: [], awareness: awareness as never }).temperature;\n}\n\ntype Picked = {\n adId: string;\n platform: \"meta\" | \"linkedin\" | \"tiktok\";\n advertiserId?: string;\n why: string;\n tried: number;\n /** The fit that kept it, with what made it win (`carry`); none for a reference chosen by hand. */\n fit?: FitAnswer;\n};\n\nconst asPlatform = (value: unknown): Picked[\"platform\"] =>\n value === \"linkedin\" || value === \"tiktok\" ? value : \"meta\";\n\ntype Candidate = { ad_id?: string | null; platform?: unknown; advertiser_id?: string | null };\ntype FitResult = Awaited<ReturnType<typeof fitReference>>;\n\n/** How references are found and checked; the live library and fit by default, injected in tests. */\nexport type ReferenceDeps = {\n search: (body: Record<string, unknown>) => Promise<Candidate[]>;\n fit: (platform: Picked[\"platform\"], adId: string) => Promise<FitResult>;\n};\n\nfunction liveReferenceDeps(root: string): ReferenceDeps {\n return {\n search: async (body) =>\n (\n await apiPost<ScopedWinnersSearchResponse>(\"/api/ad-library/winners/search\", body, {\n timeoutMs: SEARCH_TIMEOUT_MS,\n }).catch(() => null)\n )?.results ?? [],\n fit: (platform, adId) => fitReference(root, platform, adId),\n };\n}\n\n/** The candidates of every search, the better search's first; every search runs at once. */\nasync function findCandidates(searches: Record<string, unknown>[], deps: ReferenceDeps): Promise<Candidate[]> {\n const results = await Promise.all(searches.map((search) => deps.search(search).catch(() => [] as Candidate[])));\n return pooledCandidates(results, FITS_TRIED);\n}\n\n/**\n * Search the idea's container and keep the best-ranked reference whose load-bearing parts we can\n * supply. Three fits run at once (a few cents each): one after another, one make took 109 s.\n */\n/**\n * What building on a reference started before its fit was known left behind: `prepared` when the\n * reference kept is the one built on, `discarded` (to wait for before building over it) when not.\n */\ntype Speculated<T> = { prepared?: Promise<T>; discarded?: Promise<T> };\n\n/** The reference a build starts on, as `prepare` is handed it before its fit is known. */\nexport type ReferenceCandidate = Pick<Picked, \"adId\" | \"platform\" | \"advertiserId\">;\n\nconst candidateOf = (c: Candidate): ReferenceCandidate => ({\n adId: String(c.ad_id),\n platform: asPlatform(c.platform),\n ...(c.advertiser_id ? { advertiserId: c.advertiser_id } : {}),\n});\n\nexport async function pickReference<T = never>(\n root: string,\n searches: Record<string, unknown>[],\n deps: ReferenceDeps = liveReferenceDeps(root),\n /**\n * Building on the best-ranked reference, started while the fits are asked: it is usually the one\n * kept, and its scaffold (a 35 s describe) then no longer waits ~25 s for them (dev, Oct 2026).\n */\n prepare?: (candidate: ReferenceCandidate, signal: AbortSignal) => Promise<T>,\n /** Aborted when the time for a reference is out: no reference is kept, and the build started is stopped. */\n within?: AbortSignal,\n): Promise<(Picked & Speculated<T>) | (Failure & Speculated<T>)> {\n const out = whenAborted(within);\n const found = await Promise.race([findCandidates(searches, deps), out]);\n if (found === \"out\") return slowReference();\n const candidates = found.slice(0, FITS_TRIED);\n const first = candidates[0];\n // A build on a reference that is not kept is stopped, not waited for (dev: 50 s for nothing).\n const stop = new AbortController();\n const building = first && prepare ? prepare(candidateOf(first), stop.signal) : undefined;\n // A failed speculative build is never this pick's failure: the kept reference is built again.\n void building?.catch(() => undefined);\n // Three fits are asked at once, and one that does not fit asks the next; the best-ranked one that\n // fits is kept as soon as it and every better-ranked one have answered, never waiting on slower\n // fits below it. Once the pick is made, no further fit is asked.\n let settled = false;\n const asked: Promise<FitResult>[] = [];\n const askNext = () => {\n const index = asked.length;\n const candidate = candidates[index];\n if (settled || !candidate) return;\n asked.push(\n askFit(deps, candidate).then((fit) => {\n if (!(fit.ok && fitsIdea(fit.fit))) askNext();\n return fit;\n }),\n );\n };\n for (let slot = 0; slot < FITS_AT_ONCE; slot++) askNext();\n const kept = await Promise.race([firstFitting(candidates, asked), out]);\n settled = true;\n if (kept === \"out\") {\n stop.abort();\n return { ...slowReference(), ...(building ? { discarded: building } : {}) };\n }\n if (kept.index !== 0) stop.abort();\n const speculated = building ? (kept.index === 0 ? { prepared: building } : { discarded: building }) : {};\n return { ...kept.picked, ...speculated };\n}\n\n/**\n * One candidate's fit, a throw read as a fit not made: it is handled when asked, since the fits\n * below the one awaited can fail while it is awaited.\n */\nconst askFit = (deps: ReferenceDeps, c: Candidate): Promise<FitResult> =>\n Promise.resolve()\n .then(() => deps.fit(asPlatform(c.platform), String(c.ad_id)))\n .catch((e): FitResult => ({ ok: false, error: { code: \"UNAVAILABLE\", message: String(e), fix: \"\" } }));\n\n/** Resolves \"out\" once `signal` aborts (never without one). */\nconst whenAborted = (signal: AbortSignal | undefined) =>\n new Promise<\"out\">((resolve) => {\n if (signal?.aborted) resolve(\"out\");\n signal?.addEventListener(\"abort\", () => resolve(\"out\"), { once: true });\n });\n\n/** The best-ranked candidate whose fit keeps it, with its rank; else why none was kept (index -1). */\nasync function firstFitting(\n candidates: readonly Candidate[],\n fits: readonly Promise<FitResult>[],\n): Promise<{ picked: Picked | Failure; index: number }> {\n let unchecked: FitFailure | null = null;\n let checked = 0;\n const lacking: string[] = [];\n for (const [index, candidate] of candidates.entries()) {\n const fit = await fits[index];\n if (!fit) continue;\n if (!fit.ok) unchecked = fit.error;\n else checked += 1;\n if (fit.ok && !fitsIdea(fit.fit)) lacking.push(...missingElements(fit.fit));\n if (!(fit.ok && fitsIdea(fit.fit))) continue;\n const layers = fit.fit.why_it_wins;\n return {\n picked: {\n ...candidateOf(candidate),\n why: [layers.disguise, layers.trigger, layers.logic].filter(Boolean).join(\"; \"),\n tried: index + 1,\n fit: fit.fit,\n },\n index,\n };\n }\n return { picked: noReference(candidates.length, checked, unchecked, lacking), index: -1 };\n}\n\n/** What the rejected references won on that we lack, each once, at most three. Pure. */\nconst lackingText = (lacking: readonly string[]) => {\n const named = [...new Set(lacking.map((l) => l.trim()).filter(Boolean))].slice(0, 3);\n return named.length > 0 ? ` (they won on ${named.join(\", \")})` : \"\";\n};\n\nconst slowReference = (): Failure => ({\n code: \"REFERENCE_SLOW\",\n message: `Finding and checking a proven ad took longer than ${REFERENCE_MS / 1000} s.`,\n fix: \"Nothing to do: the ad starts from the idea. To build on a proven ad anyway, run make again (the checks already made are kept) or pass --reference <adId>.\",\n});\n\n/**\n * Why no reference was kept: none found, none fits (naming what the ones checked won on that we\n * lack), or the fit could not be checked. Pure.\n */\nexport function noReference(\n found: number,\n checked: number,\n unchecked: { message: string } | null,\n lacking: readonly string[] = [],\n): Failure {\n if (found > 0 && checked === 0 && unchecked) {\n return {\n code: \"FIT_UNAVAILABLE\",\n message: `Could not check whether the references fit (${unchecked.message})`,\n fix: \"Run make again in a moment. To build now, pass --reference <adId> with one you looked at yourself (`baker winning-ads search`).\",\n };\n }\n return {\n code: \"NO_REFERENCE_FITS\",\n message:\n found === 0\n ? \"The library has no proven ad in this idea's format.\"\n : `None of the ${found} proven ads checked in this format wins on something this company has${lackingText(lacking)}.`,\n fix: \"Nothing to do to go on: the ad starts from the idea. To build on a proven ad instead, pass --reference <adId> for one you looked at (`baker winning-ads search --format static --format-pattern <the idea's format>`). Do not stop the batch: build the other ideas.\",\n };\n}\n\n/**\n * Refused when the creative's ad is already written: building again would put the idea's\n * placeholders over it (dev, Oct 2026: a chat agent re-ran make on a re-formatted idea and lost the\n * ad it had shown). Nothing there, or a failed make's placeholders, lets the build go ahead. Pure.\n */\nexport function alreadyWritten(promptJson: unknown, slug: string): Failure | null {\n if (promptJson === null || promptJson === undefined) return null;\n try {\n if (unwrittenProblems(readAdSpec(promptJson)).length > 0) return null;\n } catch {\n // Unreadable is still someone's work: refuse rather than overwrite it.\n }\n return {\n code: \"ALREADY_MADE\",\n message: `\"${slug}\" is already made and its ad is written: building it again would replace that ad with placeholders.`,\n fix: `To change this ad, edit src/creatives/${slug}/prompt.json and run \\`baker canvas run\\` on it. For another ad of the same idea, run make again with --slug <new-slug>.`,\n };\n}\n\ntype MakeArgs = {\n slug?: string;\n adset?: string;\n reference?: string;\n platform?: string;\n spec?: string;\n /** The lead ad of the series this idea is made in (`--series`). */\n series?: string;\n fromIdea?: boolean;\n};\n\nconst flag = (value: unknown): string | undefined => (typeof value === \"string\" && value ? value : undefined);\n\n/** The idea, checked: refused when unreadable, missing, or with a problem `creatives ideas` names. */\nasync function loadIdea(root: string, ideaId: string) {\n const { ideas, unreadable } = await readIdeas(root);\n const bad = unreadable.find((u) => u.id === ideaId);\n if (bad) {\n fail({\n code: \"INVALID_IDEA\",\n message: bad.problems.join(\"; \"),\n fix: `Fix ${IDEAS_DIR}/${ideaId}.md, then run make again.`,\n });\n }\n const idea = ideas.find((i) => i.id === ideaId);\n if (!idea) {\n fail({\n code: \"NOT_FOUND\",\n message: `No idea \"${ideaId}\" in ${IDEAS_DIR}/.`,\n fix: `Ideas on file: ${ideas.map((i) => i.id).join(\", \") || \"none\"}. Write it there first.`,\n });\n }\n const [insights, knowledge, personas, creatives] = await Promise.all([\n readInsights(root),\n readKnowledgeCorpus(root),\n readPersonaIds(root),\n readCreativeRecords(root),\n ]);\n const check = checkIdeas({ ideas, insights, knowledge, personas, ...coverageOf(ideas, creatives) }).find(\n (c) => c.id === idea.id,\n );\n if (check && check.problems.length > 0) {\n fail({\n code: \"IDEA_HAS_PROBLEMS\",\n message: check.problems.join(\"; \"),\n fix: \"Fix the idea file and run `baker creatives ideas` again.\",\n });\n }\n return { idea, check };\n}\n\ntype Scaffolded = {\n scaffold: Record<string, unknown>;\n reference: Picked | null;\n fromIdea?: string;\n /** Why the kept reference's concept could not be seeded: the render does not see it yet. */\n conceptUnseeded?: string;\n};\n\n/** Scaffold the creative: a video from its beats, a static from a reference that fits. */\nasync function scaffoldIdea(\n root: string,\n idea: Idea,\n args: MakeArgs,\n slug: string,\n temperature: ViewerTemperature,\n): Promise<Scaffolded> {\n const viewerFlags = args.adset ? [\"--target-adset\", args.adset] : [\"--viewer-temperature\", temperature];\n if (isVideoIdea(idea)) {\n if (!args.spec) {\n fail({\n code: \"SPEC_REQUIRED\",\n message: `\"${idea.id}\" is a video idea (${idea.format}): it is built from its beats.`,\n fix: `Write the beats spec (one spoken line plus one shot each; references/video-flow.md), message first, then: baker creatives make ${idea.id} --spec <file>.`,\n });\n }\n return {\n scaffold: await baker([\"canvas\", \"scaffold-ad\", \"--spec\", args.spec, \"--slug\", slug, ...viewerFlags]),\n reference: null,\n };\n }\n return await scaffoldStatic(root, idea, args, slug, temperature, viewerFlags);\n}\n\n/** A static from a reference that fits, found within `REFERENCE_MS`; else from the idea itself. */\nasync function scaffoldStatic(\n root: string,\n idea: Idea,\n args: MakeArgs,\n slug: string,\n temperature: ViewerTemperature,\n viewerFlags: string[],\n): Promise<Scaffolded> {\n const onReference = (c: ReferenceCandidate, signal?: AbortSignal) =>\n baker(\n [\n \"canvas\",\n \"scaffold-static-ad\",\n \"--source-ad-id\",\n c.adId,\n \"--source-platform\",\n c.platform,\n ...(c.advertiserId ? [\"--source-advertiser-id\", c.advertiserId] : []),\n \"--slug\",\n slug,\n \"--title\",\n idea.message.slice(0, 120),\n ...viewerFlags,\n ],\n signal,\n );\n // Built on the best-ranked reference while the fits are asked, only into a new creative: a build\n // that is not kept is then removed whole, leaving nothing of that reference on the creative.\n const dir = path.join(root, \"src\", \"creatives\", slug);\n const fresh = !(await stat(dir).catch(() => null));\n // A reference found by make has its time: past it, the ad starts from the idea (`REFERENCE_MS`).\n const budget = AbortSignal.timeout(REFERENCE_MS);\n const reference = args.reference\n ? { adId: args.reference, platform: asPlatform(args.platform), why: \"chosen by hand\", tried: 0 }\n : args.fromIdea\n ? { code: \"FROM_IDEA\", message: \"Asked to start from the idea.\" }\n : await pickReference(\n root,\n referenceSearchesFor(idea, temperature).map(buildSearchBody),\n undefined,\n fresh ? (c, signal) => onReference(c, AbortSignal.any([signal, budget])) : undefined,\n budget,\n );\n if (\"discarded\" in reference && reference.discarded) {\n await reference.discarded.catch(() => undefined);\n await rm(dir, { recursive: true, force: true });\n }\n if (\"code\" in reference) {\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: reference.message };\n }\n const prepared = \"prepared\" in reference ? await reference.prepared?.catch(() => null) : null;\n if (prepared?.ok !== true && budget.aborted && !args.reference) {\n await rm(dir, { recursive: true, force: true });\n const slow = slowReference().message;\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: slow };\n }\n const scaffold = prepared?.ok === true ? prepared : await onReference(reference);\n const unbuilt = unbuiltReference(scaffold, { adId: reference.adId, byHand: Boolean(args.reference) });\n if (!unbuilt) return await withKeptConcept(dir, slug, scaffold, reference);\n // What the failed build left of a new creative goes, so the idea's build starts clean.\n if (fresh) await rm(dir, { recursive: true, force: true });\n return { scaffold: await scaffoldFromIdea(idea, slug, viewerFlags), reference: null, fromIdea: unbuilt };\n}\n\n/**\n * Why the ad starts from the idea when the proven ad make picked could not be built on (its picture\n * not described, dev Oct 2026: twice running for one ad), else null: a build that went through, or a\n * reference chosen by hand, whose failure is the agent's to see. Pure.\n */\nexport function unbuiltReference(\n scaffold: Record<string, unknown>,\n reference: { adId: string; byHand: boolean },\n): string | null {\n if (scaffold.ok === true || reference.byHand) return null;\n return `The proven ad ${reference.adId} could not be read to build on.`;\n}\n\n/** The creative built on a reference, its fit's concept seeded, else why it could not be. */\nasync function withKeptConcept(\n dir: string,\n slug: string,\n scaffold: Record<string, unknown>,\n reference: Picked,\n): Promise<Scaffolded> {\n if (scaffold.ok !== true || !reference.fit) return { scaffold, reference };\n const unseeded = await seedConcept(dir, slug, conceptFromFit(reference.fit, reference.adId));\n return { scaffold, reference, ...(unseeded ? { conceptUnseeded: unseeded } : {}) };\n}\n\n/**\n * Seed the kept reference's concept into a creative built before its fit answered, and compile the\n * canvas from it: the render then sees the reference at the level that won (`concept.carry`).\n * Dev, Oct 2026: every build started on the best-ranked reference had no concept. Why it could not\n * be seeded, else null.\n */\nexport async function seedConcept(dir: string, slug: string, seeded: Record<string, unknown>): Promise<string | null> {\n const promptPath = path.join(dir, \"prompt.json\");\n const canvasPath = path.join(dir, `${slug}.canvas.json`);\n let prompt: string;\n try {\n prompt = withFitConcept(await readFile(promptPath, \"utf8\"), seeded);\n await writeFile(promptPath, prompt, \"utf8\");\n } catch (e) {\n return `prompt.json could not take the proven ad's concept (${e instanceof Error ? e.message : String(e)})`;\n }\n try {\n const canvas: unknown = JSON.parse(await readFile(canvasPath, \"utf8\"));\n if (projectStaticBriefs(canvas, JSON.parse(prompt)) > 0) {\n await writeFile(canvasPath, `${JSON.stringify(canvas, null, 2)}\\n`, \"utf8\");\n }\n } catch {\n // prompt.json holds the concept: the run compiles the canvas from it.\n }\n return null;\n}\n\n/** The static started from the idea's own spec: no reference picture, nothing described or billed. */\nasync function scaffoldFromIdea(idea: Idea, slug: string, viewerFlags: string[]): Promise<Record<string, unknown>> {\n const dir = await mkdtemp(path.join(tmpdir(), \"idea-spec-\"));\n const specPath = path.join(dir, \"prompt.json\");\n await writeFile(specPath, JSON.stringify(ideaSpec(idea, idea.who.replace(/[-_]/g, \" \")), null, 2), \"utf8\");\n try {\n return await baker([\n \"canvas\",\n \"scaffold-static-ad\",\n \"--spec\",\n specPath,\n \"--slug\",\n slug,\n \"--title\",\n idea.message.slice(0, 120),\n ...viewerFlags,\n ]);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n\n/** Record the idea on the creative and its message as the ad's one message; mark the idea built. */\nasync function recordIdea(\n root: string,\n slug: string,\n idea: Idea,\n evidence: EvidenceLevel | \"explore\",\n): Promise<{ dir: string; unsourcedCopy: string[] }> {\n const dir = path.join(root, \"src\", \"creatives\", slug);\n const definitionPath = path.join(dir, \"_definition.md\");\n const definition = await readFile(definitionPath, \"utf8\").catch(() => null);\n if (definition !== null) {\n await writeFile(definitionPath, setDefinitionFields(definition, { ...definitionFieldsOf(idea, evidence) }), \"utf8\");\n }\n const promptPath = path.join(dir, \"prompt.json\");\n const prompt = isVideoIdea(idea) ? null : await readFile(promptPath, \"utf8\").catch(() => null);\n // A spec that does not parse is the scaffold's to report; the message is set by hand then.\n if (prompt !== null) await writeFile(promptPath, setSpecMessage(prompt, idea.message), \"utf8\").catch(() => undefined);\n const unsourcedCopy = prompt === null ? [] : await draftedClaims(root, prompt);\n if (idea.status === \"idea\") {\n const ideaPath = path.join(root, IDEAS_DIR, `${idea.id}.md`);\n await writeFile(ideaPath, setDefinitionFields(await readFile(ideaPath, \"utf8\"), { status: \"built\" }), \"utf8\");\n }\n // The dashboard learns the idea now, not at Publish (where most verdicts are given already).\n await baker([\"canvas\", \"sync-definition\", dir]);\n return { dir, unsourcedCopy };\n}\n\n/** The drafted lines claiming what neither the Knowledge nor our own customers said. */\nasync function draftedClaims(root: string, prompt: string): Promise<string[]> {\n const [knowledge, insights] = await Promise.all([readKnowledgeCorpus(root), readInsights(root)]);\n const own = insights.filter(sourcesClaims).map((i) => i.quote);\n try {\n return unsourcedCopyLines(prompt, `${knowledge}\\n${own.join(\"\\n\")}`);\n } catch {\n return [];\n }\n}\n\nfunction makeArgsOf(args: Record<string, unknown>): MakeArgs {\n const opts: MakeArgs = {};\n for (const key of [\"slug\", \"adset\", \"reference\", \"platform\", \"spec\", \"series\"] as const) {\n const value = flag(args[key]);\n if (value) opts[key] = value;\n }\n if (args[\"from-idea\"] === true) opts.fromIdea = true;\n return opts;\n}\n\nfunction scaffoldFailure(scaffold: Record<string, unknown>): Failure {\n const error = (scaffold.error ?? {}) as Partial<Failure>;\n return {\n code: error.code ?? \"SCAFFOLD_FAILED\",\n message: error.message ?? \"The creative could not be scaffolded.\",\n ...(error.fix ? { fix: error.fix } : {}),\n };\n}\n\ntype Made = {\n slug: string;\n idea: Idea;\n check: IdeaCheck | undefined;\n reference: Picked | null;\n /** Why the static starts from the idea itself: no proven ad fits (or `--from-idea`). */\n fromIdea?: string;\n conceptUnseeded?: string;\n viewer: { adset: string } | { temperature: ViewerTemperature };\n canvasPath: string;\n scaffoldHints: string[];\n /** Drafted copy lines claiming a figure the company never wrote (often the reference's own promise). */\n unsourcedCopy: string[];\n};\n\nconst CARRY_WORDS: Record<ConceptCarry, string> = {\n whole_ad: \"the whole ad (its disguise, layout and hook)\",\n layout: \"its layout\",\n hook: \"its hook\",\n angle: \"its angle\",\n};\n\n/** What the agent tells the person about the proven ad a creative is built on. Pure. */\nfunction builtOnHint(reference: Picked): string {\n const tell = \"Tell the person which proven ad this builds on\";\n const ours = \"the words, brand, people and claims stay ours.\";\n if (!reference.fit) {\n // Chosen by hand: no fit read what made it win, so nothing is said of it.\n return `Built on proven ad ${reference.adId}, the one chosen for it; no check read what made it win. The canvas shows that ad as \\`original\\`. ${tell}; ${ours}`;\n }\n const carried = CARRY_WORDS[reference.fit.carry ?? \"whole_ad\"];\n const why = reference.fit.carry_why ? ` (${reference.fit.carry_why})` : \"\";\n const won = reference.why ? ` It won on: ${reference.why}.` : \"\";\n return `Built on proven ad ${reference.adId}: it carries ${carried}${why}.${won} The canvas shows that ad as \\`original\\`. ${tell} and what it takes from it; ${ours}`;\n}\n\n/** The fix for a concept make could not seed: the fit already made, written in by hand. Pure. */\nconst unseededHint = (reference: Picked, slug: string, why: string) =>\n `${why}, so the render does not see proven ad ${reference.adId} yet. \\`baker winning-ads fit ${reference.adId} --platform ${reference.platform} --full\\` prints the check already made (free): write its \\`read\\` into src/creatives/${slug}/prompt.json as \\`concept\\`, with \\`reference_ad_id: \"${reference.adId}\"\\`.`;\n\n/** What `make` prints: the creative, the idea it carries, and the two steps left to the agent. Pure. */\nexport function makeEnvelope(made: Made) {\n const quote = made.check?.quote;\n return {\n ok: true as const,\n data: {\n creative: made.slug,\n idea: made.idea.id,\n message: made.idea.message,\n evidence: made.check?.evidence ?? \"explore\",\n ...(quote ? { customer_quote: quote } : {}),\n ...(made.fromIdea ? { built_from: \"idea\" } : {}),\n ...(made.reference\n ? {\n reference: {\n ad_id: made.reference.adId,\n platform: made.reference.platform,\n why_it_wins: made.reference.why,\n ...(made.reference.fit?.carry ? { carry: made.reference.fit.carry } : {}),\n },\n }\n : {}),\n viewer: made.viewer,\n canvas_path: made.canvasPath,\n },\n hints: [\n ...(made.reference ? [builtOnHint(made.reference)] : []),\n ...(made.reference && made.conceptUnseeded\n ? [unseededHint(made.reference, made.slug, made.conceptUnseeded)]\n : []),\n ...(made.fromIdea\n ? [\n `${made.fromIdea} So this ad starts from the idea: write the scene and every line of copy in src/creatives/${made.slug}/prompt.json (a placeholder refuses to run). Tell the person this ad is not built on a proven ad, and why, in plain words.`,\n ]\n : []),\n ...(made.unsourcedCopy.length > 0\n ? [\n `Rewrite before running: ${made.unsourcedCopy.map((l) => JSON.stringify(l)).join(\", \")} claim a figure nothing the company wrote holds (the reference's promise, not ours).`,\n ]\n : []),\n `Write the copy lines and the scene in src/creatives/${made.slug}/prompt.json${made.reference ? \": the drafted lines are the reference's, so keep one only if the Knowledge says it (badges, ratings and guarantees too)\" : \"\"}. Say the message in the customer's words${quote ? ` (\"${quote.slice(0, 80)}\")` : \"\"}; keep \\`message\\` as it is.`,\n SPEC_SHAPES_HINT,\n `Then: baker canvas run ${made.canvasPath} (it validates and asks the viewer itself: nothing to run before it).`,\n // The scaffold's own next steps name a separate validate; the run does it (dev, Oct 2026: five validates before one run).\n ...made.scaffoldHints\n .filter((h) => !/canvas (?:validate|viewer-check)/.test(h))\n // make checked the reference and seeded its concept: the scaffold ran before the fit answered.\n .filter((h) => !(made.reference?.fit && h.startsWith(NO_FIT_HINT)))\n .slice(0, 4),\n ],\n };\n}\n\n/** `--series <lead>`: the idea made as another ad of the lead's series, printed or refused. */\nasync function makeInSeries(\n root: string,\n idea: Idea,\n slug: string,\n lead: string,\n evidence: EvidenceLevel | \"explore\",\n): Promise<void> {\n if (isVideoIdea(idea)) {\n fail({\n code: \"SERIES_STATIC_ONLY\",\n message: `\"${idea.id}\" is a video idea: a series repeats one static ad with other words.`,\n fix: `Make it on its own: baker creatives make ${idea.id} --spec <beats file>.`,\n });\n }\n const made = await makeSeriesAd(root, idea, slug, lead, evidence, {\n sync: (dir) => baker([\"canvas\", \"sync-definition\", dir, \"--title\"]),\n chatId: optionalChatId() ?? null,\n });\n if (\"code\" in made) fail(made);\n writeJson(seriesMadeEnvelope({ ...made, canvasPath: path.relative(root, made.canvasPath) }, idea));\n}\n\nexport const makeCommand = defineCommand({\n meta: { name: \"make\", description: DESCRIPTION },\n args: ARGS,\n async run({ args }) {\n const root = findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const opts = makeArgsOf(args);\n const { idea, check } = await loadIdea(root, String(args.idea));\n const slug = opts.slug ?? idea.id;\n const written = await readFile(path.join(root, \"src\", \"creatives\", slug, \"prompt.json\"), \"utf8\").then(\n (text): unknown => {\n try {\n return JSON.parse(text);\n } catch {\n return {};\n }\n },\n (err: NodeJS.ErrnoException) => (err.code === \"ENOENT\" ? null : {}),\n );\n const refused = alreadyWritten(written, slug);\n if (refused) fail(refused);\n if (opts.series) {\n await makeInSeries(root, idea, slug, opts.series, check?.evidence ?? \"explore\");\n return;\n }\n const temperature = await viewerTemperature(root, opts.adset, idea.awareness);\n const { scaffold, reference, fromIdea, conceptUnseeded } = await scaffoldIdea(root, idea, opts, slug, temperature);\n if (scaffold.ok !== true) fail(scaffoldFailure(scaffold));\n const { dir, unsourcedCopy } = await recordIdea(root, slug, idea, check?.evidence ?? \"explore\");\n writeJson(\n makeEnvelope({\n slug,\n idea,\n check,\n reference,\n ...(fromIdea ? { fromIdea } : {}),\n ...(conceptUnseeded ? { conceptUnseeded } : {}),\n viewer: opts.adset ? { adset: opts.adset } : { temperature },\n canvasPath: path.relative(root, String(scaffold.canvas_path ?? path.join(dir, `${slug}.canvas.json`))),\n scaffoldHints: Array.isArray(scaffold.hints) ? (scaffold.hints as string[]) : [],\n unsourcedCopy,\n }),\n );\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MappingError,
|
|
3
|
+
buildFieldMapping,
|
|
4
|
+
describeSlots,
|
|
5
|
+
namesComeFromAccount,
|
|
6
|
+
otherSlots,
|
|
7
|
+
shapeFor
|
|
8
|
+
} from "./chunk-SB3GZFCV.js";
|
|
9
|
+
import {
|
|
10
|
+
collectConfigStatus,
|
|
11
|
+
collectSideEffects,
|
|
12
|
+
flowDataPath,
|
|
13
|
+
readFlowTree,
|
|
14
|
+
requestFlowInputCall,
|
|
15
|
+
sideEffectNeedsInput,
|
|
16
|
+
writeFlowTree
|
|
17
|
+
} from "./chunk-BSC33FLJ.js";
|
|
18
|
+
import {
|
|
19
|
+
repeatedFlagValues
|
|
20
|
+
} from "./chunk-ERSX3MKH.js";
|
|
21
|
+
import "./chunk-NDXBU22S.js";
|
|
22
|
+
import "./chunk-GXDLWBOY.js";
|
|
23
|
+
import "./chunk-TEINLN64.js";
|
|
24
|
+
import "./chunk-ZJWUBJYQ.js";
|
|
25
|
+
import "./chunk-NE4F3FHN.js";
|
|
26
|
+
import {
|
|
27
|
+
apiPost
|
|
28
|
+
} from "./chunk-XBOK23HI.js";
|
|
29
|
+
import "./chunk-IFWP3ZDO.js";
|
|
30
|
+
import "./chunk-NAWWC5I3.js";
|
|
31
|
+
import {
|
|
32
|
+
registerSchema,
|
|
33
|
+
writeJson
|
|
34
|
+
} from "./chunk-NU7JSWVA.js";
|
|
35
|
+
import "./chunk-YQSBHWOI.js";
|
|
36
|
+
|
|
37
|
+
// src/commands/flows/map.ts
|
|
38
|
+
import { readFileSync } from "fs";
|
|
39
|
+
import { defineCommand } from "citty";
|
|
40
|
+
registerSchema({
|
|
41
|
+
command: "flows.map",
|
|
42
|
+
description: "Map form fields onto any named value a side effect sends: a CRM fieldMapping, a sheet columnMapping, a webhook payloadKeys, a pixel eventParams, or a platform matching block. Emits the mapping and splices it in with --write. Configure the destination through request_flow_input FIRST \u2014 the destination-side names come from the connected account, not from you.",
|
|
43
|
+
args: {
|
|
44
|
+
slug: { type: "positional", description: "Form slug (folder under flows/)", required: true },
|
|
45
|
+
map: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: "<destField>[:<fieldType>]=<value>, repeatable. Omit both this and --from to be told what the side effect accepts instead. Sheet: A=name. HubSpot with --hubspot-form: firstname=nombre (the type is read off the form). Where a destination cannot be read, state the type on the LEFT \u2014 c0ffee:varchar=email \u2014 because `:` on the right belongs to the value grammar.",
|
|
48
|
+
required: false
|
|
49
|
+
},
|
|
50
|
+
from: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description: 'The whole mapping as a JSON file, or `-` for stdin: { "sideEffect": "\u2026", "map": { "<destField>": "<value>", \u2026 } }. Past ~3 fields prefer this over repeated --map.',
|
|
53
|
+
required: false
|
|
54
|
+
},
|
|
55
|
+
"side-effect": { type: "string", description: "Side-effect id, when the form has more than one", required: false },
|
|
56
|
+
"hubspot-form": {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "HubSpot formGuid of the configured destination. Fills every mapping's fieldType and objectTypeId from the form itself, so you write no types at all. The guid is the `formGuid` in the `destination` request_flow_input returned.",
|
|
59
|
+
required: false
|
|
60
|
+
},
|
|
61
|
+
into: {
|
|
62
|
+
type: "string",
|
|
63
|
+
description: "Slot to map into when the type has more than one: meta/tiktok/pinterest take eventParams (default) or their matching record; googleAds takes enhancedConversions or value/currency/transactionId.",
|
|
64
|
+
required: false
|
|
65
|
+
},
|
|
66
|
+
entity: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Destination object (pipedrive: person|organization|lead, \u2026)",
|
|
69
|
+
required: false
|
|
70
|
+
},
|
|
71
|
+
custom: { type: "boolean", description: "The destination fields are custom fields", required: false },
|
|
72
|
+
standard: { type: "boolean", description: "The destination fields are standard fields", required: false },
|
|
73
|
+
"object-type": { type: "string", description: "HubSpot objectTypeId (default 0-1, contact)", required: false },
|
|
74
|
+
"prune-missing": {
|
|
75
|
+
type: "boolean",
|
|
76
|
+
description: "Drop the mappings whose destination field no longer exists on the account, and nothing else. The repair for a deleted HubSpot property: HubSpot refuses the WHOLE submission when it names a field it does not have, so one dead mapping loses every lead. Needs --hubspot-form so the live field list can be read. Runs on its own \u2014 no --map required. Prefer this to --replace, which drops everything this call does not name.",
|
|
77
|
+
required: false
|
|
78
|
+
},
|
|
79
|
+
replace: {
|
|
80
|
+
type: "boolean",
|
|
81
|
+
description: "Make the slot exactly what this call passes, dropping every mapping already in it. Without it, mappings MERGE by destination name \u2014 re-mapping a name overwrites it, a new name is appended, and the rest are left alone. To REMOVE a dead mapping, reach for --prune-missing instead: this one also deletes every mapping you did not re-state.",
|
|
82
|
+
required: false
|
|
83
|
+
},
|
|
84
|
+
write: {
|
|
85
|
+
type: "boolean",
|
|
86
|
+
description: "Splice the mapping into the form. Without it, prints and changes nothing",
|
|
87
|
+
required: false
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
function mapSpecsFrom(rawArgs) {
|
|
92
|
+
return repeatedFlagValues(rawArgs, "map");
|
|
93
|
+
}
|
|
94
|
+
function specsFromFile(parsed) {
|
|
95
|
+
return Object.entries(parsed.map ?? {}).map(([destField, entry]) => {
|
|
96
|
+
if (typeof entry === "string") return `${destField}=${entry}`;
|
|
97
|
+
const type = entry?.type ? `:${entry.type}` : "";
|
|
98
|
+
return `${destField}${type}=${entry?.value ?? ""}`;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function readSpecFile(path) {
|
|
102
|
+
let raw;
|
|
103
|
+
try {
|
|
104
|
+
raw = path === "-" ? readFileSync(0, "utf-8") : readFileSync(path, "utf-8");
|
|
105
|
+
} catch (error) {
|
|
106
|
+
refuse(
|
|
107
|
+
`Could not read ${path === "-" ? "the mapping from stdin" : `"${path}"`}: ${error instanceof Error ? error.message : String(error)}`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
let parsed;
|
|
111
|
+
try {
|
|
112
|
+
parsed = JSON.parse(raw);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
refuse(
|
|
115
|
+
`${path === "-" ? "stdin" : `"${path}"`} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,
|
|
116
|
+
'Expected { "map": { "<destField>": "<value>", \u2026 } }'
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
120
|
+
refuse("A mapping file must be a JSON object.", 'Expected { "map": { "<destField>": "<value>", \u2026 } }');
|
|
121
|
+
}
|
|
122
|
+
const spec = parsed;
|
|
123
|
+
if (!spec.map || typeof spec.map !== "object" || Object.keys(spec.map).length === 0) {
|
|
124
|
+
refuse("A mapping file needs a non-empty `map` object.", 'Expected { "map": { "firstname": "nombre", \u2026 } }');
|
|
125
|
+
}
|
|
126
|
+
return spec;
|
|
127
|
+
}
|
|
128
|
+
function refuse(message, fix) {
|
|
129
|
+
writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message, ...fix ? { fix } : {} } });
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
async function hubspotFieldCatalog(formId) {
|
|
133
|
+
let response;
|
|
134
|
+
try {
|
|
135
|
+
response = await apiPost("/api/hubspot/forms/view", { formId });
|
|
136
|
+
} catch (error) {
|
|
137
|
+
refuse(
|
|
138
|
+
`Could not read HubSpot form "${formId}": ${error instanceof Error ? error.message : String(error)}`,
|
|
139
|
+
"Check the guid against the `destination` request_flow_input returned, or `baker hubspot forms list`. Drop --hubspot-form and write `<field>:<fieldType>=<value>` per mapping only if HubSpot is unreachable."
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
const fields = response.data.form?.fields ?? [];
|
|
143
|
+
if (fields.length === 0) {
|
|
144
|
+
refuse(
|
|
145
|
+
`HubSpot form "${formId}" reports no fields, so nothing can be mapped against it.`,
|
|
146
|
+
"Confirm the guid names the form this side effect submits to: baker hubspot forms list"
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
fields: new Map(
|
|
151
|
+
fields.map((field) => [
|
|
152
|
+
field.name,
|
|
153
|
+
{ fieldType: field.fieldType, ...field.objectTypeId ? { objectTypeId: field.objectTypeId } : {} }
|
|
154
|
+
])
|
|
155
|
+
),
|
|
156
|
+
// Read while the form is already open, because this is the moment a
|
|
157
|
+
// delivery is being wired: HubSpot refuses every submission sent to a form
|
|
158
|
+
// with spam prevention on, so a mapping written against one is correct and
|
|
159
|
+
// will still never arrive. Reported, not refused — the mapping is not the
|
|
160
|
+
// mistake, and the client can switch it off without the work being redone.
|
|
161
|
+
captchaEnabled: response.data.form?.captchaEnabled === true
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function describeDestination(chosen) {
|
|
165
|
+
const type = String(chosen.sideEffect.type ?? "");
|
|
166
|
+
const slots = describeSlots(type);
|
|
167
|
+
if (slots.length === 0) {
|
|
168
|
+
refuse(
|
|
169
|
+
`A ${type} side effect has no mappable field.`,
|
|
170
|
+
`Nothing on it addresses named values. \`baker flows schema side-effect ${type}\` shows what it does take.`
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
writeJson({
|
|
174
|
+
ok: true,
|
|
175
|
+
data: { sideEffectId: chosen.sideEffect.id, type, mappable: slots },
|
|
176
|
+
hints: [
|
|
177
|
+
`Nothing mapped \u2014 this is what a ${type} side effect accepts. Add --map <key>=<value> to build one.`,
|
|
178
|
+
...slots.map(
|
|
179
|
+
(slot) => slot.keys ? `${slot.slot}: ${slot.keys.join(", ")}` : `${slot.slot}: ${slot.keysFrom === "account" ? "keys come from the connected account (request_flow_input returns them)" : "keys are yours to choose \u2014 whatever the receiving system expects"}`
|
|
180
|
+
),
|
|
181
|
+
// Named separately from the key hint above: the key and its field type are
|
|
182
|
+
// two different questions with two different answers, and the type is the
|
|
183
|
+
// one an agent does not know it is being asked until a mapping is refused.
|
|
184
|
+
...slots.flatMap((slot) => slot.fieldTypes ? [`${slot.slot} field types \u2014 ${slot.fieldTypes}`] : []),
|
|
185
|
+
'Values (right of the `=`) are the same for every slot: a form field, tracking:<var>, global:<name>, code:<name>, a "literal", or those joined with +. A field may also be written as the file stores it, {{<stepId>.customForm.<field>}}. A value cannot run code (no .split(), .slice(), [0]).'
|
|
186
|
+
]
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function shapeOrRefuse(type, into) {
|
|
190
|
+
try {
|
|
191
|
+
return shapeFor(type, into);
|
|
192
|
+
} catch (error) {
|
|
193
|
+
if (error instanceof MappingError) refuse(error.message, error.fix);
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function assertDestinationReady(slug, tree, chosen, into) {
|
|
198
|
+
if (!sideEffectNeedsInput(chosen.sideEffect)) return;
|
|
199
|
+
const type = String(chosen.sideEffect.type ?? "");
|
|
200
|
+
const status = collectConfigStatusFor(tree, slug, String(chosen.sideEffect.id ?? ""));
|
|
201
|
+
const call = status ? requestFlowInputCall(slug, status) : `request_flow_input for the ${type} side effect`;
|
|
202
|
+
if (!namesComeFromAccount(shapeOrRefuse(type, into))) return;
|
|
203
|
+
refuse(
|
|
204
|
+
`The ${type} destination is not configured yet, so its field names cannot be anything but a guess.`,
|
|
205
|
+
`Configure it first, then map against the names that call returns: ${call}`
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
function collectConfigStatusFor(tree, _slug, sideEffectId) {
|
|
209
|
+
const rows = [];
|
|
210
|
+
collectConfigStatus(tree, rows);
|
|
211
|
+
return rows.find((row) => row.sideEffectId === sideEffectId);
|
|
212
|
+
}
|
|
213
|
+
function slotHintFor(type, into) {
|
|
214
|
+
const others = otherSlots(type, shapeFor(type, into));
|
|
215
|
+
if (others.length === 0) return [];
|
|
216
|
+
return [`This side effect also takes ${others.join(" and ")} \u2014 pass --into <slot> to map into one of those instead.`];
|
|
217
|
+
}
|
|
218
|
+
function survivorHint(built, replacing) {
|
|
219
|
+
if (built.kept > 0) {
|
|
220
|
+
return [`${built.kept} mapping${built.kept === 1 ? "" : "s"} already in ${built.key} kept \u2014 this merged by name.`];
|
|
221
|
+
}
|
|
222
|
+
if (!replacing) return [];
|
|
223
|
+
return [`--replace: ${built.key} is now exactly these ${built.count}; anything else it held is gone.`];
|
|
224
|
+
}
|
|
225
|
+
function droppedHint(built) {
|
|
226
|
+
if (built.dropped.length === 0) return [];
|
|
227
|
+
return [
|
|
228
|
+
`--prune-missing dropped ${built.dropped.length} mapping${built.dropped.length === 1 ? "" : "s"} the destination no longer has: ${built.dropped.join(", ")}. Every other mapping in ${built.key} was left alone.`
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
function pendingEndpointHint(slug, tree, chosen) {
|
|
232
|
+
if (!sideEffectNeedsInput(chosen.sideEffect)) return [];
|
|
233
|
+
const status = collectConfigStatusFor(tree, slug, String(chosen.sideEffect.id ?? ""));
|
|
234
|
+
if (!status) return [];
|
|
235
|
+
return [`The mapping is written, but this destination still needs the user: ${requestFlowInputCall(slug, status)}`];
|
|
236
|
+
}
|
|
237
|
+
function pickSideEffect(slug, found, named) {
|
|
238
|
+
if (found.length === 0) {
|
|
239
|
+
refuse(
|
|
240
|
+
`"${slug}" has no side effects \u2014 author the side effect first, then map into it.`,
|
|
241
|
+
`baker flows add-side-effect ${slug} --node <nodeId> --type <type>`
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
const chosen = named ? found.find((entry) => entry.sideEffect.id === named) : found.length === 1 ? found[0] : void 0;
|
|
245
|
+
if (chosen) return chosen;
|
|
246
|
+
const inventory = found.map((entry) => `${entry.sideEffect.id} (${entry.sideEffect.type})`).join(", ");
|
|
247
|
+
refuse(
|
|
248
|
+
named ? `No side effect with id "${named}" in "${slug}".` : `"${slug}" has ${found.length} side effects \u2014 name one with --side-effect <id>.`,
|
|
249
|
+
`Side effects in this form: ${inventory}`
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
function customFlag(custom, standard) {
|
|
253
|
+
if (custom === true && standard === true) {
|
|
254
|
+
refuse("--custom and --standard contradict each other. Pass one.");
|
|
255
|
+
}
|
|
256
|
+
if (custom === true) return true;
|
|
257
|
+
if (standard === true) return false;
|
|
258
|
+
return void 0;
|
|
259
|
+
}
|
|
260
|
+
async function mapOptions(args, fromFile, into) {
|
|
261
|
+
const hubspotForm = args["hubspot-form"] ? String(args["hubspot-form"]) : fromFile?.hubspotForm;
|
|
262
|
+
const catalog = hubspotForm ? await hubspotFieldCatalog(hubspotForm) : void 0;
|
|
263
|
+
return {
|
|
264
|
+
options: {
|
|
265
|
+
into,
|
|
266
|
+
entity: args.entity ? String(args.entity) : fromFile?.entity,
|
|
267
|
+
isCustomField: customFlag(args.custom, args.standard) ?? fromFile?.custom,
|
|
268
|
+
objectType: args["object-type"] ? String(args["object-type"]) : fromFile?.objectType,
|
|
269
|
+
replace: args.replace === true || fromFile?.replace === true,
|
|
270
|
+
pruneMissing: args["prune-missing"] === true || fromFile?.pruneMissing === true,
|
|
271
|
+
destinationFields: catalog?.fields
|
|
272
|
+
},
|
|
273
|
+
hints: catalog?.captchaEnabled ? [
|
|
274
|
+
"WARNING: this HubSpot form has spam prevention (captcha) on. HubSpot refuses every submission sent to a form with it on, so nothing mapped here will arrive \u2014 the mapping is fine, the destination is not. Only the user can switch it off, on the form in HubSpot. Tell them that, and do not swap the destination yourself."
|
|
275
|
+
] : []
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
var mapCommand = defineCommand({
|
|
279
|
+
meta: {
|
|
280
|
+
name: "map",
|
|
281
|
+
description: "Map form fields onto any value a side effect sends \u2014 never hand-write a mapping. Start here: baker flows map contact --from map.json --write"
|
|
282
|
+
},
|
|
283
|
+
args: {
|
|
284
|
+
slug: { type: "positional", description: "Form slug", required: true },
|
|
285
|
+
map: { type: "string", description: "<destField>[:<fieldType>]=<value> (repeatable)" },
|
|
286
|
+
from: { type: "string", description: "Read the whole mapping from a JSON file, or `-` for stdin" },
|
|
287
|
+
"side-effect": { type: "string", description: "Side-effect id, when the form has more than one" },
|
|
288
|
+
"hubspot-form": {
|
|
289
|
+
type: "string",
|
|
290
|
+
description: "HubSpot formGuid \u2014 reads every field's type off the form so you write none"
|
|
291
|
+
},
|
|
292
|
+
into: {
|
|
293
|
+
type: "string",
|
|
294
|
+
description: "Which slot to map into, for a type with more than one (e.g. meta: eventParams | advancedMatching)"
|
|
295
|
+
},
|
|
296
|
+
entity: { type: "string", description: "Destination object (person, contact, lead, \u2026)" },
|
|
297
|
+
custom: { type: "boolean", description: "Destination fields are custom fields" },
|
|
298
|
+
standard: { type: "boolean", description: "Destination fields are standard fields" },
|
|
299
|
+
"object-type": { type: "string", description: "HubSpot objectTypeId (default 0-1)" },
|
|
300
|
+
"prune-missing": {
|
|
301
|
+
type: "boolean",
|
|
302
|
+
description: "Drop only the mappings the destination no longer has \u2014 the repair for a deleted HubSpot field"
|
|
303
|
+
},
|
|
304
|
+
replace: {
|
|
305
|
+
type: "boolean",
|
|
306
|
+
description: "Drop every mapping already in the slot. Default merges by destination name"
|
|
307
|
+
},
|
|
308
|
+
write: { type: "boolean", description: "Splice the mapping into the form" }
|
|
309
|
+
},
|
|
310
|
+
run: async ({ args, rawArgs }) => {
|
|
311
|
+
const slug = String(args.slug);
|
|
312
|
+
const fromFile = args.from ? readSpecFile(String(args.from)) : void 0;
|
|
313
|
+
const specs = fromFile ? specsFromFile(fromFile) : mapSpecsFrom(rawArgs);
|
|
314
|
+
const into = args.into ? String(args.into) : fromFile?.into;
|
|
315
|
+
const replacing = args.replace === true || fromFile?.replace === true;
|
|
316
|
+
const pruning = args["prune-missing"] === true || fromFile?.pruneMissing === true;
|
|
317
|
+
const tree = readFlowTree(slug);
|
|
318
|
+
const chosen = pickSideEffect(
|
|
319
|
+
slug,
|
|
320
|
+
collectSideEffects(tree),
|
|
321
|
+
args["side-effect"] ? String(args["side-effect"]) : fromFile?.sideEffect
|
|
322
|
+
);
|
|
323
|
+
if (specs.length === 0 && !pruning) {
|
|
324
|
+
describeDestination(chosen);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
assertDestinationReady(slug, tree, chosen, into);
|
|
328
|
+
const { options, hints: destinationHints } = await mapOptions(args, fromFile, into);
|
|
329
|
+
let built;
|
|
330
|
+
try {
|
|
331
|
+
built = buildFieldMapping(tree, chosen.sideEffect, specs, options);
|
|
332
|
+
} catch (error) {
|
|
333
|
+
if (error instanceof MappingError) {
|
|
334
|
+
refuse(error.message, error.fix);
|
|
335
|
+
}
|
|
336
|
+
throw error;
|
|
337
|
+
}
|
|
338
|
+
const slotHint = [
|
|
339
|
+
...destinationHints,
|
|
340
|
+
...droppedHint(built),
|
|
341
|
+
...survivorHint(built, replacing),
|
|
342
|
+
...slotHintFor(String(chosen.sideEffect.type ?? ""), into),
|
|
343
|
+
...pendingEndpointHint(slug, tree, chosen)
|
|
344
|
+
];
|
|
345
|
+
if (args.write !== true) {
|
|
346
|
+
emitDryRun(slug, chosen, built, slotHint);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
Object.assign(chosen.sideEffect, built.patch);
|
|
350
|
+
writeFlowTree(slug, tree);
|
|
351
|
+
emitWritten(slug, chosen, built, slotHint);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
function mapHeadline(built, phase, slug = "") {
|
|
355
|
+
const wrote = `${built.count} ${built.key} mapping${built.count === 1 ? "" : "s"}`;
|
|
356
|
+
const drops = `${built.dropped.length} dead mapping${built.dropped.length === 1 ? "" : "s"}`;
|
|
357
|
+
if (phase === "dry-run") {
|
|
358
|
+
if (built.count === 0 && built.dropped.length > 0) {
|
|
359
|
+
return `Nothing written. Re-run with --write to drop ${drops} from ${slug}.`;
|
|
360
|
+
}
|
|
361
|
+
return `Nothing written. Re-run with --write to splice ${wrote} into ${slug}.`;
|
|
362
|
+
}
|
|
363
|
+
if (built.dropped.length === 0) return `Wrote ${wrote}.`;
|
|
364
|
+
if (built.count === 0) return `Dropped ${drops} from ${built.key}; nothing else changed.`;
|
|
365
|
+
return `Wrote ${wrote} and dropped ${drops}.`;
|
|
366
|
+
}
|
|
367
|
+
function emitDryRun(slug, chosen, built, slotHint) {
|
|
368
|
+
writeJson({
|
|
369
|
+
ok: true,
|
|
370
|
+
data: {
|
|
371
|
+
sideEffectId: chosen.sideEffect.id,
|
|
372
|
+
type: chosen.sideEffect.type,
|
|
373
|
+
key: built.key,
|
|
374
|
+
patch: built.patch
|
|
375
|
+
},
|
|
376
|
+
hints: [mapHeadline(built, "dry-run", slug), ...slotHint]
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
function emitWritten(slug, chosen, built, slotHint) {
|
|
380
|
+
writeJson({
|
|
381
|
+
ok: true,
|
|
382
|
+
data: {
|
|
383
|
+
sideEffectId: chosen.sideEffect.id,
|
|
384
|
+
type: chosen.sideEffect.type,
|
|
385
|
+
key: built.key,
|
|
386
|
+
written: built.count,
|
|
387
|
+
kept: built.kept,
|
|
388
|
+
dropped: built.dropped,
|
|
389
|
+
path: flowDataPath(slug)
|
|
390
|
+
},
|
|
391
|
+
hints: [
|
|
392
|
+
mapHeadline(built, "written"),
|
|
393
|
+
`A mapping is only real once the destination is set \u2014 check with: baker flows show ${slug}`,
|
|
394
|
+
...slotHint
|
|
395
|
+
]
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
export {
|
|
399
|
+
mapCommand,
|
|
400
|
+
mapHeadline,
|
|
401
|
+
mapSpecsFrom,
|
|
402
|
+
specsFromFile
|
|
403
|
+
};
|
|
404
|
+
//# sourceMappingURL=map-TWL7T4KP.js.map
|