@koda-sl/baker-cli 0.545.0 → 0.546.0-dev.e8b0ca6de
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 +18 -3
- package/dist/account-2WTVU5VH.js +82 -0
- package/dist/account-IG3U6UXZ.js +82 -0
- package/dist/account-reads-L2GYNCD3.js +219 -0
- package/dist/account-users-CK7D4AAI.js +64 -0
- package/dist/account-writes-BSSKSTZ2.js +68 -0
- package/dist/accounts-3EERX6MO.js +701 -0
- package/dist/accounts-JWYTBGDR.js +80 -0
- package/dist/actions-UUNK3DO4.js +55 -0
- package/dist/activecampaign-URFTGK6R.js +938 -0
- package/dist/ad-group-writes-KMB3OMJG.js +172 -0
- package/dist/ad-groups-E67CNQS4.js +70 -0
- package/dist/ad-writes-FNMKNFUN.js +176 -0
- package/dist/add-2JN54LSO.js +107 -0
- package/dist/add-4PYISQPU.js +305 -0
- package/dist/ads-4LASBP4G.js +79 -0
- package/dist/ads-6KIDAXHQ.js +48 -0
- package/dist/advertisers-K4ZLOZQ2.js +123 -0
- package/dist/analytics-36JY2LHD.js +2437 -0
- package/dist/analytics-NXXDWJU2.js +447 -0
- package/dist/animate-OWXAT2RK.js +480 -0
- package/dist/assign-SG5JXTMD.js +80 -0
- package/dist/audience-size-HOLSWGNO.js +76 -0
- package/dist/audiences-3R574STZ.js +280 -0
- package/dist/audit-YWT6CEY2.js +154 -0
- package/dist/autocomplete-KMYCOXHU.js +114 -0
- package/dist/avatars-ZGJ6RGNQ.js +38 -0
- package/dist/bid-pricing-C2UQJWYK.js +103 -0
- package/dist/brand-3653YYQF.js +22 -0
- package/dist/brief-I537G3PB.js +543 -0
- package/dist/campaign-groups-A7BT67RF.js +99 -0
- package/dist/campaign-writes-HASDYGTI.js +168 -0
- package/dist/campaign-writes-Z2J24SUZ.js +176 -0
- package/dist/campaigns-43OS6EUG.js +78 -0
- package/dist/campaigns-5DOTTJ47.js +113 -0
- package/dist/campaigns-FHP74WGY.js +111 -0
- package/dist/canvas-AW235KQX.js +46 -0
- package/dist/capabilities-6P674LBM.js +147 -0
- package/dist/catalog-7LINLVVY.js +66 -0
- package/dist/catalogs-IR22RGZD.js +130 -0
- package/dist/changes-RSEGYV45.js +143 -0
- package/dist/chatgpt-PDFFKPY2.js +47 -0
- package/dist/chats-KU6JI7DK.js +449 -0
- package/dist/check-W27MKVN7.js +107 -0
- package/dist/chunk-3EUITH4J.js +638 -0
- package/dist/chunk-3S3TVLAV.js +7793 -0
- package/dist/chunk-3S3TVLAV.js.map +1 -0
- package/dist/chunk-3TN4OR43.js +57 -0
- package/dist/chunk-4FCSE6NG.js +429 -0
- package/dist/chunk-4IRJ5JXA.js +46 -0
- package/dist/chunk-4OYSP3OX.js +547 -0
- package/dist/chunk-52WCKY2O.js +103 -0
- package/dist/chunk-5IFFPSEN.js +225 -0
- package/dist/chunk-5KSLZSOH.js +156 -0
- package/dist/chunk-64ALJ6TJ.js +274 -0
- package/dist/chunk-6OIKNJ7G.js +26 -0
- package/dist/chunk-73E4ITJK.js +224 -0
- package/dist/chunk-7UFV6H7J.js +167 -0
- package/dist/chunk-B3CDNANO.js +843 -0
- package/dist/chunk-B5UCAVCD.js +91 -0
- package/dist/chunk-B74ZFQKS.js +676 -0
- package/dist/chunk-B74ZFQKS.js.map +1 -0
- package/dist/chunk-BKIHYRQL.js +149 -0
- package/dist/chunk-BKIHYRQL.js.map +1 -0
- package/dist/chunk-BNO3EFGR.js +4266 -0
- package/dist/chunk-BNO3EFGR.js.map +1 -0
- package/dist/chunk-CVTWKHWZ.js +377 -0
- package/dist/chunk-E5H7JIWB.js +3510 -0
- package/dist/chunk-ERWMBQU2.js +203 -0
- package/dist/chunk-EYLRARHT.js +2209 -0
- package/dist/chunk-EZVW3KAW.js +831 -0
- package/dist/chunk-F3CZFUXZ.js +3187 -0
- package/dist/chunk-F3CZFUXZ.js.map +1 -0
- package/dist/chunk-G6J6AWTE.js +5471 -0
- package/dist/chunk-GAS6HBPM.js +334 -0
- package/dist/chunk-GCFC2MNR.js +228 -0
- package/dist/chunk-GCZK4BMB.js +5368 -0
- package/dist/chunk-H24HT7W7.js +170 -0
- package/dist/chunk-HMFIOE4P.js +63 -0
- package/dist/chunk-IM3GD4G3.js +857 -0
- package/dist/chunk-J6OTEZT3.js +685 -0
- package/dist/chunk-JAFTWN3A.js +207 -0
- package/dist/chunk-JBNT444M.js +285 -0
- package/dist/chunk-JDBZCUTY.js +249 -0
- package/dist/chunk-JKRXKD54.js +66 -0
- package/dist/chunk-JW6VZBV7.js +1646 -0
- package/dist/chunk-JYXERSEO.js +89 -0
- package/dist/chunk-L7AJMZ6Z.js +24026 -0
- package/dist/chunk-L7AJMZ6Z.js.map +1 -0
- package/dist/chunk-LDFM37DM.js +148 -0
- package/dist/chunk-LDMN6RE6.js +142 -0
- package/dist/chunk-M2QBEVIH.js +91 -0
- package/dist/chunk-MHMVFXTK.js +438 -0
- package/dist/chunk-MO3FJMU5.js +930 -0
- package/dist/chunk-MONZLJWO.js +1902 -0
- package/dist/chunk-NL55W4HD.js +61 -0
- package/dist/chunk-NQF5U6FX.js +150 -0
- package/dist/chunk-P6744QO6.js +344 -0
- package/dist/chunk-P6FMQHJJ.js +131 -0
- package/dist/chunk-PFBQERWX.js +10 -0
- package/dist/chunk-PFBQERWX.js.map +1 -0
- package/dist/chunk-PQWT6JHT.js +494 -0
- package/dist/chunk-PYEM5RGJ.js +51 -0
- package/dist/chunk-PZEPUBAS.js +8954 -0
- package/dist/chunk-Q6LCL67T.js +1518 -0
- package/dist/chunk-REFZAC6Q.js +604 -0
- package/dist/chunk-RLTFA2YN.js +910 -0
- package/dist/chunk-RM5T4MA6.js +783 -0
- package/dist/chunk-RPT3EWX2.js +392 -0
- package/dist/chunk-RQOSSYVH.js +718 -0
- package/dist/chunk-RQOSSYVH.js.map +1 -0
- package/dist/chunk-SIKCVWM3.js +76 -0
- package/dist/chunk-SP5P2TGW.js +197 -0
- package/dist/chunk-UYUH5XNV.js +455 -0
- package/dist/chunk-V4UJERGL.js +64 -0
- package/dist/chunk-VIHHAS2H.js +23 -0
- package/dist/chunk-X4APGDHX.js +191 -0
- package/dist/chunk-XBFUCGS4.js +387 -0
- package/dist/chunk-XK2ZJ6CI.js +19 -0
- package/dist/chunk-XN77O7GB.js +275 -0
- package/dist/chunk-XU6XQPNM.js +1919 -0
- package/dist/chunk-Y2AKJYI4.js +191 -0
- package/dist/chunk-Y2AKJYI4.js.map +1 -0
- package/dist/chunk-YQB66YKJ.js +98 -0
- package/dist/chunk-YRALBXYF.js +479 -0
- package/dist/chunk-YRTQQRNY.js +297 -0
- package/dist/chunk-ZHDXKNPO.js +163 -0
- package/dist/chunk-ZIC6AWWL.js +169 -0
- package/dist/claim-DGEZFT3W.js +200 -0
- package/dist/cli.js +36 -35
- package/dist/cli.js.map +1 -1
- package/dist/companies-NG6NTBDR.js +198 -0
- package/dist/company-46N4KFB7.js +308 -0
- package/dist/complete-KQPLWTSD.js +84 -0
- package/dist/config-3GCILBEL.js +88 -0
- package/dist/connect-OU2LJ2Z6.js +45 -0
- package/dist/conversation-UMZQ7RDA.js +96 -0
- package/dist/conversion-report-R4KJI4VA.js +127 -0
- package/dist/conversion-upload-command-XQQWLYHZ.js +439 -0
- package/dist/conversion-writes-XIQEIDPS.js +122 -0
- package/dist/conversions-RMBQNW3T.js +78 -0
- package/dist/conversions-X5LGZHA6.js +140 -0
- package/dist/create-EQSXPFUS.js +135 -0
- package/dist/create-IFQP7SVV.js +239 -0
- package/dist/create-M4LMQ2RN.js +210 -0
- package/dist/create-U4ADI5DV.js +62 -0
- package/dist/creatives-3XLHWIHK.js +58 -0
- package/dist/creatives-B2CQUJ3Y.js +223 -0
- package/dist/credentials-KVIE4DRI.js +290 -0
- package/dist/critique-UX2TWXXH.js +232 -0
- package/dist/critique-Z64ZFE6F.js +1451 -0
- package/dist/crm-67S5ZY5G.js +227 -0
- package/dist/crm-NCDTODY3.js +323 -0
- package/dist/currency-XFHCLKAV.js +88 -0
- package/dist/customers-CGVQMPPT.js +65 -0
- package/dist/delete-53RTKHBL.js +69 -0
- package/dist/delete-Q3DM3BTX.js +67 -0
- package/dist/delete-QGYNGZAO.js +57 -0
- package/dist/demographics-5SLROVD6.js +141 -0
- package/dist/discard-WY37YU5P.js +69 -0
- package/dist/discover-R3QBVUHZ.js +172 -0
- package/dist/domain-2KA6VEX4.js +101 -0
- package/dist/download-6JWNJY3B.js +172 -0
- package/dist/draft-25YY6NMC.js +396 -0
- package/dist/draft-25YY6NMC.js.map +1 -0
- package/dist/draft-6E7EQUCU.js +103 -0
- package/dist/draft-6E7EQUCU.js.map +1 -0
- package/dist/draft-BGCCVIZI.js +310 -0
- package/dist/draft-BGCCVIZI.js.map +1 -0
- package/dist/draft-EJNKW4JN.js +335 -0
- package/dist/draft-EJNKW4JN.js.map +1 -0
- package/dist/draft-GIJCJIQ5.js +240 -0
- package/dist/draft-GIJCJIQ5.js.map +1 -0
- package/dist/draft-NMEKF23T.js +220 -0
- package/dist/draft-Q74WOMUR.js +283 -0
- package/dist/draft-Q74WOMUR.js.map +1 -0
- package/dist/draft-RK3ZAUBF.js +100 -0
- package/dist/draft-RK3ZAUBF.js.map +1 -0
- package/dist/engine/index.js +8 -8
- package/dist/experiments-KGRE35JK.js +236 -0
- package/dist/facets-GWV63PKA.js +117 -0
- package/dist/feedback-2SOINGXM.js +115 -0
- package/dist/feedback-O4RPVQ73.js +136 -0
- package/dist/feedback-O4RPVQ73.js.map +1 -0
- package/dist/feedback-record-6FKYOZ3P.js +269 -0
- package/dist/fetch-4NRSXMHY.js +204 -0
- package/dist/fit-OH2X3XSX.js +65 -0
- package/dist/flows-WXSJQ3UJ.js +250 -0
- package/dist/fonts-LRN2PVYX.js +39 -0
- package/dist/forecast-FVZBUIJU.js +121 -0
- package/dist/forecast-JOQESPEP.js +169 -0
- package/dist/funnel-X2XT3XB5.js +397 -0
- package/dist/ga4-SBHUQKGK.js +55 -0
- package/dist/generate-SW5KLHXG.js +263 -0
- package/dist/get-AP3WGMDU.js +59 -0
- package/dist/get-NR34JBHK.js +82 -0
- package/dist/google-Q424277P.js +3270 -0
- package/dist/google-ads-HLFROWL7.js +198 -0
- package/dist/history-7DF5HFJT.js +69 -0
- package/dist/history-IMHDQLXW.js +102 -0
- package/dist/history-VIPGJT7Z.js +153 -0
- package/dist/hubspot-UZ4F5ANA.js +782 -0
- package/dist/ideas-MU6I7DBD.js +45 -0
- package/dist/images-236N2YSJ.js +92 -0
- package/dist/ingest-3DVD25B6.js +27 -0
- package/dist/ingest-XELCXH2P.js +123 -0
- package/dist/insights-YVV5MHPQ.js +132 -0
- package/dist/inspect-DZUGQK5Y.js +192 -0
- package/dist/intent-5VLQBTM7.js +95 -0
- package/dist/keyword-gap-COLF7JNH.js +130 -0
- package/dist/keyword-metrics-R6EWGKGO.js +200 -0
- package/dist/keywords-for-site-LU3LF65F.js +131 -0
- package/dist/landing-FZ7SSEP6.js +28 -0
- package/dist/languages-RYIOZQFH.js +40 -0
- package/dist/leads-B2YSVBOA.js +115 -0
- package/dist/learn-FVQA7RG4.js +207 -0
- package/dist/line-item-writes-UXJ3JVFY.js +211 -0
- package/dist/line-items-FOVTA5LD.js +107 -0
- package/dist/link-UPXHMS2Q.js +67 -0
- package/dist/linkedin-75HES7MX.js +1328 -0
- package/dist/linkedin-75HES7MX.js.map +1 -0
- package/dist/linkedin-person-V6CK4IYG.js +139 -0
- package/dist/list-23P4WTBN.js +154 -0
- package/dist/list-MALIT3TA.js +306 -0
- package/dist/list-WMF25FUC.js +67 -0
- package/dist/locations-7RYEWKJO.js +69 -0
- package/dist/locations-OF2ZI5YX.js +40 -0
- package/dist/log-I7FAVIQA.js +95 -0
- package/dist/make-YHE4Y2CK.js +1367 -0
- package/dist/map-3H6JFF3K.js +436 -0
- package/dist/mcp-KTR7IPSP.js +729 -0
- package/dist/media-sources-XADH7UR6.js +35 -0
- package/dist/members-4I3TSPZD.js +47 -0
- package/dist/meta-X46LC3GI.js +122 -0
- package/dist/metrics-PKMIG7VL.js +152 -0
- package/dist/models-X2IXXAD6.js +155 -0
- package/dist/normalize-GEBDT74P.js +144 -0
- package/dist/options-4DJFAVSV.js +125 -0
- package/dist/organization-SBFGCUZJ.js +949 -0
- package/dist/performance-BHDYL4JE.js +5565 -0
- package/dist/performance-ZNVGH4BL.js +27 -0
- package/dist/pixels-DBSPNHIE.js +62 -0
- package/dist/plan-2Q6SOHMD.js +208 -0
- package/dist/promoted-tweet-writes-OQM7SURA.js +183 -0
- package/dist/promoted-tweets-BCKQ4D3D.js +119 -0
- package/dist/publish-ZCWQZ5EO.js +344 -0
- package/dist/query-GBIWIZSS.js +62 -0
- package/dist/read-DF3UPNBM.js +141 -0
- package/dist/reddit-NUPXPOG3.js +29 -0
- package/dist/refresh-5KSQVA3V.js +97 -0
- package/dist/release-QIBDWPNL.js +63 -0
- package/dist/relevant-pages-OZPYOGFO.js +99 -0
- package/dist/remove-IM3WF5RS.js +53 -0
- package/dist/reopen-DK3SFSWS.js +66 -0
- package/dist/rerun-7OOJRRZE.js +96 -0
- package/dist/research-KNLA55TJ.js +75 -0
- package/dist/research-R3JAZRD4.js +265 -0
- package/dist/reset-JRKJKUZL.js +57 -0
- package/dist/reset-WQAJPREG.js +57 -0
- package/dist/resolve-LCZXCACJ.js +124 -0
- package/dist/retry-64YJR4ZS.js +65 -0
- package/dist/retry-BPDA54WP.js +63 -0
- package/dist/revenue-WNMRTD6P.js +91 -0
- package/dist/rules-N2YPNUM5.js +99 -0
- package/dist/rules-add-BS577EEB.js +465 -0
- package/dist/run-BNZFJ2YU.js +71 -0
- package/dist/run-OPSLEKBZ.js +69 -0
- package/dist/scaffold-ad-PREXRCXY.js +1513 -0
- package/dist/scaffold-static-ad-KK4QOBO7.js +1011 -0
- package/dist/scaffold-video-KLBPRMAV.js +885 -0
- package/dist/schedule-BODZ6DED.js +64 -0
- package/dist/scheduled-agents-GZEB2B25.js +55 -0
- package/dist/schema-I54DIUTV.js +135 -0
- package/dist/schema-U6GAKTQZ.js +121 -0
- package/dist/search-IJ745GV3.js +177 -0
- package/dist/select-WZJCQW4A.js +110 -0
- package/dist/set-prompt-SUJW4F5J.js +199 -0
- package/dist/setup-links-UVGNFNGP.js +144 -0
- package/dist/shopify-BR27STCS.js +3958 -0
- package/dist/shopify-BR27STCS.js.map +1 -0
- package/dist/site-ZRD4H65V.js +180 -0
- package/dist/sources-4FWNXBBR.js +457 -0
- package/dist/sources-E3QDROKM.js +30 -0
- package/dist/stale-TPM2XQKT.js +90 -0
- package/dist/status-QEVQKFFP.js +65 -0
- package/dist/studio-OV2ZY5W3.js +49 -0
- package/dist/sync-GOVV6G45.js +57 -0
- package/dist/sync-definition-OSSIAZ23.js +70 -0
- package/dist/tag-manager-5ORFHLM4.js +43 -0
- package/dist/tags-BXTCJCOH.js +227 -0
- package/dist/tags-H6ZDU6MK.js +23 -0
- package/dist/tags-Q6Q5FRVL.js +26 -0
- package/dist/tags-YJ3UVNGP.js +23 -0
- package/dist/tags-YJI3QOBK.js +23 -0
- package/dist/targeting-criteria-667LEXSS.js +113 -0
- package/dist/targets-AOE2FDDM.js +106 -0
- package/dist/testimonials-IOBXKEMA.js +32 -0
- package/dist/themes-GD53PVOD.js +95 -0
- package/dist/top-companies-AUXG5OY5.js +111 -0
- package/dist/transcript-D7ZS3X6S.js +165 -0
- package/dist/translate-BQCLUORU.js +603 -0
- package/dist/triggers-QBG5VN5O.js +144 -0
- package/dist/unlink-5KKAJJM6.js +70 -0
- package/dist/unstage-EU6YHHDA.js +88 -0
- package/dist/update-JJG7R6QN.js +192 -0
- package/dist/update-OLQGUBNH.js +101 -0
- package/dist/update-RROGL7SO.js +66 -0
- package/dist/update-RW5T53RB.js +155 -0
- package/dist/upload-4JN4BPY2.js +130 -0
- package/dist/url-options-VNNI4QXX.js +131 -0
- package/dist/url-params-3GCYLRDI.js +101 -0
- package/dist/validate-YBD2PIZE.js +125 -0
- package/dist/videos-OMPPGIYZ.js +41 -0
- package/dist/viewer-check-TCX6PFO4.js +83 -0
- package/dist/web-QGNS3YPN.js +173 -0
- package/dist/winning-ads-LY4NV5O3.js +86 -0
- package/dist/write-commands-FGWCJHLH.js +713 -0
- package/dist/write-commands-OLTCXPPW.js +1525 -0
- package/dist/write-commands-UTM7PPK5.js +206 -0
- package/dist/x-VBSKVDIX.js +47 -0
- package/package.json +1 -1
- package/dist/account-2HJ4GKHN.js +0 -82
- package/dist/account-6GKPLNDY.js +0 -82
- package/dist/account-reads-X36NPCX5.js +0 -219
- package/dist/account-users-FGL3DZES.js +0 -64
- package/dist/account-writes-FZ3KCJZY.js +0 -68
- package/dist/accounts-PKSW3DBQ.js +0 -80
- package/dist/accounts-S5C6MZFO.js +0 -701
- package/dist/actions-ARN3OFB7.js +0 -55
- package/dist/activecampaign-3YJC3H2R.js +0 -938
- package/dist/ad-group-writes-XGG3WQEO.js +0 -172
- package/dist/ad-groups-GZIPUN64.js +0 -70
- package/dist/ad-writes-2VTRWQLW.js +0 -176
- package/dist/add-CNYKQD7B.js +0 -107
- package/dist/add-IABKHM5N.js +0 -305
- package/dist/ads-LNWALF6G.js +0 -79
- package/dist/ads-UXHJCUTX.js +0 -48
- package/dist/advertisers-UT7EJ6YS.js +0 -123
- package/dist/analytics-COUVH7MV.js +0 -447
- package/dist/analytics-EHUUNMGZ.js +0 -2437
- package/dist/animate-DM4OUJMR.js +0 -480
- package/dist/assign-FWT5QQDF.js +0 -80
- package/dist/audience-size-YI2RLIG7.js +0 -76
- package/dist/audiences-7D5VPOWF.js +0 -280
- package/dist/audit-BPRRCIWN.js +0 -154
- package/dist/autocomplete-OD6SHZZH.js +0 -114
- package/dist/avatars-FFFPCH6D.js +0 -38
- package/dist/bid-pricing-JF557IO2.js +0 -103
- package/dist/brand-ZUYJWKI3.js +0 -22
- package/dist/brief-CJDBD5GJ.js +0 -543
- package/dist/campaign-groups-VCT6ZH66.js +0 -99
- package/dist/campaign-writes-H22P6YPW.js +0 -176
- package/dist/campaign-writes-YOHDMYDT.js +0 -168
- package/dist/campaigns-265JXD2Z.js +0 -78
- package/dist/campaigns-7EGRZ3V6.js +0 -113
- package/dist/campaigns-ORK5BYAM.js +0 -111
- package/dist/canvas-FW5F3KZJ.js +0 -46
- package/dist/capabilities-ISW7XT44.js +0 -147
- package/dist/catalog-DPUQBZZ7.js +0 -66
- package/dist/catalogs-SBXFAD3X.js +0 -130
- package/dist/changes-HXVZUJMH.js +0 -143
- package/dist/chatgpt-UXJPCGZU.js +0 -47
- package/dist/chats-FH3DQNYD.js +0 -449
- package/dist/check-QC5RHS3Z.js +0 -107
- package/dist/chunk-2AC5GJHC.js +0 -455
- package/dist/chunk-2VSUMGJV.js +0 -89
- package/dist/chunk-4D73PLXU.js +0 -843
- package/dist/chunk-4S5ZAG4S.js +0 -63
- package/dist/chunk-5MMJPUBH.js +0 -387
- package/dist/chunk-5Y2XPKW2.js +0 -156
- package/dist/chunk-6HCYCMIH.js +0 -61
- package/dist/chunk-6R2BQ6FK.js +0 -344
- package/dist/chunk-7P74QKVC.js +0 -297
- package/dist/chunk-7SJU6PQ7.js +0 -604
- package/dist/chunk-A37TIYFD.js +0 -91
- package/dist/chunk-A6NVGPCZ.js +0 -479
- package/dist/chunk-AK7CL5IW.js +0 -334
- package/dist/chunk-AOT3UZBM.js +0 -930
- package/dist/chunk-D2ZAZGQH.js +0 -547
- package/dist/chunk-DYTBVVQX.js +0 -679
- package/dist/chunk-DYTBVVQX.js.map +0 -1
- package/dist/chunk-EB76M4ZH.js +0 -19
- package/dist/chunk-EBWOLUII.js +0 -24026
- package/dist/chunk-EBWOLUII.js.map +0 -1
- package/dist/chunk-EOMY5SUJ.js +0 -783
- package/dist/chunk-EY5WWPPZ.js +0 -1902
- package/dist/chunk-EZKT5YGX.js +0 -23
- package/dist/chunk-FVDC6AKZ.js +0 -150
- package/dist/chunk-GEQUWPAX.js +0 -715
- package/dist/chunk-GEQUWPAX.js.map +0 -1
- package/dist/chunk-GN7K3NPI.js +0 -148
- package/dist/chunk-GQAKWQAV.js +0 -224
- package/dist/chunk-HBDWE7WK.js +0 -98
- package/dist/chunk-HETNOUE4.js +0 -377
- package/dist/chunk-HFAT5S5B.js +0 -170
- package/dist/chunk-HQ3I2QVT.js +0 -275
- package/dist/chunk-IN5UCEJD.js +0 -91
- package/dist/chunk-JAC6JVCI.js +0 -26
- package/dist/chunk-JLLGXYOZ.js +0 -857
- package/dist/chunk-JY3OJBKZ.js +0 -3510
- package/dist/chunk-KBZRG6IK.js +0 -429
- package/dist/chunk-KCRBAMFU.js +0 -392
- package/dist/chunk-KIXVHP2C.js +0 -1919
- package/dist/chunk-KTY7H44G.js +0 -831
- package/dist/chunk-LKOMEXUB.js +0 -51
- package/dist/chunk-LVKAMWKJ.js +0 -163
- package/dist/chunk-LWCGQNVU.js +0 -685
- package/dist/chunk-MCJ5I5LR.js +0 -3187
- package/dist/chunk-MCJ5I5LR.js.map +0 -1
- package/dist/chunk-MLJKPUWP.js +0 -191
- package/dist/chunk-MLJKPUWP.js.map +0 -1
- package/dist/chunk-MSMTG6OC.js +0 -4269
- package/dist/chunk-MSMTG6OC.js.map +0 -1
- package/dist/chunk-MZPS46OR.js +0 -76
- package/dist/chunk-N4AIJQ4W.js +0 -438
- package/dist/chunk-NBWZVBDG.js +0 -131
- package/dist/chunk-OKB2EAJH.js +0 -8954
- package/dist/chunk-OT2MN5UR.js +0 -169
- package/dist/chunk-OZR3KUJ3.js +0 -57
- package/dist/chunk-P3VY5JEM.js +0 -274
- package/dist/chunk-PXGR3VGW.js +0 -1646
- package/dist/chunk-QK3HMAVU.js +0 -5471
- package/dist/chunk-R65V26HH.js +0 -7770
- package/dist/chunk-R65V26HH.js.map +0 -1
- package/dist/chunk-RHEWQB5O.js +0 -638
- package/dist/chunk-RP36XHWT.js +0 -46
- package/dist/chunk-RXOQZA4K.js +0 -66
- package/dist/chunk-SEHJ7Y7J.js +0 -207
- package/dist/chunk-SNWFM2DB.js +0 -228
- package/dist/chunk-TAGRKRFI.js +0 -103
- package/dist/chunk-TARINRA4.js +0 -1518
- package/dist/chunk-TNZUMU55.js +0 -167
- package/dist/chunk-TP2NS5SG.js +0 -191
- package/dist/chunk-UOXC3XA5.js +0 -494
- package/dist/chunk-UQA6Z23M.js +0 -142
- package/dist/chunk-V2XA5SIO.js +0 -152
- package/dist/chunk-V2XA5SIO.js.map +0 -1
- package/dist/chunk-VOUCQ2YW.js +0 -64
- package/dist/chunk-WJ5AHR4K.js +0 -2209
- package/dist/chunk-WOE4TZHJ.js +0 -285
- package/dist/chunk-X32MFGWW.js +0 -15
- package/dist/chunk-X32MFGWW.js.map +0 -1
- package/dist/chunk-XYNQMRNX.js +0 -5368
- package/dist/chunk-YEISVDKW.js +0 -203
- package/dist/chunk-YNLWSP5E.js +0 -910
- package/dist/chunk-ZEUAJAKN.js +0 -225
- package/dist/chunk-ZUUVWWB5.js +0 -197
- package/dist/chunk-ZVAZFHH7.js +0 -249
- package/dist/claim-FBL5VBYZ.js +0 -200
- package/dist/companies-URRCAJZE.js +0 -198
- package/dist/company-LDCNUPHZ.js +0 -308
- package/dist/complete-3UGPO444.js +0 -84
- package/dist/config-3VK74MY6.js +0 -88
- package/dist/connect-M5KPZQWE.js +0 -45
- package/dist/conversation-S7YANZJR.js +0 -96
- package/dist/conversion-report-RB2MU7UD.js +0 -127
- package/dist/conversion-upload-command-HFZYKVXA.js +0 -439
- package/dist/conversion-writes-56AIPXPK.js +0 -122
- package/dist/conversions-NRX76ZIT.js +0 -78
- package/dist/conversions-QZL4DSJO.js +0 -140
- package/dist/create-56PJRLMA.js +0 -62
- package/dist/create-OE5MRW3X.js +0 -210
- package/dist/create-RL7PRIDY.js +0 -239
- package/dist/create-Y6YVJ5L4.js +0 -135
- package/dist/creatives-ESVH63AP.js +0 -223
- package/dist/creatives-URHXATY6.js +0 -58
- package/dist/credentials-O6QSB7ZR.js +0 -290
- package/dist/critique-EWJBOCXQ.js +0 -1451
- package/dist/critique-PTGGXRFG.js +0 -232
- package/dist/crm-F6RGNQH5.js +0 -323
- package/dist/crm-GLPOO22Q.js +0 -227
- package/dist/currency-CHBV6WIO.js +0 -88
- package/dist/customers-Q76FCWYO.js +0 -65
- package/dist/delete-ODFDZCL3.js +0 -57
- package/dist/delete-OVMPDGWQ.js +0 -69
- package/dist/delete-XN7N4S4H.js +0 -67
- package/dist/demographics-IY5RI55Z.js +0 -141
- package/dist/discard-GKIA5FML.js +0 -69
- package/dist/discover-ZU2DAV23.js +0 -172
- package/dist/domain-WGXA7OXV.js +0 -101
- package/dist/download-DYYNUGLX.js +0 -172
- package/dist/draft-6EHV5NAN.js +0 -247
- package/dist/draft-6EHV5NAN.js.map +0 -1
- package/dist/draft-EWGNZUU4.js +0 -288
- package/dist/draft-EWGNZUU4.js.map +0 -1
- package/dist/draft-EX2I6UJB.js +0 -313
- package/dist/draft-EX2I6UJB.js.map +0 -1
- package/dist/draft-FSZMTGWI.js +0 -106
- package/dist/draft-FSZMTGWI.js.map +0 -1
- package/dist/draft-GKI6MB7L.js +0 -342
- package/dist/draft-GKI6MB7L.js.map +0 -1
- package/dist/draft-P3YJZY74.js +0 -106
- package/dist/draft-P3YJZY74.js.map +0 -1
- package/dist/draft-R7BNWMBR.js +0 -408
- package/dist/draft-R7BNWMBR.js.map +0 -1
- package/dist/draft-VYIRZO3E.js +0 -220
- package/dist/experiments-6DOKWFH4.js +0 -236
- package/dist/facets-ZU5DT2QW.js +0 -117
- package/dist/feedback-RIUBM557.js +0 -115
- package/dist/feedback-record-3VVAUCOH.js +0 -269
- package/dist/fetch-T6TZCU74.js +0 -204
- package/dist/fit-YPOHTM7Y.js +0 -65
- package/dist/flows-CKVEZFF2.js +0 -250
- package/dist/fonts-3J3UVZ2E.js +0 -39
- package/dist/forecast-372Q6KQZ.js +0 -169
- package/dist/forecast-JEAFUR2O.js +0 -121
- package/dist/funnel-FBTNPTS7.js +0 -397
- package/dist/ga4-GDMHIFBU.js +0 -55
- package/dist/generate-JQIK3UYS.js +0 -263
- package/dist/get-5N5FCGNH.js +0 -59
- package/dist/get-EXHUQT65.js +0 -82
- package/dist/google-JHTOX6WM.js +0 -3270
- package/dist/google-ads-ZAYRCG2D.js +0 -198
- package/dist/history-4ULZ4BVV.js +0 -153
- package/dist/history-6J3XRNTZ.js +0 -102
- package/dist/history-VNLS2TKB.js +0 -69
- package/dist/hubspot-ZEHWWJHK.js +0 -782
- package/dist/ideas-SB6546GI.js +0 -45
- package/dist/images-LEZYVE7R.js +0 -92
- package/dist/ingest-4OOTCOLO.js +0 -123
- package/dist/ingest-KNJCCIBG.js +0 -27
- package/dist/insights-XY6II7TX.js +0 -132
- package/dist/inspect-MHKEYNIC.js +0 -192
- package/dist/intent-5QUPPZNI.js +0 -95
- package/dist/keyword-gap-IG3EFLDH.js +0 -130
- package/dist/keyword-metrics-EL7MO3H6.js +0 -200
- package/dist/keywords-for-site-I7KJLZ2I.js +0 -131
- package/dist/landing-Z3QGJYM3.js +0 -28
- package/dist/languages-LNHWSCMT.js +0 -40
- package/dist/leads-WQCTZYKT.js +0 -115
- package/dist/learn-6KW6TUVL.js +0 -207
- package/dist/line-item-writes-B2KSP36W.js +0 -211
- package/dist/line-items-3ICE5DBI.js +0 -107
- package/dist/link-QRQ34ZDH.js +0 -67
- package/dist/linkedin-D4RKHQPS.js +0 -1330
- package/dist/linkedin-D4RKHQPS.js.map +0 -1
- package/dist/linkedin-person-Y5TCUOXS.js +0 -139
- package/dist/list-6HZVHA6T.js +0 -154
- package/dist/list-CHYJ53JD.js +0 -306
- package/dist/list-XAMJSOGI.js +0 -67
- package/dist/locations-64JNCQID.js +0 -69
- package/dist/locations-KVAAO7LD.js +0 -40
- package/dist/log-PLXGA74X.js +0 -95
- package/dist/make-EP4YSN26.js +0 -1367
- package/dist/map-CAFMAMPP.js +0 -436
- package/dist/mcp-DDWSXLU7.js +0 -729
- package/dist/media-sources-J5FXYPV5.js +0 -35
- package/dist/members-ZA7S5KWP.js +0 -47
- package/dist/meta-XVPSGNHU.js +0 -122
- package/dist/metrics-MXGA3EFS.js +0 -152
- package/dist/models-Z6SUHWKI.js +0 -155
- package/dist/normalize-ZHM2ZVXZ.js +0 -144
- package/dist/options-JTMDZECY.js +0 -125
- package/dist/organization-5OJEJEQV.js +0 -949
- package/dist/performance-AHVTOYTM.js +0 -5565
- package/dist/performance-S273NSUB.js +0 -27
- package/dist/pixels-H642RPK4.js +0 -62
- package/dist/plan-FRRE4YQC.js +0 -208
- package/dist/promoted-tweet-writes-UF6LYMH4.js +0 -183
- package/dist/promoted-tweets-Z4GG6D7P.js +0 -119
- package/dist/publish-YQ6MHS7P.js +0 -344
- package/dist/query-FT2BA3WH.js +0 -62
- package/dist/read-7ZFZAJSQ.js +0 -141
- package/dist/reddit-YWYRZBL2.js +0 -29
- package/dist/refresh-TEXTTECA.js +0 -97
- package/dist/release-3JDETBZI.js +0 -63
- package/dist/relevant-pages-OCHLUV5K.js +0 -99
- package/dist/remove-KZTSU4K2.js +0 -53
- package/dist/reopen-GIJSFNDH.js +0 -66
- package/dist/rerun-6UZNOPUG.js +0 -96
- package/dist/research-TMKG4NQJ.js +0 -75
- package/dist/research-XA2IJ2XV.js +0 -265
- package/dist/reset-7VL6WJLE.js +0 -57
- package/dist/reset-HLZ6JHGY.js +0 -57
- package/dist/resolve-H2QW3U5Y.js +0 -124
- package/dist/retry-MIZ67MPP.js +0 -65
- package/dist/retry-WSWW6EJT.js +0 -63
- package/dist/revenue-LTU7HRT2.js +0 -91
- package/dist/rules-BGBCUUPH.js +0 -99
- package/dist/rules-add-SZT2MSOD.js +0 -465
- package/dist/run-FHGT4UQ7.js +0 -69
- package/dist/run-XUDGECLL.js +0 -71
- package/dist/scaffold-ad-VXNO3SQP.js +0 -1513
- package/dist/scaffold-static-ad-FT55VV3T.js +0 -1011
- package/dist/scaffold-video-V7WX5AWZ.js +0 -885
- package/dist/schedule-BNRLEFMZ.js +0 -64
- package/dist/scheduled-agents-MAXXXJ7W.js +0 -55
- package/dist/schema-NSXMRNWM.js +0 -121
- package/dist/schema-YADPD54K.js +0 -135
- package/dist/search-56ORG4PL.js +0 -177
- package/dist/select-DON4DMNM.js +0 -110
- package/dist/set-prompt-J22TUCRU.js +0 -199
- package/dist/setup-links-CHODCBYH.js +0 -144
- package/dist/shopify-FCYU4AR6.js +0 -3980
- package/dist/shopify-FCYU4AR6.js.map +0 -1
- package/dist/site-BF3Q26W5.js +0 -180
- package/dist/sources-SLCYAWTZ.js +0 -457
- package/dist/sources-VHHC6YQM.js +0 -30
- package/dist/stale-GLVTL2ZK.js +0 -90
- package/dist/status-E3RA644P.js +0 -65
- package/dist/studio-6ZXUKA4G.js +0 -49
- package/dist/sync-6QCDDJMO.js +0 -57
- package/dist/sync-definition-DXNHGY5E.js +0 -70
- package/dist/tag-manager-74CGUGXX.js +0 -43
- package/dist/tags-AMZSQJJ2.js +0 -26
- package/dist/tags-KW7PG2TR.js +0 -23
- package/dist/tags-MGV5KG6I.js +0 -23
- package/dist/tags-TM27EIAL.js +0 -23
- package/dist/tags-VWGKVGZD.js +0 -227
- package/dist/targeting-criteria-FT3G4HAW.js +0 -113
- package/dist/targets-XLVHWO6Z.js +0 -106
- package/dist/testimonials-INXY7CXU.js +0 -32
- package/dist/themes-R3A6IVQN.js +0 -95
- package/dist/top-companies-MNX3GBCP.js +0 -111
- package/dist/transcript-GIAOWCTO.js +0 -165
- package/dist/translate-JEQ4K4AH.js +0 -603
- package/dist/triggers-KDXLDZ23.js +0 -144
- package/dist/unlink-PNBSDLBQ.js +0 -70
- package/dist/unstage-X2PDLT5O.js +0 -88
- package/dist/update-4JGHSQVZ.js +0 -66
- package/dist/update-4XUQN4LK.js +0 -101
- package/dist/update-TJTDFWER.js +0 -155
- package/dist/update-URU4TO2F.js +0 -192
- package/dist/upload-TO5EPTVD.js +0 -130
- package/dist/url-options-YZ6UG3NY.js +0 -131
- package/dist/url-params-533CWJH3.js +0 -101
- package/dist/validate-XF6HU7D4.js +0 -125
- package/dist/videos-KYZ4CUOB.js +0 -41
- package/dist/viewer-check-U5GUU34Z.js +0 -83
- package/dist/web-ZYMSMIV6.js +0 -173
- package/dist/winning-ads-BCN5RVAE.js +0 -86
- package/dist/write-commands-5Z5A3D3M.js +0 -713
- package/dist/write-commands-7DTFGM6E.js +0 -206
- package/dist/write-commands-PZZ72PNL.js +0 -1525
- package/dist/x-DLEZYTAU.js +0 -47
- /package/dist/{account-6GKPLNDY.js.map → account-2WTVU5VH.js.map} +0 -0
- /package/dist/{account-2HJ4GKHN.js.map → account-IG3U6UXZ.js.map} +0 -0
- /package/dist/{account-reads-X36NPCX5.js.map → account-reads-L2GYNCD3.js.map} +0 -0
- /package/dist/{account-users-FGL3DZES.js.map → account-users-CK7D4AAI.js.map} +0 -0
- /package/dist/{account-writes-FZ3KCJZY.js.map → account-writes-BSSKSTZ2.js.map} +0 -0
- /package/dist/{accounts-S5C6MZFO.js.map → accounts-3EERX6MO.js.map} +0 -0
- /package/dist/{accounts-PKSW3DBQ.js.map → accounts-JWYTBGDR.js.map} +0 -0
- /package/dist/{actions-ARN3OFB7.js.map → actions-UUNK3DO4.js.map} +0 -0
- /package/dist/{activecampaign-3YJC3H2R.js.map → activecampaign-URFTGK6R.js.map} +0 -0
- /package/dist/{ad-group-writes-XGG3WQEO.js.map → ad-group-writes-KMB3OMJG.js.map} +0 -0
- /package/dist/{ad-groups-GZIPUN64.js.map → ad-groups-E67CNQS4.js.map} +0 -0
- /package/dist/{ad-writes-2VTRWQLW.js.map → ad-writes-FNMKNFUN.js.map} +0 -0
- /package/dist/{add-CNYKQD7B.js.map → add-2JN54LSO.js.map} +0 -0
- /package/dist/{add-IABKHM5N.js.map → add-4PYISQPU.js.map} +0 -0
- /package/dist/{ads-LNWALF6G.js.map → ads-4LASBP4G.js.map} +0 -0
- /package/dist/{ads-UXHJCUTX.js.map → ads-6KIDAXHQ.js.map} +0 -0
- /package/dist/{advertisers-UT7EJ6YS.js.map → advertisers-K4ZLOZQ2.js.map} +0 -0
- /package/dist/{analytics-EHUUNMGZ.js.map → analytics-36JY2LHD.js.map} +0 -0
- /package/dist/{analytics-COUVH7MV.js.map → analytics-NXXDWJU2.js.map} +0 -0
- /package/dist/{animate-DM4OUJMR.js.map → animate-OWXAT2RK.js.map} +0 -0
- /package/dist/{assign-FWT5QQDF.js.map → assign-SG5JXTMD.js.map} +0 -0
- /package/dist/{audience-size-YI2RLIG7.js.map → audience-size-HOLSWGNO.js.map} +0 -0
- /package/dist/{audiences-7D5VPOWF.js.map → audiences-3R574STZ.js.map} +0 -0
- /package/dist/{audit-BPRRCIWN.js.map → audit-YWT6CEY2.js.map} +0 -0
- /package/dist/{autocomplete-OD6SHZZH.js.map → autocomplete-KMYCOXHU.js.map} +0 -0
- /package/dist/{avatars-FFFPCH6D.js.map → avatars-ZGJ6RGNQ.js.map} +0 -0
- /package/dist/{bid-pricing-JF557IO2.js.map → bid-pricing-C2UQJWYK.js.map} +0 -0
- /package/dist/{brand-ZUYJWKI3.js.map → brand-3653YYQF.js.map} +0 -0
- /package/dist/{brief-CJDBD5GJ.js.map → brief-I537G3PB.js.map} +0 -0
- /package/dist/{campaign-groups-VCT6ZH66.js.map → campaign-groups-A7BT67RF.js.map} +0 -0
- /package/dist/{campaign-writes-YOHDMYDT.js.map → campaign-writes-HASDYGTI.js.map} +0 -0
- /package/dist/{campaign-writes-H22P6YPW.js.map → campaign-writes-Z2J24SUZ.js.map} +0 -0
- /package/dist/{campaigns-265JXD2Z.js.map → campaigns-43OS6EUG.js.map} +0 -0
- /package/dist/{campaigns-7EGRZ3V6.js.map → campaigns-5DOTTJ47.js.map} +0 -0
- /package/dist/{campaigns-ORK5BYAM.js.map → campaigns-FHP74WGY.js.map} +0 -0
- /package/dist/{canvas-FW5F3KZJ.js.map → canvas-AW235KQX.js.map} +0 -0
- /package/dist/{capabilities-ISW7XT44.js.map → capabilities-6P674LBM.js.map} +0 -0
- /package/dist/{catalog-DPUQBZZ7.js.map → catalog-7LINLVVY.js.map} +0 -0
- /package/dist/{catalogs-SBXFAD3X.js.map → catalogs-IR22RGZD.js.map} +0 -0
- /package/dist/{changes-HXVZUJMH.js.map → changes-RSEGYV45.js.map} +0 -0
- /package/dist/{chatgpt-UXJPCGZU.js.map → chatgpt-PDFFKPY2.js.map} +0 -0
- /package/dist/{chats-FH3DQNYD.js.map → chats-KU6JI7DK.js.map} +0 -0
- /package/dist/{check-QC5RHS3Z.js.map → check-W27MKVN7.js.map} +0 -0
- /package/dist/{chunk-RHEWQB5O.js.map → chunk-3EUITH4J.js.map} +0 -0
- /package/dist/{chunk-OZR3KUJ3.js.map → chunk-3TN4OR43.js.map} +0 -0
- /package/dist/{chunk-KBZRG6IK.js.map → chunk-4FCSE6NG.js.map} +0 -0
- /package/dist/{chunk-RP36XHWT.js.map → chunk-4IRJ5JXA.js.map} +0 -0
- /package/dist/{chunk-D2ZAZGQH.js.map → chunk-4OYSP3OX.js.map} +0 -0
- /package/dist/{chunk-TAGRKRFI.js.map → chunk-52WCKY2O.js.map} +0 -0
- /package/dist/{chunk-ZEUAJAKN.js.map → chunk-5IFFPSEN.js.map} +0 -0
- /package/dist/{chunk-5Y2XPKW2.js.map → chunk-5KSLZSOH.js.map} +0 -0
- /package/dist/{chunk-P3VY5JEM.js.map → chunk-64ALJ6TJ.js.map} +0 -0
- /package/dist/{chunk-JAC6JVCI.js.map → chunk-6OIKNJ7G.js.map} +0 -0
- /package/dist/{chunk-GQAKWQAV.js.map → chunk-73E4ITJK.js.map} +0 -0
- /package/dist/{chunk-TNZUMU55.js.map → chunk-7UFV6H7J.js.map} +0 -0
- /package/dist/{chunk-4D73PLXU.js.map → chunk-B3CDNANO.js.map} +0 -0
- /package/dist/{chunk-A37TIYFD.js.map → chunk-B5UCAVCD.js.map} +0 -0
- /package/dist/{chunk-HETNOUE4.js.map → chunk-CVTWKHWZ.js.map} +0 -0
- /package/dist/{chunk-JY3OJBKZ.js.map → chunk-E5H7JIWB.js.map} +0 -0
- /package/dist/{chunk-YEISVDKW.js.map → chunk-ERWMBQU2.js.map} +0 -0
- /package/dist/{chunk-WJ5AHR4K.js.map → chunk-EYLRARHT.js.map} +0 -0
- /package/dist/{chunk-KTY7H44G.js.map → chunk-EZVW3KAW.js.map} +0 -0
- /package/dist/{chunk-QK3HMAVU.js.map → chunk-G6J6AWTE.js.map} +0 -0
- /package/dist/{chunk-AK7CL5IW.js.map → chunk-GAS6HBPM.js.map} +0 -0
- /package/dist/{chunk-SNWFM2DB.js.map → chunk-GCFC2MNR.js.map} +0 -0
- /package/dist/{chunk-XYNQMRNX.js.map → chunk-GCZK4BMB.js.map} +0 -0
- /package/dist/{chunk-HFAT5S5B.js.map → chunk-H24HT7W7.js.map} +0 -0
- /package/dist/{chunk-4S5ZAG4S.js.map → chunk-HMFIOE4P.js.map} +0 -0
- /package/dist/{chunk-JLLGXYOZ.js.map → chunk-IM3GD4G3.js.map} +0 -0
- /package/dist/{chunk-LWCGQNVU.js.map → chunk-J6OTEZT3.js.map} +0 -0
- /package/dist/{chunk-SEHJ7Y7J.js.map → chunk-JAFTWN3A.js.map} +0 -0
- /package/dist/{chunk-WOE4TZHJ.js.map → chunk-JBNT444M.js.map} +0 -0
- /package/dist/{chunk-ZVAZFHH7.js.map → chunk-JDBZCUTY.js.map} +0 -0
- /package/dist/{chunk-RXOQZA4K.js.map → chunk-JKRXKD54.js.map} +0 -0
- /package/dist/{chunk-PXGR3VGW.js.map → chunk-JW6VZBV7.js.map} +0 -0
- /package/dist/{chunk-2VSUMGJV.js.map → chunk-JYXERSEO.js.map} +0 -0
- /package/dist/{chunk-GN7K3NPI.js.map → chunk-LDFM37DM.js.map} +0 -0
- /package/dist/{chunk-UQA6Z23M.js.map → chunk-LDMN6RE6.js.map} +0 -0
- /package/dist/{chunk-IN5UCEJD.js.map → chunk-M2QBEVIH.js.map} +0 -0
- /package/dist/{chunk-N4AIJQ4W.js.map → chunk-MHMVFXTK.js.map} +0 -0
- /package/dist/{chunk-AOT3UZBM.js.map → chunk-MO3FJMU5.js.map} +0 -0
- /package/dist/{chunk-EY5WWPPZ.js.map → chunk-MONZLJWO.js.map} +0 -0
- /package/dist/{chunk-6HCYCMIH.js.map → chunk-NL55W4HD.js.map} +0 -0
- /package/dist/{chunk-FVDC6AKZ.js.map → chunk-NQF5U6FX.js.map} +0 -0
- /package/dist/{chunk-6R2BQ6FK.js.map → chunk-P6744QO6.js.map} +0 -0
- /package/dist/{chunk-NBWZVBDG.js.map → chunk-P6FMQHJJ.js.map} +0 -0
- /package/dist/{chunk-UOXC3XA5.js.map → chunk-PQWT6JHT.js.map} +0 -0
- /package/dist/{chunk-LKOMEXUB.js.map → chunk-PYEM5RGJ.js.map} +0 -0
- /package/dist/{chunk-OKB2EAJH.js.map → chunk-PZEPUBAS.js.map} +0 -0
- /package/dist/{chunk-TARINRA4.js.map → chunk-Q6LCL67T.js.map} +0 -0
- /package/dist/{chunk-7SJU6PQ7.js.map → chunk-REFZAC6Q.js.map} +0 -0
- /package/dist/{chunk-YNLWSP5E.js.map → chunk-RLTFA2YN.js.map} +0 -0
- /package/dist/{chunk-EOMY5SUJ.js.map → chunk-RM5T4MA6.js.map} +0 -0
- /package/dist/{chunk-KCRBAMFU.js.map → chunk-RPT3EWX2.js.map} +0 -0
- /package/dist/{chunk-MZPS46OR.js.map → chunk-SIKCVWM3.js.map} +0 -0
- /package/dist/{chunk-ZUUVWWB5.js.map → chunk-SP5P2TGW.js.map} +0 -0
- /package/dist/{chunk-2AC5GJHC.js.map → chunk-UYUH5XNV.js.map} +0 -0
- /package/dist/{chunk-VOUCQ2YW.js.map → chunk-V4UJERGL.js.map} +0 -0
- /package/dist/{chunk-EZKT5YGX.js.map → chunk-VIHHAS2H.js.map} +0 -0
- /package/dist/{chunk-TP2NS5SG.js.map → chunk-X4APGDHX.js.map} +0 -0
- /package/dist/{chunk-5MMJPUBH.js.map → chunk-XBFUCGS4.js.map} +0 -0
- /package/dist/{chunk-EB76M4ZH.js.map → chunk-XK2ZJ6CI.js.map} +0 -0
- /package/dist/{chunk-HQ3I2QVT.js.map → chunk-XN77O7GB.js.map} +0 -0
- /package/dist/{chunk-KIXVHP2C.js.map → chunk-XU6XQPNM.js.map} +0 -0
- /package/dist/{chunk-HBDWE7WK.js.map → chunk-YQB66YKJ.js.map} +0 -0
- /package/dist/{chunk-A6NVGPCZ.js.map → chunk-YRALBXYF.js.map} +0 -0
- /package/dist/{chunk-7P74QKVC.js.map → chunk-YRTQQRNY.js.map} +0 -0
- /package/dist/{chunk-LVKAMWKJ.js.map → chunk-ZHDXKNPO.js.map} +0 -0
- /package/dist/{chunk-OT2MN5UR.js.map → chunk-ZIC6AWWL.js.map} +0 -0
- /package/dist/{claim-FBL5VBYZ.js.map → claim-DGEZFT3W.js.map} +0 -0
- /package/dist/{companies-URRCAJZE.js.map → companies-NG6NTBDR.js.map} +0 -0
- /package/dist/{company-LDCNUPHZ.js.map → company-46N4KFB7.js.map} +0 -0
- /package/dist/{complete-3UGPO444.js.map → complete-KQPLWTSD.js.map} +0 -0
- /package/dist/{config-3VK74MY6.js.map → config-3GCILBEL.js.map} +0 -0
- /package/dist/{connect-M5KPZQWE.js.map → connect-OU2LJ2Z6.js.map} +0 -0
- /package/dist/{conversation-S7YANZJR.js.map → conversation-UMZQ7RDA.js.map} +0 -0
- /package/dist/{conversion-report-RB2MU7UD.js.map → conversion-report-R4KJI4VA.js.map} +0 -0
- /package/dist/{conversion-upload-command-HFZYKVXA.js.map → conversion-upload-command-XQQWLYHZ.js.map} +0 -0
- /package/dist/{conversion-writes-56AIPXPK.js.map → conversion-writes-XIQEIDPS.js.map} +0 -0
- /package/dist/{conversions-NRX76ZIT.js.map → conversions-RMBQNW3T.js.map} +0 -0
- /package/dist/{conversions-QZL4DSJO.js.map → conversions-X5LGZHA6.js.map} +0 -0
- /package/dist/{create-Y6YVJ5L4.js.map → create-EQSXPFUS.js.map} +0 -0
- /package/dist/{create-RL7PRIDY.js.map → create-IFQP7SVV.js.map} +0 -0
- /package/dist/{create-OE5MRW3X.js.map → create-M4LMQ2RN.js.map} +0 -0
- /package/dist/{create-56PJRLMA.js.map → create-U4ADI5DV.js.map} +0 -0
- /package/dist/{creatives-URHXATY6.js.map → creatives-3XLHWIHK.js.map} +0 -0
- /package/dist/{creatives-ESVH63AP.js.map → creatives-B2CQUJ3Y.js.map} +0 -0
- /package/dist/{credentials-O6QSB7ZR.js.map → credentials-KVIE4DRI.js.map} +0 -0
- /package/dist/{critique-PTGGXRFG.js.map → critique-UX2TWXXH.js.map} +0 -0
- /package/dist/{critique-EWJBOCXQ.js.map → critique-Z64ZFE6F.js.map} +0 -0
- /package/dist/{crm-GLPOO22Q.js.map → crm-67S5ZY5G.js.map} +0 -0
- /package/dist/{crm-F6RGNQH5.js.map → crm-NCDTODY3.js.map} +0 -0
- /package/dist/{currency-CHBV6WIO.js.map → currency-XFHCLKAV.js.map} +0 -0
- /package/dist/{customers-Q76FCWYO.js.map → customers-CGVQMPPT.js.map} +0 -0
- /package/dist/{delete-OVMPDGWQ.js.map → delete-53RTKHBL.js.map} +0 -0
- /package/dist/{delete-XN7N4S4H.js.map → delete-Q3DM3BTX.js.map} +0 -0
- /package/dist/{delete-ODFDZCL3.js.map → delete-QGYNGZAO.js.map} +0 -0
- /package/dist/{demographics-IY5RI55Z.js.map → demographics-5SLROVD6.js.map} +0 -0
- /package/dist/{discard-GKIA5FML.js.map → discard-WY37YU5P.js.map} +0 -0
- /package/dist/{discover-ZU2DAV23.js.map → discover-R3QBVUHZ.js.map} +0 -0
- /package/dist/{domain-WGXA7OXV.js.map → domain-2KA6VEX4.js.map} +0 -0
- /package/dist/{download-DYYNUGLX.js.map → download-6JWNJY3B.js.map} +0 -0
- /package/dist/{draft-VYIRZO3E.js.map → draft-NMEKF23T.js.map} +0 -0
- /package/dist/{experiments-6DOKWFH4.js.map → experiments-KGRE35JK.js.map} +0 -0
- /package/dist/{facets-ZU5DT2QW.js.map → facets-GWV63PKA.js.map} +0 -0
- /package/dist/{feedback-RIUBM557.js.map → feedback-2SOINGXM.js.map} +0 -0
- /package/dist/{feedback-record-3VVAUCOH.js.map → feedback-record-6FKYOZ3P.js.map} +0 -0
- /package/dist/{fetch-T6TZCU74.js.map → fetch-4NRSXMHY.js.map} +0 -0
- /package/dist/{fit-YPOHTM7Y.js.map → fit-OH2X3XSX.js.map} +0 -0
- /package/dist/{flows-CKVEZFF2.js.map → flows-WXSJQ3UJ.js.map} +0 -0
- /package/dist/{fonts-3J3UVZ2E.js.map → fonts-LRN2PVYX.js.map} +0 -0
- /package/dist/{forecast-JEAFUR2O.js.map → forecast-FVZBUIJU.js.map} +0 -0
- /package/dist/{forecast-372Q6KQZ.js.map → forecast-JOQESPEP.js.map} +0 -0
- /package/dist/{funnel-FBTNPTS7.js.map → funnel-X2XT3XB5.js.map} +0 -0
- /package/dist/{ga4-GDMHIFBU.js.map → ga4-SBHUQKGK.js.map} +0 -0
- /package/dist/{generate-JQIK3UYS.js.map → generate-SW5KLHXG.js.map} +0 -0
- /package/dist/{get-5N5FCGNH.js.map → get-AP3WGMDU.js.map} +0 -0
- /package/dist/{get-EXHUQT65.js.map → get-NR34JBHK.js.map} +0 -0
- /package/dist/{google-JHTOX6WM.js.map → google-Q424277P.js.map} +0 -0
- /package/dist/{google-ads-ZAYRCG2D.js.map → google-ads-HLFROWL7.js.map} +0 -0
- /package/dist/{history-VNLS2TKB.js.map → history-7DF5HFJT.js.map} +0 -0
- /package/dist/{history-6J3XRNTZ.js.map → history-IMHDQLXW.js.map} +0 -0
- /package/dist/{history-4ULZ4BVV.js.map → history-VIPGJT7Z.js.map} +0 -0
- /package/dist/{hubspot-ZEHWWJHK.js.map → hubspot-UZ4F5ANA.js.map} +0 -0
- /package/dist/{ideas-SB6546GI.js.map → ideas-MU6I7DBD.js.map} +0 -0
- /package/dist/{images-LEZYVE7R.js.map → images-236N2YSJ.js.map} +0 -0
- /package/dist/{ingest-KNJCCIBG.js.map → ingest-3DVD25B6.js.map} +0 -0
- /package/dist/{ingest-4OOTCOLO.js.map → ingest-XELCXH2P.js.map} +0 -0
- /package/dist/{insights-XY6II7TX.js.map → insights-YVV5MHPQ.js.map} +0 -0
- /package/dist/{inspect-MHKEYNIC.js.map → inspect-DZUGQK5Y.js.map} +0 -0
- /package/dist/{intent-5QUPPZNI.js.map → intent-5VLQBTM7.js.map} +0 -0
- /package/dist/{keyword-gap-IG3EFLDH.js.map → keyword-gap-COLF7JNH.js.map} +0 -0
- /package/dist/{keyword-metrics-EL7MO3H6.js.map → keyword-metrics-R6EWGKGO.js.map} +0 -0
- /package/dist/{keywords-for-site-I7KJLZ2I.js.map → keywords-for-site-LU3LF65F.js.map} +0 -0
- /package/dist/{landing-Z3QGJYM3.js.map → landing-FZ7SSEP6.js.map} +0 -0
- /package/dist/{languages-LNHWSCMT.js.map → languages-RYIOZQFH.js.map} +0 -0
- /package/dist/{leads-WQCTZYKT.js.map → leads-B2YSVBOA.js.map} +0 -0
- /package/dist/{learn-6KW6TUVL.js.map → learn-FVQA7RG4.js.map} +0 -0
- /package/dist/{line-item-writes-B2KSP36W.js.map → line-item-writes-UXJ3JVFY.js.map} +0 -0
- /package/dist/{line-items-3ICE5DBI.js.map → line-items-FOVTA5LD.js.map} +0 -0
- /package/dist/{link-QRQ34ZDH.js.map → link-UPXHMS2Q.js.map} +0 -0
- /package/dist/{linkedin-person-Y5TCUOXS.js.map → linkedin-person-V6CK4IYG.js.map} +0 -0
- /package/dist/{list-6HZVHA6T.js.map → list-23P4WTBN.js.map} +0 -0
- /package/dist/{list-CHYJ53JD.js.map → list-MALIT3TA.js.map} +0 -0
- /package/dist/{list-XAMJSOGI.js.map → list-WMF25FUC.js.map} +0 -0
- /package/dist/{locations-64JNCQID.js.map → locations-7RYEWKJO.js.map} +0 -0
- /package/dist/{locations-KVAAO7LD.js.map → locations-OF2ZI5YX.js.map} +0 -0
- /package/dist/{log-PLXGA74X.js.map → log-I7FAVIQA.js.map} +0 -0
- /package/dist/{make-EP4YSN26.js.map → make-YHE4Y2CK.js.map} +0 -0
- /package/dist/{map-CAFMAMPP.js.map → map-3H6JFF3K.js.map} +0 -0
- /package/dist/{mcp-DDWSXLU7.js.map → mcp-KTR7IPSP.js.map} +0 -0
- /package/dist/{media-sources-J5FXYPV5.js.map → media-sources-XADH7UR6.js.map} +0 -0
- /package/dist/{members-ZA7S5KWP.js.map → members-4I3TSPZD.js.map} +0 -0
- /package/dist/{meta-XVPSGNHU.js.map → meta-X46LC3GI.js.map} +0 -0
- /package/dist/{metrics-MXGA3EFS.js.map → metrics-PKMIG7VL.js.map} +0 -0
- /package/dist/{models-Z6SUHWKI.js.map → models-X2IXXAD6.js.map} +0 -0
- /package/dist/{normalize-ZHM2ZVXZ.js.map → normalize-GEBDT74P.js.map} +0 -0
- /package/dist/{options-JTMDZECY.js.map → options-4DJFAVSV.js.map} +0 -0
- /package/dist/{organization-5OJEJEQV.js.map → organization-SBFGCUZJ.js.map} +0 -0
- /package/dist/{performance-AHVTOYTM.js.map → performance-BHDYL4JE.js.map} +0 -0
- /package/dist/{performance-S273NSUB.js.map → performance-ZNVGH4BL.js.map} +0 -0
- /package/dist/{pixels-H642RPK4.js.map → pixels-DBSPNHIE.js.map} +0 -0
- /package/dist/{plan-FRRE4YQC.js.map → plan-2Q6SOHMD.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-UF6LYMH4.js.map → promoted-tweet-writes-OQM7SURA.js.map} +0 -0
- /package/dist/{promoted-tweets-Z4GG6D7P.js.map → promoted-tweets-BCKQ4D3D.js.map} +0 -0
- /package/dist/{publish-YQ6MHS7P.js.map → publish-ZCWQZ5EO.js.map} +0 -0
- /package/dist/{query-FT2BA3WH.js.map → query-GBIWIZSS.js.map} +0 -0
- /package/dist/{read-7ZFZAJSQ.js.map → read-DF3UPNBM.js.map} +0 -0
- /package/dist/{reddit-YWYRZBL2.js.map → reddit-NUPXPOG3.js.map} +0 -0
- /package/dist/{refresh-TEXTTECA.js.map → refresh-5KSQVA3V.js.map} +0 -0
- /package/dist/{release-3JDETBZI.js.map → release-QIBDWPNL.js.map} +0 -0
- /package/dist/{relevant-pages-OCHLUV5K.js.map → relevant-pages-OZPYOGFO.js.map} +0 -0
- /package/dist/{remove-KZTSU4K2.js.map → remove-IM3WF5RS.js.map} +0 -0
- /package/dist/{reopen-GIJSFNDH.js.map → reopen-DK3SFSWS.js.map} +0 -0
- /package/dist/{rerun-6UZNOPUG.js.map → rerun-7OOJRRZE.js.map} +0 -0
- /package/dist/{research-TMKG4NQJ.js.map → research-KNLA55TJ.js.map} +0 -0
- /package/dist/{research-XA2IJ2XV.js.map → research-R3JAZRD4.js.map} +0 -0
- /package/dist/{reset-7VL6WJLE.js.map → reset-JRKJKUZL.js.map} +0 -0
- /package/dist/{reset-HLZ6JHGY.js.map → reset-WQAJPREG.js.map} +0 -0
- /package/dist/{resolve-H2QW3U5Y.js.map → resolve-LCZXCACJ.js.map} +0 -0
- /package/dist/{retry-MIZ67MPP.js.map → retry-64YJR4ZS.js.map} +0 -0
- /package/dist/{retry-WSWW6EJT.js.map → retry-BPDA54WP.js.map} +0 -0
- /package/dist/{revenue-LTU7HRT2.js.map → revenue-WNMRTD6P.js.map} +0 -0
- /package/dist/{rules-BGBCUUPH.js.map → rules-N2YPNUM5.js.map} +0 -0
- /package/dist/{rules-add-SZT2MSOD.js.map → rules-add-BS577EEB.js.map} +0 -0
- /package/dist/{run-XUDGECLL.js.map → run-BNZFJ2YU.js.map} +0 -0
- /package/dist/{run-FHGT4UQ7.js.map → run-OPSLEKBZ.js.map} +0 -0
- /package/dist/{scaffold-ad-VXNO3SQP.js.map → scaffold-ad-PREXRCXY.js.map} +0 -0
- /package/dist/{scaffold-static-ad-FT55VV3T.js.map → scaffold-static-ad-KK4QOBO7.js.map} +0 -0
- /package/dist/{scaffold-video-V7WX5AWZ.js.map → scaffold-video-KLBPRMAV.js.map} +0 -0
- /package/dist/{schedule-BNRLEFMZ.js.map → schedule-BODZ6DED.js.map} +0 -0
- /package/dist/{scheduled-agents-MAXXXJ7W.js.map → scheduled-agents-GZEB2B25.js.map} +0 -0
- /package/dist/{schema-YADPD54K.js.map → schema-I54DIUTV.js.map} +0 -0
- /package/dist/{schema-NSXMRNWM.js.map → schema-U6GAKTQZ.js.map} +0 -0
- /package/dist/{search-56ORG4PL.js.map → search-IJ745GV3.js.map} +0 -0
- /package/dist/{select-DON4DMNM.js.map → select-WZJCQW4A.js.map} +0 -0
- /package/dist/{set-prompt-J22TUCRU.js.map → set-prompt-SUJW4F5J.js.map} +0 -0
- /package/dist/{setup-links-CHODCBYH.js.map → setup-links-UVGNFNGP.js.map} +0 -0
- /package/dist/{site-BF3Q26W5.js.map → site-ZRD4H65V.js.map} +0 -0
- /package/dist/{sources-SLCYAWTZ.js.map → sources-4FWNXBBR.js.map} +0 -0
- /package/dist/{sources-VHHC6YQM.js.map → sources-E3QDROKM.js.map} +0 -0
- /package/dist/{stale-GLVTL2ZK.js.map → stale-TPM2XQKT.js.map} +0 -0
- /package/dist/{status-E3RA644P.js.map → status-QEVQKFFP.js.map} +0 -0
- /package/dist/{studio-6ZXUKA4G.js.map → studio-OV2ZY5W3.js.map} +0 -0
- /package/dist/{sync-6QCDDJMO.js.map → sync-GOVV6G45.js.map} +0 -0
- /package/dist/{sync-definition-DXNHGY5E.js.map → sync-definition-OSSIAZ23.js.map} +0 -0
- /package/dist/{tag-manager-74CGUGXX.js.map → tag-manager-5ORFHLM4.js.map} +0 -0
- /package/dist/{tags-VWGKVGZD.js.map → tags-BXTCJCOH.js.map} +0 -0
- /package/dist/{tags-TM27EIAL.js.map → tags-H6ZDU6MK.js.map} +0 -0
- /package/dist/{tags-AMZSQJJ2.js.map → tags-Q6Q5FRVL.js.map} +0 -0
- /package/dist/{tags-KW7PG2TR.js.map → tags-YJ3UVNGP.js.map} +0 -0
- /package/dist/{tags-MGV5KG6I.js.map → tags-YJI3QOBK.js.map} +0 -0
- /package/dist/{targeting-criteria-FT3G4HAW.js.map → targeting-criteria-667LEXSS.js.map} +0 -0
- /package/dist/{targets-XLVHWO6Z.js.map → targets-AOE2FDDM.js.map} +0 -0
- /package/dist/{testimonials-INXY7CXU.js.map → testimonials-IOBXKEMA.js.map} +0 -0
- /package/dist/{themes-R3A6IVQN.js.map → themes-GD53PVOD.js.map} +0 -0
- /package/dist/{top-companies-MNX3GBCP.js.map → top-companies-AUXG5OY5.js.map} +0 -0
- /package/dist/{transcript-GIAOWCTO.js.map → transcript-D7ZS3X6S.js.map} +0 -0
- /package/dist/{translate-JEQ4K4AH.js.map → translate-BQCLUORU.js.map} +0 -0
- /package/dist/{triggers-KDXLDZ23.js.map → triggers-QBG5VN5O.js.map} +0 -0
- /package/dist/{unlink-PNBSDLBQ.js.map → unlink-5KKAJJM6.js.map} +0 -0
- /package/dist/{unstage-X2PDLT5O.js.map → unstage-EU6YHHDA.js.map} +0 -0
- /package/dist/{update-URU4TO2F.js.map → update-JJG7R6QN.js.map} +0 -0
- /package/dist/{update-4XUQN4LK.js.map → update-OLQGUBNH.js.map} +0 -0
- /package/dist/{update-4JGHSQVZ.js.map → update-RROGL7SO.js.map} +0 -0
- /package/dist/{update-TJTDFWER.js.map → update-RW5T53RB.js.map} +0 -0
- /package/dist/{upload-TO5EPTVD.js.map → upload-4JN4BPY2.js.map} +0 -0
- /package/dist/{url-options-YZ6UG3NY.js.map → url-options-VNNI4QXX.js.map} +0 -0
- /package/dist/{url-params-533CWJH3.js.map → url-params-3GCYLRDI.js.map} +0 -0
- /package/dist/{validate-XF6HU7D4.js.map → validate-YBD2PIZE.js.map} +0 -0
- /package/dist/{videos-KYZ4CUOB.js.map → videos-OMPPGIYZ.js.map} +0 -0
- /package/dist/{viewer-check-U5GUU34Z.js.map → viewer-check-TCX6PFO4.js.map} +0 -0
- /package/dist/{web-ZYMSMIV6.js.map → web-QGNS3YPN.js.map} +0 -0
- /package/dist/{winning-ads-BCN5RVAE.js.map → winning-ads-LY4NV5O3.js.map} +0 -0
- /package/dist/{write-commands-5Z5A3D3M.js.map → write-commands-FGWCJHLH.js.map} +0 -0
- /package/dist/{write-commands-PZZ72PNL.js.map → write-commands-OLTCXPPW.js.map} +0 -0
- /package/dist/{write-commands-7DTFGM6E.js.map → write-commands-UTM7PPK5.js.map} +0 -0
- /package/dist/{x-DLEZYTAU.js.map → x-VBSKVDIX.js.map} +0 -0
|
@@ -0,0 +1,685 @@
|
|
|
1
|
+
import {
|
|
2
|
+
findSubreddits,
|
|
3
|
+
searchReddit
|
|
4
|
+
} from "./chunk-YRTQQRNY.js";
|
|
5
|
+
import {
|
|
6
|
+
holdUnbilledSpend
|
|
7
|
+
} from "./chunk-VWOKPC3T.js";
|
|
8
|
+
import {
|
|
9
|
+
findWorkspaceRoot
|
|
10
|
+
} from "./chunk-BGT5ZA4L.js";
|
|
11
|
+
import {
|
|
12
|
+
askAboutText
|
|
13
|
+
} from "./chunk-B3CDNANO.js";
|
|
14
|
+
import {
|
|
15
|
+
CUSTOMER_INSIGHTS_MODEL
|
|
16
|
+
} from "./chunk-F3CZFUXZ.js";
|
|
17
|
+
import {
|
|
18
|
+
apiGet,
|
|
19
|
+
apiPost
|
|
20
|
+
} from "./chunk-B2OHCWYB.js";
|
|
21
|
+
import {
|
|
22
|
+
registerSchema,
|
|
23
|
+
writeJson
|
|
24
|
+
} from "./chunk-WCIS4FZH.js";
|
|
25
|
+
|
|
26
|
+
// src/commands/research/customers.ts
|
|
27
|
+
import { mkdir, readdir, readFile, writeFile } from "fs/promises";
|
|
28
|
+
import path from "path";
|
|
29
|
+
|
|
30
|
+
// ../api/src/verbatim.ts
|
|
31
|
+
var SINGLE_QUOTES = /* @__PURE__ */ new Set([8216, 8217, 8218, 8219, 8242]);
|
|
32
|
+
var DOUBLE_QUOTES = /* @__PURE__ */ new Set([8220, 8221, 8222, 8223, 8243]);
|
|
33
|
+
var DASHES = /* @__PURE__ */ new Set([8208, 8209, 8210, 8211, 8212, 8213, 8722]);
|
|
34
|
+
function foldChar(char) {
|
|
35
|
+
if (/\s/.test(char)) return " ";
|
|
36
|
+
const code = char.codePointAt(0) ?? 0;
|
|
37
|
+
if (SINGLE_QUOTES.has(code)) return "'";
|
|
38
|
+
if (DOUBLE_QUOTES.has(code)) return '"';
|
|
39
|
+
if (DASHES.has(code)) return "-";
|
|
40
|
+
return char.normalize("NFKC").toLowerCase();
|
|
41
|
+
}
|
|
42
|
+
function foldWithOffsets(text) {
|
|
43
|
+
let folded = "";
|
|
44
|
+
const offsets = [];
|
|
45
|
+
let at = 0;
|
|
46
|
+
for (const char of text) {
|
|
47
|
+
const out = foldChar(char);
|
|
48
|
+
const collapses = out === " " && (folded.length === 0 || folded.endsWith(" "));
|
|
49
|
+
if (!collapses) {
|
|
50
|
+
for (const piece of out) {
|
|
51
|
+
folded += piece;
|
|
52
|
+
offsets.push(at);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
at += char.length;
|
|
56
|
+
}
|
|
57
|
+
if (folded.endsWith(" ")) {
|
|
58
|
+
folded = folded.slice(0, -1);
|
|
59
|
+
offsets.pop();
|
|
60
|
+
}
|
|
61
|
+
return { folded, offsets };
|
|
62
|
+
}
|
|
63
|
+
function foldForComparison(text) {
|
|
64
|
+
return foldWithOffsets(text).folded;
|
|
65
|
+
}
|
|
66
|
+
function findVerbatimSpan(quote, text) {
|
|
67
|
+
const needle = foldWithOffsets(quote).folded;
|
|
68
|
+
if (needle.length === 0) return null;
|
|
69
|
+
const { folded, offsets } = foldWithOffsets(text);
|
|
70
|
+
const at = folded.indexOf(needle);
|
|
71
|
+
if (at < 0) return null;
|
|
72
|
+
const start = offsets[at] ?? 0;
|
|
73
|
+
const last = offsets[at + needle.length - 1] ?? 0;
|
|
74
|
+
const end = last + (String.fromCodePoint(text.codePointAt(last) ?? 0).length || 1);
|
|
75
|
+
return { start, end };
|
|
76
|
+
}
|
|
77
|
+
function findVerbatim(quote, text) {
|
|
78
|
+
const span = findVerbatimSpan(quote, text);
|
|
79
|
+
return span ? text.slice(span.start, span.end).replace(/\s+/g, " ").trim() : null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// src/commands/research/customers.ts
|
|
83
|
+
import { defineCommand } from "citty";
|
|
84
|
+
import { parse as parseYaml } from "yaml";
|
|
85
|
+
import { z } from "zod";
|
|
86
|
+
var INSIGHT_TYPES = [
|
|
87
|
+
"accommodation",
|
|
88
|
+
"failed_solution",
|
|
89
|
+
"nearly_didnt",
|
|
90
|
+
"word",
|
|
91
|
+
"moment",
|
|
92
|
+
"pain",
|
|
93
|
+
"objection",
|
|
94
|
+
"desire",
|
|
95
|
+
"proof",
|
|
96
|
+
"other"
|
|
97
|
+
];
|
|
98
|
+
var FORCES = ["push", "pull", "anxiety", "habit"];
|
|
99
|
+
var FITS = ["on_topic", "off_topic", "not_a_buyer"];
|
|
100
|
+
var MAX_QUOTE_CHARS = 280;
|
|
101
|
+
function keepVerbatim(candidates, sources) {
|
|
102
|
+
const kept = [];
|
|
103
|
+
let dropped = 0;
|
|
104
|
+
let tooLong = 0;
|
|
105
|
+
for (const { source: index, ...rest } of candidates) {
|
|
106
|
+
const source = sources[index - 1];
|
|
107
|
+
const quote = source ? findVerbatim(rest.quote, source.text) : null;
|
|
108
|
+
if (!source || !quote) {
|
|
109
|
+
dropped++;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (quote.length > MAX_QUOTE_CHARS) {
|
|
113
|
+
tooLong++;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
kept.push({ ...rest, quote, source });
|
|
117
|
+
}
|
|
118
|
+
return { kept, dropped, tooLong };
|
|
119
|
+
}
|
|
120
|
+
function keepOnTopic(insights) {
|
|
121
|
+
const kept = [];
|
|
122
|
+
let offTopic = 0;
|
|
123
|
+
let notABuyer = 0;
|
|
124
|
+
for (const insight of insights) {
|
|
125
|
+
if (insight.fit === "not_a_buyer") notABuyer++;
|
|
126
|
+
else if (insight.fit === "on_topic" && insight.why?.trim()) kept.push(insight);
|
|
127
|
+
else offTopic++;
|
|
128
|
+
}
|
|
129
|
+
return { kept, offTopic, notABuyer };
|
|
130
|
+
}
|
|
131
|
+
var SLUG_WORDS = 6;
|
|
132
|
+
function asciiWords(text) {
|
|
133
|
+
return text.normalize("NFKD").replace(new RegExp("\\p{M}", "gu"), "").toLowerCase().replace(/[^a-z0-9]+/g, " ").trim().split(" ").filter(Boolean);
|
|
134
|
+
}
|
|
135
|
+
function insightSlug(type, quote) {
|
|
136
|
+
return [type.replace(/_/g, "-"), ...asciiWords(quote).slice(0, SLUG_WORDS)].join("-");
|
|
137
|
+
}
|
|
138
|
+
function planInsightWrites(insights, existing, limit) {
|
|
139
|
+
const filed = existing.map((e) => ({ folded: foldForComparison(e.quote), source: e.source }));
|
|
140
|
+
const quotes = new Set(filed.map((e) => e.folded));
|
|
141
|
+
const ids = new Set(existing.map((e) => e.id));
|
|
142
|
+
const ranked = [...insights].sort((a, b) => INSIGHT_TYPES.indexOf(a.type) - INSIGHT_TYPES.indexOf(b.type));
|
|
143
|
+
const writes = [];
|
|
144
|
+
let skippedExisting = 0;
|
|
145
|
+
let skippedOverlap = 0;
|
|
146
|
+
for (const insight of ranked) {
|
|
147
|
+
const folded = foldForComparison(insight.quote);
|
|
148
|
+
if (quotes.has(folded)) {
|
|
149
|
+
skippedExisting++;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const overlaps = filed.some(
|
|
153
|
+
(e) => e.source === insight.source.ref && e.folded && (e.folded.includes(folded) || folded.includes(e.folded))
|
|
154
|
+
);
|
|
155
|
+
if (overlaps) {
|
|
156
|
+
skippedOverlap++;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (writes.length >= limit) continue;
|
|
160
|
+
const base = insightSlug(insight.type, insight.quote);
|
|
161
|
+
let id = base;
|
|
162
|
+
for (let n = 2; ids.has(id); n++) id = `${base}-${n}`;
|
|
163
|
+
quotes.add(folded);
|
|
164
|
+
filed.push({ folded, source: insight.source.ref });
|
|
165
|
+
ids.add(id);
|
|
166
|
+
writes.push({ id, insight });
|
|
167
|
+
}
|
|
168
|
+
return { writes, skippedExisting, skippedOverlap };
|
|
169
|
+
}
|
|
170
|
+
function yamlScalar(value) {
|
|
171
|
+
return JSON.stringify(value);
|
|
172
|
+
}
|
|
173
|
+
var TITLE_CHARS = 70;
|
|
174
|
+
function insightTitle(quote) {
|
|
175
|
+
const text = quote.replace(/["“”]/g, "").replace(/\s+/g, " ").trim();
|
|
176
|
+
if (text.length <= TITLE_CHARS) return `\u201C${text}\u201D`;
|
|
177
|
+
const cut = text.slice(0, TITLE_CHARS);
|
|
178
|
+
return `\u201C${cut.slice(0, cut.lastIndexOf(" ")).replace(/[,;:.]$/, "")}\u2026\u201D`;
|
|
179
|
+
}
|
|
180
|
+
function renderInsightFile(insight, opts) {
|
|
181
|
+
const { source } = insight;
|
|
182
|
+
const lines = [
|
|
183
|
+
"---",
|
|
184
|
+
`title: ${yamlScalar(insightTitle(insight.quote))}`,
|
|
185
|
+
`type: ${insight.type}`,
|
|
186
|
+
`quote: ${yamlScalar(insight.quote)}`,
|
|
187
|
+
`source: ${yamlScalar(source.ref)}`,
|
|
188
|
+
`sourceKind: ${source.kind}`,
|
|
189
|
+
`seenAt: ${yamlScalar(source.saidOn ?? opts.today)}`,
|
|
190
|
+
"status: observed"
|
|
191
|
+
];
|
|
192
|
+
if (insight.force) lines.push(`force: ${insight.force}`);
|
|
193
|
+
if (insight.persona?.trim()) lines.push(`persona: ${yamlScalar(insight.persona.trim())}`);
|
|
194
|
+
if (opts.product) lines.push(`product: ${yamlScalar(opts.product)}`);
|
|
195
|
+
lines.push("---", "", source.context.replace(/\s+/g, " ").trim(), "");
|
|
196
|
+
return lines.join("\n");
|
|
197
|
+
}
|
|
198
|
+
var MAX_SHORT_SOURCE_CHARS = 1500;
|
|
199
|
+
var PLATFORM_NAMES = {
|
|
200
|
+
google: "Google",
|
|
201
|
+
trustpilot: "Trustpilot",
|
|
202
|
+
yelp: "Yelp",
|
|
203
|
+
tripadvisor: "Tripadvisor",
|
|
204
|
+
g2: "G2",
|
|
205
|
+
capterra: "Capterra",
|
|
206
|
+
amazon: "Amazon",
|
|
207
|
+
app_store: "App Store",
|
|
208
|
+
google_play: "Google Play"
|
|
209
|
+
};
|
|
210
|
+
var LibraryReviewSchema = z.object({
|
|
211
|
+
_id: z.string().min(1),
|
|
212
|
+
reviewText: z.string(),
|
|
213
|
+
sourceType: z.string().optional(),
|
|
214
|
+
rating: z.number().optional(),
|
|
215
|
+
reviewDate: z.number().optional()
|
|
216
|
+
});
|
|
217
|
+
function dayOf(ms) {
|
|
218
|
+
const date = new Date(ms);
|
|
219
|
+
return Number.isNaN(date.getTime()) ? void 0 : date.toISOString().slice(0, 10);
|
|
220
|
+
}
|
|
221
|
+
function sentence(rest) {
|
|
222
|
+
const line = `${/^[aeiou]/i.test(rest) ? "An" : "A"} ${rest}`;
|
|
223
|
+
return line.endsWith(".") ? line : `${line}.`;
|
|
224
|
+
}
|
|
225
|
+
function reviewContext(review) {
|
|
226
|
+
const platform = review.sourceType ? `${PLATFORM_NAMES[review.sourceType] ?? review.sourceType} ` : "";
|
|
227
|
+
const rating = review.rating !== void 0 ? `${review.rating}\u2605 ` : "";
|
|
228
|
+
return sentence(`${rating}${platform}review`);
|
|
229
|
+
}
|
|
230
|
+
function sourcesFromTestimonials(data) {
|
|
231
|
+
const list = Array.isArray(data) ? data : [];
|
|
232
|
+
return list.flatMap((item) => {
|
|
233
|
+
const parsed = LibraryReviewSchema.safeParse(item);
|
|
234
|
+
if (!parsed.success) return [];
|
|
235
|
+
const review = parsed.data;
|
|
236
|
+
const text = review.reviewText.trim().slice(0, MAX_SHORT_SOURCE_CHARS);
|
|
237
|
+
if (!text) return [];
|
|
238
|
+
const saidOn = review.reviewDate !== void 0 ? dayOf(review.reviewDate) : void 0;
|
|
239
|
+
return [
|
|
240
|
+
{
|
|
241
|
+
ref: `testimonials:${review._id}`,
|
|
242
|
+
kind: "review",
|
|
243
|
+
text,
|
|
244
|
+
context: reviewContext(review),
|
|
245
|
+
...saidOn ? { saidOn } : {}
|
|
246
|
+
}
|
|
247
|
+
];
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
function sourcesFromReddit(items) {
|
|
251
|
+
return items.flatMap((item) => {
|
|
252
|
+
const words = item.kind === "post" ? [item.title ?? "", item.text].filter((t) => t.trim()).join("\n\n") : item.text;
|
|
253
|
+
const text = words.trim().slice(0, MAX_SHORT_SOURCE_CHARS);
|
|
254
|
+
if (!text) return [];
|
|
255
|
+
const under = item.kind === "comment" && item.title ? `, under ${JSON.stringify(item.title)}` : "";
|
|
256
|
+
const saidOn = dayOf(item.createdAt);
|
|
257
|
+
return [
|
|
258
|
+
{
|
|
259
|
+
ref: item.permalink,
|
|
260
|
+
kind: "reddit",
|
|
261
|
+
text,
|
|
262
|
+
context: `A Reddit ${item.kind} in r/${item.subreddit}${under}.`,
|
|
263
|
+
...saidOn ? { saidOn } : {}
|
|
264
|
+
}
|
|
265
|
+
];
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
var MAX_PAGE_SOURCE_CHARS = 6e3;
|
|
269
|
+
function sourcesFromPages(pages) {
|
|
270
|
+
return pages.flatMap((page) => {
|
|
271
|
+
const text = page.content.trim().slice(0, MAX_PAGE_SOURCE_CHARS);
|
|
272
|
+
if (!text) return [];
|
|
273
|
+
const host = URL.canParse(page.finalUrl) ? new URL(page.finalUrl).host : page.finalUrl;
|
|
274
|
+
const title = page.title?.trim() ? `, ${JSON.stringify(page.title.trim())}` : "";
|
|
275
|
+
return [{ ref: page.finalUrl, kind: "web", text, context: `A page on ${host}${title}.` }];
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
function promptLine(source, n) {
|
|
279
|
+
const where = source.context.replace(/\s+/g, " ").trim();
|
|
280
|
+
const ofCompany = source.kind === "review" ? " A review of this company." : "";
|
|
281
|
+
return `[${n}] ${where || ofCompany ? `(${`${where}${ofCompany}`.trim()}) ` : ""}${source.text}`;
|
|
282
|
+
}
|
|
283
|
+
function buildCustomersPrompt(sources, opts = {}) {
|
|
284
|
+
const { focus, company } = opts;
|
|
285
|
+
const about = company?.about?.trim();
|
|
286
|
+
const products = company?.products.length ? `Its products: ${company.products.join(", ")}.` : "";
|
|
287
|
+
return [
|
|
288
|
+
`Below are ${sources.length} numbered texts (reviews, testimonials, forum posts and comments, web pages)${focus ? `, gathered about: ${focus}` : ""}.`,
|
|
289
|
+
"Find what this company's customers say in them, the material its ads are written from.",
|
|
290
|
+
"",
|
|
291
|
+
"The company:",
|
|
292
|
+
about ? about : "(no company description on file: judge by the focus and the company's own reviews)",
|
|
293
|
+
...products ? [products] : [],
|
|
294
|
+
"",
|
|
295
|
+
"Rules:",
|
|
296
|
+
"- Every quote must be an EXACT substring of the text it cites: the same words, in the same order, with the same spelling and typos. Copy, never paraphrase, translate, summarize, correct or join two passages. Never quote the part in parentheses before a text; that only says where it was said.",
|
|
297
|
+
`- The shortest span that carries the truth, at most ${MAX_QUOTE_CHARS} characters.`,
|
|
298
|
+
"- Only the customer's own words: skip a seller's reply, an ad, a page's marketing copy, and a text with no truth in it. Return fewer, or none, rather than invent.",
|
|
299
|
+
"- fit, for every quote: on_topic when the speaker is a buyer or user of this company, its product, its category or a named competitor, talking about the problem it solves, in a market it serves; off_topic when the text (or the forum or thread it was said in) is about something else, such as a game, another industry or another country's market; not_a_buyer when it is on the subject but the speaker is not a buyer: someone the product acts against, a seller or the company replying, a marketer. A real quote that is off_topic is worthless here, so judge strictly.",
|
|
300
|
+
"- why: one short line on what makes it that fit (who is speaking, about what).",
|
|
301
|
+
"- type: accommodation (a workaround they live with), failed_solution (what they tried before that failed them), nearly_didnt (what nearly stopped them buying), word (their own word or phrase for the problem), moment (the moment that started their search), pain, objection, desire, proof (a result they got), other.",
|
|
302
|
+
"- force, when it speaks to one: push (what pushes them off the old way), pull (what draws them to the new one), anxiety (what they fear about changing), habit (what keeps them where they are).",
|
|
303
|
+
`- persona: a few words on who is speaking, only when the text says it ("restaurant owner", "night-shift courier"). Never a person's name.`,
|
|
304
|
+
"",
|
|
305
|
+
'Reply with only this JSON: {"insights":[{"source":1,"quote":"","fit":"","why":"","type":"","force":"","persona":""}]}',
|
|
306
|
+
"",
|
|
307
|
+
"Texts:",
|
|
308
|
+
...sources.map((source, i) => promptLine(source, i + 1))
|
|
309
|
+
].join("\n");
|
|
310
|
+
}
|
|
311
|
+
var AnswerSchema = z.object({ insights: z.array(z.unknown()) });
|
|
312
|
+
var CandidateSchema = z.object({
|
|
313
|
+
source: z.coerce.number().int().positive(),
|
|
314
|
+
quote: z.string().trim().min(1),
|
|
315
|
+
type: z.enum(INSIGHT_TYPES).catch("other"),
|
|
316
|
+
force: z.enum(FORCES).optional().catch(void 0),
|
|
317
|
+
persona: z.string().trim().optional().catch(void 0),
|
|
318
|
+
fit: z.enum(FITS).optional().catch(void 0),
|
|
319
|
+
why: z.string().trim().optional().catch(void 0)
|
|
320
|
+
});
|
|
321
|
+
function candidatesFrom(answer) {
|
|
322
|
+
const parsed = AnswerSchema.safeParse(answer);
|
|
323
|
+
if (!parsed.success) return null;
|
|
324
|
+
return parsed.data.insights.flatMap((item) => {
|
|
325
|
+
const candidate = CandidateSchema.safeParse(item);
|
|
326
|
+
if (!candidate.success) return [];
|
|
327
|
+
const { source, quote, type, force, persona, fit, why } = candidate.data;
|
|
328
|
+
return [
|
|
329
|
+
{
|
|
330
|
+
source,
|
|
331
|
+
quote,
|
|
332
|
+
type,
|
|
333
|
+
...force ? { force } : {},
|
|
334
|
+
...persona ? { persona } : {},
|
|
335
|
+
...fit ? { fit } : {},
|
|
336
|
+
...why ? { why } : {}
|
|
337
|
+
}
|
|
338
|
+
];
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
function batchSources(sources, budget) {
|
|
342
|
+
const batches = [];
|
|
343
|
+
let current = [];
|
|
344
|
+
let size = 0;
|
|
345
|
+
for (const source of sources) {
|
|
346
|
+
if (current.length > 0 && size + source.text.length > budget) {
|
|
347
|
+
batches.push(current);
|
|
348
|
+
current = [];
|
|
349
|
+
size = 0;
|
|
350
|
+
}
|
|
351
|
+
current.push(source);
|
|
352
|
+
size += source.text.length;
|
|
353
|
+
}
|
|
354
|
+
if (current.length > 0) batches.push(current);
|
|
355
|
+
return batches;
|
|
356
|
+
}
|
|
357
|
+
var FEW_OBSERVED = 5;
|
|
358
|
+
function customersHints(input) {
|
|
359
|
+
const { written, offTopic = 0, notABuyer = 0, sources } = input;
|
|
360
|
+
const widen = `Search in the customers' own words with --query "<the words they write>" (their phrasing, not a category name), or add --web.`;
|
|
361
|
+
const elsewhere = offTopic > 0 && offTopic >= written ? [
|
|
362
|
+
`${offTopic} real quotes were dropped as not about this company, its product, category or competitors (the forum or thread was about something else). Put the product or category in --query with the customers' words ("<category> <their words>"), and check where this company's customers actually talk with \`baker research reddit subreddits "<category>"\`. Never write the dropped quotes in by hand.`
|
|
363
|
+
] : [];
|
|
364
|
+
const notBuyers = notABuyer > 0 && notABuyer >= written ? [
|
|
365
|
+
`${notABuyer} quotes on the subject were dropped because the speakers are not buyers (people the product acts against, sellers replying, marketers). The search reached the right conversations: look for the buyers' side of them \u2014 reviews of this company, or --query in a buyer's words ("I chose", "we switched", "before we signed"). Never write the dropped quotes in by hand.`
|
|
366
|
+
] : [];
|
|
367
|
+
const why = [...elsewhere, ...notBuyers];
|
|
368
|
+
if (written === 0) {
|
|
369
|
+
return [
|
|
370
|
+
...why,
|
|
371
|
+
"No customer words were found to keep, so nothing was written. Import where customers already talk: `baker testimonials sources add <review page link>` (Google, Trustpilot, G2, app stores\u2026) brings their reviews into the library; then run this again.",
|
|
372
|
+
...sources.reddit === null ? ['Reddit was not read: pass --focus "<product>" or --query "<their words>".'] : [widen],
|
|
373
|
+
"Until there are observed truths, ad ideas go in as explore bets: an idea with an empty `evidence` list."
|
|
374
|
+
];
|
|
375
|
+
}
|
|
376
|
+
const cite = `Cite these by id in an idea's \`evidence\` (src/creatives/_ideas/<idea>.md); write the ad from the quote as said.`;
|
|
377
|
+
return [...why, ...written < FEW_OBSERVED ? [`Only ${written} observed. ${widen}`, cite] : [cite]];
|
|
378
|
+
}
|
|
379
|
+
var INSIGHTS_DIR = path.join("src", "content", "insights");
|
|
380
|
+
var BATCH_CHARS = 24e3;
|
|
381
|
+
var MAX_BATCHES = 5;
|
|
382
|
+
var WEB_PAGES = 3;
|
|
383
|
+
var DEFAULT_LIMIT = 20;
|
|
384
|
+
var SHOWN_QUOTE_CHARS = 120;
|
|
385
|
+
var READ_TIMEOUT_MS = 18e4;
|
|
386
|
+
var DESCRIPTION = `Gather what real customers say and keep it as Knowledge: one file per customer truth in src/content/insights/<id>.md, each a quote found word for word in its source (status: observed). Ads and ideas are written from these.
|
|
387
|
+
|
|
388
|
+
Start here: baker research customers --focus "<product or persona>"
|
|
389
|
+
|
|
390
|
+
Reads the company's review library, Reddit (with --focus or --query) and, with --web, a few web pages. A model only points at spans; a quote is kept only if it appears verbatim in the text it came from AND that text is a buyer talking about this company, its product, category or a competitor (judged against COMPANY.md). Everything else is dropped and counted: dropped_not_verbatim, dropped_off_topic, dropped_not_a_buyer. Never write an insight by hand, and never add back a dropped one.
|
|
391
|
+
|
|
392
|
+
Examples:
|
|
393
|
+
baker research customers --focus "payroll app for restaurants"
|
|
394
|
+
baker research customers --query "chasing invoices" --web
|
|
395
|
+
baker research customers --dry-run`;
|
|
396
|
+
var ARGS = {
|
|
397
|
+
focus: {
|
|
398
|
+
type: "string",
|
|
399
|
+
required: false,
|
|
400
|
+
description: 'The product or persona to listen for, e.g. "payroll for restaurants". Also the Reddit search when --query is not given.'
|
|
401
|
+
},
|
|
402
|
+
query: {
|
|
403
|
+
type: "string",
|
|
404
|
+
required: false,
|
|
405
|
+
description: `Search terms in the customers' own words, e.g. "chasing invoices". Used for Reddit and the web.`
|
|
406
|
+
},
|
|
407
|
+
limit: { type: "string", required: false, description: `Most insights written (default ${DEFAULT_LIMIT}).` },
|
|
408
|
+
web: {
|
|
409
|
+
type: "boolean",
|
|
410
|
+
required: false,
|
|
411
|
+
default: false,
|
|
412
|
+
description: `Also read up to ${WEB_PAGES} web pages where customers talk about it (slower).`
|
|
413
|
+
},
|
|
414
|
+
"dry-run": {
|
|
415
|
+
type: "boolean",
|
|
416
|
+
required: false,
|
|
417
|
+
default: false,
|
|
418
|
+
description: "Show what would be written; write nothing."
|
|
419
|
+
},
|
|
420
|
+
full: {
|
|
421
|
+
type: "boolean",
|
|
422
|
+
required: false,
|
|
423
|
+
default: false,
|
|
424
|
+
description: "Add each insight's whole quote, source and context."
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
registerSchema({ command: "research.customers", description: DESCRIPTION, args: ARGS });
|
|
428
|
+
var InsightFrontmatter = z.object({ quote: z.string(), source: z.string().optional().catch(void 0) });
|
|
429
|
+
function filedOf(raw) {
|
|
430
|
+
const front = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1];
|
|
431
|
+
if (!front) return { quote: "" };
|
|
432
|
+
try {
|
|
433
|
+
const parsed = InsightFrontmatter.safeParse(parseYaml(front));
|
|
434
|
+
if (!parsed.success) return { quote: "" };
|
|
435
|
+
const { quote, source } = parsed.data;
|
|
436
|
+
return source ? { quote, source } : { quote };
|
|
437
|
+
} catch {
|
|
438
|
+
return { quote: "" };
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
async function readExistingInsights(dir) {
|
|
442
|
+
const files = (await readdir(dir).catch(() => [])).filter((f) => f.endsWith(".md"));
|
|
443
|
+
return await Promise.all(
|
|
444
|
+
files.map(async (file) => ({
|
|
445
|
+
id: file.slice(0, -3),
|
|
446
|
+
...filedOf(await readFile(path.join(dir, file), "utf8").catch(() => ""))
|
|
447
|
+
}))
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
var MAX_COMPANY_CHARS = 4e3;
|
|
451
|
+
async function companyAbout(root) {
|
|
452
|
+
const doc = await readFile(path.join(root, "COMPANY.md"), "utf8").catch(() => "");
|
|
453
|
+
const text = doc.replace(/<!--[\s\S]*?-->/g, "").trim();
|
|
454
|
+
if (!text || /^#\s*Company\s*\n+TODO\b/i.test(text)) return void 0;
|
|
455
|
+
return text.slice(0, MAX_COMPANY_CHARS);
|
|
456
|
+
}
|
|
457
|
+
async function productSlugs(root) {
|
|
458
|
+
const files = await readdir(path.join(root, "src", "content", "products")).catch(() => []);
|
|
459
|
+
return files.filter((f) => f.endsWith(".md")).map((f) => f.slice(0, -3));
|
|
460
|
+
}
|
|
461
|
+
async function gatherTestimonials(focus) {
|
|
462
|
+
try {
|
|
463
|
+
const search = { query: focus ?? "", limit: 40 };
|
|
464
|
+
const data = focus ? await apiPost("/api/testimonials/search", search) : await apiGet("/api/testimonials", { limit: "50" });
|
|
465
|
+
return sourcesFromTestimonials(data);
|
|
466
|
+
} catch {
|
|
467
|
+
return null;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
async function gatherReddit(query) {
|
|
471
|
+
const subreddits = await findSubreddits({ query: query.slice(0, 100), limit: 3 }).then((r) => r.results.filter((s) => s.access !== "private").map((s) => s.name)).catch(() => []);
|
|
472
|
+
const answers = await Promise.allSettled([
|
|
473
|
+
searchReddit({ query, subreddits, kind: "posts", limit: 15 }),
|
|
474
|
+
...subreddits.length > 0 ? [searchReddit({ query, subreddits, kind: "comments", limit: 25 })] : []
|
|
475
|
+
]);
|
|
476
|
+
if (answers.every((a) => a.status === "rejected")) return null;
|
|
477
|
+
const seen = /* @__PURE__ */ new Set();
|
|
478
|
+
const items = answers.flatMap((a) => a.status === "fulfilled" ? a.value.results : []).filter((item) => !seen.has(item.id) && Boolean(seen.add(item.id)));
|
|
479
|
+
return sourcesFromReddit(items);
|
|
480
|
+
}
|
|
481
|
+
var ExploreAnswer = z.object({ sources: z.array(z.object({ url: z.string(), resolved: z.boolean().optional() })) });
|
|
482
|
+
function webPageUrls(sources) {
|
|
483
|
+
return sources.filter((source) => source.resolved !== false && !/reddit\.com/i.test(source.url)).map((source) => source.url).filter((url, i, all) => all.indexOf(url) === i);
|
|
484
|
+
}
|
|
485
|
+
async function gatherWeb(topic) {
|
|
486
|
+
let urls;
|
|
487
|
+
try {
|
|
488
|
+
const found = ExploreAnswer.parse(
|
|
489
|
+
await apiPost(
|
|
490
|
+
"/api/research/explore",
|
|
491
|
+
{
|
|
492
|
+
question: `Which pages carry first-hand customer comments about ${topic}, in the customers' own words: reviews, complaints, forum threads?`,
|
|
493
|
+
depth: "medium"
|
|
494
|
+
},
|
|
495
|
+
{ timeoutMs: READ_TIMEOUT_MS }
|
|
496
|
+
)
|
|
497
|
+
);
|
|
498
|
+
urls = webPageUrls(found.sources.slice(0, WEB_PAGES * 2));
|
|
499
|
+
} catch {
|
|
500
|
+
return null;
|
|
501
|
+
}
|
|
502
|
+
const pages = await Promise.allSettled(
|
|
503
|
+
urls.slice(0, WEB_PAGES).map((url) => {
|
|
504
|
+
const body = { url };
|
|
505
|
+
return apiPost("/api/research/fetch", body, { timeoutMs: READ_TIMEOUT_MS });
|
|
506
|
+
})
|
|
507
|
+
);
|
|
508
|
+
return sourcesFromPages(pages.flatMap((p) => p.status === "fulfilled" ? [p.value] : []));
|
|
509
|
+
}
|
|
510
|
+
var CLASSIFY_TIMEOUT_MS = 9e4;
|
|
511
|
+
var CLASSIFY_REQUEST = { seed: 0, response_format: { type: "json_object" }, reasoning: { effort: "low" } };
|
|
512
|
+
async function classifyBatch(batch, context, onSpend) {
|
|
513
|
+
const prompt = buildCustomersPrompt(batch, context);
|
|
514
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
515
|
+
const candidates = candidatesFrom(
|
|
516
|
+
await askAboutText(CUSTOMER_INSIGHTS_MODEL, prompt, onSpend, {
|
|
517
|
+
timeoutMs: CLASSIFY_TIMEOUT_MS,
|
|
518
|
+
request: CLASSIFY_REQUEST
|
|
519
|
+
})
|
|
520
|
+
);
|
|
521
|
+
if (candidates) return candidates;
|
|
522
|
+
}
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
function interleave(lists) {
|
|
526
|
+
const out = [];
|
|
527
|
+
const longest = Math.max(0, ...lists.map((l) => l.length));
|
|
528
|
+
for (let i = 0; i < longest; i++) {
|
|
529
|
+
for (const list of lists) {
|
|
530
|
+
const source = list[i];
|
|
531
|
+
if (source) out.push(source);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return out;
|
|
535
|
+
}
|
|
536
|
+
function fail(code, message, fix) {
|
|
537
|
+
writeJson({ ok: false, error: { code, message, fix } });
|
|
538
|
+
process.exit(1);
|
|
539
|
+
}
|
|
540
|
+
async function gatherSources(opts) {
|
|
541
|
+
const { focus, topic, web: withWeb } = opts;
|
|
542
|
+
const [testimonials, reddit, web] = await Promise.all([
|
|
543
|
+
gatherTestimonials(focus),
|
|
544
|
+
topic ? gatherReddit(topic) : Promise.resolve(null),
|
|
545
|
+
withWeb && topic ? gatherWeb(topic) : Promise.resolve(null)
|
|
546
|
+
]);
|
|
547
|
+
const counts = {
|
|
548
|
+
testimonials: testimonials?.length ?? null,
|
|
549
|
+
reddit: reddit?.length ?? null,
|
|
550
|
+
web: web?.length ?? null
|
|
551
|
+
};
|
|
552
|
+
return { all: interleave([testimonials ?? [], reddit ?? [], web ?? []]), counts };
|
|
553
|
+
}
|
|
554
|
+
async function classifyAll(sources, context, root) {
|
|
555
|
+
const batches = batchSources(sources, BATCH_CHARS).slice(0, MAX_BATCHES);
|
|
556
|
+
const spent = [];
|
|
557
|
+
const answers = await Promise.all(batches.map((batch) => classifyBatch(batch, context, (u) => spent.push(u))));
|
|
558
|
+
await holdUnbilledSpend(path.join(root, "canvas", ".cache"), spent);
|
|
559
|
+
if (batches.length > 0 && answers.every((a) => a === null)) return null;
|
|
560
|
+
const result = { kept: [], dropped: 0, tooLong: 0, offTopic: 0, notABuyer: 0 };
|
|
561
|
+
batches.forEach((batch, i) => {
|
|
562
|
+
const verbatim = keepVerbatim(answers[i] ?? [], batch);
|
|
563
|
+
const relevant = keepOnTopic(verbatim.kept);
|
|
564
|
+
result.kept.push(...relevant.kept);
|
|
565
|
+
result.dropped += verbatim.dropped;
|
|
566
|
+
result.tooLong += verbatim.tooLong;
|
|
567
|
+
result.offTopic += relevant.offTopic;
|
|
568
|
+
result.notABuyer += relevant.notABuyer;
|
|
569
|
+
});
|
|
570
|
+
return result;
|
|
571
|
+
}
|
|
572
|
+
async function writeInsights(dir, writes, opts) {
|
|
573
|
+
if (writes.length === 0) return [];
|
|
574
|
+
await mkdir(dir, { recursive: true });
|
|
575
|
+
const written = [];
|
|
576
|
+
for (const entry of writes) {
|
|
577
|
+
const file = renderInsightFile(entry.insight, opts);
|
|
578
|
+
const ok = await writeFile(path.join(dir, `${entry.id}.md`), file, { encoding: "utf8", flag: "wx" }).then(
|
|
579
|
+
() => true,
|
|
580
|
+
() => false
|
|
581
|
+
);
|
|
582
|
+
if (ok) written.push(entry);
|
|
583
|
+
}
|
|
584
|
+
return written;
|
|
585
|
+
}
|
|
586
|
+
function writtenRow({ id, insight }, full) {
|
|
587
|
+
const quote = insight.quote.length > SHOWN_QUOTE_CHARS ? `${insight.quote.slice(0, SHOWN_QUOTE_CHARS)}\u2026` : insight.quote;
|
|
588
|
+
if (!full) return { id, type: insight.type, quote };
|
|
589
|
+
return {
|
|
590
|
+
id,
|
|
591
|
+
type: insight.type,
|
|
592
|
+
quote,
|
|
593
|
+
full_quote: insight.quote,
|
|
594
|
+
source: insight.source.ref,
|
|
595
|
+
context: insight.source.context,
|
|
596
|
+
...insight.force ? { force: insight.force } : {},
|
|
597
|
+
...insight.persona ? { persona: insight.persona } : {},
|
|
598
|
+
...insight.why ? { why: insight.why } : {}
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
async function resolveTopic(root, focus, query) {
|
|
602
|
+
const products = await productSlugs(root);
|
|
603
|
+
const product = focus ? products.find((slug) => slug === asciiWords(focus).join("-")) : void 0;
|
|
604
|
+
const firstProduct = products[0];
|
|
605
|
+
const topic = query ?? focus ?? (firstProduct ? asciiWords(firstProduct).join(" ") : void 0);
|
|
606
|
+
return { product, products, topic };
|
|
607
|
+
}
|
|
608
|
+
async function researchCustomers(root, opts) {
|
|
609
|
+
const { focus, query, limit = DEFAULT_LIMIT, web = false, dryRun = false } = opts;
|
|
610
|
+
const { product, products, topic } = await resolveTopic(root, focus, query);
|
|
611
|
+
const [{ all, counts }, about] = await Promise.all([gatherSources({ focus, topic, web }), companyAbout(root)]);
|
|
612
|
+
const company = { products, ...about ? { about } : {} };
|
|
613
|
+
const gated = await classifyAll(all, { ...focus ? { focus } : {}, company }, root);
|
|
614
|
+
if (!gated) return null;
|
|
615
|
+
const dir = path.join(root, INSIGHTS_DIR);
|
|
616
|
+
const plan = planInsightWrites(gated.kept, await readExistingInsights(dir), limit);
|
|
617
|
+
const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
618
|
+
const shown = dryRun ? plan.writes : await writeInsights(dir, plan.writes, { today, ...product ? { product } : {} });
|
|
619
|
+
return { shown, plan, gated, counts };
|
|
620
|
+
}
|
|
621
|
+
var customersCommand = defineCommand({
|
|
622
|
+
meta: { name: "customers", description: DESCRIPTION },
|
|
623
|
+
args: ARGS,
|
|
624
|
+
async run({ args }) {
|
|
625
|
+
const focus = args.focus?.trim() || void 0;
|
|
626
|
+
const query = args.query?.trim() || void 0;
|
|
627
|
+
const limit = args.limit === void 0 ? DEFAULT_LIMIT : Number(args.limit);
|
|
628
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
|
|
629
|
+
fail("VALIDATION_ERROR", "--limit must be a whole number from 1 to 100.", "Run it again with --limit 20.");
|
|
630
|
+
}
|
|
631
|
+
const dryRun = Boolean(args["dry-run"]);
|
|
632
|
+
const root = findWorkspaceRoot(process.cwd()) ?? process.cwd();
|
|
633
|
+
const found = await researchCustomers(root, { focus, query, limit, web: Boolean(args.web), dryRun });
|
|
634
|
+
if (!found) {
|
|
635
|
+
fail(
|
|
636
|
+
"UNAVAILABLE",
|
|
637
|
+
"The model that picks out customer words did not answer (no gateway key here, or it failed twice).",
|
|
638
|
+
"Run it again. Do not write insights by hand: an insight is only a quote this command found in its source."
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
const { shown, plan, gated, counts } = found;
|
|
642
|
+
writeJson({
|
|
643
|
+
ok: true,
|
|
644
|
+
data: {
|
|
645
|
+
...dryRun ? { dry_run: true } : {},
|
|
646
|
+
written: shown.map((entry) => writtenRow(entry, Boolean(args.full))),
|
|
647
|
+
skipped_existing: plan.skippedExisting,
|
|
648
|
+
...plan.skippedOverlap > 0 ? { skipped_overlap: plan.skippedOverlap } : {},
|
|
649
|
+
dropped_not_verbatim: gated.dropped,
|
|
650
|
+
dropped_off_topic: gated.offTopic,
|
|
651
|
+
...gated.notABuyer > 0 ? { dropped_not_a_buyer: gated.notABuyer } : {},
|
|
652
|
+
...gated.tooLong > 0 ? { dropped_too_long: gated.tooLong } : {},
|
|
653
|
+
sources: counts
|
|
654
|
+
},
|
|
655
|
+
hints: customersHints({
|
|
656
|
+
written: shown.length,
|
|
657
|
+
offTopic: gated.offTopic,
|
|
658
|
+
notABuyer: gated.notABuyer,
|
|
659
|
+
sources: counts
|
|
660
|
+
})
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
});
|
|
664
|
+
|
|
665
|
+
export {
|
|
666
|
+
INSIGHT_TYPES,
|
|
667
|
+
FORCES,
|
|
668
|
+
FITS,
|
|
669
|
+
MAX_QUOTE_CHARS,
|
|
670
|
+
keepVerbatim,
|
|
671
|
+
keepOnTopic,
|
|
672
|
+
planInsightWrites,
|
|
673
|
+
renderInsightFile,
|
|
674
|
+
sourcesFromTestimonials,
|
|
675
|
+
sourcesFromReddit,
|
|
676
|
+
sourcesFromPages,
|
|
677
|
+
buildCustomersPrompt,
|
|
678
|
+
candidatesFrom,
|
|
679
|
+
batchSources,
|
|
680
|
+
customersHints,
|
|
681
|
+
webPageUrls,
|
|
682
|
+
researchCustomers,
|
|
683
|
+
customersCommand
|
|
684
|
+
};
|
|
685
|
+
//# sourceMappingURL=chunk-J6OTEZT3.js.map
|