@koda-sl/baker-cli 0.481.0-dev.2d33e194f → 0.482.0-dev.a5555ab55
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 +131 -149
- package/canvas/avocado-tutorial.json +3 -3
- package/canvas/hello-world-overlay.json +1 -1
- package/dist/account-7LUQWY6Q.js +49 -0
- package/dist/account-ELL7ZZLM.js +80 -0
- package/dist/account-KZVOT6HL.js +79 -0
- package/dist/account-reads-LA45L6G3.js +218 -0
- package/dist/account-writes-CEPERFD6.js +66 -0
- package/dist/accounts-7G556DH4.js +77 -0
- package/dist/accounts-E4TVYTUR.js +115 -0
- package/dist/accounts-HC7GPQNG.js +611 -0
- package/dist/accounts-SMB3TNXX.js +114 -0
- package/dist/accounts-UA2ZWRN4.js +75 -0
- package/dist/actions-V6YP5C3X.js +55 -0
- package/dist/active-entities-MCL7UEGV.js +103 -0
- package/dist/activecampaign-CHZEHRHZ.js +935 -0
- package/dist/activecampaign-CHZEHRHZ.js.map +1 -0
- package/dist/activities-IQPJPP4B.js +74 -0
- package/dist/ad-group-writes-XGSCEQTW.js +170 -0
- package/dist/ad-groups-GKOLDGET.js +68 -0
- package/dist/ad-writes-VVD36JKH.js +174 -0
- package/dist/add-3MD72QMT.js +104 -0
- package/dist/add-5IGUQHVZ.js +105 -0
- package/dist/add-BK5AQI5A.js +97 -0
- package/dist/add-TSQNUP5N.js +302 -0
- package/dist/add-accounts-CJSV5NPL.js +91 -0
- package/dist/ads-EKZVHKPN.js +77 -0
- package/dist/ads-HXX2IAFF.js +113 -0
- package/dist/ads-KRM4WAMZ.js +40 -0
- package/dist/ads-KRM4WAMZ.js.map +1 -0
- package/dist/ads-RAUM6ISF.js +128 -0
- package/dist/adsets-LPN6WFGF.js +176 -0
- package/dist/advertisers-DS2NRWKI.js +125 -0
- package/dist/advertisers-XJG7XDK7.js +120 -0
- package/dist/analytics-DO4UKW2H.js +1976 -0
- package/dist/analytics-JVT2OBQC.js +433 -0
- package/dist/analytics-JVT2OBQC.js.map +1 -0
- package/dist/animate-G4P3OEJE.js +480 -0
- package/dist/assign-72YAL6TP.js +77 -0
- package/dist/audience-size-M5NU4QYN.js +73 -0
- package/dist/audience-size-M5NU4QYN.js.map +1 -0
- package/dist/audiences-3LRCLHTQ.js +85 -0
- package/dist/audiences-BU4JZJT7.js +268 -0
- package/dist/audiences-XEZHACKH.js +78 -0
- package/dist/audit-22KQAHJR.js +151 -0
- package/dist/audit-YEGQU474.js +88 -0
- package/dist/autocomplete-KLNQIK5T.js +111 -0
- package/dist/avatars-VO6FMJFB.js +38 -0
- package/dist/bid-pricing-52HDANYL.js +100 -0
- package/dist/bid-pricing-52HDANYL.js.map +1 -0
- package/dist/brand-XXNOVSGE.js +22 -0
- package/dist/brief-JIARAUIR.js +538 -0
- package/dist/brief-JIARAUIR.js.map +1 -0
- package/dist/businesses-PRRYPR7H.js +53 -0
- package/dist/campaign-groups-JFOFU76X.js +95 -0
- package/dist/campaign-writes-NSEJCINS.js +170 -0
- package/dist/campaign-writes-PKWLLKB5.js +165 -0
- package/dist/campaigns-4SOLY7OR.js +110 -0
- package/dist/campaigns-5AZMOOID.js +107 -0
- package/dist/campaigns-H4VK3GKK.js +109 -0
- package/dist/campaigns-VWN2XPK2.js +76 -0
- package/dist/canvas-TTV7QZZT.js +46 -0
- package/dist/capabilities-VJ53ROIP.js +144 -0
- package/dist/cards-WHMCSRZX.js +85 -0
- package/dist/catalog-43BSTAT6.js +65 -0
- package/dist/catalog-43BSTAT6.js.map +1 -0
- package/dist/catalogs-XH5NHH4C.js +128 -0
- package/dist/changes-F6WUXFC3.js +135 -0
- package/dist/chatgpt-K6KNTME4.js +47 -0
- package/dist/chats-PWLQO7UY.js +262 -0
- package/dist/check-545MAB4E.js +104 -0
- package/dist/check-545MAB4E.js.map +1 -0
- package/dist/chunk-232YUPUI.js +125 -0
- package/dist/chunk-23H4ZJRP.js +136 -0
- package/dist/chunk-2FSEESJU.js +1744 -0
- package/dist/chunk-2FSEESJU.js.map +1 -0
- package/dist/chunk-2QSPPWOU.js +6306 -0
- package/dist/chunk-2QSPPWOU.js.map +1 -0
- package/dist/chunk-2WTD5Y34.js +66 -0
- package/dist/chunk-2WTD5Y34.js.map +1 -0
- package/dist/chunk-3BKNGXCL.js +23992 -0
- package/dist/chunk-3BKNGXCL.js.map +1 -0
- package/dist/chunk-3OCSWUHV.js +67 -0
- package/dist/chunk-3UBTVAFJ.js +392 -0
- package/dist/chunk-3UBTVAFJ.js.map +1 -0
- package/dist/chunk-3ZHOBEQD.js +122 -0
- package/dist/chunk-3ZHOBEQD.js.map +1 -0
- package/dist/chunk-46TND6YK.js +207 -0
- package/dist/chunk-46TND6YK.js.map +1 -0
- package/dist/chunk-5SRHACZW.js +274 -0
- package/dist/chunk-5WMTPYKT.js +84 -0
- package/dist/chunk-64HQDJ2E.js +344 -0
- package/dist/chunk-64HQDJ2E.js.map +1 -0
- package/dist/chunk-6JWEGFM5.js +174 -0
- package/dist/chunk-6OIKNJ7G.js +26 -0
- package/dist/chunk-7RBJ2Z7Z.js +172 -0
- package/dist/chunk-AOZ7547I.js +159 -0
- package/dist/chunk-AOZ7547I.js.map +1 -0
- package/dist/chunk-B7FVPHCW.js +843 -0
- package/dist/chunk-B7FVPHCW.js.map +1 -0
- package/dist/chunk-BC2BXRXY.js +2887 -0
- package/dist/chunk-BC2BXRXY.js.map +1 -0
- package/dist/chunk-BFRIRZRZ.js +98 -0
- package/dist/chunk-BFZS3WHS.js +84 -0
- package/dist/chunk-BITS62MF.js +77 -0
- package/dist/chunk-BLAHHMPF.js +333 -0
- package/dist/chunk-C7MENOP5.js +224 -0
- package/dist/chunk-C7MENOP5.js.map +1 -0
- package/dist/chunk-CM6FCSWN.js +644 -0
- package/dist/chunk-CM6FCSWN.js.map +1 -0
- package/dist/chunk-CSN6L345.js +547 -0
- package/dist/chunk-CSN6L345.js.map +1 -0
- package/dist/chunk-CVBKW75S.js +296 -0
- package/dist/chunk-D4LKZJYJ.js +76 -0
- package/dist/chunk-D6KHVUDS.js +297 -0
- package/dist/chunk-D7KR6KXR.js +66 -0
- package/dist/chunk-D7KR6KXR.js.map +1 -0
- package/dist/chunk-DDES6J6A.js +97 -0
- package/dist/chunk-DDES6J6A.js.map +1 -0
- package/dist/chunk-DMVDVZJK.js +97 -0
- package/dist/chunk-DMVDVZJK.js.map +1 -0
- package/dist/chunk-DWX44QL6.js +75 -0
- package/dist/chunk-EE72SSB2.js +472 -0
- package/dist/chunk-EE72SSB2.js.map +1 -0
- package/dist/chunk-F3CZFUXZ.js +3187 -0
- package/dist/chunk-F3CZFUXZ.js.map +1 -0
- package/dist/chunk-F5IH7G2F.js +1919 -0
- package/dist/chunk-F5IH7G2F.js.map +1 -0
- package/dist/chunk-FNA277HP.js +97 -0
- package/dist/chunk-FQXGII24.js +592 -0
- package/dist/chunk-FU7HJWGM.js +26 -0
- package/dist/chunk-G5GV6SUK.js +399 -0
- package/dist/chunk-G5GV6SUK.js.map +1 -0
- package/dist/chunk-GD6UJDOB.js +665 -0
- package/dist/chunk-GDLQ6SGW.js +46 -0
- package/dist/chunk-GEKXIXMG.js +106 -0
- package/dist/chunk-GJWMPTUE.js +156 -0
- package/dist/chunk-GJWMPTUE.js.map +1 -0
- package/dist/chunk-GLW7UJLB.js +58 -0
- package/dist/chunk-GM46ZEYP.js +831 -0
- package/dist/chunk-GM46ZEYP.js.map +1 -0
- package/dist/chunk-H5HDZ7IC.js +139 -0
- package/dist/chunk-HNEYIWXW.js +8896 -0
- package/dist/chunk-HNEYIWXW.js.map +1 -0
- package/dist/chunk-I2WRZJAC.js +46 -0
- package/dist/chunk-I2WRZJAC.js.map +1 -0
- package/dist/chunk-I44SNQ34.js +275 -0
- package/dist/chunk-I5VZVQBZ.js +35 -0
- package/dist/chunk-IC6SDOED.js +45 -0
- package/dist/chunk-IN4G7X6W.js +94 -0
- package/dist/chunk-IPLE5K5E.js +188 -0
- package/dist/chunk-IYELKHBG.js +197 -0
- package/dist/chunk-JQNO6JCV.js +206 -0
- package/dist/chunk-JRFVSSKP.js +160 -0
- package/dist/chunk-JRFVSSKP.js.map +1 -0
- package/dist/chunk-JYBLCIRN.js +106 -0
- package/dist/chunk-K3TNTBZJ.js +52 -0
- package/dist/chunk-K4NMOWG7.js +455 -0
- package/dist/chunk-KOVQ2JGM.js +903 -0
- package/dist/chunk-KOVQ2JGM.js.map +1 -0
- package/dist/chunk-KPYDTIAI.js +317 -0
- package/dist/chunk-KPYDTIAI.js.map +1 -0
- package/dist/chunk-KXSXZAC2.js +225 -0
- package/dist/chunk-KXSXZAC2.js.map +1 -0
- package/dist/chunk-LCW3U4EA.js +25 -0
- package/dist/chunk-LFXE2G6R.js +61 -0
- package/dist/chunk-LFXE2G6R.js.map +1 -0
- package/dist/chunk-LMZAOTRX.js +846 -0
- package/dist/chunk-M6UNISGO.js +66 -0
- package/dist/chunk-M6UNISGO.js.map +1 -0
- package/dist/chunk-MI3JB5KB.js +76 -0
- package/dist/chunk-MJQBXFW6.js +74 -0
- package/dist/chunk-MK3OJZIU.js +23 -0
- package/dist/chunk-MPACDBH5.js +74 -0
- package/dist/chunk-MXWOYFI2.js +544 -0
- package/dist/chunk-MXWOYFI2.js.map +1 -0
- package/dist/chunk-N5O67GK5.js +215 -0
- package/dist/chunk-OP7DNHD2.js +137 -0
- package/dist/chunk-OP7DNHD2.js.map +1 -0
- package/dist/chunk-P3TNRS56.js +149 -0
- package/dist/chunk-P5PX2G7E.js +225 -0
- package/dist/chunk-P5PX2G7E.js.map +1 -0
- package/dist/chunk-PAJJXZ3Z.js +170 -0
- package/dist/chunk-PHPXAMY3.js +346 -0
- package/dist/chunk-PNVEV3XP.js +8928 -0
- package/dist/chunk-PNVEV3XP.js.map +1 -0
- package/dist/chunk-QABSQADZ.js +56 -0
- package/dist/chunk-QKABEX3F.js +148 -0
- package/dist/chunk-QKABEX3F.js.map +1 -0
- package/dist/chunk-QTLZXIF3.js +5366 -0
- package/dist/chunk-QTLZXIF3.js.map +1 -0
- package/dist/chunk-QVQKCVP7.js +85 -0
- package/dist/chunk-QVQKCVP7.js.map +1 -0
- package/dist/chunk-QYAI24PN.js +172 -0
- package/dist/chunk-QZHGIJOW.js +51 -0
- package/dist/chunk-REMR5FHD.js +91 -0
- package/dist/chunk-REMR5FHD.js.map +1 -0
- package/dist/chunk-RGX7AQ2K.js +131 -0
- package/dist/chunk-RGX7AQ2K.js.map +1 -0
- package/dist/chunk-RMNKCVRB.js +275 -0
- package/dist/chunk-RMNKCVRB.js.map +1 -0
- package/dist/chunk-ROX7LQRR.js +19 -0
- package/dist/chunk-S7A34DOA.js +111 -0
- package/dist/chunk-S7A34DOA.js.map +1 -0
- package/dist/chunk-S7B2TOOU.js +98 -0
- package/dist/chunk-SFJW2KED.js +166 -0
- package/dist/chunk-SIKCVWM3.js +76 -0
- package/dist/chunk-SK2N45LO.js +1079 -0
- package/dist/chunk-SOKVXKRM.js +74 -0
- package/dist/chunk-STNCMKL6.js +191 -0
- package/dist/chunk-SWL4AAPP.js +320 -0
- package/dist/chunk-SWL4AAPP.js.map +1 -0
- package/dist/chunk-TBHRRQZD.js +942 -0
- package/dist/chunk-TBHRRQZD.js.map +1 -0
- package/dist/chunk-TKPVVD52.js +169 -0
- package/dist/chunk-TNB5EIFV.js +433 -0
- package/dist/chunk-TUSR5R7I.js +57 -0
- package/dist/chunk-TY4BDVLG.js +624 -0
- package/dist/chunk-TY4BDVLG.js.map +1 -0
- package/dist/chunk-U63S2JWI.js +167 -0
- package/dist/chunk-U63S2JWI.js.map +1 -0
- package/dist/chunk-ULPO72IQ.js +225 -0
- package/dist/chunk-UTLIQBRY.js +604 -0
- package/dist/chunk-UTLIQBRY.js.map +1 -0
- package/dist/chunk-UWT7RCL3.js +363 -0
- package/dist/chunk-V4UIM4QE.js +103 -0
- package/dist/chunk-WHSTZRUY.js +64 -0
- package/dist/chunk-WHSTZRUY.js.map +1 -0
- package/dist/chunk-WNSE7N75.js +2123 -0
- package/dist/chunk-WNSE7N75.js.map +1 -0
- package/dist/chunk-XDZVBX6L.js +220 -0
- package/dist/chunk-XDZVBX6L.js.map +1 -0
- package/dist/chunk-XF5R2FQT.js +3868 -0
- package/dist/chunk-XF5R2FQT.js.map +1 -0
- package/dist/chunk-XFJNCZXA.js +142 -0
- package/dist/chunk-XFJNCZXA.js.map +1 -0
- package/dist/chunk-XGOEX2VJ.js +55 -0
- package/dist/chunk-XLJVJ5TK.js +1518 -0
- package/dist/chunk-XLJVJ5TK.js.map +1 -0
- package/dist/chunk-XP4G2DJL.js +494 -0
- package/dist/chunk-XZ4YMCZK.js +66 -0
- package/dist/chunk-Y3VRMFGF.js +42 -0
- package/dist/chunk-YU2XIIL3.js +191 -0
- package/dist/chunk-YU2XIIL3.js.map +1 -0
- package/dist/chunk-ZBUWO4XH.js +1599 -0
- package/dist/chunk-ZBUWO4XH.js.map +1 -0
- package/dist/chunk-ZJ6HUCRK.js +89 -0
- package/dist/chunk-ZJ6HUCRK.js.map +1 -0
- package/dist/claim-QHXKN7W6.js +197 -0
- package/dist/cli.js +101 -81
- package/dist/cli.js.map +1 -1
- package/dist/client-WL2FKW4T.js +19 -0
- package/dist/code-NXN7QYKU.js +76 -0
- package/dist/companies-PGVT62JL.js +195 -0
- package/dist/complete-TCTR3XVD.js +81 -0
- package/dist/config-VOF57KBL.js +88 -0
- package/dist/connect-4S7JLICS.js +42 -0
- package/dist/content-KA25YYO3.js +85 -0
- package/dist/conversation-DI4WMEL2.js +93 -0
- package/dist/conversion-report-KL4LIVY5.js +125 -0
- package/dist/conversion-upload-command-EIKJU5ZW.js +438 -0
- package/dist/conversion-writes-MPBCTVSP.js +120 -0
- package/dist/conversions-ACYT6K7H.js +76 -0
- package/dist/conversions-JTYMFX66.js +135 -0
- package/dist/countries-XGMZWUGP.js +82 -0
- package/dist/create-3QA7X2DD.js +207 -0
- package/dist/create-AFVT5JTH.js +235 -0
- package/dist/create-TYCOMVWR.js +59 -0
- package/dist/create-VFXEJ3EV.js +132 -0
- package/dist/create-VFXEJ3EV.js.map +1 -0
- package/dist/creatives-5VY3LT6X.js +58 -0
- package/dist/creatives-5VY3LT6X.js.map +1 -0
- package/dist/creatives-E6N2YLHE.js +182 -0
- package/dist/creatives-YJ3CXZQC.js +87 -0
- package/dist/credentials-34I6ZZWU.js +287 -0
- package/dist/critique-JM5QADYW.js +1451 -0
- package/dist/critique-JM5QADYW.js.map +1 -0
- package/dist/critique-OCVV6N3U.js +227 -0
- package/dist/critique-OCVV6N3U.js.map +1 -0
- package/dist/crm-4F3LFOZD.js +318 -0
- package/dist/crm-MNBYNP5R.js +224 -0
- package/dist/crop-7UTYG7GS.js +113 -0
- package/dist/currency-3QTI5RSB.js +88 -0
- package/dist/custom-conversions-YRYE65PU.js +125 -0
- package/dist/customers-VNYNT2EQ.js +56 -0
- package/dist/decide-TWKH5QQU.js +199 -0
- package/dist/delete-2GIIUPA3.js +69 -0
- package/dist/delete-AZEVPMVO.js +64 -0
- package/dist/delete-AZEVPMVO.js.map +1 -0
- package/dist/delete-GLLYPNNB.js +71 -0
- package/dist/delete-J7DXPGKD.js +71 -0
- package/dist/delete-PRJGFA2U.js +54 -0
- package/dist/delete-UZRHYEPK.js +66 -0
- package/dist/demographics-JMZA7MB6.js +138 -0
- package/dist/describe-5QCPRSIG.js +97 -0
- package/dist/describe-L3UC6MIL.js +97 -0
- package/dist/dimensions-POH4JXEM.js +101 -0
- package/dist/discard-OH3B5P4C.js +66 -0
- package/dist/discover-5GLET36U.js +172 -0
- package/dist/discover-XAJKZCMM.js +93 -0
- package/dist/domain-K3IILLYE.js +98 -0
- package/dist/download-N4J5WFHD.js +299 -0
- package/dist/draft-2KHUZTIE.js +217 -0
- package/dist/draft-7RYDPOFS.js +307 -0
- package/dist/draft-BB3UUWJP.js +328 -0
- package/dist/draft-EWDOIXSH.js +233 -0
- package/dist/draft-IL37WDST.js +103 -0
- package/dist/draft-KDMYGLWN.js +100 -0
- package/dist/draft-LZL6VWHX.js +306 -0
- package/dist/draft-VXGZDBC7.js +281 -0
- package/dist/engine/index.d.ts +31 -1
- package/dist/engine/index.js +15 -14
- package/dist/env-5MUVYE2L.js +51 -0
- package/dist/experiment-G3FQVAJU.js +1397 -0
- package/dist/export-OLDI32HM.js +168 -0
- package/dist/extract-PPS6ONQN.js +113 -0
- package/dist/facets-PAWOEHOK.js +114 -0
- package/dist/favorites-4ELADD3R.js +178 -0
- package/dist/feed-XIY5TVDL.js +177 -0
- package/dist/feedback-GAGIKZ6B.js +106 -0
- package/dist/feedback-GAGIKZ6B.js.map +1 -0
- package/dist/feedback-record-ZORDBRV2.js +260 -0
- package/dist/feedback-record-ZORDBRV2.js.map +1 -0
- package/dist/fetch-M5GIBURQ.js +176 -0
- package/dist/fetch-YWUVDMUH.js +139 -0
- package/dist/find-EVY4XEIQ.js +134 -0
- package/dist/find-EVY4XEIQ.js.map +1 -0
- package/dist/fit-DGCYW7LN.js +62 -0
- package/dist/flows-TD6PNUDM.js +247 -0
- package/dist/flows-TD6PNUDM.js.map +1 -0
- package/dist/follow-ZTPZKIMZ.js +94 -0
- package/dist/follow-competitors-6QDVQ4VJ.js +112 -0
- package/dist/following-PBZLZFGQ.js +113 -0
- package/dist/fonts-IQ6XOUGU.js +36 -0
- package/dist/forecast-FACEH4WR.js +118 -0
- package/dist/forecast-FACEH4WR.js.map +1 -0
- package/dist/forecast-YXOKAWDZ.js +168 -0
- package/dist/funding-ULBMKUMW.js +85 -0
- package/dist/funnel-CJRFDTCD.js +394 -0
- package/dist/ga4-2BL5YAYN.js +55 -0
- package/dist/generate-D3LUXFJT.js +263 -0
- package/dist/generate-D3LUXFJT.js.map +1 -0
- package/dist/get-6RZU4M6W.js +63 -0
- package/dist/get-7GCEJ6KG.js +92 -0
- package/dist/get-JRMJLLU5.js +79 -0
- package/dist/get-JRMJLLU5.js.map +1 -0
- package/dist/get-MZWUMHEF.js +61 -0
- package/dist/get-NUL4YJG5.js +56 -0
- package/dist/get-OAZZHUZP.js +59 -0
- package/dist/get-OHU2N7B7.js +63 -0
- package/dist/gif-NYZYV5RY.js +102 -0
- package/dist/gif-NYZYV5RY.js.map +1 -0
- package/dist/google-7STODZQR.js +136 -0
- package/dist/google-URYXWN5O.js +3190 -0
- package/dist/google-URYXWN5O.js.map +1 -0
- package/dist/google-ads-BB7CF4NV.js +195 -0
- package/dist/group-D5WXNFCP.js +43 -0
- package/dist/group-Y5PLETFT.js +43 -0
- package/dist/gsc-UU3T2C6B.js +30 -0
- package/dist/history-OQAOTEO3.js +67 -0
- package/dist/history-Q47TKZJS.js +133 -0
- package/dist/hubspot-A6O5GVTH.js +779 -0
- package/dist/icon-GB7UH5RF.js +137 -0
- package/dist/ideas-LD6X753E.js +40 -0
- package/dist/images-XY5DLJEA.js +92 -0
- package/dist/images-XY5DLJEA.js.map +1 -0
- package/dist/improve-U5USRH4G.js +86 -0
- package/dist/ingest-PUMTHASV.js +107 -0
- package/dist/ingest-WWNSA6VZ.js +23 -0
- package/dist/insights-4HT2NAYP.js +423 -0
- package/dist/insights-4HT2NAYP.js.map +1 -0
- package/dist/insights-PZXFCMX2.js +122 -0
- package/dist/insights-PZXFCMX2.js.map +1 -0
- package/dist/inspect-5PRLZLF5.js +189 -0
- package/dist/inspiration-XQYHBJY2.js +53 -0
- package/dist/intent-4QVVI4FF.js +95 -0
- package/dist/job-CGQHEANB.js +202 -0
- package/dist/job-create-SZYJT2NC.js +109 -0
- package/dist/job-status-6LAKLCKH.js +74 -0
- package/dist/keep-3MJSHWU3.js +78 -0
- package/dist/keyword-gap-YMMDRYVK.js +130 -0
- package/dist/keyword-metrics-FB7FCYK6.js +197 -0
- package/dist/keywords-for-site-YZYALONY.js +128 -0
- package/dist/landing-XOCPIOWX.js +28 -0
- package/dist/landings-ZLKUP66P.js +151 -0
- package/dist/languages-3IJVDS5Z.js +55 -0
- package/dist/languages-R3Y2IOFU.js +40 -0
- package/dist/launches-RG2SWEXM.js +19 -0
- package/dist/layerize-SJYK6HPD.js +190 -0
- package/dist/leads-2XOSAYP4.js +293 -0
- package/dist/leads-SWINPYEP.js +90 -0
- package/dist/learn-6HVDSTTJ.js +204 -0
- package/dist/learn-6HVDSTTJ.js.map +1 -0
- package/dist/library-Q4OU7VR7.js +109 -0
- package/dist/library-Q4OU7VR7.js.map +1 -0
- package/dist/lighthouse-FALRSVQH.js +75 -0
- package/dist/line-item-writes-FG3TY4W4.js +208 -0
- package/dist/line-items-ZNVBFA4H.js +103 -0
- package/dist/link-IFEXIUDW.js +64 -0
- package/dist/linkedin-NINSMEW6.js +1045 -0
- package/dist/linkedin-NINSMEW6.js.map +1 -0
- package/dist/list-2ZTOMTES.js +65 -0
- package/dist/list-FR2OVRVL.js +151 -0
- package/dist/list-GK6LNWIW.js +76 -0
- package/dist/list-K65FY6SV.js +303 -0
- package/dist/list-RJG3FMZR.js +64 -0
- package/dist/list-RJG3FMZR.js.map +1 -0
- package/dist/list-RR53EF3O.js +57 -0
- package/dist/list-TB677Q2F.js +50 -0
- package/dist/list-VTVRZIYL.js +51 -0
- package/dist/locations-6IH7WGRG.js +40 -0
- package/dist/locations-VL2G22Y5.js +67 -0
- package/dist/log-TAKCMC2C.js +92 -0
- package/dist/logo-YSNUUT33.js +18 -0
- package/dist/lookup-RH5N3OWJ.js +22 -0
- package/dist/make-EWHS4EHQ.js +1345 -0
- package/dist/make-EWHS4EHQ.js.map +1 -0
- package/dist/map-DWLEYXSW.js +433 -0
- package/dist/map-DWLEYXSW.js.map +1 -0
- package/dist/mcp-NNQZ5B7N.js +463 -0
- package/dist/media-ES2UBGYW.js +15 -0
- package/dist/media-MPXEXN4O.js +89 -0
- package/dist/media-sources-OAFBA62X.js +32 -0
- package/dist/members-SS7IBYVE.js +44 -0
- package/dist/meme-FMHHKWVU.js +100 -0
- package/dist/meme-FMHHKWVU.js.map +1 -0
- package/dist/meta-AOIPEDV5.js +69 -0
- package/dist/metrics-YLAREC4T.js +152 -0
- package/dist/models-IH6KE6OH.js +155 -0
- package/dist/normalize-NR5RS3WR.js +806 -0
- package/dist/normalize-WOZTAI6C.js +141 -0
- package/dist/options-PL44BV5E.js +122 -0
- package/dist/options-PL44BV5E.js.map +1 -0
- package/dist/organization-SQBODZUK.js +328 -0
- package/dist/organization-SQBODZUK.js.map +1 -0
- package/dist/output-GWIP6ROX.js +24 -0
- package/dist/page-YWGBCN65.js +105 -0
- package/dist/pages-FTI44OSH.js +66 -0
- package/dist/performance-WRARV3YR.js +24 -0
- package/dist/pinterest-J442QLQS.js +96 -0
- package/dist/pixels-DWW2TDY2.js +60 -0
- package/dist/pixels-MBKR4XPX.js +108 -0
- package/dist/plan-YPE77T4R.js +207 -0
- package/dist/preview-V4YBD45S.js +169 -0
- package/dist/profile-S3MXS2VO.js +159 -0
- package/dist/profile-S3MXS2VO.js.map +1 -0
- package/dist/promoted-tweet-writes-CAD3RGU4.js +180 -0
- package/dist/promoted-tweets-NYJP3TXL.js +119 -0
- package/dist/properties-G3L2OAOL.js +101 -0
- package/dist/publish-ZW6VHB27.js +341 -0
- package/dist/publish-ZW6VHB27.js.map +1 -0
- package/dist/query-QRPBV2AR.js +61 -0
- package/dist/query-WCB5W4NW.js +236 -0
- package/dist/query-YBS6ZQ75.js +247 -0
- package/dist/questionnaire-PAK4DALP.js +93 -0
- package/dist/read-LUTB3UOR.js +141 -0
- package/dist/reddit-VJTNXORD.js +26 -0
- package/dist/refresh-6I52WXG5.js +94 -0
- package/dist/release-LSSYP2ZJ.js +60 -0
- package/dist/relevant-pages-2XHS5WP4.js +99 -0
- package/dist/remove-K62YJYGT.js +50 -0
- package/dist/remove-X6DNVS67.js +48 -0
- package/dist/reopen-RPVEBQVR.js +63 -0
- package/dist/rerun-ETH2NEEX.js +90 -0
- package/dist/rerun-ETH2NEEX.js.map +1 -0
- package/dist/research-4ASN2KMB.js +62 -0
- package/dist/research-6J3EOBAL.js +262 -0
- package/dist/reset-ETORO5UO.js +54 -0
- package/dist/reset-YVTYHSTY.js +54 -0
- package/dist/resolve-BI7GB5U2.js +121 -0
- package/dist/retry-2ZZCKSRW.js +62 -0
- package/dist/retry-QZ7YHXF3.js +60 -0
- package/dist/retry-failed-EJBP4236.js +45 -0
- package/dist/rules-KEHQEXEU.js +96 -0
- package/dist/rules-KEHQEXEU.js.map +1 -0
- package/dist/rules-add-IDBWO6XV.js +462 -0
- package/dist/rules-add-IDBWO6XV.js.map +1 -0
- package/dist/run-FFASB4YB.js +65 -0
- package/dist/run-KYEOLJFV.js +66 -0
- package/dist/run-KYEOLJFV.js.map +1 -0
- package/dist/scaffold-ad-EKCXHZPT.js +1511 -0
- package/dist/scaffold-ad-EKCXHZPT.js.map +1 -0
- package/dist/scaffold-static-ad-MWKTXATN.js +1005 -0
- package/dist/scaffold-static-ad-MWKTXATN.js.map +1 -0
- package/dist/scaffold-video-BYPPH352.js +883 -0
- package/dist/scaffold-video-BYPPH352.js.map +1 -0
- package/dist/schedule-4BK2ML6F.js +61 -0
- package/dist/schedule-IDZC6M32.js +66 -0
- package/dist/scheduled-agents-GMGP3G6T.js +50 -0
- package/dist/scheduled-agents-GMGP3G6T.js.map +1 -0
- package/dist/schema-EFR7NGJG.js +69 -0
- package/dist/schema-EFR7NGJG.js.map +1 -0
- package/dist/schema-QPPWADIL.js +132 -0
- package/dist/scrape-J2Y7YZ4Z.js +2241 -0
- package/dist/screenshot-K7ZGTVTE.js +102 -0
- package/dist/search-CI7LEOOK.js +92 -0
- package/dist/search-GCSQ6CSD.js +174 -0
- package/dist/search-I6DRUXBX.js +224 -0
- package/dist/search-TTL7VQET.js +26 -0
- package/dist/search-VT2KUAH6.js +91 -0
- package/dist/search-copy-N2AIJNUH.js +168 -0
- package/dist/seeds-EYYQCMGF.js +101 -0
- package/dist/select-CPFKK57J.js +101 -0
- package/dist/select-CPFKK57J.js.map +1 -0
- package/dist/sends-RHVFV2XM.js +309 -0
- package/dist/sequences-5DUWNSWQ.js +146 -0
- package/dist/set-prompt-TJ3UTNYS.js +193 -0
- package/dist/set-prompt-TJ3UTNYS.js.map +1 -0
- package/dist/setup-links-C3EUV2RX.js +141 -0
- package/dist/shared-NDRFKAH7.js +31 -0
- package/dist/site-W5W7FCUD.js +177 -0
- package/dist/sitemaps-QKKXMXMV.js +87 -0
- package/dist/sites-GRC6CCCK.js +101 -0
- package/dist/skills-UML6GSW6.js +47 -0
- package/dist/sources-AWODYZDS.js +454 -0
- package/dist/sources-AWODYZDS.js.map +1 -0
- package/dist/sources-SGGLJIOA.js +30 -0
- package/dist/stale-KILEXX57.js +71 -0
- package/dist/stale-KILEXX57.js.map +1 -0
- package/dist/stats-RCLQE4HJ.js +34 -0
- package/dist/status-KUSLGZD7.js +62 -0
- package/dist/sticker-SINY47WT.js +94 -0
- package/dist/stock-ECRBD7RP.js +179 -0
- package/dist/studio-LMDDQWRY.js +49 -0
- package/dist/sync-2MFUI3ME.js +54 -0
- package/dist/sync-IE4AAVGY.js +265 -0
- package/dist/sync-IE4AAVGY.js.map +1 -0
- package/dist/sync-TCY4NX7J.js +54 -0
- package/dist/sync-definition-DGSAZGQZ.js +64 -0
- package/dist/tag-manager-G3LBQZUL.js +43 -0
- package/dist/tags-IHLO2NDM.js +20 -0
- package/dist/tags-QQLYW2QQ.js +224 -0
- package/dist/tags-QXRKKRIR.js +20 -0
- package/dist/tags-U5YWCPFW.js +20 -0
- package/dist/tags-ZYVOKGHU.js +26 -0
- package/dist/targeting-constants-KEKYU5JQ.js +118 -0
- package/dist/targeting-criteria-AEBSY6OY.js +113 -0
- package/dist/targets-5Q2OFVXL.js +103 -0
- package/dist/targets-5Q2OFVXL.js.map +1 -0
- package/dist/testimonials-O52ULRAU.js +32 -0
- package/dist/themes-26XFWSWC.js +94 -0
- package/dist/top-companies-OMGAFFWN.js +108 -0
- package/dist/translate-C5LZ6KVN.js +604 -0
- package/dist/translate-C5LZ6KVN.js.map +1 -0
- package/dist/triggers-PTPG6OQ6.js +142 -0
- package/dist/triggers-PTPG6OQ6.js.map +1 -0
- package/dist/tweets-C3QUKS3I.js +123 -0
- package/dist/unfollow-ZI5QU7RD.js +46 -0
- package/dist/unlink-3BAXM2OH.js +67 -0
- package/dist/unstage-7F7JI6HY.js +95 -0
- package/dist/unstage-EFW465VN.js +85 -0
- package/dist/unstage-EFW465VN.js.map +1 -0
- package/dist/update-2RCIXWP3.js +98 -0
- package/dist/update-5A7Q7S6I.js +63 -0
- package/dist/update-VTUB2M5I.js +188 -0
- package/dist/update-VTUB2M5I.js.map +1 -0
- package/dist/update-XPRHUFBR.js +152 -0
- package/dist/update-XPRHUFBR.js.map +1 -0
- package/dist/upload-KO46L76G.js +150 -0
- package/dist/upload-Y3TACPEN.js +126 -0
- package/dist/upscale-SJ7SCSRS.js +109 -0
- package/dist/url-options-6CNDIUDM.js +130 -0
- package/dist/url-params-ZUYOLAJG.js +98 -0
- package/dist/use-6ULEM3WE.js +95 -0
- package/dist/validate-KPJLIGYY.js +117 -0
- package/dist/validate-KPJLIGYY.js.map +1 -0
- package/dist/variant-5TRRSYBB.js +338 -0
- package/dist/videos-EFMNE6U2.js +39 -0
- package/dist/view-ABSWZMXW.js +121 -0
- package/dist/viewer-check-2GI26EKA.js +80 -0
- package/dist/viewer-check-2GI26EKA.js.map +1 -0
- package/dist/web-4JGYRY36.js +140 -0
- package/dist/winners-KRISBKOR.js +113 -0
- package/dist/winning-ads-6SXA4HGB.js +84 -0
- package/dist/write-commands-HCQI4Y27.js +737 -0
- package/dist/write-commands-LQXKNBA5.js +1015 -0
- package/dist/write-commands-QCI6XBM7.js +206 -0
- package/dist/write-commands-RHCCPMAE.js +713 -0
- package/dist/x-LUEUC3XO.js +47 -0
- package/package.json +2 -1
- package/dist/account-67PZBEP6.js +0 -79
- package/dist/account-HZC6X2PH.js +0 -49
- package/dist/account-TQUV64XP.js +0 -80
- package/dist/account-reads-IRBTERTY.js +0 -218
- package/dist/account-writes-ALDSHAEV.js +0 -66
- package/dist/accounts-4P54UY6F.js +0 -115
- package/dist/accounts-6UNBLIUH.js +0 -75
- package/dist/accounts-GVTZN4VE.js +0 -114
- package/dist/accounts-NJ6TF6WH.js +0 -611
- package/dist/accounts-WTB737BM.js +0 -77
- package/dist/actions-D3BOWDEB.js +0 -55
- package/dist/active-entities-J2O76SRP.js +0 -103
- package/dist/activities-2J7FTZMN.js +0 -74
- package/dist/ad-group-writes-PQKDCMQF.js +0 -170
- package/dist/ad-groups-NGYEJMV4.js +0 -68
- package/dist/ad-writes-77FVHJTS.js +0 -174
- package/dist/add-2FHPLALV.js +0 -105
- package/dist/add-2XJYOGKW.js +0 -104
- package/dist/add-62JPGFD4.js +0 -302
- package/dist/add-JP76KCCY.js +0 -97
- package/dist/add-accounts-M5Y4DQFM.js +0 -91
- package/dist/ads-DB5NDHX5.js +0 -128
- package/dist/ads-J2F7BSHR.js +0 -45
- package/dist/ads-J2F7BSHR.js.map +0 -1
- package/dist/ads-LYNA2I7B.js +0 -77
- package/dist/ads-W2IPUWHQ.js +0 -113
- package/dist/adsets-PY5ZKGBO.js +0 -176
- package/dist/advertisers-BVAZ4XUX.js +0 -125
- package/dist/advertisers-NZPJQF7W.js +0 -120
- package/dist/analytics-K2QIWKBN.js +0 -444
- package/dist/analytics-K2QIWKBN.js.map +0 -1
- package/dist/analytics-NTPZKMYK.js +0 -1976
- package/dist/animate-EIV2OHXT.js +0 -480
- package/dist/assign-UNIA5YDC.js +0 -77
- package/dist/audience-size-4NN6ENP5.js +0 -94
- package/dist/audience-size-4NN6ENP5.js.map +0 -1
- package/dist/audiences-45ZCY2VZ.js +0 -268
- package/dist/audiences-UUIYQFS6.js +0 -78
- package/dist/audiences-VYFX7OFS.js +0 -85
- package/dist/audit-NSVHNA5J.js +0 -151
- package/dist/audit-OWXTLQC4.js +0 -88
- package/dist/autocomplete-EHWAQYVB.js +0 -111
- package/dist/avatars-7WZPW7BV.js +0 -38
- package/dist/bid-pricing-F5NDMS6W.js +0 -99
- package/dist/bid-pricing-F5NDMS6W.js.map +0 -1
- package/dist/brand-QAJ5VWFM.js +0 -22
- package/dist/brief-V2OB5OJW.js +0 -490
- package/dist/brief-V2OB5OJW.js.map +0 -1
- package/dist/businesses-ZH67AXR6.js +0 -53
- package/dist/campaign-groups-KFJKLNNU.js +0 -95
- package/dist/campaign-writes-BDGQ6XB3.js +0 -170
- package/dist/campaign-writes-FNMAGCKB.js +0 -165
- package/dist/campaigns-66OOGMDW.js +0 -110
- package/dist/campaigns-6HMHOXXY.js +0 -109
- package/dist/campaigns-HJTGX5WW.js +0 -76
- package/dist/campaigns-KT3J2O7S.js +0 -107
- package/dist/canvas-MQ6ZE5CZ.js +0 -46
- package/dist/capabilities-RVUMPP7C.js +0 -144
- package/dist/cards-I4BZIYUV.js +0 -85
- package/dist/catalog-NLL5VDRK.js +0 -64
- package/dist/catalog-NLL5VDRK.js.map +0 -1
- package/dist/catalogs-B2NKQO24.js +0 -128
- package/dist/changes-FX3TPYGT.js +0 -135
- package/dist/chatgpt-3NS2R442.js +0 -47
- package/dist/chats-72L7U4ML.js +0 -262
- package/dist/chunk-2KIF3U2C.js +0 -51
- package/dist/chunk-35ENAFJX.js +0 -46
- package/dist/chunk-3ZWHAIMU.js +0 -207
- package/dist/chunk-3ZWHAIMU.js.map +0 -1
- package/dist/chunk-4DM6OAQ6.js +0 -2065
- package/dist/chunk-4DM6OAQ6.js.map +0 -1
- package/dist/chunk-4TU2MWBJ.js +0 -275
- package/dist/chunk-57UECM77.js +0 -98
- package/dist/chunk-5HYSKH77.js +0 -315
- package/dist/chunk-5HYSKH77.js.map +0 -1
- package/dist/chunk-65BQAJMH.js +0 -136
- package/dist/chunk-6GFJFTG6.js +0 -75
- package/dist/chunk-6HPIWZHS.js +0 -76
- package/dist/chunk-73B3RQJC.js +0 -610
- package/dist/chunk-73B3RQJC.js.map +0 -1
- package/dist/chunk-7GYM4I5I.js +0 -206
- package/dist/chunk-7NTION5F.js +0 -26
- package/dist/chunk-7SX73SH2.js +0 -2902
- package/dist/chunk-7SX73SH2.js.map +0 -1
- package/dist/chunk-AFDPISNJ.js +0 -111
- package/dist/chunk-AFDPISNJ.js.map +0 -1
- package/dist/chunk-AIDXJHZ4.js +0 -433
- package/dist/chunk-AR7PU7BB.js +0 -76
- package/dist/chunk-AXVOBRQT.js +0 -1442
- package/dist/chunk-AXVOBRQT.js.map +0 -1
- package/dist/chunk-BBBZR7MF.js +0 -160
- package/dist/chunk-BBBZR7MF.js.map +0 -1
- package/dist/chunk-BVYPRGPG.js +0 -92
- package/dist/chunk-BVYPRGPG.js.map +0 -1
- package/dist/chunk-CAMX6OHF.js +0 -3182
- package/dist/chunk-CAMX6OHF.js.map +0 -1
- package/dist/chunk-CBCGVPHB.js +0 -125
- package/dist/chunk-CECS3DHZ.js +0 -333
- package/dist/chunk-CZYUZL6R.js +0 -3151
- package/dist/chunk-CZYUZL6R.js.map +0 -1
- package/dist/chunk-D5MF337I.js +0 -97
- package/dist/chunk-DDTILZXI.js +0 -103
- package/dist/chunk-DL2W4N7J.js +0 -52
- package/dist/chunk-DLUWHZCE.js +0 -225
- package/dist/chunk-EOGPNV25.js +0 -509
- package/dist/chunk-EOGPNV25.js.map +0 -1
- package/dist/chunk-F3FSD6BO.js +0 -96
- package/dist/chunk-F3FSD6BO.js.map +0 -1
- package/dist/chunk-FDG2LLX7.js +0 -494
- package/dist/chunk-FE7T32YL.js +0 -163
- package/dist/chunk-FE7T32YL.js.map +0 -1
- package/dist/chunk-FIN4ZXGJ.js +0 -70
- package/dist/chunk-FIN4ZXGJ.js.map +0 -1
- package/dist/chunk-FO5EP6DA.js +0 -24008
- package/dist/chunk-FO5EP6DA.js.map +0 -1
- package/dist/chunk-FSGTITIW.js +0 -622
- package/dist/chunk-FSGTITIW.js.map +0 -1
- package/dist/chunk-FSPV2DUG.js +0 -310
- package/dist/chunk-FSPV2DUG.js.map +0 -1
- package/dist/chunk-FYAWA3FO.js +0 -1830
- package/dist/chunk-FYAWA3FO.js.map +0 -1
- package/dist/chunk-G3KO2HFZ.js +0 -35
- package/dist/chunk-GKXMIXEV.js +0 -166
- package/dist/chunk-GT4UFORX.js +0 -296
- package/dist/chunk-GZ6YS7TG.js +0 -106
- package/dist/chunk-H7JOVRHO.js +0 -106
- package/dist/chunk-IJDF7D4U.js +0 -139
- package/dist/chunk-INJHF7AF.js +0 -172
- package/dist/chunk-IZFGTGFR.js +0 -67
- package/dist/chunk-J2QOKD2F.js +0 -76
- package/dist/chunk-J5WZ7SAD.js +0 -346
- package/dist/chunk-JC6GNMA7.js +0 -297
- package/dist/chunk-KB5HBQEK.js +0 -25
- package/dist/chunk-KB5XJHQX.js +0 -216
- package/dist/chunk-KB5XJHQX.js.map +0 -1
- package/dist/chunk-KM4AAAHZ.js +0 -5187
- package/dist/chunk-KM4AAAHZ.js.map +0 -1
- package/dist/chunk-LFZTGIPJ.js +0 -384
- package/dist/chunk-LFZTGIPJ.js.map +0 -1
- package/dist/chunk-LHNL6JM2.js +0 -309
- package/dist/chunk-LHNL6JM2.js.map +0 -1
- package/dist/chunk-LMHVLUD4.js +0 -175
- package/dist/chunk-LMHVLUD4.js.map +0 -1
- package/dist/chunk-NAMEFVWL.js +0 -1743
- package/dist/chunk-NAMEFVWL.js.map +0 -1
- package/dist/chunk-NFSLRRIE.js +0 -77
- package/dist/chunk-NORAJYUI.js +0 -172
- package/dist/chunk-NQTSHC7Z.js +0 -304
- package/dist/chunk-NQTSHC7Z.js.map +0 -1
- package/dist/chunk-O3LHCQ7Q.js +0 -136
- package/dist/chunk-O3LHCQ7Q.js.map +0 -1
- package/dist/chunk-O4ABJ352.js +0 -4410
- package/dist/chunk-O4ABJ352.js.map +0 -1
- package/dist/chunk-O5XLQUDS.js +0 -846
- package/dist/chunk-OI7KSXZM.js +0 -6265
- package/dist/chunk-OI7KSXZM.js.map +0 -1
- package/dist/chunk-OO67YTPM.js +0 -35
- package/dist/chunk-OO67YTPM.js.map +0 -1
- package/dist/chunk-OXBPKBSK.js +0 -6667
- package/dist/chunk-OXBPKBSK.js.map +0 -1
- package/dist/chunk-P3XJUOWT.js +0 -474
- package/dist/chunk-P3XJUOWT.js.map +0 -1
- package/dist/chunk-P3ZJIIDS.js +0 -57
- package/dist/chunk-P5T7OZKV.js +0 -26
- package/dist/chunk-P66JWKAL.js +0 -533
- package/dist/chunk-P66JWKAL.js.map +0 -1
- package/dist/chunk-PA5MYVQY.js +0 -66
- package/dist/chunk-PELW56D7.js +0 -45
- package/dist/chunk-PGVF4SB7.js +0 -169
- package/dist/chunk-Q676JHJA.js +0 -58
- package/dist/chunk-QDOVBGKZ.js +0 -149
- package/dist/chunk-QHIUJXU7.js +0 -363
- package/dist/chunk-QJPPPQPD.js +0 -98
- package/dist/chunk-QNEX7FEC.js +0 -174
- package/dist/chunk-QTL4NJ5I.js +0 -65
- package/dist/chunk-QTL4NJ5I.js.map +0 -1
- package/dist/chunk-QWX3QJNM.js +0 -170
- package/dist/chunk-QXDEZKAR.js +0 -455
- package/dist/chunk-QXDEZKAR.js.map +0 -1
- package/dist/chunk-RG7OMI5W.js +0 -1621
- package/dist/chunk-RG7OMI5W.js.map +0 -1
- package/dist/chunk-RUHMLPH5.js +0 -455
- package/dist/chunk-SJLIV6PF.js +0 -19
- package/dist/chunk-SLCSLVGS.js +0 -274
- package/dist/chunk-THU74XR6.js +0 -96
- package/dist/chunk-THU74XR6.js.map +0 -1
- package/dist/chunk-TY7TEU3T.js +0 -1079
- package/dist/chunk-UXTZ5MBE.js +0 -56
- package/dist/chunk-V43RLLZE.js +0 -55
- package/dist/chunk-V7PMSMPF.js +0 -817
- package/dist/chunk-V7PMSMPF.js.map +0 -1
- package/dist/chunk-VFSLIDXA.js +0 -42
- package/dist/chunk-VHMNSO2B.js +0 -84
- package/dist/chunk-VKH6LSC2.js +0 -188
- package/dist/chunk-VTCBPYGE.js +0 -592
- package/dist/chunk-W6ASM6UP.js +0 -197
- package/dist/chunk-W7KB3LJE.js +0 -60
- package/dist/chunk-W7KB3LJE.js.map +0 -1
- package/dist/chunk-WESRVXFS.js +0 -133
- package/dist/chunk-WESRVXFS.js.map +0 -1
- package/dist/chunk-WILN7TD6.js +0 -84
- package/dist/chunk-YGK7ZHNI.js +0 -337
- package/dist/chunk-YGK7ZHNI.js.map +0 -1
- package/dist/chunk-YGL5LTEA.js +0 -665
- package/dist/chunk-YONSWWCF.js +0 -215
- package/dist/chunk-Z5KBRTB2.js +0 -191
- package/dist/chunk-Z62XZCBE.js +0 -541
- package/dist/chunk-Z62XZCBE.js.map +0 -1
- package/dist/chunk-ZBKBTTHD.js +0 -74
- package/dist/chunk-ZJR5E53N.js +0 -23
- package/dist/chunk-ZLU5QDLU.js +0 -486
- package/dist/chunk-ZLU5QDLU.js.map +0 -1
- package/dist/chunk-ZNNC6B75.js +0 -94
- package/dist/chunk-ZO2YLHRW.js +0 -74
- package/dist/chunk-ZPJE6D7W.js +0 -74
- package/dist/claim-DIITRUIN.js +0 -197
- package/dist/client-LY2JCQS2.js +0 -19
- package/dist/code-7CBNYUPU.js +0 -76
- package/dist/companies-HHSYHL74.js +0 -195
- package/dist/complete-M3TURPU5.js +0 -81
- package/dist/config-7COTFJWK.js +0 -88
- package/dist/connect-TQL5EVVE.js +0 -42
- package/dist/content-OXMONMHJ.js +0 -85
- package/dist/conversation-GE273GC4.js +0 -93
- package/dist/conversion-report-BH4HH2Q3.js +0 -125
- package/dist/conversion-upload-command-QWWYCTNV.js +0 -438
- package/dist/conversion-writes-HG2O6JI7.js +0 -120
- package/dist/conversions-DP6ZF57D.js +0 -135
- package/dist/conversions-XPSN7SOW.js +0 -76
- package/dist/countries-UXAUGSBR.js +0 -82
- package/dist/create-ENQWVWGB.js +0 -59
- package/dist/create-NVXJP477.js +0 -207
- package/dist/create-PITWGVAS.js +0 -130
- package/dist/create-PITWGVAS.js.map +0 -1
- package/dist/create-XLZYNFKN.js +0 -235
- package/dist/creatives-O3444SBT.js +0 -182
- package/dist/creatives-ONKKGW5T.js +0 -87
- package/dist/creatives-U6IKIQBT.js +0 -51
- package/dist/creatives-U6IKIQBT.js.map +0 -1
- package/dist/credentials-3UY7RVUL.js +0 -287
- package/dist/critique-3LMW73QJ.js +0 -1449
- package/dist/critique-3LMW73QJ.js.map +0 -1
- package/dist/critique-KB32Y4AW.js +0 -213
- package/dist/critique-KB32Y4AW.js.map +0 -1
- package/dist/crm-OX67TBWD.js +0 -224
- package/dist/crm-XXU5XZIQ.js +0 -318
- package/dist/crop-3ZV5BFCA.js +0 -113
- package/dist/currency-XP4EMU4M.js +0 -88
- package/dist/custom-conversions-TV23XQHW.js +0 -125
- package/dist/customers-EJ7FVCTC.js +0 -56
- package/dist/decide-EGQ3CRHI.js +0 -199
- package/dist/delete-55IHV25V.js +0 -63
- package/dist/delete-55IHV25V.js.map +0 -1
- package/dist/delete-GXLPIGTC.js +0 -54
- package/dist/delete-MUPTLWHI.js +0 -71
- package/dist/delete-OW2N4WIA.js +0 -66
- package/dist/delete-R2SEUSLV.js +0 -69
- package/dist/delete-ZGBBWFAW.js +0 -71
- package/dist/demographics-K6DEWUE5.js +0 -138
- package/dist/describe-4O3VCV6L.js +0 -97
- package/dist/describe-FCTM53MM.js +0 -97
- package/dist/dimensions-AD4VS5AH.js +0 -101
- package/dist/discard-NZ7FQJEE.js +0 -66
- package/dist/discover-OISU5EJF.js +0 -172
- package/dist/discover-UQXQUPNO.js +0 -93
- package/dist/domain-DXBHNZLO.js +0 -98
- package/dist/download-IE6XLFHM.js +0 -299
- package/dist/draft-DB6KMBCH.js +0 -306
- package/dist/draft-ENA7S4Y7.js +0 -103
- package/dist/draft-HJBAG3SN.js +0 -307
- package/dist/draft-ICEVLF4E.js +0 -328
- package/dist/draft-MGKJ5RYI.js +0 -100
- package/dist/draft-OBFKQEPK.js +0 -281
- package/dist/draft-OOHU6NMA.js +0 -217
- package/dist/draft-S6VPKZYY.js +0 -233
- package/dist/env-YLOVBOAE.js +0 -43
- package/dist/experiment-PHFP6IBM.js +0 -1397
- package/dist/export-R2IMUCQO.js +0 -168
- package/dist/extract-OQP3TSQG.js +0 -113
- package/dist/facets-NUKR7I57.js +0 -114
- package/dist/favorites-NS73FDG5.js +0 -178
- package/dist/feed-SQPOB7SP.js +0 -177
- package/dist/feedback-SQAAAKOQ.js +0 -66
- package/dist/feedback-SQAAAKOQ.js.map +0 -1
- package/dist/feedback-record-7W7WBHSQ.js +0 -175
- package/dist/feedback-record-7W7WBHSQ.js.map +0 -1
- package/dist/fetch-PQ3NOPIE.js +0 -139
- package/dist/fetch-PTSAVQW5.js +0 -176
- package/dist/find-Y22AANDE.js +0 -134
- package/dist/find-Y22AANDE.js.map +0 -1
- package/dist/fit-IITU6UWC.js +0 -45
- package/dist/flows-ZLF3QJ76.js +0 -247
- package/dist/flows-ZLF3QJ76.js.map +0 -1
- package/dist/follow-N3DQZV7M.js +0 -94
- package/dist/follow-competitors-BZPCBGIB.js +0 -112
- package/dist/following-KESWTEBR.js +0 -113
- package/dist/fonts-FG6XMK5A.js +0 -34
- package/dist/forecast-43XBSHJR.js +0 -168
- package/dist/forecast-MAFZQ4UF.js +0 -104
- package/dist/forecast-MAFZQ4UF.js.map +0 -1
- package/dist/funding-HYSCYS62.js +0 -85
- package/dist/funnel-32CNV57L.js +0 -394
- package/dist/ga4-J2KTNCD4.js +0 -55
- package/dist/generate-G3I5BLLW.js +0 -262
- package/dist/generate-G3I5BLLW.js.map +0 -1
- package/dist/get-3P2EQLP3.js +0 -63
- package/dist/get-FJB3X44Z.js +0 -61
- package/dist/get-GDF5V3RN.js +0 -78
- package/dist/get-GDF5V3RN.js.map +0 -1
- package/dist/get-MBGO4VJD.js +0 -63
- package/dist/get-NOKSZPIV.js +0 -59
- package/dist/get-W7MKBMQ3.js +0 -56
- package/dist/get-WHC4SRYK.js +0 -92
- package/dist/gif-SFYVDLCU.js +0 -94
- package/dist/gif-SFYVDLCU.js.map +0 -1
- package/dist/google-THWFDDHJ.js +0 -3191
- package/dist/google-THWFDDHJ.js.map +0 -1
- package/dist/google-XRAMIES5.js +0 -136
- package/dist/google-ads-N55SE2CB.js +0 -195
- package/dist/group-6RDJTWVN.js +0 -43
- package/dist/group-TZJCKHKS.js +0 -43
- package/dist/gsc-HD6UFRYM.js +0 -30
- package/dist/history-4RWCE7WW.js +0 -67
- package/dist/history-IROFQ6LA.js +0 -133
- package/dist/hubspot-75N4AI43.js +0 -779
- package/dist/icon-BMCDFGMN.js +0 -137
- package/dist/ideas-7UQMXLI5.js +0 -32
- package/dist/images-OFR3S2U4.js +0 -90
- package/dist/images-OFR3S2U4.js.map +0 -1
- package/dist/improve-P6F2HXYQ.js +0 -86
- package/dist/ingest-HGR7KSG4.js +0 -107
- package/dist/ingest-XU4WXE4U.js +0 -23
- package/dist/insights-7SI2TB72.js +0 -128
- package/dist/insights-7SI2TB72.js.map +0 -1
- package/dist/insights-P5VIDOZN.js +0 -432
- package/dist/insights-P5VIDOZN.js.map +0 -1
- package/dist/inspect-TL2VZBN7.js +0 -189
- package/dist/inspiration-7WTS3AVI.js +0 -53
- package/dist/intent-OCZE4O7R.js +0 -95
- package/dist/job-XMPQ27SJ.js +0 -202
- package/dist/job-create-HTDQHPEF.js +0 -109
- package/dist/job-status-L7WUTZ2C.js +0 -74
- package/dist/keep-42SLV4CR.js +0 -78
- package/dist/keyword-gap-323NE4AK.js +0 -130
- package/dist/keyword-metrics-V6DGO7U5.js +0 -197
- package/dist/keywords-for-site-ANSLXBHB.js +0 -128
- package/dist/landing-K25GUBLZ.js +0 -28
- package/dist/landings-5IYXHA5Z.js +0 -151
- package/dist/languages-SRFGW6Z3.js +0 -55
- package/dist/languages-US6JUATO.js +0 -40
- package/dist/launches-7U4TPNO3.js +0 -108
- package/dist/launches-7U4TPNO3.js.map +0 -1
- package/dist/layerize-U672AXED.js +0 -190
- package/dist/leads-MXUQISOC.js +0 -293
- package/dist/leads-UJVKPRXX.js +0 -90
- package/dist/learn-XTEU4K66.js +0 -203
- package/dist/learn-XTEU4K66.js.map +0 -1
- package/dist/library-RPFXNER4.js +0 -109
- package/dist/library-RPFXNER4.js.map +0 -1
- package/dist/lighthouse-SJ4QNLUS.js +0 -75
- package/dist/line-item-writes-NURRHJ7P.js +0 -208
- package/dist/line-items-PC6QWV5J.js +0 -103
- package/dist/link-ZSXKCLQD.js +0 -64
- package/dist/linkedin-EZJJBKY3.js +0 -1008
- package/dist/linkedin-EZJJBKY3.js.map +0 -1
- package/dist/list-ECF3RA26.js +0 -303
- package/dist/list-GQ65MC2N.js +0 -65
- package/dist/list-K56J7FZW.js +0 -51
- package/dist/list-M4Z3WYPM.js +0 -76
- package/dist/list-N7ZLO2LE.js +0 -63
- package/dist/list-N7ZLO2LE.js.map +0 -1
- package/dist/list-Q5ZZRPHO.js +0 -151
- package/dist/list-SXYVDDMU.js +0 -57
- package/dist/list-XFIOXFB2.js +0 -50
- package/dist/locations-LZUHWKZY.js +0 -40
- package/dist/locations-NG4YXIBT.js +0 -67
- package/dist/log-EEBJQ6X2.js +0 -92
- package/dist/logo-4JOWGJ5A.js +0 -18
- package/dist/lookup-7NBZ64TE.js +0 -22
- package/dist/make-3J5EK52U.js +0 -633
- package/dist/make-3J5EK52U.js.map +0 -1
- package/dist/map-JVVNH2RI.js +0 -404
- package/dist/map-JVVNH2RI.js.map +0 -1
- package/dist/mcp-DAKGMA2Z.js +0 -463
- package/dist/media-2SWDJDA6.js +0 -15
- package/dist/media-R64YP7T2.js +0 -89
- package/dist/media-sources-L2X3KRDU.js +0 -32
- package/dist/members-22BOEGQS.js +0 -44
- package/dist/meta-RBHF2RG3.js +0 -69
- package/dist/metrics-IXRQZVSM.js +0 -152
- package/dist/models-BDXZ56GI.js +0 -155
- package/dist/normalize-JAE3NVOX.js +0 -141
- package/dist/normalize-P5Q3F7FU.js +0 -806
- package/dist/options-YTIU3BDC.js +0 -121
- package/dist/options-YTIU3BDC.js.map +0 -1
- package/dist/output-ZL62UZHQ.js +0 -24
- package/dist/page-FZ7IZ5CV.js +0 -105
- package/dist/pages-SS7TZTHV.js +0 -66
- package/dist/performance-FOOV624A.js +0 -24
- package/dist/performance-VYEANYQ5.js +0 -4707
- package/dist/performance-VYEANYQ5.js.map +0 -1
- package/dist/pinterest-UETS7U7U.js +0 -96
- package/dist/pixels-LCTMLKGP.js +0 -108
- package/dist/pixels-MPZYWGFD.js +0 -60
- package/dist/plan-V74EVXTW.js +0 -207
- package/dist/preview-RU54Z4EM.js +0 -169
- package/dist/profile-NQOIBLJL.js +0 -150
- package/dist/profile-NQOIBLJL.js.map +0 -1
- package/dist/promoted-tweet-writes-FQRFU7PB.js +0 -180
- package/dist/promoted-tweets-L2L3V5SF.js +0 -119
- package/dist/properties-ZUDQH3LE.js +0 -101
- package/dist/publish-5XTAHTM4.js +0 -322
- package/dist/publish-5XTAHTM4.js.map +0 -1
- package/dist/query-26T7XATH.js +0 -236
- package/dist/query-SHUOHXTO.js +0 -247
- package/dist/query-XISUHMBR.js +0 -62
- package/dist/questionnaire-UG55JLVW.js +0 -93
- package/dist/read-UYSQAXRV.js +0 -141
- package/dist/reddit-BCB4FT6J.js +0 -26
- package/dist/refresh-WY5NPNLX.js +0 -94
- package/dist/release-JBSPPNQE.js +0 -60
- package/dist/relevant-pages-OU5H56KY.js +0 -99
- package/dist/remove-2KACTXKP.js +0 -48
- package/dist/remove-M5P7M5JU.js +0 -50
- package/dist/reopen-J3VW5766.js +0 -63
- package/dist/rerun-5MRYJG6U.js +0 -84
- package/dist/rerun-5MRYJG6U.js.map +0 -1
- package/dist/research-4CAA5CA2.js +0 -262
- package/dist/research-7LBTJ2B2.js +0 -62
- package/dist/reset-DBWWGCXY.js +0 -54
- package/dist/reset-DJSSXC4Y.js +0 -54
- package/dist/resolve-BNRUYS56.js +0 -121
- package/dist/retry-TMRIFGVT.js +0 -62
- package/dist/retry-WRBGLB7O.js +0 -60
- package/dist/retry-failed-NWLH6WHK.js +0 -45
- package/dist/run-TA3DP6QG.js +0 -59
- package/dist/run-VVTLDRRW.js +0 -65
- package/dist/run-VVTLDRRW.js.map +0 -1
- package/dist/scaffold-ad-7DSV6XDB.js +0 -1548
- package/dist/scaffold-ad-7DSV6XDB.js.map +0 -1
- package/dist/scaffold-static-ad-BEZ37QWN.js +0 -971
- package/dist/scaffold-static-ad-BEZ37QWN.js.map +0 -1
- package/dist/scaffold-video-SPCMTYK3.js +0 -872
- package/dist/scaffold-video-SPCMTYK3.js.map +0 -1
- package/dist/schedule-BQQGYGT7.js +0 -61
- package/dist/schedule-S547HPUT.js +0 -66
- package/dist/scheduled-agents-4Q6WS333.js +0 -49
- package/dist/scheduled-agents-4Q6WS333.js.map +0 -1
- package/dist/schema-DDEWM5ZX.js +0 -132
- package/dist/schema-SQIP75WG.js +0 -63
- package/dist/schema-SQIP75WG.js.map +0 -1
- package/dist/scrape-TI6S2W7I.js +0 -2241
- package/dist/screenshot-XFAYY4WW.js +0 -102
- package/dist/search-4HIOKYFR.js +0 -26
- package/dist/search-D2IV7KFJ.js +0 -92
- package/dist/search-IZPDHRJ4.js +0 -224
- package/dist/search-KFDL2IGG.js +0 -91
- package/dist/search-VJBKRD2U.js +0 -174
- package/dist/search-copy-QZXCAGK4.js +0 -168
- package/dist/seeds-VUNZMHZH.js +0 -101
- package/dist/select-U5TPAXGY.js +0 -94
- package/dist/select-U5TPAXGY.js.map +0 -1
- package/dist/sends-7HWLIOUO.js +0 -309
- package/dist/sequences-5RAGZE7L.js +0 -146
- package/dist/set-prompt-MHU4WI3Q.js +0 -185
- package/dist/set-prompt-MHU4WI3Q.js.map +0 -1
- package/dist/setup-links-SPIGXQTY.js +0 -141
- package/dist/shared-3CGGKICB.js +0 -31
- package/dist/site-FW6K6L6M.js +0 -177
- package/dist/sitemaps-3WDYQHYR.js +0 -87
- package/dist/sites-G4DQ2Z2X.js +0 -101
- package/dist/skills-PA26HXEP.js +0 -47
- package/dist/sources-4NAC6HV6.js +0 -421
- package/dist/sources-4NAC6HV6.js.map +0 -1
- package/dist/sources-PMBWG4KO.js +0 -30
- package/dist/stale-5IMY6MWC.js +0 -63
- package/dist/stale-5IMY6MWC.js.map +0 -1
- package/dist/stats-Q35I5DRW.js +0 -34
- package/dist/status-62SUXUWW.js +0 -62
- package/dist/sticker-MC2IAIQB.js +0 -94
- package/dist/stock-B7LKMKUK.js +0 -179
- package/dist/studio-BB2EVW5I.js +0 -49
- package/dist/sync-CLZDZL5F.js +0 -54
- package/dist/sync-XCHBEBZG.js +0 -279
- package/dist/sync-XCHBEBZG.js.map +0 -1
- package/dist/sync-YTHNOAAM.js +0 -54
- package/dist/sync-definition-DYSVT7BJ.js +0 -52
- package/dist/tag-manager-EAREWVYR.js +0 -43
- package/dist/tags-53AG3FYG.js +0 -20
- package/dist/tags-7TH7TVR6.js +0 -224
- package/dist/tags-EB4RE3ML.js +0 -20
- package/dist/tags-EUEWDTTN.js +0 -20
- package/dist/tags-ICAWBCOR.js +0 -26
- package/dist/targeting-constants-IFE72XKL.js +0 -118
- package/dist/targeting-criteria-WZDGJKOI.js +0 -113
- package/dist/targets-OKJ6A4YL.js +0 -102
- package/dist/targets-OKJ6A4YL.js.map +0 -1
- package/dist/templates-IA5TDCCZ.js +0 -178
- package/dist/templates-IA5TDCCZ.js.map +0 -1
- package/dist/testimonials-THHR5JH5.js +0 -32
- package/dist/themes-ZFRM6AVO.js +0 -94
- package/dist/top-companies-63Q475IA.js +0 -108
- package/dist/translate-XKUWIIOS.js +0 -598
- package/dist/translate-XKUWIIOS.js.map +0 -1
- package/dist/triggers-XLKO2QXQ.js +0 -141
- package/dist/triggers-XLKO2QXQ.js.map +0 -1
- package/dist/tweets-7EZRFG3Y.js +0 -123
- package/dist/unfollow-WBBTVEHE.js +0 -46
- package/dist/unlink-P7KU54YU.js +0 -67
- package/dist/unstage-EG7AUE5X.js +0 -84
- package/dist/unstage-EG7AUE5X.js.map +0 -1
- package/dist/unstage-GHXGDOT2.js +0 -95
- package/dist/update-7EWDO32L.js +0 -98
- package/dist/update-BVYGB4YL.js +0 -142
- package/dist/update-BVYGB4YL.js.map +0 -1
- package/dist/update-KVMQOVQK.js +0 -63
- package/dist/update-N74F5KXB.js +0 -155
- package/dist/update-N74F5KXB.js.map +0 -1
- package/dist/upload-6PYPHPCZ.js +0 -126
- package/dist/upload-NA62W5RS.js +0 -150
- package/dist/upscale-RXJUBHXN.js +0 -109
- package/dist/url-options-EUDXLDBD.js +0 -130
- package/dist/url-params-DBJSM2LP.js +0 -98
- package/dist/use-MHPNS4V4.js +0 -95
- package/dist/validate-TTAGVGM2.js +0 -88
- package/dist/validate-TTAGVGM2.js.map +0 -1
- package/dist/variant-ZFCWILPG.js +0 -338
- package/dist/videos-DUG7JYUA.js +0 -39
- package/dist/view-PYCGDGT2.js +0 -121
- package/dist/viewer-check-HIMNCZGY.js +0 -68
- package/dist/web-SDG42OBC.js +0 -140
- package/dist/winners-AI4PVSOI.js +0 -113
- package/dist/winning-ads-KGAYAIPG.js +0 -84
- package/dist/write-commands-34L5LJIB.js +0 -713
- package/dist/write-commands-5TJ3LQ5F.js +0 -737
- package/dist/write-commands-OYMWOFEY.js +0 -1015
- package/dist/write-commands-R3UCCBUI.js +0 -206
- package/dist/x-VNRVGVLI.js +0 -47
- /package/dist/{account-HZC6X2PH.js.map → account-7LUQWY6Q.js.map} +0 -0
- /package/dist/{account-TQUV64XP.js.map → account-ELL7ZZLM.js.map} +0 -0
- /package/dist/{account-67PZBEP6.js.map → account-KZVOT6HL.js.map} +0 -0
- /package/dist/{account-reads-IRBTERTY.js.map → account-reads-LA45L6G3.js.map} +0 -0
- /package/dist/{account-writes-ALDSHAEV.js.map → account-writes-CEPERFD6.js.map} +0 -0
- /package/dist/{accounts-WTB737BM.js.map → accounts-7G556DH4.js.map} +0 -0
- /package/dist/{accounts-4P54UY6F.js.map → accounts-E4TVYTUR.js.map} +0 -0
- /package/dist/{accounts-NJ6TF6WH.js.map → accounts-HC7GPQNG.js.map} +0 -0
- /package/dist/{accounts-GVTZN4VE.js.map → accounts-SMB3TNXX.js.map} +0 -0
- /package/dist/{accounts-6UNBLIUH.js.map → accounts-UA2ZWRN4.js.map} +0 -0
- /package/dist/{actions-D3BOWDEB.js.map → actions-V6YP5C3X.js.map} +0 -0
- /package/dist/{active-entities-J2O76SRP.js.map → active-entities-MCL7UEGV.js.map} +0 -0
- /package/dist/{activities-2J7FTZMN.js.map → activities-IQPJPP4B.js.map} +0 -0
- /package/dist/{ad-group-writes-PQKDCMQF.js.map → ad-group-writes-XGSCEQTW.js.map} +0 -0
- /package/dist/{ad-groups-NGYEJMV4.js.map → ad-groups-GKOLDGET.js.map} +0 -0
- /package/dist/{ad-writes-77FVHJTS.js.map → ad-writes-VVD36JKH.js.map} +0 -0
- /package/dist/{add-2XJYOGKW.js.map → add-3MD72QMT.js.map} +0 -0
- /package/dist/{add-2FHPLALV.js.map → add-5IGUQHVZ.js.map} +0 -0
- /package/dist/{add-JP76KCCY.js.map → add-BK5AQI5A.js.map} +0 -0
- /package/dist/{add-62JPGFD4.js.map → add-TSQNUP5N.js.map} +0 -0
- /package/dist/{add-accounts-M5Y4DQFM.js.map → add-accounts-CJSV5NPL.js.map} +0 -0
- /package/dist/{ads-LYNA2I7B.js.map → ads-EKZVHKPN.js.map} +0 -0
- /package/dist/{ads-W2IPUWHQ.js.map → ads-HXX2IAFF.js.map} +0 -0
- /package/dist/{ads-DB5NDHX5.js.map → ads-RAUM6ISF.js.map} +0 -0
- /package/dist/{adsets-PY5ZKGBO.js.map → adsets-LPN6WFGF.js.map} +0 -0
- /package/dist/{advertisers-BVAZ4XUX.js.map → advertisers-DS2NRWKI.js.map} +0 -0
- /package/dist/{advertisers-NZPJQF7W.js.map → advertisers-XJG7XDK7.js.map} +0 -0
- /package/dist/{analytics-NTPZKMYK.js.map → analytics-DO4UKW2H.js.map} +0 -0
- /package/dist/{animate-EIV2OHXT.js.map → animate-G4P3OEJE.js.map} +0 -0
- /package/dist/{assign-UNIA5YDC.js.map → assign-72YAL6TP.js.map} +0 -0
- /package/dist/{audiences-VYFX7OFS.js.map → audiences-3LRCLHTQ.js.map} +0 -0
- /package/dist/{audiences-45ZCY2VZ.js.map → audiences-BU4JZJT7.js.map} +0 -0
- /package/dist/{audiences-UUIYQFS6.js.map → audiences-XEZHACKH.js.map} +0 -0
- /package/dist/{audit-NSVHNA5J.js.map → audit-22KQAHJR.js.map} +0 -0
- /package/dist/{audit-OWXTLQC4.js.map → audit-YEGQU474.js.map} +0 -0
- /package/dist/{autocomplete-EHWAQYVB.js.map → autocomplete-KLNQIK5T.js.map} +0 -0
- /package/dist/{avatars-7WZPW7BV.js.map → avatars-VO6FMJFB.js.map} +0 -0
- /package/dist/{brand-QAJ5VWFM.js.map → brand-XXNOVSGE.js.map} +0 -0
- /package/dist/{businesses-ZH67AXR6.js.map → businesses-PRRYPR7H.js.map} +0 -0
- /package/dist/{campaign-groups-KFJKLNNU.js.map → campaign-groups-JFOFU76X.js.map} +0 -0
- /package/dist/{campaign-writes-BDGQ6XB3.js.map → campaign-writes-NSEJCINS.js.map} +0 -0
- /package/dist/{campaign-writes-FNMAGCKB.js.map → campaign-writes-PKWLLKB5.js.map} +0 -0
- /package/dist/{campaigns-66OOGMDW.js.map → campaigns-4SOLY7OR.js.map} +0 -0
- /package/dist/{campaigns-KT3J2O7S.js.map → campaigns-5AZMOOID.js.map} +0 -0
- /package/dist/{campaigns-6HMHOXXY.js.map → campaigns-H4VK3GKK.js.map} +0 -0
- /package/dist/{campaigns-HJTGX5WW.js.map → campaigns-VWN2XPK2.js.map} +0 -0
- /package/dist/{canvas-MQ6ZE5CZ.js.map → canvas-TTV7QZZT.js.map} +0 -0
- /package/dist/{capabilities-RVUMPP7C.js.map → capabilities-VJ53ROIP.js.map} +0 -0
- /package/dist/{cards-I4BZIYUV.js.map → cards-WHMCSRZX.js.map} +0 -0
- /package/dist/{catalogs-B2NKQO24.js.map → catalogs-XH5NHH4C.js.map} +0 -0
- /package/dist/{changes-FX3TPYGT.js.map → changes-F6WUXFC3.js.map} +0 -0
- /package/dist/{chatgpt-3NS2R442.js.map → chatgpt-K6KNTME4.js.map} +0 -0
- /package/dist/{chats-72L7U4ML.js.map → chats-PWLQO7UY.js.map} +0 -0
- /package/dist/{chunk-CBCGVPHB.js.map → chunk-232YUPUI.js.map} +0 -0
- /package/dist/{chunk-65BQAJMH.js.map → chunk-23H4ZJRP.js.map} +0 -0
- /package/dist/{chunk-IZFGTGFR.js.map → chunk-3OCSWUHV.js.map} +0 -0
- /package/dist/{chunk-SLCSLVGS.js.map → chunk-5SRHACZW.js.map} +0 -0
- /package/dist/{chunk-VHMNSO2B.js.map → chunk-5WMTPYKT.js.map} +0 -0
- /package/dist/{chunk-QNEX7FEC.js.map → chunk-6JWEGFM5.js.map} +0 -0
- /package/dist/{chunk-P5T7OZKV.js.map → chunk-6OIKNJ7G.js.map} +0 -0
- /package/dist/{chunk-INJHF7AF.js.map → chunk-7RBJ2Z7Z.js.map} +0 -0
- /package/dist/{chunk-57UECM77.js.map → chunk-BFRIRZRZ.js.map} +0 -0
- /package/dist/{chunk-WILN7TD6.js.map → chunk-BFZS3WHS.js.map} +0 -0
- /package/dist/{chunk-NFSLRRIE.js.map → chunk-BITS62MF.js.map} +0 -0
- /package/dist/{chunk-CECS3DHZ.js.map → chunk-BLAHHMPF.js.map} +0 -0
- /package/dist/{chunk-GT4UFORX.js.map → chunk-CVBKW75S.js.map} +0 -0
- /package/dist/{chunk-J2QOKD2F.js.map → chunk-D4LKZJYJ.js.map} +0 -0
- /package/dist/{chunk-JC6GNMA7.js.map → chunk-D6KHVUDS.js.map} +0 -0
- /package/dist/{chunk-6GFJFTG6.js.map → chunk-DWX44QL6.js.map} +0 -0
- /package/dist/{chunk-D5MF337I.js.map → chunk-FNA277HP.js.map} +0 -0
- /package/dist/{chunk-VTCBPYGE.js.map → chunk-FQXGII24.js.map} +0 -0
- /package/dist/{chunk-7NTION5F.js.map → chunk-FU7HJWGM.js.map} +0 -0
- /package/dist/{chunk-YGL5LTEA.js.map → chunk-GD6UJDOB.js.map} +0 -0
- /package/dist/{chunk-35ENAFJX.js.map → chunk-GDLQ6SGW.js.map} +0 -0
- /package/dist/{chunk-GZ6YS7TG.js.map → chunk-GEKXIXMG.js.map} +0 -0
- /package/dist/{chunk-Q676JHJA.js.map → chunk-GLW7UJLB.js.map} +0 -0
- /package/dist/{chunk-IJDF7D4U.js.map → chunk-H5HDZ7IC.js.map} +0 -0
- /package/dist/{chunk-4TU2MWBJ.js.map → chunk-I44SNQ34.js.map} +0 -0
- /package/dist/{chunk-G3KO2HFZ.js.map → chunk-I5VZVQBZ.js.map} +0 -0
- /package/dist/{chunk-PELW56D7.js.map → chunk-IC6SDOED.js.map} +0 -0
- /package/dist/{chunk-ZNNC6B75.js.map → chunk-IN4G7X6W.js.map} +0 -0
- /package/dist/{chunk-VKH6LSC2.js.map → chunk-IPLE5K5E.js.map} +0 -0
- /package/dist/{chunk-W6ASM6UP.js.map → chunk-IYELKHBG.js.map} +0 -0
- /package/dist/{chunk-7GYM4I5I.js.map → chunk-JQNO6JCV.js.map} +0 -0
- /package/dist/{chunk-H7JOVRHO.js.map → chunk-JYBLCIRN.js.map} +0 -0
- /package/dist/{chunk-DL2W4N7J.js.map → chunk-K3TNTBZJ.js.map} +0 -0
- /package/dist/{chunk-RUHMLPH5.js.map → chunk-K4NMOWG7.js.map} +0 -0
- /package/dist/{chunk-KB5HBQEK.js.map → chunk-LCW3U4EA.js.map} +0 -0
- /package/dist/{chunk-O5XLQUDS.js.map → chunk-LMZAOTRX.js.map} +0 -0
- /package/dist/{chunk-6HPIWZHS.js.map → chunk-MI3JB5KB.js.map} +0 -0
- /package/dist/{chunk-ZBKBTTHD.js.map → chunk-MJQBXFW6.js.map} +0 -0
- /package/dist/{chunk-ZJR5E53N.js.map → chunk-MK3OJZIU.js.map} +0 -0
- /package/dist/{chunk-ZO2YLHRW.js.map → chunk-MPACDBH5.js.map} +0 -0
- /package/dist/{chunk-YONSWWCF.js.map → chunk-N5O67GK5.js.map} +0 -0
- /package/dist/{chunk-QDOVBGKZ.js.map → chunk-P3TNRS56.js.map} +0 -0
- /package/dist/{chunk-QWX3QJNM.js.map → chunk-PAJJXZ3Z.js.map} +0 -0
- /package/dist/{chunk-J5WZ7SAD.js.map → chunk-PHPXAMY3.js.map} +0 -0
- /package/dist/{chunk-UXTZ5MBE.js.map → chunk-QABSQADZ.js.map} +0 -0
- /package/dist/{chunk-NORAJYUI.js.map → chunk-QYAI24PN.js.map} +0 -0
- /package/dist/{chunk-2KIF3U2C.js.map → chunk-QZHGIJOW.js.map} +0 -0
- /package/dist/{chunk-SJLIV6PF.js.map → chunk-ROX7LQRR.js.map} +0 -0
- /package/dist/{chunk-QJPPPQPD.js.map → chunk-S7B2TOOU.js.map} +0 -0
- /package/dist/{chunk-GKXMIXEV.js.map → chunk-SFJW2KED.js.map} +0 -0
- /package/dist/{chunk-AR7PU7BB.js.map → chunk-SIKCVWM3.js.map} +0 -0
- /package/dist/{chunk-TY7TEU3T.js.map → chunk-SK2N45LO.js.map} +0 -0
- /package/dist/{chunk-ZPJE6D7W.js.map → chunk-SOKVXKRM.js.map} +0 -0
- /package/dist/{chunk-Z5KBRTB2.js.map → chunk-STNCMKL6.js.map} +0 -0
- /package/dist/{chunk-PGVF4SB7.js.map → chunk-TKPVVD52.js.map} +0 -0
- /package/dist/{chunk-AIDXJHZ4.js.map → chunk-TNB5EIFV.js.map} +0 -0
- /package/dist/{chunk-P3ZJIIDS.js.map → chunk-TUSR5R7I.js.map} +0 -0
- /package/dist/{chunk-DLUWHZCE.js.map → chunk-ULPO72IQ.js.map} +0 -0
- /package/dist/{chunk-QHIUJXU7.js.map → chunk-UWT7RCL3.js.map} +0 -0
- /package/dist/{chunk-DDTILZXI.js.map → chunk-V4UIM4QE.js.map} +0 -0
- /package/dist/{chunk-V43RLLZE.js.map → chunk-XGOEX2VJ.js.map} +0 -0
- /package/dist/{chunk-FDG2LLX7.js.map → chunk-XP4G2DJL.js.map} +0 -0
- /package/dist/{chunk-PA5MYVQY.js.map → chunk-XZ4YMCZK.js.map} +0 -0
- /package/dist/{chunk-VFSLIDXA.js.map → chunk-Y3VRMFGF.js.map} +0 -0
- /package/dist/{claim-DIITRUIN.js.map → claim-QHXKN7W6.js.map} +0 -0
- /package/dist/{client-LY2JCQS2.js.map → client-WL2FKW4T.js.map} +0 -0
- /package/dist/{code-7CBNYUPU.js.map → code-NXN7QYKU.js.map} +0 -0
- /package/dist/{companies-HHSYHL74.js.map → companies-PGVT62JL.js.map} +0 -0
- /package/dist/{complete-M3TURPU5.js.map → complete-TCTR3XVD.js.map} +0 -0
- /package/dist/{config-7COTFJWK.js.map → config-VOF57KBL.js.map} +0 -0
- /package/dist/{connect-TQL5EVVE.js.map → connect-4S7JLICS.js.map} +0 -0
- /package/dist/{content-OXMONMHJ.js.map → content-KA25YYO3.js.map} +0 -0
- /package/dist/{conversation-GE273GC4.js.map → conversation-DI4WMEL2.js.map} +0 -0
- /package/dist/{conversion-report-BH4HH2Q3.js.map → conversion-report-KL4LIVY5.js.map} +0 -0
- /package/dist/{conversion-upload-command-QWWYCTNV.js.map → conversion-upload-command-EIKJU5ZW.js.map} +0 -0
- /package/dist/{conversion-writes-HG2O6JI7.js.map → conversion-writes-MPBCTVSP.js.map} +0 -0
- /package/dist/{conversions-XPSN7SOW.js.map → conversions-ACYT6K7H.js.map} +0 -0
- /package/dist/{conversions-DP6ZF57D.js.map → conversions-JTYMFX66.js.map} +0 -0
- /package/dist/{countries-UXAUGSBR.js.map → countries-XGMZWUGP.js.map} +0 -0
- /package/dist/{create-NVXJP477.js.map → create-3QA7X2DD.js.map} +0 -0
- /package/dist/{create-XLZYNFKN.js.map → create-AFVT5JTH.js.map} +0 -0
- /package/dist/{create-ENQWVWGB.js.map → create-TYCOMVWR.js.map} +0 -0
- /package/dist/{creatives-O3444SBT.js.map → creatives-E6N2YLHE.js.map} +0 -0
- /package/dist/{creatives-ONKKGW5T.js.map → creatives-YJ3CXZQC.js.map} +0 -0
- /package/dist/{credentials-3UY7RVUL.js.map → credentials-34I6ZZWU.js.map} +0 -0
- /package/dist/{crm-XXU5XZIQ.js.map → crm-4F3LFOZD.js.map} +0 -0
- /package/dist/{crm-OX67TBWD.js.map → crm-MNBYNP5R.js.map} +0 -0
- /package/dist/{crop-3ZV5BFCA.js.map → crop-7UTYG7GS.js.map} +0 -0
- /package/dist/{currency-XP4EMU4M.js.map → currency-3QTI5RSB.js.map} +0 -0
- /package/dist/{custom-conversions-TV23XQHW.js.map → custom-conversions-YRYE65PU.js.map} +0 -0
- /package/dist/{customers-EJ7FVCTC.js.map → customers-VNYNT2EQ.js.map} +0 -0
- /package/dist/{decide-EGQ3CRHI.js.map → decide-TWKH5QQU.js.map} +0 -0
- /package/dist/{delete-R2SEUSLV.js.map → delete-2GIIUPA3.js.map} +0 -0
- /package/dist/{delete-ZGBBWFAW.js.map → delete-GLLYPNNB.js.map} +0 -0
- /package/dist/{delete-MUPTLWHI.js.map → delete-J7DXPGKD.js.map} +0 -0
- /package/dist/{delete-GXLPIGTC.js.map → delete-PRJGFA2U.js.map} +0 -0
- /package/dist/{delete-OW2N4WIA.js.map → delete-UZRHYEPK.js.map} +0 -0
- /package/dist/{demographics-K6DEWUE5.js.map → demographics-JMZA7MB6.js.map} +0 -0
- /package/dist/{describe-FCTM53MM.js.map → describe-5QCPRSIG.js.map} +0 -0
- /package/dist/{describe-4O3VCV6L.js.map → describe-L3UC6MIL.js.map} +0 -0
- /package/dist/{dimensions-AD4VS5AH.js.map → dimensions-POH4JXEM.js.map} +0 -0
- /package/dist/{discard-NZ7FQJEE.js.map → discard-OH3B5P4C.js.map} +0 -0
- /package/dist/{discover-OISU5EJF.js.map → discover-5GLET36U.js.map} +0 -0
- /package/dist/{discover-UQXQUPNO.js.map → discover-XAJKZCMM.js.map} +0 -0
- /package/dist/{domain-DXBHNZLO.js.map → domain-K3IILLYE.js.map} +0 -0
- /package/dist/{download-IE6XLFHM.js.map → download-N4J5WFHD.js.map} +0 -0
- /package/dist/{draft-OOHU6NMA.js.map → draft-2KHUZTIE.js.map} +0 -0
- /package/dist/{draft-HJBAG3SN.js.map → draft-7RYDPOFS.js.map} +0 -0
- /package/dist/{draft-ICEVLF4E.js.map → draft-BB3UUWJP.js.map} +0 -0
- /package/dist/{draft-S6VPKZYY.js.map → draft-EWDOIXSH.js.map} +0 -0
- /package/dist/{draft-ENA7S4Y7.js.map → draft-IL37WDST.js.map} +0 -0
- /package/dist/{draft-MGKJ5RYI.js.map → draft-KDMYGLWN.js.map} +0 -0
- /package/dist/{draft-DB6KMBCH.js.map → draft-LZL6VWHX.js.map} +0 -0
- /package/dist/{draft-OBFKQEPK.js.map → draft-VXGZDBC7.js.map} +0 -0
- /package/dist/{env-YLOVBOAE.js.map → env-5MUVYE2L.js.map} +0 -0
- /package/dist/{experiment-PHFP6IBM.js.map → experiment-G3FQVAJU.js.map} +0 -0
- /package/dist/{export-R2IMUCQO.js.map → export-OLDI32HM.js.map} +0 -0
- /package/dist/{extract-OQP3TSQG.js.map → extract-PPS6ONQN.js.map} +0 -0
- /package/dist/{facets-NUKR7I57.js.map → facets-PAWOEHOK.js.map} +0 -0
- /package/dist/{favorites-NS73FDG5.js.map → favorites-4ELADD3R.js.map} +0 -0
- /package/dist/{feed-SQPOB7SP.js.map → feed-XIY5TVDL.js.map} +0 -0
- /package/dist/{fetch-PTSAVQW5.js.map → fetch-M5GIBURQ.js.map} +0 -0
- /package/dist/{fetch-PQ3NOPIE.js.map → fetch-YWUVDMUH.js.map} +0 -0
- /package/dist/{fit-IITU6UWC.js.map → fit-DGCYW7LN.js.map} +0 -0
- /package/dist/{follow-N3DQZV7M.js.map → follow-ZTPZKIMZ.js.map} +0 -0
- /package/dist/{follow-competitors-BZPCBGIB.js.map → follow-competitors-6QDVQ4VJ.js.map} +0 -0
- /package/dist/{following-KESWTEBR.js.map → following-PBZLZFGQ.js.map} +0 -0
- /package/dist/{fonts-FG6XMK5A.js.map → fonts-IQ6XOUGU.js.map} +0 -0
- /package/dist/{forecast-43XBSHJR.js.map → forecast-YXOKAWDZ.js.map} +0 -0
- /package/dist/{funding-HYSCYS62.js.map → funding-ULBMKUMW.js.map} +0 -0
- /package/dist/{funnel-32CNV57L.js.map → funnel-CJRFDTCD.js.map} +0 -0
- /package/dist/{ga4-J2KTNCD4.js.map → ga4-2BL5YAYN.js.map} +0 -0
- /package/dist/{get-MBGO4VJD.js.map → get-6RZU4M6W.js.map} +0 -0
- /package/dist/{get-WHC4SRYK.js.map → get-7GCEJ6KG.js.map} +0 -0
- /package/dist/{get-FJB3X44Z.js.map → get-MZWUMHEF.js.map} +0 -0
- /package/dist/{get-W7MKBMQ3.js.map → get-NUL4YJG5.js.map} +0 -0
- /package/dist/{get-NOKSZPIV.js.map → get-OAZZHUZP.js.map} +0 -0
- /package/dist/{get-3P2EQLP3.js.map → get-OHU2N7B7.js.map} +0 -0
- /package/dist/{google-XRAMIES5.js.map → google-7STODZQR.js.map} +0 -0
- /package/dist/{google-ads-N55SE2CB.js.map → google-ads-BB7CF4NV.js.map} +0 -0
- /package/dist/{group-6RDJTWVN.js.map → group-D5WXNFCP.js.map} +0 -0
- /package/dist/{group-TZJCKHKS.js.map → group-Y5PLETFT.js.map} +0 -0
- /package/dist/{gsc-HD6UFRYM.js.map → gsc-UU3T2C6B.js.map} +0 -0
- /package/dist/{history-4RWCE7WW.js.map → history-OQAOTEO3.js.map} +0 -0
- /package/dist/{history-IROFQ6LA.js.map → history-Q47TKZJS.js.map} +0 -0
- /package/dist/{hubspot-75N4AI43.js.map → hubspot-A6O5GVTH.js.map} +0 -0
- /package/dist/{icon-BMCDFGMN.js.map → icon-GB7UH5RF.js.map} +0 -0
- /package/dist/{ideas-7UQMXLI5.js.map → ideas-LD6X753E.js.map} +0 -0
- /package/dist/{improve-P6F2HXYQ.js.map → improve-U5USRH4G.js.map} +0 -0
- /package/dist/{ingest-HGR7KSG4.js.map → ingest-PUMTHASV.js.map} +0 -0
- /package/dist/{ingest-XU4WXE4U.js.map → ingest-WWNSA6VZ.js.map} +0 -0
- /package/dist/{inspect-TL2VZBN7.js.map → inspect-5PRLZLF5.js.map} +0 -0
- /package/dist/{inspiration-7WTS3AVI.js.map → inspiration-XQYHBJY2.js.map} +0 -0
- /package/dist/{intent-OCZE4O7R.js.map → intent-4QVVI4FF.js.map} +0 -0
- /package/dist/{job-XMPQ27SJ.js.map → job-CGQHEANB.js.map} +0 -0
- /package/dist/{job-create-HTDQHPEF.js.map → job-create-SZYJT2NC.js.map} +0 -0
- /package/dist/{job-status-L7WUTZ2C.js.map → job-status-6LAKLCKH.js.map} +0 -0
- /package/dist/{keep-42SLV4CR.js.map → keep-3MJSHWU3.js.map} +0 -0
- /package/dist/{keyword-gap-323NE4AK.js.map → keyword-gap-YMMDRYVK.js.map} +0 -0
- /package/dist/{keyword-metrics-V6DGO7U5.js.map → keyword-metrics-FB7FCYK6.js.map} +0 -0
- /package/dist/{keywords-for-site-ANSLXBHB.js.map → keywords-for-site-YZYALONY.js.map} +0 -0
- /package/dist/{landing-K25GUBLZ.js.map → landing-XOCPIOWX.js.map} +0 -0
- /package/dist/{landings-5IYXHA5Z.js.map → landings-ZLKUP66P.js.map} +0 -0
- /package/dist/{languages-SRFGW6Z3.js.map → languages-3IJVDS5Z.js.map} +0 -0
- /package/dist/{languages-US6JUATO.js.map → languages-R3Y2IOFU.js.map} +0 -0
- /package/dist/{logo-4JOWGJ5A.js.map → launches-RG2SWEXM.js.map} +0 -0
- /package/dist/{layerize-U672AXED.js.map → layerize-SJYK6HPD.js.map} +0 -0
- /package/dist/{leads-MXUQISOC.js.map → leads-2XOSAYP4.js.map} +0 -0
- /package/dist/{leads-UJVKPRXX.js.map → leads-SWINPYEP.js.map} +0 -0
- /package/dist/{lighthouse-SJ4QNLUS.js.map → lighthouse-FALRSVQH.js.map} +0 -0
- /package/dist/{line-item-writes-NURRHJ7P.js.map → line-item-writes-FG3TY4W4.js.map} +0 -0
- /package/dist/{line-items-PC6QWV5J.js.map → line-items-ZNVBFA4H.js.map} +0 -0
- /package/dist/{link-ZSXKCLQD.js.map → link-IFEXIUDW.js.map} +0 -0
- /package/dist/{list-GQ65MC2N.js.map → list-2ZTOMTES.js.map} +0 -0
- /package/dist/{list-Q5ZZRPHO.js.map → list-FR2OVRVL.js.map} +0 -0
- /package/dist/{list-M4Z3WYPM.js.map → list-GK6LNWIW.js.map} +0 -0
- /package/dist/{list-ECF3RA26.js.map → list-K65FY6SV.js.map} +0 -0
- /package/dist/{list-SXYVDDMU.js.map → list-RR53EF3O.js.map} +0 -0
- /package/dist/{list-XFIOXFB2.js.map → list-TB677Q2F.js.map} +0 -0
- /package/dist/{list-K56J7FZW.js.map → list-VTVRZIYL.js.map} +0 -0
- /package/dist/{locations-LZUHWKZY.js.map → locations-6IH7WGRG.js.map} +0 -0
- /package/dist/{locations-NG4YXIBT.js.map → locations-VL2G22Y5.js.map} +0 -0
- /package/dist/{log-EEBJQ6X2.js.map → log-TAKCMC2C.js.map} +0 -0
- /package/dist/{lookup-7NBZ64TE.js.map → logo-YSNUUT33.js.map} +0 -0
- /package/dist/{output-ZL62UZHQ.js.map → lookup-RH5N3OWJ.js.map} +0 -0
- /package/dist/{mcp-DAKGMA2Z.js.map → mcp-NNQZ5B7N.js.map} +0 -0
- /package/dist/{media-2SWDJDA6.js.map → media-ES2UBGYW.js.map} +0 -0
- /package/dist/{media-R64YP7T2.js.map → media-MPXEXN4O.js.map} +0 -0
- /package/dist/{media-sources-L2X3KRDU.js.map → media-sources-OAFBA62X.js.map} +0 -0
- /package/dist/{members-22BOEGQS.js.map → members-SS7IBYVE.js.map} +0 -0
- /package/dist/{meta-RBHF2RG3.js.map → meta-AOIPEDV5.js.map} +0 -0
- /package/dist/{metrics-IXRQZVSM.js.map → metrics-YLAREC4T.js.map} +0 -0
- /package/dist/{models-BDXZ56GI.js.map → models-IH6KE6OH.js.map} +0 -0
- /package/dist/{normalize-P5Q3F7FU.js.map → normalize-NR5RS3WR.js.map} +0 -0
- /package/dist/{normalize-JAE3NVOX.js.map → normalize-WOZTAI6C.js.map} +0 -0
- /package/dist/{performance-FOOV624A.js.map → output-GWIP6ROX.js.map} +0 -0
- /package/dist/{page-FZ7IZ5CV.js.map → page-YWGBCN65.js.map} +0 -0
- /package/dist/{pages-SS7TZTHV.js.map → pages-FTI44OSH.js.map} +0 -0
- /package/dist/{query-XISUHMBR.js.map → performance-WRARV3YR.js.map} +0 -0
- /package/dist/{pinterest-UETS7U7U.js.map → pinterest-J442QLQS.js.map} +0 -0
- /package/dist/{pixels-MPZYWGFD.js.map → pixels-DWW2TDY2.js.map} +0 -0
- /package/dist/{pixels-LCTMLKGP.js.map → pixels-MBKR4XPX.js.map} +0 -0
- /package/dist/{plan-V74EVXTW.js.map → plan-YPE77T4R.js.map} +0 -0
- /package/dist/{preview-RU54Z4EM.js.map → preview-V4YBD45S.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-FQRFU7PB.js.map → promoted-tweet-writes-CAD3RGU4.js.map} +0 -0
- /package/dist/{promoted-tweets-L2L3V5SF.js.map → promoted-tweets-NYJP3TXL.js.map} +0 -0
- /package/dist/{properties-ZUDQH3LE.js.map → properties-G3L2OAOL.js.map} +0 -0
- /package/dist/{reddit-BCB4FT6J.js.map → query-QRPBV2AR.js.map} +0 -0
- /package/dist/{query-26T7XATH.js.map → query-WCB5W4NW.js.map} +0 -0
- /package/dist/{query-SHUOHXTO.js.map → query-YBS6ZQ75.js.map} +0 -0
- /package/dist/{questionnaire-UG55JLVW.js.map → questionnaire-PAK4DALP.js.map} +0 -0
- /package/dist/{read-UYSQAXRV.js.map → read-LUTB3UOR.js.map} +0 -0
- /package/dist/{run-TA3DP6QG.js.map → reddit-VJTNXORD.js.map} +0 -0
- /package/dist/{refresh-WY5NPNLX.js.map → refresh-6I52WXG5.js.map} +0 -0
- /package/dist/{release-JBSPPNQE.js.map → release-LSSYP2ZJ.js.map} +0 -0
- /package/dist/{relevant-pages-OU5H56KY.js.map → relevant-pages-2XHS5WP4.js.map} +0 -0
- /package/dist/{remove-M5P7M5JU.js.map → remove-K62YJYGT.js.map} +0 -0
- /package/dist/{remove-2KACTXKP.js.map → remove-X6DNVS67.js.map} +0 -0
- /package/dist/{reopen-J3VW5766.js.map → reopen-RPVEBQVR.js.map} +0 -0
- /package/dist/{research-7LBTJ2B2.js.map → research-4ASN2KMB.js.map} +0 -0
- /package/dist/{research-4CAA5CA2.js.map → research-6J3EOBAL.js.map} +0 -0
- /package/dist/{reset-DJSSXC4Y.js.map → reset-ETORO5UO.js.map} +0 -0
- /package/dist/{reset-DBWWGCXY.js.map → reset-YVTYHSTY.js.map} +0 -0
- /package/dist/{resolve-BNRUYS56.js.map → resolve-BI7GB5U2.js.map} +0 -0
- /package/dist/{retry-TMRIFGVT.js.map → retry-2ZZCKSRW.js.map} +0 -0
- /package/dist/{retry-WRBGLB7O.js.map → retry-QZ7YHXF3.js.map} +0 -0
- /package/dist/{retry-failed-NWLH6WHK.js.map → retry-failed-EJBP4236.js.map} +0 -0
- /package/dist/{search-4HIOKYFR.js.map → run-FFASB4YB.js.map} +0 -0
- /package/dist/{schedule-BQQGYGT7.js.map → schedule-4BK2ML6F.js.map} +0 -0
- /package/dist/{schedule-S547HPUT.js.map → schedule-IDZC6M32.js.map} +0 -0
- /package/dist/{schema-DDEWM5ZX.js.map → schema-QPPWADIL.js.map} +0 -0
- /package/dist/{scrape-TI6S2W7I.js.map → scrape-J2Y7YZ4Z.js.map} +0 -0
- /package/dist/{screenshot-XFAYY4WW.js.map → screenshot-K7ZGTVTE.js.map} +0 -0
- /package/dist/{search-D2IV7KFJ.js.map → search-CI7LEOOK.js.map} +0 -0
- /package/dist/{search-VJBKRD2U.js.map → search-GCSQ6CSD.js.map} +0 -0
- /package/dist/{search-IZPDHRJ4.js.map → search-I6DRUXBX.js.map} +0 -0
- /package/dist/{shared-3CGGKICB.js.map → search-TTL7VQET.js.map} +0 -0
- /package/dist/{search-KFDL2IGG.js.map → search-VT2KUAH6.js.map} +0 -0
- /package/dist/{search-copy-QZXCAGK4.js.map → search-copy-N2AIJNUH.js.map} +0 -0
- /package/dist/{seeds-VUNZMHZH.js.map → seeds-EYYQCMGF.js.map} +0 -0
- /package/dist/{sends-7HWLIOUO.js.map → sends-RHVFV2XM.js.map} +0 -0
- /package/dist/{sequences-5RAGZE7L.js.map → sequences-5DUWNSWQ.js.map} +0 -0
- /package/dist/{setup-links-SPIGXQTY.js.map → setup-links-C3EUV2RX.js.map} +0 -0
- /package/dist/{sync-definition-DYSVT7BJ.js.map → shared-NDRFKAH7.js.map} +0 -0
- /package/dist/{site-FW6K6L6M.js.map → site-W5W7FCUD.js.map} +0 -0
- /package/dist/{sitemaps-3WDYQHYR.js.map → sitemaps-QKKXMXMV.js.map} +0 -0
- /package/dist/{sites-G4DQ2Z2X.js.map → sites-GRC6CCCK.js.map} +0 -0
- /package/dist/{skills-PA26HXEP.js.map → skills-UML6GSW6.js.map} +0 -0
- /package/dist/{sources-PMBWG4KO.js.map → sources-SGGLJIOA.js.map} +0 -0
- /package/dist/{stats-Q35I5DRW.js.map → stats-RCLQE4HJ.js.map} +0 -0
- /package/dist/{status-62SUXUWW.js.map → status-KUSLGZD7.js.map} +0 -0
- /package/dist/{sticker-MC2IAIQB.js.map → sticker-SINY47WT.js.map} +0 -0
- /package/dist/{stock-B7LKMKUK.js.map → stock-ECRBD7RP.js.map} +0 -0
- /package/dist/{studio-BB2EVW5I.js.map → studio-LMDDQWRY.js.map} +0 -0
- /package/dist/{sync-CLZDZL5F.js.map → sync-2MFUI3ME.js.map} +0 -0
- /package/dist/{sync-YTHNOAAM.js.map → sync-TCY4NX7J.js.map} +0 -0
- /package/dist/{viewer-check-HIMNCZGY.js.map → sync-definition-DGSAZGQZ.js.map} +0 -0
- /package/dist/{tag-manager-EAREWVYR.js.map → tag-manager-G3LBQZUL.js.map} +0 -0
- /package/dist/{tags-53AG3FYG.js.map → tags-IHLO2NDM.js.map} +0 -0
- /package/dist/{tags-7TH7TVR6.js.map → tags-QQLYW2QQ.js.map} +0 -0
- /package/dist/{tags-EUEWDTTN.js.map → tags-QXRKKRIR.js.map} +0 -0
- /package/dist/{tags-EB4RE3ML.js.map → tags-U5YWCPFW.js.map} +0 -0
- /package/dist/{tags-ICAWBCOR.js.map → tags-ZYVOKGHU.js.map} +0 -0
- /package/dist/{targeting-constants-IFE72XKL.js.map → targeting-constants-KEKYU5JQ.js.map} +0 -0
- /package/dist/{targeting-criteria-WZDGJKOI.js.map → targeting-criteria-AEBSY6OY.js.map} +0 -0
- /package/dist/{testimonials-THHR5JH5.js.map → testimonials-O52ULRAU.js.map} +0 -0
- /package/dist/{themes-ZFRM6AVO.js.map → themes-26XFWSWC.js.map} +0 -0
- /package/dist/{top-companies-63Q475IA.js.map → top-companies-OMGAFFWN.js.map} +0 -0
- /package/dist/{tweets-7EZRFG3Y.js.map → tweets-C3QUKS3I.js.map} +0 -0
- /package/dist/{unfollow-WBBTVEHE.js.map → unfollow-ZI5QU7RD.js.map} +0 -0
- /package/dist/{unlink-P7KU54YU.js.map → unlink-3BAXM2OH.js.map} +0 -0
- /package/dist/{unstage-GHXGDOT2.js.map → unstage-7F7JI6HY.js.map} +0 -0
- /package/dist/{update-7EWDO32L.js.map → update-2RCIXWP3.js.map} +0 -0
- /package/dist/{update-KVMQOVQK.js.map → update-5A7Q7S6I.js.map} +0 -0
- /package/dist/{upload-NA62W5RS.js.map → upload-KO46L76G.js.map} +0 -0
- /package/dist/{upload-6PYPHPCZ.js.map → upload-Y3TACPEN.js.map} +0 -0
- /package/dist/{upscale-RXJUBHXN.js.map → upscale-SJ7SCSRS.js.map} +0 -0
- /package/dist/{url-options-EUDXLDBD.js.map → url-options-6CNDIUDM.js.map} +0 -0
- /package/dist/{url-params-DBJSM2LP.js.map → url-params-ZUYOLAJG.js.map} +0 -0
- /package/dist/{use-MHPNS4V4.js.map → use-6ULEM3WE.js.map} +0 -0
- /package/dist/{variant-ZFCWILPG.js.map → variant-5TRRSYBB.js.map} +0 -0
- /package/dist/{videos-DUG7JYUA.js.map → videos-EFMNE6U2.js.map} +0 -0
- /package/dist/{view-PYCGDGT2.js.map → view-ABSWZMXW.js.map} +0 -0
- /package/dist/{web-SDG42OBC.js.map → web-4JGYRY36.js.map} +0 -0
- /package/dist/{winners-AI4PVSOI.js.map → winners-KRISBKOR.js.map} +0 -0
- /package/dist/{winning-ads-KGAYAIPG.js.map → winning-ads-6SXA4HGB.js.map} +0 -0
- /package/dist/{write-commands-5TJ3LQ5F.js.map → write-commands-HCQI4Y27.js.map} +0 -0
- /package/dist/{write-commands-OYMWOFEY.js.map → write-commands-LQXKNBA5.js.map} +0 -0
- /package/dist/{write-commands-R3UCCBUI.js.map → write-commands-QCI6XBM7.js.map} +0 -0
- /package/dist/{write-commands-34L5LJIB.js.map → write-commands-RHCCPMAE.js.map} +0 -0
- /package/dist/{x-VNRVGVLI.js.map → x-LUEUC3XO.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/creative-rules/schema.ts","../src/engine/copy-tells/rule-tells.ts","../src/commands/creatives/ideas-model.ts","../src/engine/creative-rules/read.ts"],"sourcesContent":["/**\n * A creative rule: a standing must, never or prefer about every ad a company makes. Declared ones\n * are the brand's own (BRAND.md, read by `brand-doc.ts`); learned ones are what a person taught in a\n * chat, one file each in `src/content/creative-rules/<slug>.md`, saved only after they said yes.\n * Read when a call runs, never copied into an ad's own files.\n */\nimport { z } from \"zod\";\n\nexport const RULE_STRENGTHS = [\"never\", \"must\", \"prefer\"] as const;\nexport type RuleStrength = (typeof RULE_STRENGTHS)[number];\n\n/** What of the ad a rule is about, and so which check holds it. */\nexport const RULE_APPLIES = [\"copy\", \"picture\", \"cast\", \"logo\", \"voice\", \"sound\", \"subtitles\", \"any\"] as const;\nexport type RuleApplies = (typeof RULE_APPLIES)[number];\n\nexport const RULE_KINDS = [\"static\", \"video\"] as const;\n\n/** Where a rule holds; absent parts hold everywhere. */\nexport type RuleScope = {\n kinds?: Array<(typeof RULE_KINDS)[number]>;\n /** Product slugs (`src/content/products/<slug>.md`) a business unit's rule is about. */\n products?: string[];\n platforms?: string[];\n /** The language its phrases are in (\"es\"): its wording checks hold only in ads in that language. */\n language?: string;\n};\n\n/**\n * The part of a rule code can decide on the ad's words: phrases it bans (`forbid`, except where they\n * sit inside an `allow`), phrases every ad must say (`require`), and that only real people may appear.\n */\nexport type RuleCheck = {\n forbid?: string[];\n require?: string[];\n allow?: string[];\n people?: \"real\";\n};\n\nexport const RULE_SOURCE_KINDS = [\"feedback\", \"user\", \"brand-import\", \"brand\"] as const;\n\nexport type RuleSource = {\n kind: (typeof RULE_SOURCE_KINDS)[number];\n feedbackId?: string;\n runId?: string;\n slug?: string;\n /** The person's own words the rule came from. */\n quote?: string;\n /** When it was taught (YYYY-MM-DD). */\n date?: string;\n};\n\nexport type CreativeRule = {\n /** The file's slug for a learned rule; `brand-<hash>` for one BRAND.md states. */\n id: string;\n origin: \"learned\" | \"declared\";\n strength: RuleStrength;\n applies: RuleApplies;\n scope: RuleScope;\n check?: RuleCheck;\n /** The rule, in the words it was given in. */\n text: string;\n why?: string;\n source: RuleSource;\n status: \"active\" | \"retired\";\n retiredBy?: string;\n};\n\nconst phrase = z.string().trim().min(1).max(120);\n\n/** A list of phrases, each trimmed, the empty and malformed ones dropped. */\nexport const Phrases = z\n .array(z.unknown())\n .transform((list) => list.flatMap((p) => (phrase.safeParse(p).success ? [String(p).trim()] : [])));\n","/**\n * The company's wording rules, checked on an ad's words without a model: a phrase a rule bans\n * (except inside a phrase it allows) and a phrase every ad must say. Whole phrases only, read the\n * way a person reads them: accents, case and spacing folded (\"100 % online\" is \"100% Online\"), ß as\n * ss. A rule whose phrases differ only in case is about spelling, and keeps case (\"ZentIA\", never\n * \"Zentia\"). A rule in one language holds only in ads in that language. Never and must rules only:\n * a prefer is the reviewers' to weigh. Pure and total.\n */\nimport type { CreativeRule } from \"../creative-rules/schema.ts\";\n\nexport type RuleTell = {\n rule: string;\n strength: CreativeRule[\"strength\"];\n /** A phrase the rule bans was found, or none of the lines says one it requires. */\n kind: \"forbidden\" | \"missing\";\n phrase: string;\n /** The line it was found in (a forbidden phrase only). */\n line?: string;\n /** The rule's words. */\n text: string;\n /** The person's own words, when they taught it. */\n quote?: string;\n};\n\n/** Marks that separate words rather than say anything: never part of a phrase unless it is only marks. */\nconst SOFT = new Set([\n \".\",\n \",\",\n \";\",\n \":\",\n \"!\",\n \"?\",\n \"¡\",\n \"¿\",\n '\"',\n \"'\",\n \"“\",\n \"”\",\n \"‘\",\n \"’\",\n \"«\",\n \"»\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \"{\",\n \"}\",\n \"…\",\n \"-\",\n \"/\",\n \"*\",\n \"_\",\n]);\n\n/** Accents off, ß as ss, and case folded unless the rule is about case. Pure. */\nfunction fold(text: string, keepCase: boolean): string {\n const plain = text.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\").replace(/ß/g, \"ss\").replace(/ẞ/g, \"SS\");\n return keepCase ? plain : plain.toLowerCase();\n}\n\n/** The words and marks of a text, as phrases are matched on; the separating marks only when `marks`. Pure. */\nfunction tokens(text: string, keepCase: boolean, marks = false): string[] {\n const all = fold(text, keepCase).match(/[\\p{L}\\p{N}]+|[^\\s\\p{L}\\p{N}]/gu) ?? [];\n return marks ? all : all.filter((t) => !SOFT.has(t));\n}\n\n/** Whether a phrase is only separating marks (\"!\", \"¿\"): then it is matched among the marks of a line. Pure. */\nfunction onlyMarks(phrase: string, keepCase: boolean): boolean {\n return tokens(phrase, keepCase).length === 0 && tokens(phrase, keepCase, true).length > 0;\n}\n\n/** Where `phrase` starts in `words`, every place. Pure. */\nfunction positions(words: readonly string[], phrase: readonly string[]): number[] {\n if (phrase.length === 0) return [];\n const at: number[] = [];\n for (let i = 0; i + phrase.length <= words.length; i++) {\n if (phrase.every((w, j) => words[i + j] === w)) at.push(i);\n }\n return at;\n}\n\n/** A rule is about case when two of its phrases are the same word but for case. Pure. */\nfunction aboutCase(check: NonNullable<CreativeRule[\"check\"]>): boolean {\n const phrases = [...(check.forbid ?? []), ...(check.allow ?? []), ...(check.require ?? [])];\n return phrases.some((a, i) =>\n phrases.some((b, j) => i !== j && a !== b && fold(a, false) === fold(b, false) && fold(a, true) !== fold(b, true)),\n );\n}\n\n/** Whether a rule in one language holds for an ad in `language`: the same primary tag, or a rule in none. Pure. */\nfunction sameLanguage(rule: CreativeRule, language: string | undefined): boolean {\n const ruleLanguage = rule.scope.language;\n if (!ruleLanguage) return true;\n if (!language) return false;\n const primary = (tag: string) => tag.toLowerCase().split(/[-_]/)[0];\n return primary(ruleLanguage) === primary(language);\n}\n\n/** The first phrase of `forbid` a line says outside every `allow`, or null. Pure. */\nfunction forbiddenIn(line: string, check: NonNullable<CreativeRule[\"check\"]>, keepCase: boolean): string | null {\n for (const banned of check.forbid ?? []) {\n const marks = onlyMarks(banned, keepCase);\n const words = tokens(line, keepCase, marks);\n const allowed = (check.allow ?? []).flatMap((a) => {\n const allow = tokens(a, keepCase, marks);\n return positions(words, allow).map((start) => [start, start + allow.length] as const);\n });\n const phrase = tokens(banned, keepCase, marks);\n const free = positions(words, phrase).some(\n (start) => !allowed.some(([from, to]) => start >= from && start + phrase.length <= to),\n );\n if (free) return banned;\n }\n return null;\n}\n\n/** What one rule finds in the lines: each line saying a phrase it bans, each phrase it requires none says. Pure. */\nfunction tellsOf(rule: CreativeRule, lines: readonly string[]): RuleTell[] {\n const check = rule.check;\n if (!check) return [];\n const keepCase = aboutCase(check);\n const base = {\n rule: rule.id,\n strength: rule.strength,\n text: rule.text,\n ...(rule.source.quote ? { quote: rule.source.quote } : {}),\n };\n const forbidden = lines.flatMap((line) => {\n const phrase = forbiddenIn(line, check, keepCase);\n return phrase ? [{ ...base, kind: \"forbidden\" as const, phrase, line }] : [];\n });\n const missing = (check.require ?? []).flatMap((required) => {\n const marks = onlyMarks(required, keepCase);\n const phrase = tokens(required, keepCase, marks);\n const said = lines.some((line) => positions(tokens(line, keepCase, marks), phrase).length > 0);\n return said ? [] : [{ ...base, kind: \"missing\" as const, phrase: required }];\n });\n return [...forbidden, ...missing];\n}\n\n/** Every wording rule the lines break, the line it is broken in first. Pure. */\nexport function ruleTells(\n lines: readonly string[],\n rules: readonly CreativeRule[],\n language: string | undefined,\n): RuleTell[] {\n return rules\n .filter((rule) => rule.strength !== \"prefer\" && sameLanguage(rule, language))\n .flatMap((rule) => tellsOf(rule, lines));\n}\n","/**\n * Ideas and the customer truths they stand on.\n *\n * An idea (src/creatives/_ideas/<id>.md) is one bet: who it is for, the one thing it says, the\n * customer evidence behind it and how it says it. An insight (src/content/insights/<id>.md) is\n * one customer truth, a quote with its source. `checkIdeas` is the judgment the agent used to\n * carry in prose: is each idea backed by something a customer said, does it claim only what the\n * Knowledge holds, is it a different ad from the others, does it fill a gap. Pure.\n */\nimport { staticFormatPatternSchema } from \"@baker/api\";\nimport { AD_PLATFORMS } from \"@baker/canvas-contract\";\nimport { parse as parseYaml, YAMLParseError } from \"yaml\";\nimport { ruleTells } from \"../../engine/copy-tells/rule-tells.ts\";\nimport type { CreativeRule } from \"../../engine/creative-rules/schema.ts\";\n\n/** How an idea persuades, in the ads library's own angle vocabulary, so ours and theirs compare. */\nexport const IDEA_ANGLES = [\n \"pain_relief\",\n \"aspiration\",\n \"status\",\n \"fear\",\n \"FOMO\",\n \"identity\",\n \"contrarian\",\n \"education\",\n \"novelty\",\n \"authority\",\n \"community\",\n \"transformation\",\n \"convenience\",\n \"save_money\",\n \"save_time\",\n \"save_effort\",\n \"named_enemy\",\n \"objection_crusher\",\n \"villain_democratization\",\n \"commiseration\",\n \"recognition_mirror\",\n \"flipped_idiom\",\n] as const;\n\n/** Video formats an idea may take; every other format is a static container from the library. */\nexport const IDEA_VIDEO_FORMATS = [\n \"video_ugc\",\n \"video_founder\",\n \"video_testimonial\",\n \"video_demo\",\n \"video_screen_recording\",\n \"video_explainer\",\n \"video_motion_graphics\",\n] as const;\n\nexport const IDEA_FORMATS: readonly string[] = [...staticFormatPatternSchema.options, ...IDEA_VIDEO_FORMATS];\n\nexport const AWARENESS_STAGES = [\"unaware\", \"problem_aware\", \"solution_aware\", \"product_aware\", \"most_aware\"] as const;\nexport type AwarenessStage = (typeof AWARENESS_STAGES)[number];\n\nexport const EVIDENCE_LEVELS = [\"observed\", \"interpreted\", \"hypothesized\", \"generated\"] as const;\nexport type EvidenceLevel = (typeof EVIDENCE_LEVELS)[number];\n\nexport const IDEA_STATUSES = [\"idea\", \"built\", \"testing\", \"winner\", \"failed\", \"inconclusive\", \"retired\"] as const;\nexport type IdeaStatus = (typeof IDEA_STATUSES)[number];\n\nexport type Insight = {\n id: string;\n type: string;\n quote: string;\n source: string;\n status: EvidenceLevel;\n sourceKind?: string;\n force?: string;\n persona?: string;\n /** Who said it, as the research wrote it (\"A 5★ Trustpilot review by Lena Fischer.\"). */\n author?: string;\n};\n\nexport type Idea = {\n id: string;\n who: string;\n message: string;\n evidence: string[];\n awareness: AwarenessStage;\n angle: string;\n /**\n * What the scroller sees in the first second that makes the message land (\"before/after split:\n * a tangle of 16 platform logos, then one API key\"). The proven ad is searched by it, in any category.\n */\n shows?: string;\n /** The container: a video style (built from beats), or a static one the idea insists on. Absent: the proven ad's. */\n format?: string;\n job: \"opener\" | \"closer\";\n why: string;\n status: IdeaStatus;\n /** Where its ads run, main platform first (`AD_PLATFORMS`): the sizes they are made in. Absent: not said yet. */\n platforms?: string[];\n};\n\nconst FRONTMATTER = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n\n/** A markdown file's frontmatter as an object, or null when it has none or it does not parse. */\nexport function frontmatterOf(markdown: string): Record<string, unknown> | null {\n const block = FRONTMATTER.exec(markdown)?.[1];\n if (block === undefined) return null;\n try {\n const parsed: unknown = parseYaml(block);\n return parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Why a file's frontmatter does not parse, naming the line, or null when it parses (or has none).\n * Dev, Oct 2026: an unquoted `why: \"a minefield\" with quotes` read as every field missing. Pure.\n */\nexport function frontmatterError(markdown: string): string | null {\n const block = FRONTMATTER.exec(markdown)?.[1];\n if (block === undefined) return null;\n try {\n parseYaml(block);\n return null;\n } catch (e) {\n const line = e instanceof YAMLParseError ? e.linePos?.[0]?.line : undefined;\n const at = line ? ` at line ${line} (\\`${block.split(/\\r?\\n/)[line - 1]?.trim() ?? \"\"}\\`)` : \"\";\n return `the frontmatter is not valid YAML${at}: put each text value wholly in double quotes, with any quote inside it as \\\\\" or as single quotes`;\n }\n}\n\nfunction text(value: unknown): string | undefined {\n if (typeof value === \"string\") return value.trim() || undefined;\n if (typeof value === \"number\") return String(value);\n return undefined;\n}\n\nfunction oneOf<T extends string>(values: readonly T[], value: unknown): T | undefined {\n return typeof value === \"string\" && (values as readonly string[]).includes(value) ? (value as T) : undefined;\n}\n\n/** A source a reader can open: a link, or a library entry (`testimonials:t1`). */\nconst CHECKABLE_SOURCE = /^(?:https?:\\/\\/\\S+|[a-z_]+:[\\w-]+)$/i;\n\n/**\n * How strong an insight really is: one filed as observed is read as interpreted when its source\n * cannot be checked. Audited live Oct 2026: article lines, sourced \"an article (referenced in …)\",\n * filed as what customers said. A quote that is a statistic about people rather than someone's\n * words is the other half of that audit, and a reading of the words: `ideas-judgments.ts`.\n */\nfunction evidenceStatus(stated: EvidenceLevel, source: string): EvidenceLevel {\n if (stated !== \"observed\") return stated;\n return CHECKABLE_SOURCE.test(source) ? \"observed\" : \"interpreted\";\n}\n\n/** One customer truth, or null when it carries no quote or source to stand on. */\nexport function parseInsight(id: string, markdown: string): Insight | null {\n const fm = frontmatterOf(markdown);\n const quote = text(fm?.quote);\n const source = text(fm?.source);\n if (!fm || !quote || !source) return null;\n const force = text(fm.force);\n const persona = text(fm.persona);\n const sourceKind = text(fm.sourceKind);\n const author = markdown\n .replace(/^---[\\s\\S]*?\\n---/, \"\")\n .match(/\\bby ([\\p{Lu}][\\p{L}'’-]*\\.?(?: [\\p{Lu}][\\p{L}'’-]*\\.?)?)/u)?.[1]\n // The sentence's full stop, never an initial's (\"Marta G.\").\n ?.replace(/(\\p{L}{2,})\\.$/u, \"$1\");\n return {\n id,\n type: text(fm.type) ?? \"other\",\n quote,\n source,\n status: evidenceStatus(oneOf(EVIDENCE_LEVELS, fm.status) ?? \"observed\", source),\n ...(sourceKind ? { sourceKind } : {}),\n ...(force ? { force } : {}),\n ...(persona ? { persona } : {}),\n ...(author ? { author } : {}),\n };\n}\n\nfunction evidenceList(value: unknown): string[] {\n if (Array.isArray(value)) return value.flatMap((e) => (text(e) ? [String(text(e))] : []));\n const single = text(value);\n return single ? [single] : [];\n}\n\ntype IdeaFields = {\n who?: string;\n message?: string;\n why?: string;\n angle?: string;\n shows?: string;\n format?: string;\n awareness?: AwarenessStage;\n /** The awareness as written, to quote back when it is not a stage. */\n awarenessWritten?: string;\n /** The platforms as written; absent when the idea names none (never a problem). */\n platforms?: string[];\n};\n\nfunction fieldProblems(f: IdeaFields): string[] {\n const problems: string[] = [];\n if (!f.who) problems.push(\"who is missing: the persona it is for\");\n if (!f.message)\n problems.push(\n \"message is missing: the one promise a stranger should get, what is offered and what changes for them\",\n );\n if (!f.why) problems.push(\"why is missing: the brief finding it answers\");\n if (!f.awareness) {\n const written = f.awarenessWritten ? `\"${f.awarenessWritten}\" ` : \"\";\n problems.push(`awareness ${written}must be one of ${AWARENESS_STAGES.join(\", \")}`);\n }\n if (!(f.angle && (IDEA_ANGLES as readonly string[]).includes(f.angle)))\n problems.push(`angle ${f.angle ? `\"${f.angle}\" ` : \"\"}must be one of ${IDEA_ANGLES.join(\", \")}`);\n if (f.format && !IDEA_FORMATS.includes(f.format))\n problems.push(`format \"${f.format}\" must be one of ${IDEA_FORMATS.join(\", \")}`);\n if (!f.format && !f.shows)\n problems.push(\n \"shows is missing: what the scroller sees in the first second that makes the message land (a before/after, a reaction, the product doing it, a real review, the pain itself); the proven ad is searched by it\",\n );\n return [...problems, ...platformProblems(f.platforms)];\n}\n\n/** A platform the catalog does not know, named with the ones it does; none named is no problem. */\nfunction platformProblems(platforms: readonly string[] | undefined): string[] {\n const unknown = (platforms ?? []).filter((p) => !(AD_PLATFORMS as readonly string[]).includes(p));\n return unknown.length > 0\n ? [`platforms ${unknown.map((p) => `\"${p}\"`).join(\", \")} must be among ${AD_PLATFORMS.join(\", \")}`]\n : [];\n}\n\n/** The platforms an idea names, as written (a single name read as a list of one). */\nfunction platformList(value: unknown): string[] | undefined {\n const list = (Array.isArray(value) ? value : value === undefined || value === null ? [] : [value])\n .map((v) => text(v))\n .filter((v): v is string => v !== undefined);\n return list.length > 0 ? list : undefined;\n}\n\n/** One idea file, or every problem that keeps it from being one. */\nexport function parseIdea(id: string, markdown: string): { idea?: Idea; problems: string[] } {\n const unparsable = frontmatterError(markdown);\n if (unparsable) return { problems: [unparsable] };\n const fm = frontmatterOf(markdown) ?? {};\n const f: IdeaFields = {\n who: text(fm.who),\n message: text(fm.message),\n why: text(fm.why),\n angle: text(fm.angle),\n shows: text(fm.shows),\n format: text(fm.format),\n awareness: oneOf(AWARENESS_STAGES, fm.awareness),\n awarenessWritten: text(fm.awareness),\n platforms: platformList(fm.platforms),\n };\n const problems = fieldProblems(f);\n const { who, message, why, angle, shows, format, awareness } = f;\n if (problems.length > 0 || !who || !message || !why || !awareness || !angle) return { problems };\n return {\n idea: {\n id,\n who,\n message,\n evidence: evidenceList(fm.evidence),\n awareness,\n angle,\n ...(shows ? { shows } : {}),\n ...(format ? { format } : {}),\n job: fm.job === \"closer\" ? \"closer\" : \"opener\",\n why,\n status: oneOf(IDEA_STATUSES, fm.status) ?? \"idea\",\n ...(f.platforms ? { platforms: f.platforms } : {}),\n },\n problems,\n };\n}\n\nexport type IdeaCheck = {\n id: string;\n status: IdeaStatus;\n message: string;\n /** The strongest evidence behind it; `explore` when no insight backs it. */\n evidence: EvidenceLevel | \"explore\";\n /** The customer's own words it stands on, when it has some. */\n quote?: string;\n awareness: AwarenessStage;\n angle: string;\n /** What the scroller sees first, when the idea says. */\n shows?: string;\n /** The container, when the idea names one; absent: the proven ad's. */\n format?: string;\n /** Where its ads run, main platform first; absent when the idea names nowhere. */\n platforms?: string[];\n /** Blocks building it until fixed. */\n problems: string[];\n /** Worth fixing; never blocks. */\n warnings: string[];\n /** What it adds that the live ads do not have. */\n gaps: string[];\n score: number;\n};\n\nexport type CheckIdeasInput = {\n ideas: readonly Idea[];\n insights: readonly Insight[];\n /** Everything the company's documents say (COMPANY.md, the Knowledge): the claims an ad may make. */\n knowledge: string;\n /** Persona entry ids in the Knowledge; empty when there are none to check against. */\n personas: readonly string[];\n /** Awareness stages the company's live or built ads already speak to. */\n coveredAwareness: readonly string[];\n /** How many live or built ideas close (`job: closer`). */\n closersLive: number;\n /** Whether two messages say the same thing (`ideas-judgments.ts`); the same words, without it. */\n sameMessage?: SameMessage;\n /** The company's rules for its ads: a message that breaks a wording rule is not an idea to build. */\n rules?: readonly CreativeRule[];\n /** The language the ideas' messages are in (the company's market's), for the wording rules. */\n language?: string;\n};\n\nconst EVIDENCE_WEIGHT: Record<EvidenceLevel | \"explore\", number> = {\n observed: 3,\n interpreted: 2,\n hypothesized: 1,\n generated: 0,\n explore: 0,\n};\n\nconst LIVE_STATUSES: readonly IdeaStatus[] = [\"built\", \"testing\", \"winner\"];\n\n/** Numbers, percentages and prices a message states: each must be found in what the company wrote. */\nfunction claimsOf(message: string): string[] {\n return [...message.matchAll(/\\d[\\d.,]*\\s?(?:%|€|\\$|£|x\\b|k\\b)?/gi)].map((m) => m[0].trim());\n}\n\n/** A figure as written anywhere, separators dropped: \"4.990 €\", \"4990€\" and \"4,990\" are one number. */\nfunction figureOf(claim: string): string {\n return claim.replace(/[^\\d]/g, \"\");\n}\n\n/** Every whole number a text states, so \"4\" is never found inside \"4.990\". Pure. */\nexport function figuresIn(text: string): Set<string> {\n return new Set([...text.matchAll(/\\d(?:[\\d.,]*\\d)?/g)].map((m) => figureOf(m[0])));\n}\n\nfunction normalize(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction sentencesOf(message: string): number {\n return message.split(/[.!?]+(?:\\s|$)/).filter((s) => s.trim().length > 0).length;\n}\n\ntype CheckContext = {\n insights: ReadonlyMap<string, Insight>;\n corpusFigures: ReadonlySet<string>;\n covered: ReadonlySet<string>;\n duplicateOf: ReadonlyMap<string, string>;\n personas: readonly string[];\n closersLive: number;\n failed: readonly Idea[];\n sameMessage: SameMessage;\n rules: readonly CreativeRule[];\n language: string | undefined;\n};\n\n/** Whether two ad messages say the same thing, however reworded. */\nexport type SameMessage = (a: string, b: string) => boolean;\n\n/** Without a reading of the words, only the same message written the same way is one. Pure. */\nexport const SAME_WORDS: SameMessage = (a, b) => normalize(a) === normalize(b);\n\n/** A failed idea this one repeats: the same message (reworded or not), or the same angle in the same format. */\nfunction repeatedFailure(idea: Idea, failed: readonly Idea[], sameMessage: SameMessage): string[] {\n const lost = failed.find(\n (f) =>\n f.id !== idea.id &&\n (sameMessage(f.message, idea.message) || (f.angle === idea.angle && f.format === idea.format)),\n );\n return lost\n ? [`says what \"${lost.id}\" said, and that idea failed in the account: change the message, not just the picture`]\n : [];\n}\n\n/** The insight on file whose id and quote share the most words with `id`, an id written from memory. */\nfunction likelyMeant(id: string, insights: ReadonlyMap<string, Insight>): string | undefined {\n const words = (text: string) =>\n new Set(\n text\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((w) => w.length >= 3),\n );\n const wanted = words(id);\n let best: { id: string; shared: number } | undefined;\n for (const insight of insights.values()) {\n const said = words(`${insight.id} ${insight.quote}`);\n const shared = [...wanted].filter((w) => said.has(w)).length;\n if (shared > 0 && shared > (best?.shared ?? 0)) best = { id: insight.id, shared };\n }\n return best?.id;\n}\n\nfunction backingOf(idea: Idea, insights: ReadonlyMap<string, Insight>, problems: string[]) {\n const backing = idea.evidence.flatMap((id) => {\n const insight = insights.get(id);\n if (!insight) {\n const meant = likelyMeant(id, insights);\n problems.push(\n `evidence \"${id}\" is not in src/content/insights/: ${meant ? `did you mean \"${meant}\"? ` : \"\"}name an insight on file by its id, or leave it out`,\n );\n }\n return insight ? [insight] : [];\n });\n return [...backing].sort((a, b) => EVIDENCE_WEIGHT[b.status] - EVIDENCE_WEIGHT[a.status])[0];\n}\n\n/** The figures a text claims that nothing the company wrote holds. Pure. */\nexport function unsourcedClaims(text: string, corpusFigures: ReadonlySet<string>): string[] {\n return claimsOf(text).filter((claim) => {\n const figure = figureOf(claim);\n return figure !== \"\" && !corpusFigures.has(figure);\n });\n}\n\n/**\n * Why an insight that states a figure cannot stand behind it as our claim, in words the agent can act\n * on. Review, Oct 2026: a figure held by an insight read as interpreted only for its unlinked source\n * was said to be in no quote at all, and the agent searched for what it already had. Pure.\n */\nfunction whyNotBacking(insight: Insight): string {\n const named = `the insight \"${insight.id}\"`;\n if (fromMarket(insight))\n return `${named}, what someone in the market said, not our customer: it is never our claim; drop it`;\n if (insight.status === \"hypothesized\" || insight.status === \"generated\")\n return `${named}, a ${insight.status} reading, not a customer's words: source it or drop it`;\n if (!CHECKABLE_SOURCE.test(insight.source))\n return `${named}, which cites no link a reader can open (its source: \"${insight.source}\"): give it its link, or drop the figure`;\n return `${named}, a statistic about people rather than a customer's words: it cannot stand behind our claim; drop it`;\n}\n\nfunction claimProblems(message: string, ctx: Pick<CheckContext, \"corpusFigures\" | \"insights\">): string[] {\n return unsourcedClaims(message, ctx.corpusFigures).map((claim) => {\n const figure = figureOf(claim);\n const holder = [...ctx.insights.values()].find((insight) => figuresIn(insight.quote).has(figure));\n return holder\n ? `\"${claim}\" is in ${whyNotBacking(holder)}`\n : `\"${claim}\" is in no customer quote, COMPANY.md or Knowledge entry: source it or drop it`;\n });\n}\n\n/** Where people in the market speak, as opposed to our own customers (reviews, testimonials, calls…). */\nexport const MARKET_SOURCES: readonly string[] = [\"reddit\", \"forum\", \"web\"];\nconst TESTIMONIAL_FORMATS = [\"review_screenshot\", \"testimonial_quote\", \"video_testimonial\"];\n\nfunction fromMarket(insight: Insight | undefined): boolean {\n return insight?.sourceKind !== undefined && MARKET_SOURCES.includes(insight.sourceKind);\n}\n\n/** An insight whose figures may stand behind our claim: our own customer's words, as written. */\nexport function sourcesClaims(insight: Insight): boolean {\n return insight.status === \"observed\" && !fromMarket(insight);\n}\n\n/** A cited result someone in the market reported, which an ad could pass off as ours. */\nfunction borrowedProof(idea: Idea, insights: ReadonlyMap<string, Insight>): string | undefined {\n return idea.evidence.find((id) => {\n const insight = insights.get(id);\n return fromMarket(insight) && insight?.type === \"proof\";\n });\n}\n\n/** A review or testimonial format with no quote from our own customers: it could only be a fake review. */\nfunction fakeReviewProblem(idea: Idea, insights: ReadonlyMap<string, Insight>): string[] {\n if (!idea.format || !TESTIMONIAL_FORMATS.includes(idea.format)) return [];\n const cited = idea.evidence.flatMap((id) => insights.get(id) ?? []);\n if (cited.length === 0 || !cited.every(fromMarket)) return [];\n return [\n `${idea.format} needs a quote from our own customer (a review, testimonial, call or survey); every one cited was said by someone in the market. Pick another format, or cite our own customer`,\n ];\n}\n\nfunction warningsOf(\n idea: Idea,\n evidence: EvidenceLevel | \"explore\",\n personas: readonly string[],\n insights: ReadonlyMap<string, Insight>,\n): string[] {\n const warnings: string[] = [];\n const video = (IDEA_VIDEO_FORMATS as readonly string[]).includes(idea.format ?? \"\");\n if (idea.status === \"idea\" && !video && !idea.shows)\n warnings.push(\n \"say what it shows (`shows`): what the scroller sees in the first second that lands the message; the proven ad is searched by it, and without it by what the company sells\",\n );\n const borrowed = borrowedProof(idea, insights);\n if (borrowed) {\n warnings.push(\n `\"${borrowed}\" was said by someone in the market, not a customer of ours: use their words for the problem, never show it as our review, testimonial or result`,\n );\n }\n if (sentencesOf(idea.message) > 1 || idea.message.split(/\\s+/).length > 25) {\n warnings.push(\n 'the message says more than one thing: keep one promise that still names what is offered (\"a free roof survey that shows your real saving\", never a slogan like \"the numbers, explained\"), the rest goes to the ad text',\n );\n }\n if (personas.length > 0 && !personas.includes(idea.who)) {\n warnings.push(`who \"${idea.who}\" is not a persona in the Knowledge (${personas.join(\", \")})`);\n }\n if (evidence === \"explore\") {\n warnings.push(\"no customer evidence: an explore bet. `baker research customers` may find some\");\n }\n return warnings;\n}\n\nfunction checkOne(idea: Idea, ctx: CheckContext): IdeaCheck {\n const problems: string[] = [];\n const best = backingOf(idea, ctx.insights, problems);\n const evidence = best?.status ?? \"explore\";\n problems.push(\n ...claimProblems(idea.message, ctx),\n ...fakeReviewProblem(idea, ctx.insights),\n // The message is one line of the ad: a phrase a rule requires may sit in another.\n ...ruleTells([idea.message], ctx.rules, ctx.language)\n .filter((t) => t.kind === \"forbidden\")\n .map((t) => `The message says \"${t.phrase}\": ${t.rule} (${t.strength}) — ${t.text}`),\n );\n const duplicate = ctx.duplicateOf.get(idea.id);\n if (duplicate) {\n problems.push(\n `same angle and the same picture (format or what it shows), or the same message, as \"${duplicate}\": to the platform it is the same ad. Change the angle or what it shows`,\n );\n }\n const gaps: string[] = [];\n if (!ctx.covered.has(idea.awareness)) gaps.push(`no live ad speaks to ${idea.awareness} people`);\n if (idea.job === \"closer\" && ctx.closersLive === 0) gaps.push(\"no live ad closes warm people\");\n return {\n id: idea.id,\n status: idea.status,\n message: idea.message,\n evidence,\n ...(best ? { quote: best.quote } : {}),\n awareness: idea.awareness,\n angle: idea.angle,\n ...(idea.shows ? { shows: idea.shows } : {}),\n ...(idea.format ? { format: idea.format } : {}),\n ...(idea.platforms ? { platforms: idea.platforms } : {}),\n problems,\n warnings: [\n ...warningsOf(idea, evidence, ctx.personas, ctx.insights),\n ...repeatedFailure(idea, ctx.failed, ctx.sameMessage),\n ],\n gaps,\n score: EVIDENCE_WEIGHT[evidence] + gaps.length - (problems.length > 0 ? 10 : 0),\n };\n}\n\n/** Which idea repeats an earlier one: a built idea, then the better-evidenced, then the first written keeps it. */\nfunction duplicatesOf(ideas: readonly Idea[], insights: ReadonlyMap<string, Insight>): Map<string, string> {\n const active = ideas.filter((i) => i.status !== \"retired\" && i.status !== \"failed\");\n const strength = (idea: Idea) =>\n Math.max(0, ...idea.evidence.map((id) => EVIDENCE_WEIGHT[insights.get(id)?.status ?? \"explore\"]));\n const position = new Map(ideas.map((idea, index) => [idea.id, index]));\n const order = [...active].sort(\n (a, b) =>\n Number(LIVE_STATUSES.includes(b.status)) - Number(LIVE_STATUSES.includes(a.status)) ||\n strength(b) - strength(a) ||\n (position.get(a.id) ?? 0) - (position.get(b.id) ?? 0),\n );\n const seenPairs = new Map<string, string>();\n const seenMessages = new Map<string, string>();\n const duplicateOf = new Map<string, string>();\n for (const idea of order) {\n const pair = `${idea.angle}×${idea.format ?? normalize(idea.shows ?? \"\")}`;\n const message = normalize(idea.message);\n const earlier = seenPairs.get(pair) ?? seenMessages.get(message);\n if (earlier) duplicateOf.set(idea.id, earlier);\n if (!seenPairs.has(pair)) seenPairs.set(pair, idea.id);\n if (!seenMessages.has(message)) seenMessages.set(message, idea.id);\n }\n return duplicateOf;\n}\n\n/**\n * Check and rank every idea. Ideas still to build come first, best first: the strongest customer\n * evidence, then a gap the live ads leave; anything with a problem sinks. Built ideas follow.\n */\nexport function checkIdeas(input: CheckIdeasInput): IdeaCheck[] {\n const insights = new Map(input.insights.map((insight) => [insight.id, insight]));\n // What our own customers said, word for word, can source a claim; a stranger's number or a reading never can.\n const ownQuotes = input.insights.filter(sourcesClaims).map((i) => i.quote);\n const corpusFigures = figuresIn(`${input.knowledge}\\n${ownQuotes.join(\"\\n\")}`);\n const covered = new Set(input.coveredAwareness);\n const duplicateOf = duplicatesOf(input.ideas, insights);\n const checks = input.ideas.map((idea) =>\n checkOne(idea, {\n insights,\n corpusFigures,\n covered,\n duplicateOf,\n personas: input.personas,\n closersLive: input.closersLive,\n failed: input.ideas.filter((i) => i.status === \"failed\"),\n sameMessage: input.sameMessage ?? SAME_WORDS,\n rules: input.rules ?? [],\n language: input.language,\n }),\n );\n\n const toBuild = (c: IdeaCheck) => c.status === \"idea\";\n return checks.sort(\n (a, b) => Number(toBuild(b)) - Number(toBuild(a)) || b.score - a.score || a.id.localeCompare(b.id),\n );\n}\n","/**\n * Where a company's creative rules come from: the brand's own (BRAND.md, through its reading) and\n * the ones a person taught in a chat (`src/content/creative-rules/<slug>.md`, one per file). Each is\n * read as it stands when a call runs; nothing is copied into an ad's files.\n */\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { frontmatterOf } from \"../../commands/creatives/ideas-model.ts\";\nimport type { BrandRule } from \"../brand/brand-rules.ts\";\nimport {\n type CreativeRule,\n Phrases,\n RULE_APPLIES,\n RULE_KINDS,\n RULE_SOURCE_KINDS,\n RULE_STRENGTHS,\n type RuleCheck,\n} from \"./schema.ts\";\n\n/** Where the learned rules live in a workspace. */\nexport const RULES_DIR = path.join(\"src\", \"content\", \"creative-rules\");\n\nconst optionalText = z.string().trim().min(1).max(2000).optional().catch(undefined);\nconst optionalPhrases = Phrases.optional().catch(undefined);\nconst dateText = z\n .union([z.string(), z.date().transform((d) => d.toISOString().slice(0, 10))])\n .pipe(z.string().trim().min(1))\n .optional()\n .catch(undefined);\n\nconst Frontmatter = z.object({\n strength: z.enum(RULE_STRENGTHS).catch(\"must\"),\n applies: z.enum(RULE_APPLIES).catch(\"any\"),\n scope: z\n .object({\n kinds: z.array(z.enum(RULE_KINDS)).optional().catch(undefined),\n products: optionalPhrases,\n platforms: optionalPhrases,\n language: z.string().trim().min(2).max(10).optional().catch(undefined),\n })\n .catch({}),\n check: z\n .object({\n forbid: optionalPhrases,\n require: optionalPhrases,\n allow: optionalPhrases,\n people: z.literal(\"real\").optional().catch(undefined),\n })\n .optional()\n .catch(undefined),\n source: z\n .object({\n kind: z.enum(RULE_SOURCE_KINDS).catch(\"user\"),\n feedbackId: optionalText,\n runId: optionalText,\n slug: optionalText,\n quote: optionalText,\n date: dateText,\n })\n .catch({ kind: \"user\" }),\n status: z.enum([\"active\", \"retired\"]).catch(\"active\"),\n retiredBy: optionalText,\n});\n\n/** An object with its undefined and empty-list entries left out. Pure. */\nfunction defined<T extends object>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, v]) => v !== undefined && !(Array.isArray(v) && v.length === 0)),\n ) as T;\n}\n\n/** The rule's words (the body's first paragraph) and its why (a `Why:` paragraph). Pure. */\nfunction bodyOf(markdown: string): { text?: string; why?: string } {\n const body = markdown.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, \"\").trim();\n const paragraphs = body\n .split(/\\r?\\n\\s*\\r?\\n/)\n .map((p) => p.trim())\n .filter(Boolean);\n const why = paragraphs.find((p) => /^(?:why|por qué|porque)\\s*:/i.test(p));\n const text = paragraphs.find((p) => p !== why && !p.startsWith(\"#\"));\n return { ...(text ? { text } : {}), ...(why ? { why: why.replace(/^[^:]+:\\s*/, \"\") } : {}) };\n}\n\n/** A rule file as a rule, read leniently (a hand edit still teaches it); null without words. Pure. */\nexport function parseRuleFile(id: string, markdown: string): CreativeRule | null {\n const { text, why } = bodyOf(markdown);\n if (!text) return null;\n const fm = Frontmatter.parse(frontmatterOf(markdown) ?? {});\n const check = fm.check ? defined<RuleCheck>(fm.check) : undefined;\n return {\n id,\n origin: \"learned\",\n strength: fm.strength,\n applies: fm.applies,\n scope: defined(fm.scope),\n ...(check && Object.keys(check).length > 0 ? { check } : {}),\n text,\n ...(why ? { why } : {}),\n source: defined(fm.source),\n status: fm.status,\n ...(fm.retiredBy ? { retiredBy: fm.retiredBy } : {}),\n };\n}\n\n/** Every rule file in the workspace, by its slug; none when there is no folder. */\nexport async function readLearnedRules(root: string): Promise<CreativeRule[]> {\n const dir = path.join(root, RULES_DIR);\n const files = (await readdir(dir).catch(() => [] as string[])).filter((f) => f.endsWith(\".md\")).sort();\n const rules = await Promise.all(\n files.map(async (file) =>\n parseRuleFile(file.replace(/\\.md$/, \"\"), await readFile(path.join(dir, file), \"utf8\").catch(() => \"\")),\n ),\n );\n return rules.filter((r): r is CreativeRule => r !== null);\n}\n\n/** A declared rule's id: its words decide it, so the same rule keeps it across readings. Pure. */\nconst declaredId = (text: string) => `brand-${createHash(\"sha256\").update(text.trim()).digest(\"hex\").slice(0, 8)}`;\n\n/**\n * A ban the rule's own words show as both right and wrong, no allowed phrase telling them apart:\n * \"'£640 a year, at 24p a unit', never '£640 a year'\" bans a bare figure, not the words, so code\n * cannot check it (live, Oct 2026: read as banning \"£640 a year\", which the right form says too).\n */\nfunction shownBothWays(text: string, phrase: string, allow: readonly string[] | undefined): boolean {\n const fold = (s: string) => s.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\").toLowerCase();\n const said = fold(text).split(fold(phrase)).length - 1;\n return said > 1 && !(allow ?? []).some((a) => fold(a).includes(fold(phrase)));\n}\n\n/** A bare word of one or two letters (\"IA\", \"DS\"): an acronym a brand bans reads as an ordinary word too. */\nconst BARE_SHORT_WORD = /^\\p{L}{1,2}$/u;\n\n/**\n * The rules the brand's documents state, as creative rules. Code holds only the words a brand bans,\n * never the ones it says to use: a brand document's \"must\" depends on the piece (prod, Oct 2026: its\n * taglines and CTAs fired on 28 of 66 approved ads), and the reviewers weigh those. Pure.\n */\nexport function declaredRules(rules: readonly BrandRule[]): CreativeRule[] {\n return rules.map(({ text, strength, applies, forbid, allow }) => {\n const checked = forbid?.filter((p) => !BARE_SHORT_WORD.test(p.trim()) && !shownBothWays(text, p, allow));\n const check = defined<RuleCheck>({ forbid: checked, ...(checked?.length ? { allow } : {}) });\n return {\n id: declaredId(text),\n origin: \"declared\",\n strength,\n applies,\n scope: {},\n ...(Object.keys(check).length > 0 ? { check } : {}),\n text,\n source: { kind: \"brand\" },\n status: \"active\",\n };\n });\n}\n"],"mappings":"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","names":["text","phrase","text","z","z","text","phrase","fold"]}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseRefExpr
|
|
3
|
+
} from "./chunk-QTLZXIF3.js";
|
|
4
|
+
import {
|
|
5
|
+
collectAssetRefLikes,
|
|
6
|
+
isPersistedAssetRef
|
|
7
|
+
} from "./chunk-2FSEESJU.js";
|
|
8
|
+
|
|
9
|
+
// src/commands/canvas/run-record.ts
|
|
10
|
+
import path from "path";
|
|
11
|
+
var MAX_RUN_NODES = 200;
|
|
12
|
+
var MAX_OUTPUTS_PER_NODE = 10;
|
|
13
|
+
var MAX_FINAL_OUTPUTS = 10;
|
|
14
|
+
var MAX_NODE_FACTS_CHARS = 4096;
|
|
15
|
+
var MAX_CREATIVE_SLUG_LENGTH = 100;
|
|
16
|
+
function creativeSlugFromCanvasPath(filePath) {
|
|
17
|
+
const normalized = filePath.split(path.sep).join("/");
|
|
18
|
+
const match = normalized.match(/(?:^|\/)src\/creatives\/([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\//);
|
|
19
|
+
const slug = match?.[1] ?? null;
|
|
20
|
+
return slug && slug.length <= MAX_CREATIVE_SLUG_LENGTH ? slug : null;
|
|
21
|
+
}
|
|
22
|
+
function finalOutputLabelsFromCanvas(parsed) {
|
|
23
|
+
const canvas = parsed;
|
|
24
|
+
const outputNodeId = canvas?.output?.node;
|
|
25
|
+
if (typeof outputNodeId !== "string" || !Array.isArray(canvas?.nodes)) return null;
|
|
26
|
+
const node = canvas.nodes.find((n) => n?.id === outputNodeId);
|
|
27
|
+
if (node?.type !== "collect") return null;
|
|
28
|
+
const explicit = node.params?.labels;
|
|
29
|
+
if (Array.isArray(explicit) && explicit.every((l) => typeof l === "string")) {
|
|
30
|
+
return { nodeId: outputNodeId, labels: explicit };
|
|
31
|
+
}
|
|
32
|
+
const images = node.inputs?.images;
|
|
33
|
+
if (!Array.isArray(images)) return null;
|
|
34
|
+
const labels = images.map((entry) => {
|
|
35
|
+
if (typeof entry !== "string") return void 0;
|
|
36
|
+
return parseRefExpr(entry)?.nodeId;
|
|
37
|
+
});
|
|
38
|
+
return { nodeId: outputNodeId, labels };
|
|
39
|
+
}
|
|
40
|
+
var OUTPUT_KINDS = /* @__PURE__ */ new Set(["image", "video", "audio", "json", "text", "font"]);
|
|
41
|
+
function toRecordOutput(slot, value, label) {
|
|
42
|
+
const refs = collectAssetRefLikes(value);
|
|
43
|
+
const ref = refs.length === 1 ? refs[0] : null;
|
|
44
|
+
if (!ref || !isPersistedAssetRef(ref)) return null;
|
|
45
|
+
const kind = typeof ref.kind === "string" && OUTPUT_KINDS.has(ref.kind) ? ref.kind : null;
|
|
46
|
+
if (!kind) return null;
|
|
47
|
+
return {
|
|
48
|
+
slot,
|
|
49
|
+
label,
|
|
50
|
+
kind,
|
|
51
|
+
sha256: ref.sha256,
|
|
52
|
+
url: ref.url,
|
|
53
|
+
mime: ref.mime,
|
|
54
|
+
width: typeof ref.width === "number" ? ref.width : void 0,
|
|
55
|
+
height: typeof ref.height === "number" ? ref.height : void 0,
|
|
56
|
+
durationMs: typeof ref.duration_ms === "number" ? ref.duration_ms : void 0
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function nodeOutputsToRecord(nodeOutputs, labels) {
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const [slot, value] of Object.entries(nodeOutputs)) {
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
value.forEach((item, i) => {
|
|
64
|
+
const rec = toRecordOutput(`${slot}#${i}`, item, labels?.[i]);
|
|
65
|
+
if (rec) out.push(rec);
|
|
66
|
+
});
|
|
67
|
+
} else {
|
|
68
|
+
const rec = toRecordOutput(slot, value);
|
|
69
|
+
if (rec) out.push(rec);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return out.slice(0, MAX_OUTPUTS_PER_NODE);
|
|
73
|
+
}
|
|
74
|
+
function finalOutputsToRecord(output, labels) {
|
|
75
|
+
if (Array.isArray(output)) {
|
|
76
|
+
return output.map((item, i) => toRecordOutput(`final#${i}`, item, labels?.[i])).filter((rec2) => rec2 !== null).slice(0, MAX_FINAL_OUTPUTS);
|
|
77
|
+
}
|
|
78
|
+
const rec = toRecordOutput("final", output);
|
|
79
|
+
return rec ? [rec] : [];
|
|
80
|
+
}
|
|
81
|
+
function finalFiles(output, labels) {
|
|
82
|
+
const items = Array.isArray(output) ? output : [output];
|
|
83
|
+
const files = {};
|
|
84
|
+
items.forEach((item, i) => {
|
|
85
|
+
const ref = collectAssetRefLikes(item)[0];
|
|
86
|
+
if (ref && typeof ref.path === "string") files[labels?.[i] ?? `final#${i}`] = ref.path;
|
|
87
|
+
});
|
|
88
|
+
return files;
|
|
89
|
+
}
|
|
90
|
+
function withFacts(nodeOutputs) {
|
|
91
|
+
const facts = nodeOutputs.facts;
|
|
92
|
+
if (facts === void 0 || facts === null) return {};
|
|
93
|
+
const json = JSON.stringify(facts);
|
|
94
|
+
return json.length <= MAX_NODE_FACTS_CHARS ? { facts: json } : {};
|
|
95
|
+
}
|
|
96
|
+
function buildRunRecord(result, meta, plan, finalLabels) {
|
|
97
|
+
const nodes = result.node_runs.slice(0, MAX_RUN_NODES).map((run) => {
|
|
98
|
+
const planned = plan?.get(run.node_id);
|
|
99
|
+
return {
|
|
100
|
+
nodeId: run.node_id,
|
|
101
|
+
nodeType: run.node_type,
|
|
102
|
+
cached: run.cached,
|
|
103
|
+
credits: run.credits,
|
|
104
|
+
durationMs: run.duration_ms,
|
|
105
|
+
outputs: nodeOutputsToRecord(
|
|
106
|
+
result.outputs_by_node[run.node_id] ?? {},
|
|
107
|
+
run.node_id === finalLabels?.nodeId ? finalLabels.labels : void 0
|
|
108
|
+
),
|
|
109
|
+
deps: planned?.deps,
|
|
110
|
+
status: plan ? "completed" : void 0,
|
|
111
|
+
paramsPreview: planned?.paramsPreview,
|
|
112
|
+
...planned?.role !== void 0 ? { role: planned.role } : {},
|
|
113
|
+
...withFacts(result.outputs_by_node[run.node_id] ?? {})
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
const finalOutputs = finalOutputsToRecord(result.output, finalLabels?.labels);
|
|
117
|
+
return {
|
|
118
|
+
runId: result.run_id,
|
|
119
|
+
...meta,
|
|
120
|
+
status: "completed",
|
|
121
|
+
stats: {
|
|
122
|
+
totalNodes: result.stats.total_nodes,
|
|
123
|
+
cachedNodes: result.stats.cached_nodes,
|
|
124
|
+
totalCredits: result.stats.total_credits,
|
|
125
|
+
durationMs: result.stats.duration_ms
|
|
126
|
+
},
|
|
127
|
+
nodes,
|
|
128
|
+
finalOutputs: finalOutputs.length > 0 ? finalOutputs : void 0,
|
|
129
|
+
// Sent whenever the review RAN, empty list included. Sending it only when there
|
|
130
|
+
// were findings makes a clean render and an unreviewed one look identical in the
|
|
131
|
+
// record — which is the exact ambiguity this field was added to remove: proving a
|
|
132
|
+
// review had happened once meant re-running a cached canvas and reading raw JSON.
|
|
133
|
+
// Only the fields the backend keeps: a static review's typed fields (`kind`) stay in the CLI.
|
|
134
|
+
...meta.review ? { review: meta.review.slice(0, 40).map(({ severity, what, scene }) => ({ severity, what, ...scene ? { scene } : {} })) } : {}
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function buildInitialRunRecord(runId, meta) {
|
|
138
|
+
return {
|
|
139
|
+
runId,
|
|
140
|
+
...meta,
|
|
141
|
+
status: "running",
|
|
142
|
+
stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },
|
|
143
|
+
nodes: []
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function buildFailedRunRecord(runId, errorMessage, meta) {
|
|
147
|
+
return {
|
|
148
|
+
runId,
|
|
149
|
+
...meta,
|
|
150
|
+
status: "failed",
|
|
151
|
+
errorMessage: errorMessage.slice(0, 2e3),
|
|
152
|
+
stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },
|
|
153
|
+
nodes: []
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export {
|
|
158
|
+
creativeSlugFromCanvasPath,
|
|
159
|
+
finalOutputLabelsFromCanvas,
|
|
160
|
+
nodeOutputsToRecord,
|
|
161
|
+
finalFiles,
|
|
162
|
+
withFacts,
|
|
163
|
+
buildRunRecord,
|
|
164
|
+
buildInitialRunRecord,
|
|
165
|
+
buildFailedRunRecord
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=chunk-U63S2JWI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/canvas/run-record.ts"],"sourcesContent":["import path from \"node:path\";\nimport type { CanvasRunVerdict } from \"@baker/api\";\nimport type { NodeRunRecord, RunResult } from \"../../engine/engine/executor.ts\";\nimport { parseRefExpr } from \"../../engine/schema/canvas.ts\";\nimport { collectAssetRefLikes, isPersistedAssetRef } from \"../../engine/storage/remote-cache-store.ts\";\n\n// Mirrors of the backend intake caps (canvas/runRecords.ts) so an in-bounds\n// payload is sent even for pathological runs; the server re-caps defensively.\nconst MAX_RUN_NODES = 200;\nconst MAX_OUTPUTS_PER_NODE = 10;\nconst MAX_FINAL_OUTPUTS = 10;\n/** The longest `facts` JSON a node record carries (the backend's cap); a longer one is dropped, never cut. */\nconst MAX_NODE_FACTS_CHARS = 4096;\n\nexport type RunRecordOutput = {\n slot: string;\n /** Variant identity from the collect terminal (branch/scene name) — slot stays the stable key. */\n label?: string;\n kind: \"image\" | \"video\" | \"audio\" | \"json\" | \"text\" | \"font\";\n sha256: string;\n url: string;\n mime: string;\n width?: number;\n height?: number;\n durationMs?: number;\n};\n\n/** Labels for a collect-terminated canvas: the collector's node id + one label per collected image. */\nexport type FinalOutputLabels = { nodeId: string; labels: (string | undefined)[] };\n\nexport type RunNodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\";\n\nexport type RunRecordNode = {\n nodeId: string;\n nodeType: string;\n cached: boolean;\n credits: number;\n durationMs: number;\n outputs: RunRecordOutput[];\n /** Upstream node ids ($ref edges) — lets the dashboard render the workflow graph. */\n deps?: string[];\n status?: RunNodeStatus;\n /** Compact params excerpt (prompt text preferred) for graph-node legibility. */\n paramsPreview?: string;\n /** Why this node failed — the real upstream status/provider — set only on `status: \"failed\"`. */\n error?: RunNodeError;\n /** The node's job, from its `tags.role` (e.g. `static_variants`), so readers never parse node ids. */\n role?: string;\n /** What the node did, as small JSON (its `facts` output: a size's crop, words move, steps). */\n facts?: string;\n};\n\n/** Display-ready per-node failure detail. Mirrors the engine's `NodeFailureDetail`. */\nexport type RunNodeError = {\n message: string;\n code?: string;\n provider?: string;\n retryable?: boolean;\n};\n\n/** Run attribution stamped on every record post (progress, terminal, initial). */\nexport type RunRecordMeta = {\n creativeSlug?: string;\n canvasPath?: string;\n canvasSha?: string;\n /** Content sha of the rendered source (canvas.json + prompt.json) — powers the dashboard staleness signal. */\n sourceSha?: string;\n chatId?: string;\n /** R2 manifest of the executed canvas + its local file refs — first-write-wins server-side. */\n canvasSnapshotUrl?: string;\n /** R2 copy of the graph this run executes (every node's declaration): what a correction elsewhere grows on. */\n graphUrl?: string;\n /** What the render review found, so it outlives the terminal it was printed to. */\n review?: { severity: \"blocking\" | \"warning\"; what: string; scene?: string }[];\n /**\n * What the review's own model calls cost, as the gateway reported them.\n *\n * The review calls OpenRouter from the Runtime — that is where the finished video is,\n * and shipping 60MB through Convex to reach the same gateway would buy nothing — so\n * this record is what carries the spend back to where it is billed. `costUsd` is\n * OpenRouter's own `usage.cost`, relayed rather than computed: the sandbox never\n * prices anything, which is what makes it safe for the model id to float.\n */\n reviewUsage?: { model: string; inputTokens: number; outputTokens: number; costUsd: number }[];\n /** What the render review said (`@baker/api` CANVAS_RUN_VERDICTS), and whether the run may be shown as a version. */\n verdict?: CanvasRunVerdict;\n presentable?: boolean;\n /** An ad of a series made again from a new version of its lead: a new version of the ad, not a retry. */\n newAsk?: boolean;\n /** The company's creative rules this run was made and checked against (`rulesDigest`, and their ids). */\n rules?: { digest: string; ids: string[] };\n};\n\nexport type RunRecordPayload = {\n runId: string;\n /** `awaiting_approval`: stopped on purpose at a `--until` checkpoint, resumable with the same run id. */\n status: \"running\" | \"completed\" | \"failed\" | \"awaiting_approval\";\n errorMessage?: string;\n stats: { totalNodes: number; cachedNodes: number; totalCredits: number; durationMs: number };\n nodes: RunRecordNode[];\n finalOutputs?: RunRecordOutput[];\n /**\n * What the render review found, sent with the run that produced it.\n *\n * Without this the findings existed only in the CLI's stdout — visible to the agent\n * for one turn and to nobody afterwards. A check whose result leaves no trace cannot\n * be read back, compared between runs, or shown to the person the ad is for, and is\n * indistinguishable from a check that never ran.\n */\n review?: { severity: \"blocking\" | \"warning\"; what: string; scene?: string }[];\n /** Graceful-abort flush (SIGINT/SIGTERM): terminal but resumable — the backend keeps the row adoptable. */\n interrupted?: boolean;\n} & RunRecordMeta;\n\n/** Per-node plan facts (edges + params preview) captured from the engine's plan event. */\nexport type RunPlanInfo = Map<string, { deps: string[]; paramsPreview?: string; role?: string }>;\n\n// Mirrors the backend's CREATIVE_SLUG_MAX_LENGTH — an over-long slug would\n// 400 the whole run record, so attribution is dropped instead.\nconst MAX_CREATIVE_SLUG_LENGTH = 100;\n\n/**\n * A canvas under the repo convention `src/creatives/{slug}/` belongs to that\n * creative; its runs become the creative's generation history. Returns null\n * for canvases anywhere else (and for slugs the backend would reject).\n */\nexport function creativeSlugFromCanvasPath(filePath: string): string | null {\n const normalized = filePath.split(path.sep).join(\"/\");\n const match = normalized.match(/(?:^|\\/)src\\/creatives\\/([a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\\//);\n const slug = match?.[1] ?? null;\n return slug && slug.length <= MAX_CREATIVE_SLUG_LENGTH ? slug : null;\n}\n\n/**\n * Best-effort variant labels from a not-yet-validated canvas: when the declared\n * output is a `collect` node, each final inherits the node's explicit\n * `params.labels[i]`, else the producer node id parsed from the raw `$ref` it\n * collects (`$ref:gen_billboard_03.images#0` → `gen_billboard_03`). Null for\n * every other canvas shape — single-output runs stay unlabeled.\n */\nexport function finalOutputLabelsFromCanvas(parsed: unknown): FinalOutputLabels | null {\n const canvas = parsed as { nodes?: unknown; output?: { node?: unknown } } | null;\n const outputNodeId = canvas?.output?.node;\n if (typeof outputNodeId !== \"string\" || !Array.isArray(canvas?.nodes)) return null;\n const node = canvas.nodes.find((n) => (n as { id?: unknown })?.id === outputNodeId) as\n | { type?: unknown; inputs?: { images?: unknown }; params?: { labels?: unknown } }\n | undefined;\n if (node?.type !== \"collect\") return null;\n const explicit = node.params?.labels;\n if (Array.isArray(explicit) && explicit.every((l) => typeof l === \"string\")) {\n return { nodeId: outputNodeId, labels: explicit };\n }\n const images = node.inputs?.images;\n if (!Array.isArray(images)) return null;\n const labels = images.map((entry) => {\n if (typeof entry !== \"string\") return undefined;\n return parseRefExpr(entry)?.nodeId;\n });\n return { nodeId: outputNodeId, labels };\n}\n\nconst OUTPUT_KINDS = new Set([\"image\", \"video\", \"audio\", \"json\", \"text\", \"font\"]);\n\nfunction toRecordOutput(slot: string, value: unknown, label?: string): RunRecordOutput | null {\n const refs = collectAssetRefLikes(value);\n const ref = refs.length === 1 ? refs[0] : null;\n if (!ref || !isPersistedAssetRef(ref)) return null;\n const kind = typeof ref.kind === \"string\" && OUTPUT_KINDS.has(ref.kind) ? ref.kind : null;\n if (!kind) return null;\n return {\n slot,\n label,\n kind: kind as RunRecordOutput[\"kind\"],\n sha256: ref.sha256,\n url: ref.url,\n mime: ref.mime,\n width: typeof ref.width === \"number\" ? ref.width : undefined,\n height: typeof ref.height === \"number\" ? ref.height : undefined,\n durationMs: typeof ref.duration_ms === \"number\" ? ref.duration_ms : undefined,\n };\n}\n\n/**\n * Flatten one node's outputs into record entries. Single refs keep their slot\n * name; arrays become `slot#i`. Values without a persisted ref (plain JSON\n * manifests, refs whose upload failed) are dropped — every stored output must\n * be renderable from R2.\n */\nexport function nodeOutputsToRecord(\n nodeOutputs: Record<string, unknown>,\n labels?: (string | undefined)[],\n): RunRecordOutput[] {\n const out: RunRecordOutput[] = [];\n for (const [slot, value] of Object.entries(nodeOutputs)) {\n if (Array.isArray(value)) {\n value.forEach((item, i) => {\n const rec = toRecordOutput(`${slot}#${i}`, item, labels?.[i]);\n if (rec) out.push(rec);\n });\n } else {\n const rec = toRecordOutput(slot, value);\n if (rec) out.push(rec);\n }\n }\n return out.slice(0, MAX_OUTPUTS_PER_NODE);\n}\n\nfunction finalOutputsToRecord(output: unknown, labels?: (string | undefined)[]): RunRecordOutput[] {\n if (Array.isArray(output)) {\n return output\n .map((item, i) => toRecordOutput(`final#${i}`, item, labels?.[i]))\n .filter((rec): rec is RunRecordOutput => rec !== null)\n .slice(0, MAX_FINAL_OUTPUTS);\n }\n const rec = toRecordOutput(\"final\", output);\n return rec ? [rec] : [];\n}\n\n/** Each delivered size's local file, keyed by its label (or `final#i`), so the agent opens it with Read. */\nexport function finalFiles(output: unknown, labels?: (string | undefined)[]): Record<string, string> {\n const items = Array.isArray(output) ? output : [output];\n const files: Record<string, string> = {};\n items.forEach((item, i) => {\n const ref = collectAssetRefLikes(item)[0];\n if (ref && typeof ref.path === \"string\") files[labels?.[i] ?? `final#${i}`] = ref.path;\n });\n return files;\n}\n\n/**\n * `{ facts }`: a node's `facts` output as the JSON its record carries; nothing when it has none or\n * its JSON is longer than `MAX_NODE_FACTS_CHARS` (dropped whole: a cut JSON parses as nothing).\n */\nexport function withFacts(nodeOutputs: Record<string, unknown>): { facts?: string } {\n const facts = nodeOutputs.facts;\n if (facts === undefined || facts === null) return {};\n const json = JSON.stringify(facts);\n return json.length <= MAX_NODE_FACTS_CHARS ? { facts: json } : {};\n}\n\nexport function buildRunRecord(\n result: Pick<RunResult, \"run_id\" | \"output\" | \"outputs_by_node\" | \"stats\"> & { node_runs: NodeRunRecord[] },\n meta: RunRecordMeta,\n plan?: RunPlanInfo,\n finalLabels?: FinalOutputLabels,\n): RunRecordPayload {\n const nodes = result.node_runs.slice(0, MAX_RUN_NODES).map((run): RunRecordNode => {\n const planned = plan?.get(run.node_id);\n return {\n nodeId: run.node_id,\n nodeType: run.node_type,\n cached: run.cached,\n credits: run.credits,\n durationMs: run.duration_ms,\n outputs: nodeOutputsToRecord(\n result.outputs_by_node[run.node_id] ?? {},\n run.node_id === finalLabels?.nodeId ? finalLabels.labels : undefined,\n ),\n deps: planned?.deps,\n status: plan ? \"completed\" : undefined,\n paramsPreview: planned?.paramsPreview,\n ...(planned?.role !== undefined ? { role: planned.role } : {}),\n ...withFacts(result.outputs_by_node[run.node_id] ?? {}),\n };\n });\n const finalOutputs = finalOutputsToRecord(result.output, finalLabels?.labels);\n return {\n runId: result.run_id,\n ...meta,\n status: \"completed\",\n stats: {\n totalNodes: result.stats.total_nodes,\n cachedNodes: result.stats.cached_nodes,\n totalCredits: result.stats.total_credits,\n durationMs: result.stats.duration_ms,\n },\n nodes,\n finalOutputs: finalOutputs.length > 0 ? finalOutputs : undefined,\n // Sent whenever the review RAN, empty list included. Sending it only when there\n // were findings makes a clean render and an unreviewed one look identical in the\n // record — which is the exact ambiguity this field was added to remove: proving a\n // review had happened once meant re-running a cached canvas and reading raw JSON.\n // Only the fields the backend keeps: a static review's typed fields (`kind`) stay in the CLI.\n ...(meta.review\n ? { review: meta.review.slice(0, 40).map(({ severity, what, scene }) => ({ severity, what, ...(scene ? { scene } : {}) })) }\n : {}),\n };\n}\n\n/**\n * The empty `running` record posted BEFORE layer 1 executes. This row is the\n * Convex-side in-flight marker: the reconciliation sweep and cross-sandbox\n * resume both key off it, so unlike the fire-and-forget progress stream it is\n * posted synchronously (with retries) at run start.\n */\nexport function buildInitialRunRecord(runId: string, meta: RunRecordMeta): RunRecordPayload {\n return {\n runId,\n ...meta,\n status: \"running\",\n stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },\n nodes: [],\n };\n}\n\nexport function buildFailedRunRecord(runId: string, errorMessage: string, meta: RunRecordMeta): RunRecordPayload {\n return {\n runId,\n ...meta,\n status: \"failed\",\n errorMessage: errorMessage.slice(0, 2000),\n stats: { totalNodes: 0, cachedNodes: 0, totalCredits: 0, durationMs: 0 },\n nodes: [],\n };\n}\n"],"mappings":"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","names":["rec"]}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ApiError
|
|
3
|
+
} from "./chunk-XDZVBX6L.js";
|
|
4
|
+
import {
|
|
5
|
+
optionalChatId
|
|
6
|
+
} from "./chunk-EE72SSB2.js";
|
|
7
|
+
import {
|
|
8
|
+
writeJson
|
|
9
|
+
} from "./chunk-WNSE7N75.js";
|
|
10
|
+
|
|
11
|
+
// src/commands/avatars/casting.ts
|
|
12
|
+
var CAST_FLAG_RULE = "Cast with `--avatar <handle>` on `baker studio generate`, `baker studio animate`, `baker canvas scaffold-ad`, `baker canvas scaffold-static-ad` and `baker canvas scaffold-video`. Don't hand-roll it by pasting `subjectDescription` into the prompt or by passing the sheet through `--reference` \u2014 both render something that merely resembles them. `--avatar` is also the only thing that carries their accent and delivery into a clip. An avatar has no pinned voice by design (ADR 0005): the video model renders the voice, and the region on their profile is the only thing steering it \u2014 without the flag the clip is performed flat, in whatever accent the model picks on its own. `baker canvas scaffold-video` casts only their face: a reproduced video keeps the source ad's accent direction, so never tell the user it speaks in theirs.";
|
|
13
|
+
var VERBATIM_RULE = "When you do write the description yourself \u2014 a hand-built canvas node, a landing image, anywhere `--avatar` does not exist \u2014 copy `subjectDescription` verbatim, word for word. Re-phrasing it per generation is the other reason a face drifts across a set.";
|
|
14
|
+
var VIDEO_ROUTING = "In video, a photoreal presenter renders on `google/veo-3.1` (or `google/veo-3.1-fast`), never `bytedance/seedance-2.0` \u2014 it refuses photoreal human faces, AI-generated ones included. Reproducing a video the user gave you: `baker canvas scaffold-video \u2026 --avatar <handle> --real-face`.";
|
|
15
|
+
function castingHints(avatar) {
|
|
16
|
+
if (avatar.status === "generating" && avatar.needsFace) {
|
|
17
|
+
return [
|
|
18
|
+
`The user is picking @${avatar.handle}'s face right now \u2014 portraits are on their screen and nothing renders until they answer. There is NOTHING to wait for and nothing to check: do not poll, do not block on it, do not ask about the face in a question of your own, and do not delete or recreate this avatar. Whatever you do next simply runs after they have chosen.`
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
if (avatar.status === "generating") {
|
|
22
|
+
return [
|
|
23
|
+
`Still building \u2014 a ~30s render that settles on its own, and this avatar is castable only once it reads \`ready\`. If the next thing you do needs it (a clip, a still, anything with --avatar), block on it: \`baker avatars get ${avatar.handle} --wait\` returns the moment it is ready. Otherwise do other work first and read it back with \`baker avatars get ${avatar.handle}\`. Never write your own sleep or poll loop, and never end the turn waiting \u2014 the user would have to come back and tell you it is ready.`
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
if (avatar.status === "error") {
|
|
27
|
+
return [
|
|
28
|
+
`The identity sheet could not be built${avatar.errorMessage ? `: ${avatar.errorMessage}` : ""}. This avatar cannot be cast. Sharpen the subject description (one person, plain description, no scene) and rebuild: \`baker avatars update ${avatar.handle} --subject "\u2026" --regenerate-sheet\`.`
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
if (avatar.status === "archived") {
|
|
32
|
+
return [
|
|
33
|
+
`Retired. Work that already used it still resolves, but do not cast it into anything new \u2014 \`baker avatars list\` shows the roster you can cast from.`
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
if (!avatar.sheetUrl) {
|
|
37
|
+
return [
|
|
38
|
+
`No identity sheet on this avatar yet, so there is nothing to ground a render on. Re-read it with \`baker avatars get ${avatar.handle}\`; if it stays this way, rebuild the sheet with \`baker avatars update ${avatar.handle} --regenerate-sheet\`.`
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
return [
|
|
42
|
+
`Ready to cast: \`baker studio generate "<your scene>" --avatar ${avatar.handle}\` for a still, \`baker studio animate "<the motion, and the line they say>" --avatar ${avatar.handle}\` for a clip.`,
|
|
43
|
+
CAST_FLAG_RULE,
|
|
44
|
+
VERBATIM_RULE,
|
|
45
|
+
VIDEO_ROUTING
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
function rosterRow(avatar) {
|
|
49
|
+
return {
|
|
50
|
+
handle: avatar.handle,
|
|
51
|
+
name: avatar.name,
|
|
52
|
+
status: avatar.status,
|
|
53
|
+
likeness: avatar.likeness,
|
|
54
|
+
sheetUrl: avatar.sheetUrl ?? null,
|
|
55
|
+
avatarId: avatar.avatarId,
|
|
56
|
+
...avatar.errorMessage ? { errorMessage: avatar.errorMessage } : {}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function chatIdFromEnv() {
|
|
60
|
+
return optionalChatId();
|
|
61
|
+
}
|
|
62
|
+
function rosterHints(roster, statusFilter) {
|
|
63
|
+
if (roster.length === 0) {
|
|
64
|
+
return [
|
|
65
|
+
statusFilter ? `No avatars with status "${statusFilter}". Drop \`--status\` to see the whole roster.` : `No avatars yet \u2014 and retired ones are hidden unless you pass \`--status archived\`. Cast a new presenter with \`baker avatars create --name "\u2026" --subject "\u2026"\`.`
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
const mine = roster.filter((avatar) => avatar.fromThisChat).map((avatar) => avatar.handle);
|
|
69
|
+
const hints = mine.length ? [
|
|
70
|
+
`@${mine[0]} was made in this conversation${mine.length > 1 ? ` (with ${mine.slice(1).map((h) => `@${h}`).join(", ")})` : ""} \u2014 that is the avatar this chat is about, and the user chose its face. Use it. The others belong to earlier conversations: only reach for one if the user names it, and never ask which to use when the answer is the one you just cast.`
|
|
71
|
+
] : [];
|
|
72
|
+
hints.push(
|
|
73
|
+
"Casting one of these? Cast them with `--avatar <handle>` on `baker studio generate` / `baker studio animate` \u2014 that flag carries their face AND their accent. `baker avatars get <handle>` returns the written profile behind it; the roster leaves the description out on purpose, because it must never be read half-way."
|
|
74
|
+
);
|
|
75
|
+
const building = roster.filter((avatar) => avatar.status === "generating").map((avatar) => avatar.handle);
|
|
76
|
+
if (building.length > 0) {
|
|
77
|
+
hints.push(
|
|
78
|
+
`Still building, not castable yet: ${building.join(", ")}. Check with \`baker avatars get ${building[0]}\` after your next piece of work.`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const failed = roster.filter((avatar) => avatar.status === "error").map((avatar) => avatar.handle);
|
|
82
|
+
if (failed.length > 0) {
|
|
83
|
+
hints.push(
|
|
84
|
+
`Could not be built: ${failed.join(", ")}. Read why with \`baker avatars get ${failed[0]}\`, then rebuild with \`baker avatars update ${failed[0]} --subject "\u2026" --regenerate-sheet\`.`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
return hints;
|
|
88
|
+
}
|
|
89
|
+
function thinProfileHint(profile, handle) {
|
|
90
|
+
const missing = ["motion", "persona", "speech", "accent", "wardrobe", "setting"].filter(
|
|
91
|
+
(field) => !profile?.[field]?.trim()
|
|
92
|
+
);
|
|
93
|
+
if (missing.length === 0) return null;
|
|
94
|
+
return `MISSING ${missing.map((field) => `--${field}`).join(" ")}. A bare subject description holds the face still and nothing else, so clips of @${handle} come out stiff and generic \u2014 measured, filling these in nearly doubled the movement in the same brief. --accent is the one nobody guesses and the only one that fails silently: it decides the LANGUAGE and accent the avatar speaks in, in every clip. Name the region whose language the USER is writing to you in ("Spanish from Spain, Madrid accent") \u2014 "Spanish" on its own renders as no accent at all, and a region taken from how the person LOOKS ("European", "Nordic") renders as that region's language: an ad for a Spanish client shipped with --accent "German" and came back spoken in German. The user almost certainly told you how this person talks and carries themselves; put it in: \`baker avatars update ${handle} ${missing.map((field) => `--${field} "\u2026"`).join(" ")}\`.`;
|
|
95
|
+
}
|
|
96
|
+
function parseFaceChoice(raw) {
|
|
97
|
+
if (raw === void 0) return "ask";
|
|
98
|
+
const value = raw.trim().toLowerCase();
|
|
99
|
+
if (value === "ask" || value === "auto") return value;
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
function creationHints(created, profile) {
|
|
103
|
+
const thin = thinProfileHint(profile, created.handle);
|
|
104
|
+
const casting = created.likeness === "synthetic" && created.faceChoice === "auto" ? [
|
|
105
|
+
`No one was asked about this face \u2014 \`--face auto\` cast it and it is kept. Do not tell the user they chose it, and do not offer them a pick you are not going to run. If this should have been theirs, say so and create it again with \`--face ask\`.`
|
|
106
|
+
] : created.likeness === "synthetic" ? [
|
|
107
|
+
`The user is being shown real portraits of @${created.handle} right now, and the turn waits for them to pick \u2014 this happens on its own, triggered by the command you just ran. The picker is already showing, so don't call request_avatar_casting, don't ask about the face in a question of your own, and don't wait or poll: whatever you do next simply runs after they have chosen \u2014 or, if they have not picked within 30 seconds of the faces appearing, after the first face is kept for them (then never say they chose it). Say what you created, then carry on with what the user asked for: when that was only the avatar, or they said to stop after it, stop there and render nothing.`
|
|
108
|
+
] : [];
|
|
109
|
+
const hints = [
|
|
110
|
+
...casting,
|
|
111
|
+
...thin ? [thin] : [],
|
|
112
|
+
...castingHints({ handle: created.handle, status: created.status }),
|
|
113
|
+
`Once it is ready, cast it with \`--avatar ${created.handle}\` on \`baker studio generate\` / \`baker studio animate\` \u2014 that flag is what grounds the render on its identity sheet and, for a clip, what carries their accent and delivery into the read.`
|
|
114
|
+
];
|
|
115
|
+
if (created.likeness === "licensed") {
|
|
116
|
+
hints.push(
|
|
117
|
+
"This avatar carries a real person's likeness, used on the company's confirmation that it may appear in their advertising. Keep it out of any creative that would misrepresent them, and out of claims they did not make."
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return hints;
|
|
121
|
+
}
|
|
122
|
+
function updateHints(update) {
|
|
123
|
+
const hints = [];
|
|
124
|
+
if (update.previousHandle !== update.avatar.handle) {
|
|
125
|
+
hints.push(
|
|
126
|
+
`Renamed to @${update.avatar.handle}. @${update.previousHandle} no longer resolves \u2014 update anything that mentioned it.`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
if (update.regeneratedSheet) {
|
|
130
|
+
hints.push(
|
|
131
|
+
`Rebuilding the identity sheet (~30s). The avatar is back to building and cannot be cast until \`baker avatars get ${update.avatar.handle}\` shows \`ready\` \u2014 and the sheet URL changes, so drop any \`--reference\` you were reusing and read the new one.`
|
|
132
|
+
);
|
|
133
|
+
return hints;
|
|
134
|
+
}
|
|
135
|
+
if (update.subjectChanged) {
|
|
136
|
+
hints.push(
|
|
137
|
+
`MISSING --regenerate-sheet. You changed the subject description but the identity sheet still shows the person you described before, so the words and the face no longer match and every new render will drift. Re-run: \`baker avatars update ${update.avatar.handle} --regenerate-sheet\` (a ~30s rebuild, billed).`
|
|
138
|
+
);
|
|
139
|
+
return hints;
|
|
140
|
+
}
|
|
141
|
+
hints.push(...castingHints(update.avatar));
|
|
142
|
+
return hints;
|
|
143
|
+
}
|
|
144
|
+
function removalHints(removal) {
|
|
145
|
+
if (removal.archived) {
|
|
146
|
+
return [
|
|
147
|
+
`Retired @${removal.handle}. Work that already used it still resolves and its images stay as they are; it no longer shows in \`baker avatars list\` and must not be cast into anything new.`
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
return [
|
|
151
|
+
`Deleted @${removal.handle} for good. The mention no longer resolves anywhere \u2014 creatives that already rendered keep their images, but nothing new can be grounded on this identity. \`--archive\` is the reversible option next time.`
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
function avatarRowNormalizer(record) {
|
|
155
|
+
const flat = {};
|
|
156
|
+
for (const [key, value] of Object.entries(record)) {
|
|
157
|
+
if (Array.isArray(value)) {
|
|
158
|
+
flat[key] = value.join("; ");
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (value !== null && typeof value === "object") {
|
|
162
|
+
for (const [nested, nestedValue] of Object.entries(value)) {
|
|
163
|
+
flat[nested] = Array.isArray(nestedValue) ? nestedValue.join("; ") : nestedValue;
|
|
164
|
+
}
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
flat[key] = value;
|
|
168
|
+
}
|
|
169
|
+
return flat;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/commands/avatars/failures.ts
|
|
173
|
+
function failValidation(message, fix) {
|
|
174
|
+
writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message, ...fix ? { fix } : {} } });
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
function avatarFailureFix(err, handle, context = {}) {
|
|
178
|
+
if (err.code === "NOT_FOUND") {
|
|
179
|
+
return {
|
|
180
|
+
action: "list_avatars",
|
|
181
|
+
explanation: `Run \`baker avatars list\` to see which avatars this company has${handle ? ` \u2014 "${handle}" is not one of them` : ""}. Handles are lowercase letters, numbers and dashes ("maria-founder", not "Maria Founder"). If the roster is empty, create the avatar first with \`baker avatars create\`. Do not abandon the wider job over this \u2014 carry on without the avatar and say so.`
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (err.code === "CONFLICT" && context.operation === "remove") {
|
|
185
|
+
return {
|
|
186
|
+
action: "wait_for_the_user",
|
|
187
|
+
explanation: `Do not remove or recreate${handle ? ` @${handle}` : " this avatar"} \u2014 wait. The portraits are on the user's screen and the turn continues once they answer. If you think the faces are wrong, say so in your reply and let them turn all four down; that recasts the same avatar from what they tell you was missing, and keeps everything already pointing at it.`
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
if (err.code === "CONFLICT" && handle) {
|
|
191
|
+
return {
|
|
192
|
+
action: "use_the_existing_avatar",
|
|
193
|
+
explanation: `@${handle} already exists in this company \u2014 avatars belong to the company, not to a chat, so one made in an earlier conversation is still here and still castable. If it is the person you want, use it as it is: \`--avatar ${handle}\`. Read it first with \`baker avatars get ${handle} --full\` and say who they already are. Do not create the same person under a second name: the user would be told about one avatar and handed another, and the company ends up with duplicates nobody chose a face for. If you genuinely need a different person, ask the user what to call them.`
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
return void 0;
|
|
197
|
+
}
|
|
198
|
+
function failAvatarApi(err, handle, context = {}) {
|
|
199
|
+
if (err instanceof ApiError) {
|
|
200
|
+
const fix = avatarFailureFix(err, handle, context);
|
|
201
|
+
writeJson({ ok: false, error: { code: err.code, message: err.message, ...fix ? { fix } : {} } });
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
if (err instanceof Error) {
|
|
205
|
+
writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: err.message } });
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export {
|
|
213
|
+
castingHints,
|
|
214
|
+
rosterRow,
|
|
215
|
+
chatIdFromEnv,
|
|
216
|
+
rosterHints,
|
|
217
|
+
parseFaceChoice,
|
|
218
|
+
creationHints,
|
|
219
|
+
updateHints,
|
|
220
|
+
removalHints,
|
|
221
|
+
avatarRowNormalizer,
|
|
222
|
+
failValidation,
|
|
223
|
+
failAvatarApi
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=chunk-ULPO72IQ.js.map
|